{ "schemaVersion": "0.1.0", "project": { "name": "task-flow-manager", "root": "E:/task-flow-manager", "languages": [ "tsx", "typescript" ], "generatedAt": "2026-07-22T03:03:35.924Z", "generator": "code-visualize-cli@0.1.0" }, "stats": { "fileCount": 36, "containerCount": 0, "functionCount": 570, "edgeCount": 682, "loc": 12750 }, "modules": [ { "id": "module:.", "kind": "module", "name": "task-flow-manager", "provenance": "ast", "path": ".", "childModuleIds": [ "module:src", "module:prisma" ], "fileIds": [ "file:prisma.config.ts", "file:server.ts", "file:vite.config.ts" ] }, { "id": "module:src", "kind": "module", "name": "src", "provenance": "ast", "path": "src", "childModuleIds": [ "module:src/server", "module:src/utils", "module:src/components" ], "fileIds": [ "file:src/types.ts", "file:src/App.tsx", "file:src/main.tsx" ], "parentId": "module:." }, { "id": "module:src/server", "kind": "module", "name": "server", "provenance": "ast", "path": "src/server", "childModuleIds": [], "fileIds": [ "file:src/server/defaultData.ts", "file:src/server/db.ts", "file:src/server/weeklyPlanRepository.ts", "file:src/server/taskRepository.ts", "file:src/server/notificationRepository.ts", "file:src/server/projectTemplateRepository.ts", "file:src/server/tagRepository.ts", "file:src/server/personRepository.ts", "file:src/server/botQueryTools.ts", "file:src/server/aiChatService.ts" ], "parentId": "module:src" }, { "id": "module:prisma", "kind": "module", "name": "prisma", "provenance": "ast", "path": "prisma", "childModuleIds": [], "fileIds": [ "file:prisma/seed.ts" ], "parentId": "module:." }, { "id": "module:src/utils", "kind": "module", "name": "utils", "provenance": "ast", "path": "src/utils", "childModuleIds": [], "fileIds": [ "file:src/utils/date.ts", "file:src/utils/nodeTimeRanges.ts", "file:src/utils/taskStatus.ts", "file:src/utils/taskPriority.ts", "file:src/utils/api.ts" ], "parentId": "module:src" }, { "id": "module:src/components", "kind": "module", "name": "components", "provenance": "ast", "path": "src/components", "childModuleIds": [], "fileIds": [ "file:src/components/TaskList.tsx", "file:src/components/WeeklyPlanList.tsx", "file:src/components/WorkflowCanvas.tsx", "file:src/components/ProjectCreateModal.tsx", "file:src/components/TaskOverview.tsx", "file:src/components/GanttChart.tsx", "file:src/components/PersonGanttChart.tsx", "file:src/components/PeopleManager.tsx", "file:src/components/LoginPage.tsx", "file:src/components/TagManager.tsx", "file:src/components/ProjectTemplateManager.tsx", "file:src/components/NodeEditorDrawer.tsx", "file:src/components/WeeklyOverview.tsx", "file:src/components/DingTalkLogs.tsx" ], "parentId": "module:src" } ], "files": [ { "id": "file:prisma.config.ts", "kind": "file", "name": "prisma.config.ts", "location": { "file": "prisma.config.ts", "startLine": 1, "endLine": 14 }, "language": "typescript", "provenance": "ast", "moduleId": "module:.", "path": "prisma.config.ts", "loc": 14, "containerIds": [], "functionIds": [ "func:prisma.config.ts#@0" ] }, { "id": "file:src/types.ts", "kind": "file", "name": "types.ts", "location": { "file": "src/types.ts", "startLine": 1, "endLine": 105 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src", "path": "src/types.ts", "loc": 105, "containerIds": [], "functionIds": [ "func:src/types.ts#isPublicPoolPlan@68" ] }, { "id": "file:src/server/defaultData.ts", "kind": "file", "name": "defaultData.ts", "location": { "file": "src/server/defaultData.ts", "startLine": 1, "endLine": 127 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/defaultData.ts", "loc": 127, "containerIds": [], "functionIds": [] }, { "id": "file:prisma/seed.ts", "kind": "file", "name": "seed.ts", "location": { "file": "prisma/seed.ts", "startLine": 1, "endLine": 110 }, "language": "typescript", "provenance": "ast", "moduleId": "module:prisma", "path": "prisma/seed.ts", "loc": 110, "containerIds": [], "functionIds": [ "func:prisma/seed.ts#dateFromInput@9", "func:prisma/seed.ts#seed@13", "func:prisma/seed.ts#then() 回调@102@102", "func:prisma/seed.ts#catch() 回调@105@105", "func:prisma/seed.ts#@0" ] }, { "id": "file:src/server/db.ts", "kind": "file", "name": "db.ts", "location": { "file": "src/server/db.ts", "startLine": 1, "endLine": 21 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/db.ts", "loc": 21, "containerIds": [], "functionIds": [] }, { "id": "file:src/server/weeklyPlanRepository.ts", "kind": "file", "name": "weeklyPlanRepository.ts", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 1, "endLine": 164 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/weeklyPlanRepository.ts", "loc": 164, "containerIds": [], "functionIds": [ "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "func:src/server/weeklyPlanRepository.ts#addDays@13", "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128" ] }, { "id": "file:src/server/taskRepository.ts", "kind": "file", "name": "taskRepository.ts", "location": { "file": "src/server/taskRepository.ts", "startLine": 1, "endLine": 670 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/taskRepository.ts", "loc": 670, "containerIds": [], "functionIds": [ "func:src/server/taskRepository.ts#dateFromInput@31", "func:src/server/taskRepository.ts#dateToInput@36", "func:src/server/taskRepository.ts#uniqueValues@40", "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "func:src/server/taskRepository.ts#existingTagNames@96", "func:src/server/taskRepository.ts#findTaskRecord@111", "func:src/server/taskRepository.ts#toWorkflowNode@118", "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "func:src/server/taskRepository.ts#toTask@163", "func:src/server/taskRepository.ts#getTaskOrThrow@182", "func:src/server/taskRepository.ts#getTask@190", "func:src/server/taskRepository.ts#listTasks@194", "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "func:src/server/taskRepository.ts#createTask@227", "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "func:src/server/taskRepository.ts#updateTask@302", "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "func:src/server/taskRepository.ts#updateTaskListState@353", "func:src/server/taskRepository.ts#deleteTask@383", "func:src/server/taskRepository.ts#createWorkflowNode@389", "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "func:src/server/taskRepository.ts#updateWorkflowNode@423", "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "func:src/server/taskRepository.ts#$transaction() 回调@480@480", "func:src/server/taskRepository.ts#createNodeDependency@494", "func:src/server/taskRepository.ts#$transaction() 回调@510@510", "func:src/server/taskRepository.ts#deleteNodeDependency@535", "func:src/server/taskRepository.ts#$transaction() 回调@542@542", "func:src/server/taskRepository.ts#ensureTaskExists@560", "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "func:src/server/taskRepository.ts#hasDependencyPath@577", "func:src/server/taskRepository.ts#replaceTaskNodes@605", "func:src/server/taskRepository.ts#map() 回调@618@618" ] }, { "id": "file:src/server/notificationRepository.ts", "kind": "file", "name": "notificationRepository.ts", "location": { "file": "src/server/notificationRepository.ts", "startLine": 1, "endLine": 59 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/notificationRepository.ts", "loc": 59, "containerIds": [], "functionIds": [ "func:src/server/notificationRepository.ts#toNotificationLog@17", "func:src/server/notificationRepository.ts#createNotificationLog@37", "func:src/server/notificationRepository.ts#listNotificationLogs@47", "func:src/server/notificationRepository.ts#clearNotificationLogs@56" ] }, { "id": "file:src/server/projectTemplateRepository.ts", "kind": "file", "name": "projectTemplateRepository.ts", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 1, "endLine": 163 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/projectTemplateRepository.ts", "loc": 163, "containerIds": [], "functionIds": [ "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" ] }, { "id": "file:src/server/tagRepository.ts", "kind": "file", "name": "tagRepository.ts", "location": { "file": "src/server/tagRepository.ts", "startLine": 1, "endLine": 49 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/tagRepository.ts", "loc": 49, "containerIds": [], "functionIds": [ "func:src/server/tagRepository.ts#toTagDefinition@4", "func:src/server/tagRepository.ts#listTagDefinitions@11", "func:src/server/tagRepository.ts#createTagDefinition@19", "func:src/server/tagRepository.ts#deleteTagDefinition@34" ] }, { "id": "file:src/server/personRepository.ts", "kind": "file", "name": "personRepository.ts", "location": { "file": "src/server/personRepository.ts", "startLine": 1, "endLine": 182 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/personRepository.ts", "loc": 182, "containerIds": [], "functionIds": [ "func:src/server/personRepository.ts#toPerson@4", "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "func:src/server/personRepository.ts#listPeople@53", "func:src/server/personRepository.ts#getPersonOrThrow@64", "func:src/server/personRepository.ts#createPerson@73", "func:src/server/personRepository.ts#ensurePeople@118", "func:src/server/personRepository.ts#updatePerson@142", "func:src/server/personRepository.ts#deletePerson@177" ] }, { "id": "file:src/server/botQueryTools.ts", "kind": "file", "name": "botQueryTools.ts", "location": { "file": "src/server/botQueryTools.ts", "startLine": 1, "endLine": 586 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/botQueryTools.ts", "loc": 586, "containerIds": [], "functionIds": [ "func:src/server/botQueryTools.ts#getTodayStr@10", "func:src/server/botQueryTools.ts#value@17", "func:src/server/botQueryTools.ts#nodeRanges@21", "func:src/server/botQueryTools.ts#nodeStartDate@28", "func:src/server/botQueryTools.ts#nodeEndDate@34", "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "func:src/server/botQueryTools.ts#taskDateSpan@51", "func:src/server/botQueryTools.ts#overlapsRange@59", "func:src/server/botQueryTools.ts#buildTaskLink@72", "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "func:src/server/botQueryTools.ts#createBotQueryContext@116", "func:src/server/botQueryTools.ts#getTasks@124", "func:src/server/botQueryTools.ts#getPeople@125", "func:src/server/botQueryTools.ts#getWeeklyPlans@126", "func:src/server/botQueryTools.ts#resolveTaskScope@141", "func:src/server/botQueryTools.ts#selfScope@149", "func:src/server/botQueryTools.ts#summarizeTask@172", "func:src/server/botQueryTools.ts#planNameById@198", "func:src/server/botQueryTools.ts#resolveToolSchema@231", "func:src/server/botQueryTools.ts#execute@253", "func:src/server/botQueryTools.ts#execute@297", "func:src/server/botQueryTools.ts#filter() 回调@310@310", "func:src/server/botQueryTools.ts#execute@349", "func:src/server/botQueryTools.ts#execute@430", "func:src/server/botQueryTools.ts#addDays@440", "func:src/server/botQueryTools.ts#execute@500", "func:src/server/botQueryTools.ts#filter() 回调@516@516", "func:src/server/botQueryTools.ts#execute@542", "func:src/server/botQueryTools.ts#getBotToolByName@583" ] }, { "id": "file:src/server/aiChatService.ts", "kind": "file", "name": "aiChatService.ts", "location": { "file": "src/server/aiChatService.ts", "startLine": 1, "endLine": 261 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/server", "path": "src/server/aiChatService.ts", "loc": 261, "containerIds": [], "functionIds": [ "func:src/server/aiChatService.ts#isAiConfigured@30", "func:src/server/aiChatService.ts#getMemoryTurns@62", "func:src/server/aiChatService.ts#appendMemoryTurn@72", "func:src/server/aiChatService.ts#clearBotMemory@79", "func:src/server/aiChatService.ts#setInterval() 回调@84@84", "func:src/server/aiChatService.ts#buildToolSpecs@93", "func:src/server/aiChatService.ts#map() 回调@94@94", "func:src/server/aiChatService.ts#buildSystemPrompt@107", "func:src/server/aiChatService.ts#callChatCompletion@124", "func:src/server/aiChatService.ts#executeToolCall@156", "func:src/server/aiChatService.ts#answerBotQuestion@185", "func:src/server/aiChatService.ts#@0" ] }, { "id": "file:server.ts", "kind": "file", "name": "server.ts", "location": { "file": "server.ts", "startLine": 1, "endLine": 1261 }, "language": "typescript", "provenance": "ast", "moduleId": "module:.", "path": "server.ts", "loc": 1261, "containerIds": [], "functionIds": [ "func:server.ts#ensureManualLoginPeople@84", "func:server.ts#GET /api/health@90", "func:server.ts#readRemoteError@98", "func:server.ts#readRemoteJson@110", "func:server.ts#ensureDingTalkRobotConfigured@122", "func:server.ts#getDingTalkRobotAccessToken@128", "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "func:server.ts#replyToDingTalkSession@204", "func:server.ts#replyToDingTalkSessionMarkdown@222", "func:server.ts#getTaskRelatedPersonNames@239", "func:server.ts#getWorkflowLink@252", "func:server.ts#getZonedDateParts@261", "func:server.ts#value@271", "func:server.ts#getPersonNamesForDueNodeReminder@280", "func:server.ts#getDueTimeRanges@290", "func:server.ts#sendDailyDueNodeReminder@298", "func:server.ts#notifyTaskConfirmedCompleted@363", "func:server.ts#ensureSsoConfigured@417", "func:server.ts#getSsoRedirectUri@423", "func:server.ts#getSsoAuthUrl@432", "func:server.ts#getSsoUserAccessToken@444", "func:server.ts#getSsoCurrentUser@471", "func:server.ts#GET /api/auth/sso-config@498", "func:server.ts#GET /api/auth/sso-login-url@508", "func:server.ts#handleSsoCallback@520", "func:server.ts#GET /api/auth/manual-users@559", "func:server.ts#POST /api/auth/manual-login@563", "func:server.ts#POST /api/auth/dev-login@575", "func:server.ts#POST /api/auth/sso-login@605", "func:server.ts#POST /api/auth/sso-join-person@642", "func:server.ts#GET /api/people@669", "func:server.ts#POST /api/people@678", "func:server.ts#PUT /api/people/:id@687", "func:server.ts#DELETE /api/people/:id@696", "func:server.ts#POST /api/dingtalk/robot/send-message@705", "func:server.ts#GET /api/tags@737", "func:server.ts#POST /api/tags@745", "func:server.ts#DELETE /api/tags/:id@754", "func:server.ts#GET /api/weekly-plans@764", "func:server.ts#POST /api/weekly-plans@772", "func:server.ts#DELETE /api/weekly-plans/:id@781", "func:server.ts#GET /api/project-templates@791", "func:server.ts#POST /api/project-templates@799", "func:server.ts#PUT /api/project-templates/:id@808", "func:server.ts#DELETE /api/project-templates/:id@817", "func:server.ts#GET /api/tasks@826", "func:server.ts#GET /api/tasks/:id@834", "func:server.ts#POST /api/tasks@843", "func:server.ts#PATCH /api/tasks/:id/list-state@852", "func:server.ts#PUT /api/tasks/:id@865", "func:server.ts#catch() 回调@876@876", "func:server.ts#DELETE /api/tasks/:id@886", "func:server.ts#POST /api/tasks/:id/nodes@895", "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "func:server.ts#POST /api/tasks/:id/dependencies@925", "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "func:server.ts#POST /api/notify@944", "func:server.ts#GET /api/logs@1041", "func:server.ts#DELETE /api/logs@1049", "func:server.ts#normalizeActionType@1058", "func:server.ts#getNotificationState@1065", "func:server.ts#startDailyDueNodeReminderScheduler@1089", "func:server.ts#checkAndRun@1090", "func:server.ts#catch() 回调@1098@1098", "func:server.ts#handleDingTalkRobotMessage@1114", "func:server.ts#replyText@1147", "func:server.ts#startDingTalkRobotStream@1204", "func:server.ts#registerCallbackListener() 回调@1215@1215", "func:server.ts#catch() 回调@1218@1218", "func:server.ts#then() 回调@1225@1225", "func:server.ts#catch() 回调@1228@1228", "func:server.ts#startServer@1235", "func:server.ts#GET *@1245", "func:server.ts#listen() 回调@1250@1250", "func:server.ts#catch() 回调@1257@1257", "func:server.ts#@0" ] }, { "id": "file:src/utils/date.ts", "kind": "file", "name": "date.ts", "location": { "file": "src/utils/date.ts", "startLine": 1, "endLine": 8 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/utils", "path": "src/utils/date.ts", "loc": 8, "containerIds": [], "functionIds": [ "func:src/utils/date.ts#getLocalDateString@1" ] }, { "id": "file:src/utils/nodeTimeRanges.ts", "kind": "file", "name": "nodeTimeRanges.ts", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 1, "endLine": 148 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/utils", "path": "src/utils/nodeTimeRanges.ts", "loc": 148, "containerIds": [], "functionIds": [ "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107" ] }, { "id": "file:src/utils/taskStatus.ts", "kind": "file", "name": "taskStatus.ts", "location": { "file": "src/utils/taskStatus.ts", "startLine": 1, "endLine": 94 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/utils", "path": "src/utils/taskStatus.ts", "loc": 94, "containerIds": [], "functionIds": [ "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "func:src/utils/taskStatus.ts#getTaskStatusMeta@50" ] }, { "id": "file:src/utils/taskPriority.ts", "kind": "file", "name": "taskPriority.ts", "location": { "file": "src/utils/taskPriority.ts", "startLine": 1, "endLine": 36 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/utils", "path": "src/utils/taskPriority.ts", "loc": 36, "containerIds": [], "functionIds": [ "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" ] }, { "id": "file:src/components/TaskList.tsx", "kind": "file", "name": "TaskList.tsx", "location": { "file": "src/components/TaskList.tsx", "startLine": 1, "endLine": 514 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/TaskList.tsx", "loc": 514, "containerIds": [], "functionIds": [ "func:src/components/TaskList.tsx#TaskList@47", "func:src/components/TaskList.tsx#reduce() 回调@77@77", "func:src/components/TaskList.tsx#toggleSelectedTag@91", "func:src/components/TaskList.tsx#toggleSelectedStatus@97", "func:src/components/TaskList.tsx#toggleSelectedPriority@103", "func:src/components/TaskList.tsx#filter() 回调@110@110", "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "func:src/components/TaskList.tsx#find() 回调@139@139", "func:src/components/TaskList.tsx#clearQueueDropState@147", "func:src/components/TaskList.tsx#map() 回调@202@202", "func:src/components/TaskList.tsx#map() 回调@265@265", "func:src/components/TaskList.tsx#map() 回调@297@297", "func:src/components/TaskList.tsx#匿名函数@353@353", "func:src/components/TaskList.tsx#匿名函数@366@366", "func:src/components/TaskList.tsx#匿名函数@371@371", "func:src/components/TaskList.tsx#map() 回调@387@387", "func:src/components/TaskList.tsx#匿名函数@400@400", "func:src/components/TaskList.tsx#匿名函数@410@410", "func:src/components/TaskList.tsx#匿名函数@442@442", "func:src/components/TaskList.tsx#匿名函数@458@458" ] }, { "id": "file:src/components/WeeklyPlanList.tsx", "kind": "file", "name": "WeeklyPlanList.tsx", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 1, "endLine": 370 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/WeeklyPlanList.tsx", "loc": 370, "containerIds": [], "functionIds": [ "func:src/components/WeeklyPlanList.tsx#addDays@20", "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", "func:src/components/WeeklyPlanList.tsx#resetForm@70", "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219" ] }, { "id": "file:src/components/WorkflowCanvas.tsx", "kind": "file", "name": "WorkflowCanvas.tsx", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 1, "endLine": 1125 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/WorkflowCanvas.tsx", "loc": 1125, "containerIds": [], "functionIds": [ "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "func:src/components/WorkflowCanvas.tsx#isAncestor@265", "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", "func:src/components/WorkflowCanvas.tsx#addConnection@282", "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "func:src/components/WorkflowCanvas.tsx#toMs@623", "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073" ] }, { "id": "file:src/components/ProjectCreateModal.tsx", "kind": "file", "name": "ProjectCreateModal.tsx", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 1, "endLine": 318 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/ProjectCreateModal.tsx", "loc": 318, "containerIds": [], "functionIds": [ "func:src/components/ProjectCreateModal.tsx#toDateMs@23", "func:src/components/ProjectCreateModal.tsx#addDays@27", "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", "func:src/components/ProjectCreateModal.tsx#toggleTag@146", "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271" ] }, { "id": "file:src/components/TaskOverview.tsx", "kind": "file", "name": "TaskOverview.tsx", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 1, "endLine": 464 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/TaskOverview.tsx", "loc": 464, "containerIds": [], "functionIds": [ "func:src/components/TaskOverview.tsx#TaskOverview@14", "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", "func:src/components/TaskOverview.tsx#handleSave@64", "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", "func:src/components/TaskOverview.tsx#toggleEditTag@89", "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", "func:src/components/TaskOverview.tsx#map() 回调@240@240", "func:src/components/TaskOverview.tsx#map() 回调@294@294" ] }, { "id": "file:src/components/GanttChart.tsx", "kind": "file", "name": "GanttChart.tsx", "location": { "file": "src/components/GanttChart.tsx", "startLine": 1, "endLine": 428 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/GanttChart.tsx", "loc": 428, "containerIds": [], "functionIds": [ "func:src/components/GanttChart.tsx#GanttChart@14", "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", "func:src/components/GanttChart.tsx#from() 回调@29@29", "func:src/components/GanttChart.tsx#forEach() 回调@40@40", "func:src/components/GanttChart.tsx#forEach() 回调@41@41", "func:src/components/GanttChart.tsx#formatDateString@76", "func:src/components/GanttChart.tsx#getDayLabel@80", "func:src/components/GanttChart.tsx#isWeekend@86", "func:src/components/GanttChart.tsx#getTimelinePercentage@92", "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", "func:src/components/GanttChart.tsx#stopTimelineDrag@155", "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "func:src/components/GanttChart.tsx#map() 回调@260@260", "func:src/components/GanttChart.tsx#map() 回调@304@304", "func:src/components/GanttChart.tsx#map() 回调@375@375", "func:src/components/GanttChart.tsx#map() 回调@389@389", "func:src/components/GanttChart.tsx#匿名函数@399@399" ] }, { "id": "file:src/components/PersonGanttChart.tsx", "kind": "file", "name": "PersonGanttChart.tsx", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 1, "endLine": 425 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/PersonGanttChart.tsx", "loc": 425, "containerIds": [], "functionIds": [ "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", "func:src/components/PersonGanttChart.tsx#buildDateRange@379", "func:src/components/PersonGanttChart.tsx#getDayLabel@393", "func:src/components/PersonGanttChart.tsx#getStatusVisual@398" ] }, { "id": "file:src/components/PeopleManager.tsx", "kind": "file", "name": "PeopleManager.tsx", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 1, "endLine": 329 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/PeopleManager.tsx", "loc": 329, "containerIds": [], "functionIds": [ "func:src/components/PeopleManager.tsx#getSearchTokens@29", "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", "func:src/components/PeopleManager.tsx#PeopleManager@58", "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", "func:src/components/PeopleManager.tsx#handleSaveRole@127", "func:src/components/PeopleManager.tsx#匿名函数@250@250", "func:src/components/PeopleManager.tsx#匿名函数@280@280", "func:src/components/PeopleManager.tsx#匿名函数@285@285" ] }, { "id": "file:src/utils/api.ts", "kind": "file", "name": "api.ts", "location": { "file": "src/utils/api.ts", "startLine": 1, "endLine": 18 }, "language": "typescript", "provenance": "ast", "moduleId": "module:src/utils", "path": "src/utils/api.ts", "loc": 18, "containerIds": [], "functionIds": [ "func:src/utils/api.ts#appPath@7", "func:src/utils/api.ts#apiPath@15" ] }, { "id": "file:src/components/LoginPage.tsx", "kind": "file", "name": "LoginPage.tsx", "location": { "file": "src/components/LoginPage.tsx", "startLine": 1, "endLine": 188 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/LoginPage.tsx", "loc": 188, "containerIds": [], "functionIds": [ "func:src/components/LoginPage.tsx#readApiJson@21", "func:src/components/LoginPage.tsx#createOAuthState@31", "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "func:src/components/LoginPage.tsx#匿名函数@40@40", "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", "func:src/components/LoginPage.tsx#handleMessage@58", "func:src/components/LoginPage.tsx#LoginPage@84", "func:src/components/LoginPage.tsx#handleSsoLogin@90", "func:src/components/LoginPage.tsx#handleDevLogin@121" ] }, { "id": "file:src/components/TagManager.tsx", "kind": "file", "name": "TagManager.tsx", "location": { "file": "src/components/TagManager.tsx", "startLine": 1, "endLine": 158 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/TagManager.tsx", "loc": 158, "containerIds": [], "functionIds": [ "func:src/components/TagManager.tsx#TagManager@11", "func:src/components/TagManager.tsx#useMemo() 回调@17@17", "func:src/components/TagManager.tsx#handleSubmit@23", "func:src/components/TagManager.tsx#匿名函数@136@136" ] }, { "id": "file:src/components/ProjectTemplateManager.tsx", "kind": "file", "name": "ProjectTemplateManager.tsx", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 1, "endLine": 535 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/ProjectTemplateManager.tsx", "loc": 535, "containerIds": [], "functionIds": [ "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504" ] }, { "id": "file:src/components/NodeEditorDrawer.tsx", "kind": "file", "name": "NodeEditorDrawer.tsx", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 1, "endLine": 756 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/NodeEditorDrawer.tsx", "loc": 756, "containerIds": [], "functionIds": [ "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "func:src/components/NodeEditorDrawer.tsx#completeNode@328", "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", "func:src/components/NodeEditorDrawer.tsx#@0" ] }, { "id": "file:src/components/WeeklyOverview.tsx", "kind": "file", "name": "WeeklyOverview.tsx", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 1, "endLine": 880 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/WeeklyOverview.tsx", "loc": 880, "containerIds": [], "functionIds": [ "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "func:src/components/WeeklyOverview.tsx#sortTasks@82", "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", "func:src/components/WeeklyOverview.tsx#matchesFilters@290", "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", "func:src/components/WeeklyOverview.tsx#map() 回调@840@840" ] }, { "id": "file:src/App.tsx", "kind": "file", "name": "App.tsx", "location": { "file": "src/App.tsx", "startLine": 1, "endLine": 1975 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src", "path": "src/App.tsx", "loc": 1975, "containerIds": [], "functionIds": [ "func:src/App.tsx#readApiError@39", "func:src/App.tsx#readApiJson@44", "func:src/App.tsx#sortTasksForList@54", "func:src/App.tsx#sort() 回调@55@55", "func:src/App.tsx#readStoredAuthUser@62", "func:src/App.tsx#App@84", "func:src/App.tsx#useEffect() 回调@133@133", "func:src/App.tsx#useEffect() 回调@147@147", "func:src/App.tsx#useEffect() 回调@153@153", "func:src/App.tsx#useEffect() 回调@159@159", "func:src/App.tsx#useEffect() 回调@171@171", "func:src/App.tsx#useEffect() 回调@178@178", "func:src/App.tsx#useEffect() 回调@186@186", "func:src/App.tsx#useEffect() 回调@213@213", "func:src/App.tsx#匿名函数@214@214", "func:src/App.tsx#fetchTasks@221", "func:src/App.tsx#fetchPeople@241", "func:src/App.tsx#fetchTags@256", "func:src/App.tsx#handleCreateTag@271", "func:src/App.tsx#setTags() 回调@281@281", "func:src/App.tsx#handleDeleteTag@297", "func:src/App.tsx#fetchProjectTemplates@323", "func:src/App.tsx#fetchWeeklyPlans@338", "func:src/App.tsx#handleCreateWeeklyPlan@353", "func:src/App.tsx#handleDeleteWeeklyPlan@385", "func:src/App.tsx#setWeeklyPlans() 回调@402@402", "func:src/App.tsx#handleCreateProjectTemplate@427", "func:src/App.tsx#handleUpdateProjectTemplate@450", "func:src/App.tsx#handleDeleteProjectTemplate@478", "func:src/App.tsx#handleCreatePerson@498", "func:src/App.tsx#setPeople() 回调@508@508", "func:src/App.tsx#handleJoinSsoPerson@521", "func:src/App.tsx#setPeople() 回调@532@532", "func:src/App.tsx#handleDeletePerson@548", "func:src/App.tsx#handleUpdatePersonRole@565", "func:src/App.tsx#handleTogglePersonAdmin@605", "func:src/App.tsx#handleLogin@639", "func:src/App.tsx#handleUnlockAdmin@650", "func:src/App.tsx#handleCurrentUserClick@678", "func:src/App.tsx#handleLogout@696", "func:src/App.tsx#useMemo() 回调@720@720", "func:src/App.tsx#useMemo() 回调@726@726", "func:src/App.tsx#useMemo() 回调@730@730", "func:src/App.tsx#useEffect() 回调@734@734", "func:src/App.tsx#handleSelectWeeklyPlan@750", "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", "func:src/App.tsx#handleReorderTask@798", "func:src/App.tsx#handleSelectTask@849", "func:src/App.tsx#handleStartCreateProject@856", "func:src/App.tsx#handleCancelCreateProject@865", "func:src/App.tsx#handleSelectNode@870", "func:src/App.tsx#handleOpenTaskFromOverview@877", "func:src/App.tsx#handleOpenPlanFromOverview@888", "func:src/App.tsx#handleSelectTaskNode@899", "func:src/App.tsx#handleNavigateDrawerView@926", "func:src/App.tsx#handleWorkspaceClick@957", "func:src/App.tsx#computeCenteredViewport@981", "func:src/App.tsx#focusNodeInCanvas@1016", "func:src/App.tsx#animate@1042", "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", "func:src/App.tsx#animate@1088", "func:src/App.tsx#useEffect() 回调@1109@1109", "func:src/App.tsx#useEffect() 回调@1121@1121", "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", "func:src/App.tsx#applyCentered@1149", "func:src/App.tsx#handleCreateTask@1165", "func:src/App.tsx#handleQuickRequirement@1212", "func:src/App.tsx#handleSubmitRequirement@1219", "func:src/App.tsx#handleToggleTaskPinned@1278", "func:src/App.tsx#handleDeleteTask@1299", "func:src/App.tsx#handleUpdateTaskMetadata@1329", "func:src/App.tsx#handleRefreshTask@1353", "func:src/App.tsx#handleUpdateNodes@1371", "func:src/App.tsx#edgeKey@1383", "func:src/App.tsx#filter() 回调@1393@1393", "func:src/App.tsx#requestTaskUpdate@1425", "func:src/App.tsx#map() 回调@1526@1526", "func:src/App.tsx#匿名函数@1533@1533", "func:src/App.tsx#匿名函数@1557@1557", "func:src/App.tsx#map() 回调@1700@1700" ] }, { "id": "file:src/components/DingTalkLogs.tsx", "kind": "file", "name": "DingTalkLogs.tsx", "location": { "file": "src/components/DingTalkLogs.tsx", "startLine": 1, "endLine": 159 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src/components", "path": "src/components/DingTalkLogs.tsx", "loc": 159, "containerIds": [], "functionIds": [ "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", "func:src/components/DingTalkLogs.tsx#map() 回调@76@76" ] }, { "id": "file:src/main.tsx", "kind": "file", "name": "main.tsx", "location": { "file": "src/main.tsx", "startLine": 1, "endLine": 11 }, "language": "tsx", "provenance": "ast", "moduleId": "module:src", "path": "src/main.tsx", "loc": 11, "containerIds": [], "functionIds": [ "func:src/main.tsx#@0" ] }, { "id": "file:vite.config.ts", "kind": "file", "name": "vite.config.ts", "location": { "file": "vite.config.ts", "startLine": 1, "endLine": 39 }, "language": "typescript", "provenance": "ast", "moduleId": "module:.", "path": "vite.config.ts", "loc": 39, "containerIds": [], "functionIds": [ "func:vite.config.ts#normalizeBasePath@6", "func:vite.config.ts#defineConfig() 回调@12@12", "func:vite.config.ts#@0" ] } ], "containers": [], "functions": [ { "id": "func:src/types.ts#isPublicPoolPlan@68", "kind": "function", "name": "isPublicPoolPlan", "qualifiedName": "isPublicPoolPlan", "location": { "file": "src/types.ts", "startLine": 68, "endLine": 70, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/types.ts", "moduleId": "module:src", "signature": "isPublicPoolPlan(id: string | null | undefined): boolean", "params": [ { "name": "id", "typeRef": "string | null | undefined", "optional": false } ], "returnType": "boolean", "loc": 3 }, { "id": "func:prisma/seed.ts#dateFromInput@9", "kind": "function", "name": "dateFromInput", "qualifiedName": "dateFromInput", "location": { "file": "prisma/seed.ts", "startLine": 9, "endLine": 11, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma/seed.ts", "moduleId": "module:prisma", "signature": "dateFromInput(value: string): Date", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "returnType": "Date", "loc": 3 }, { "id": "func:prisma/seed.ts#seed@13", "kind": "function", "name": "seed", "qualifiedName": "seed", "location": { "file": "prisma/seed.ts", "startLine": 13, "endLine": 99, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma/seed.ts", "moduleId": "module:prisma", "signature": "seed()", "params": [], "loc": 87, "interactions": [ { "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:notificationLog", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "notificationLog", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "task", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "weeklyPlan", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "person", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "weeklyPlan", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "task", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:nodeDependency", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "nodeDependency", "engine": "prisma" }, { "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "person", "engine": "prisma" } ] }, { "id": "func:prisma/seed.ts#then() 回调@102@102", "kind": "function", "name": "then() 回调@102", "qualifiedName": "then() 回调@102", "location": { "file": "prisma/seed.ts", "startLine": 102, "endLine": 104, "startCol": 9, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma/seed.ts", "moduleId": "module:prisma", "signature": "then() 回调@102()", "params": [], "loc": 3 }, { "id": "func:prisma/seed.ts#catch() 回调@105@105", "kind": "function", "name": "catch() 回调@105", "qualifiedName": "catch() 回调@105", "location": { "file": "prisma/seed.ts", "startLine": 105, "endLine": 109, "startCol": 10, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma/seed.ts", "moduleId": "module:prisma", "signature": "catch() 回调@105(error)", "params": [ { "name": "error", "optional": false } ], "loc": 5 }, { "id": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "kind": "function", "name": "dateFromInput", "qualifiedName": "dateFromInput", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 4, "endLine": 7, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "dateFromInput(value: string): Date", "params": [ { "name": "value", "typeRef": "string", "optional": true } ], "returnType": "Date", "loc": 4 }, { "id": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "kind": "function", "name": "dateToInput", "qualifiedName": "dateToInput", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 9, "endLine": 11, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "dateToInput(value: Date): string", "params": [ { "name": "value", "typeRef": "Date", "optional": false } ], "returnType": "string", "loc": 3 }, { "id": "func:src/server/weeklyPlanRepository.ts#addDays@13", "kind": "function", "name": "addDays", "qualifiedName": "addDays", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 13, "endLine": 17, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "addDays(value: string, days: number)", "params": [ { "name": "value", "typeRef": "string", "optional": false }, { "name": "days", "typeRef": "number", "optional": false } ], "loc": 5 }, { "id": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "kind": "function", "name": "toWeeklyPlan", "qualifiedName": "toWeeklyPlan", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 19, "endLine": 31, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "toWeeklyPlan(plan: {\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}): WeeklyPlan", "params": [ { "name": "plan", "typeRef": "{\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}", "optional": false } ], "returnType": "WeeklyPlan", "loc": 13 }, { "id": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "kind": "function", "name": "ensurePublicPoolPlan", "qualifiedName": "ensurePublicPoolPlan", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 34, "endLine": 48, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "ensurePublicPoolPlan(): Promise", "params": [], "returnType": "Promise", "loc": 15, "interactions": [ { "id": "ix:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34:db:out:create:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "weeklyPlan", "engine": "prisma" } ] }, { "id": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "kind": "function", "name": "getDefaultWeeklyPlan", "qualifiedName": "getDefaultWeeklyPlan", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 51, "endLine": 53, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "getDefaultWeeklyPlan(): Promise", "params": [], "returnType": "Promise", "loc": 3 }, { "id": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "kind": "function", "name": "listWeeklyPlans", "qualifiedName": "listWeeklyPlans", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 55, "endLine": 67, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "listWeeklyPlans(): Promise", "params": [], "returnType": "Promise", "loc": 13, "interactions": [ { "id": "ix:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55:db:out:read:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "weeklyPlan", "engine": "prisma" } ] }, { "id": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "kind": "function", "name": "createWeeklyPlan", "qualifiedName": "createWeeklyPlan", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 69, "endLine": 91, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "createWeeklyPlan(input: Partial): Promise", "params": [ { "name": "input", "typeRef": "Partial", "optional": false } ], "returnType": "Promise", "loc": 23, "interactions": [ { "id": "ix:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69:db:out:create:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "weeklyPlan", "engine": "prisma" } ] }, { "id": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "kind": "function", "name": "getWeeklyPlanOrThrow", "qualifiedName": "getWeeklyPlanOrThrow", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 93, "endLine": 100, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "getWeeklyPlanOrThrow(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 8, "interactions": [ { "id": "ix:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93:db:out:read:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "weeklyPlan", "engine": "prisma" } ] }, { "id": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "kind": "function", "name": "deleteWeeklyPlan", "qualifiedName": "deleteWeeklyPlan", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 102, "endLine": 163, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "deleteWeeklyPlan(id: string): Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", "loc": 62, "interactions": [ { "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:read:weeklyPlan", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "weeklyPlan", "engine": "prisma" }, { "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128", "kind": "function", "name": "$transaction() 回调@128", "qualifiedName": "$transaction() 回调@128", "location": { "file": "src/server/weeklyPlanRepository.ts", "startLine": 128, "endLine": 154, "startCol": 54, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/weeklyPlanRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@128(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 27 }, { "id": "func:src/server/taskRepository.ts#dateFromInput@31", "kind": "function", "name": "dateFromInput", "qualifiedName": "dateFromInput", "location": { "file": "src/server/taskRepository.ts", "startLine": 31, "endLine": 34, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "dateFromInput(value: string): Date", "params": [ { "name": "value", "typeRef": "string", "optional": true } ], "returnType": "Date", "loc": 4 }, { "id": "func:src/server/taskRepository.ts#dateToInput@36", "kind": "function", "name": "dateToInput", "qualifiedName": "dateToInput", "location": { "file": "src/server/taskRepository.ts", "startLine": 36, "endLine": 38, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "dateToInput(value: Date): string", "params": [ { "name": "value", "typeRef": "Date", "optional": false } ], "returnType": "string", "loc": 3 }, { "id": "func:src/server/taskRepository.ts#uniqueValues@40", "kind": "function", "name": "uniqueValues", "qualifiedName": "uniqueValues", "location": { "file": "src/server/taskRepository.ts", "startLine": 40, "endLine": 42, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "uniqueValues(values: string[]): string[]", "params": [ { "name": "values", "typeRef": "string[]", "optional": true, "defaultValue": "[]" } ], "returnType": "string[]", "loc": 3 }, { "id": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "kind": "function", "name": "normalizeNodeProgress", "qualifiedName": "normalizeNodeProgress", "location": { "file": "src/server/taskRepository.ts", "startLine": 44, "endLine": 48, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "normalizeNodeProgress(value: unknown): number", "params": [ { "name": "value", "typeRef": "unknown", "optional": false } ], "returnType": "number", "loc": 5 }, { "id": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "kind": "function", "name": "normalizeNodeTimeRanges", "qualifiedName": "normalizeNodeTimeRanges", "location": { "file": "src/server/taskRepository.ts", "startLine": 50, "endLine": 79, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", "params": [ { "name": "ranges", "typeRef": "unknown", "optional": false }, { "name": "fallbackStartDate", "typeRef": "string", "optional": false }, { "name": "fallbackEndDate", "optional": true, "defaultValue": "fallbackStartDate" } ], "returnType": "NodeTimeRange[]", "loc": 30 }, { "id": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "kind": "function", "name": "getNodeTimeBounds", "qualifiedName": "getNodeTimeBounds", "location": { "file": "src/server/taskRepository.ts", "startLine": 81, "endLine": 88, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "getNodeTimeBounds(node: Pick)", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "loc": 8 }, { "id": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "kind": "function", "name": "nodeTimeRangesToJson", "qualifiedName": "nodeTimeRangesToJson", "location": { "file": "src/server/taskRepository.ts", "startLine": 90, "endLine": 94, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "nodeTimeRangesToJson(node: Pick): Prisma.InputJsonValue", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "returnType": "Prisma.InputJsonValue", "loc": 5 }, { "id": "func:src/server/taskRepository.ts#existingTagNames@96", "kind": "function", "name": "existingTagNames", "qualifiedName": "existingTagNames", "location": { "file": "src/server/taskRepository.ts", "startLine": 96, "endLine": 109, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "existingTagNames(values: string[]): Promise", "params": [ { "name": "values", "typeRef": "string[]", "optional": true, "defaultValue": "[]" } ], "returnType": "Promise", "loc": 14, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#existingTagNames@96:db:out:read:tagDefinition", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "tagDefinition", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#findTaskRecord@111", "kind": "function", "name": "findTaskRecord", "qualifiedName": "findTaskRecord", "location": { "file": "src/server/taskRepository.ts", "startLine": 111, "endLine": 116, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "findTaskRecord(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 6, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#findTaskRecord@111:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#toWorkflowNode@118", "kind": "function", "name": "toWorkflowNode", "qualifiedName": "toWorkflowNode", "location": { "file": "src/server/taskRepository.ts", "startLine": 118, "endLine": 140, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "toWorkflowNode(node: NonNullable[\"nodes\"][number]): WorkflowNode", "params": [ { "name": "node", "typeRef": "NonNullable[\"nodes\"][number]", "optional": false } ], "returnType": "WorkflowNode", "loc": 23 }, { "id": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "kind": "function", "name": "normalizeTaskCompletionStatus", "qualifiedName": "normalizeTaskCompletionStatus", "location": { "file": "src/server/taskRepository.ts", "startLine": 142, "endLine": 146, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "normalizeTaskCompletionStatus(value: string): \"incomplete\" | \"confirmed_completed\" | undefined", "params": [ { "name": "value", "typeRef": "string", "optional": true } ], "returnType": "\"incomplete\" | \"confirmed_completed\" | undefined", "loc": 5 }, { "id": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "kind": "function", "name": "normalizeTaskPriority", "qualifiedName": "normalizeTaskPriority", "location": { "file": "src/server/taskRepository.ts", "startLine": 148, "endLine": 151, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "normalizeTaskPriority(value: string): TaskPriority | undefined", "params": [ { "name": "value", "typeRef": "string", "optional": true } ], "returnType": "TaskPriority | undefined", "loc": 4 }, { "id": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "kind": "function", "name": "resolveTaskCompletionStatus", "qualifiedName": "resolveTaskCompletionStatus", "location": { "file": "src/server/taskRepository.ts", "startLine": 153, "endLine": 161, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "resolveTaskCompletionStatus(task: NonNullable): TaskCompletionStatus", "params": [ { "name": "task", "typeRef": "NonNullable", "optional": false } ], "returnType": "TaskCompletionStatus", "loc": 9 }, { "id": "func:src/server/taskRepository.ts#toTask@163", "kind": "function", "name": "toTask", "qualifiedName": "toTask", "location": { "file": "src/server/taskRepository.ts", "startLine": 163, "endLine": 180, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "toTask(task: NonNullable): Task", "params": [ { "name": "task", "typeRef": "NonNullable", "optional": false } ], "returnType": "Task", "loc": 18 }, { "id": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "function", "name": "getTaskOrThrow", "qualifiedName": "getTaskOrThrow", "location": { "file": "src/server/taskRepository.ts", "startLine": 182, "endLine": 188, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "getTaskOrThrow(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 7 }, { "id": "func:src/server/taskRepository.ts#getTask@190", "kind": "function", "name": "getTask", "qualifiedName": "getTask", "location": { "file": "src/server/taskRepository.ts", "startLine": 190, "endLine": 192, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "getTask(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 3 }, { "id": "func:src/server/taskRepository.ts#listTasks@194", "kind": "function", "name": "listTasks", "qualifiedName": "listTasks", "location": { "file": "src/server/taskRepository.ts", "startLine": 194, "endLine": 205, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "listTasks(): Promise", "params": [], "returnType": "Promise", "loc": 12, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#listTasks@194:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "kind": "function", "name": "getNextTaskSortOrder", "qualifiedName": "getNextTaskSortOrder", "location": { "file": "src/server/taskRepository.ts", "startLine": 207, "endLine": 215, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "getNextTaskSortOrder(isPinned)", "params": [ { "name": "isPinned", "optional": true, "defaultValue": "false" } ], "loc": 9, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#getNextTaskSortOrder@207:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "kind": "function", "name": "getFirstTaskSortOrder", "qualifiedName": "getFirstTaskSortOrder", "location": { "file": "src/server/taskRepository.ts", "startLine": 217, "endLine": 225, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "getFirstTaskSortOrder(isPinned)", "params": [ { "name": "isPinned", "optional": true, "defaultValue": "false" } ], "loc": 9, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#createTask@227", "kind": "function", "name": "createTask", "qualifiedName": "createTask", "location": { "file": "src/server/taskRepository.ts", "startLine": 227, "endLine": 300, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "createTask(input: {\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}): Promise", "params": [ { "name": "input", "typeRef": "{\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}", "optional": false } ], "returnType": "Promise", "loc": 74, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#createTask@227:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "kind": "function", "name": "$transaction() 回调@273", "qualifiedName": "$transaction() 回调@273", "location": { "file": "src/server/taskRepository.ts", "startLine": 273, "endLine": 297, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@273(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 25 }, { "id": "func:src/server/taskRepository.ts#updateTask@302", "kind": "function", "name": "updateTask", "qualifiedName": "updateTask", "location": { "file": "src/server/taskRepository.ts", "startLine": 302, "endLine": 351, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "updateTask(id: string, input: Partial>): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "Partial>", "optional": false } ], "returnType": "Promise", "loc": 50, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" }, { "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "kind": "function", "name": "$transaction() 回调@313", "qualifiedName": "$transaction() 回调@313", "location": { "file": "src/server/taskRepository.ts", "startLine": 313, "endLine": 348, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@313(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 36 }, { "id": "func:src/server/taskRepository.ts#updateTaskListState@353", "kind": "function", "name": "updateTaskListState", "qualifiedName": "updateTaskListState", "location": { "file": "src/server/taskRepository.ts", "startLine": 353, "endLine": 381, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "updateTaskListState(id: string, input: { isPinned?: boolean; sortOrder?: number }): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "{ isPinned?: boolean; sortOrder?: number }", "optional": false } ], "returnType": "Promise", "loc": 29, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" }, { "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:update:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "update", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#deleteTask@383", "kind": "function", "name": "deleteTask", "qualifiedName": "deleteTask", "location": { "file": "src/server/taskRepository.ts", "startLine": 383, "endLine": 387, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "deleteTask(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 5, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#deleteTask@383:db:out:delete:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#createWorkflowNode@389", "kind": "function", "name": "createWorkflowNode", "qualifiedName": "createWorkflowNode", "location": { "file": "src/server/taskRepository.ts", "startLine": 389, "endLine": 421, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "createWorkflowNode(taskId: string, input: WorkflowNode): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "Promise", "loc": 33, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#createWorkflowNode@389:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "kind": "function", "name": "$transaction() 回调@392", "qualifiedName": "$transaction() 回调@392", "location": { "file": "src/server/taskRepository.ts", "startLine": 392, "endLine": 418, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@392(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 27 }, { "id": "func:src/server/taskRepository.ts#updateWorkflowNode@423", "kind": "function", "name": "updateWorkflowNode", "qualifiedName": "updateWorkflowNode", "location": { "file": "src/server/taskRepository.ts", "startLine": 423, "endLine": 470, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "updateWorkflowNode(taskId: string, nodeId: string, input: Partial): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodeId", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "Partial", "optional": false } ], "returnType": "Promise", "loc": 48, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#updateWorkflowNode@423:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "kind": "function", "name": "$transaction() 回调@430", "qualifiedName": "$transaction() 回调@430", "location": { "file": "src/server/taskRepository.ts", "startLine": 430, "endLine": 467, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@430(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 38 }, { "id": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "kind": "function", "name": "deleteWorkflowNode", "qualifiedName": "deleteWorkflowNode", "location": { "file": "src/server/taskRepository.ts", "startLine": 472, "endLine": 492, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "deleteWorkflowNode(taskId: string, nodeId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodeId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 21, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:read:workflowNode", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "workflowNode", "engine": "prisma" }, { "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@480@480", "kind": "function", "name": "$transaction() 回调@480", "qualifiedName": "$transaction() 回调@480", "location": { "file": "src/server/taskRepository.ts", "startLine": 480, "endLine": 489, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@480(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 10 }, { "id": "func:src/server/taskRepository.ts#createNodeDependency@494", "kind": "function", "name": "createNodeDependency", "qualifiedName": "createNodeDependency", "location": { "file": "src/server/taskRepository.ts", "startLine": 494, "endLine": 533, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "createNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "parentNodeId", "typeRef": "string", "optional": false }, { "name": "childNodeId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 40, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#createNodeDependency@494:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@510@510", "kind": "function", "name": "$transaction() 回调@510", "qualifiedName": "$transaction() 回调@510", "location": { "file": "src/server/taskRepository.ts", "startLine": 510, "endLine": 530, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@510(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 21 }, { "id": "func:src/server/taskRepository.ts#deleteNodeDependency@535", "kind": "function", "name": "deleteNodeDependency", "qualifiedName": "deleteNodeDependency", "location": { "file": "src/server/taskRepository.ts", "startLine": 535, "endLine": 558, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "deleteNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "parentNodeId", "typeRef": "string", "optional": false }, { "name": "childNodeId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 24, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#deleteNodeDependency@535:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#$transaction() 回调@542@542", "kind": "function", "name": "$transaction() 回调@542", "qualifiedName": "$transaction() 回调@542", "location": { "file": "src/server/taskRepository.ts", "startLine": 542, "endLine": 555, "startCol": 29, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "$transaction() 回调@542(tx)", "params": [ { "name": "tx", "optional": false } ], "loc": 14 }, { "id": "func:src/server/taskRepository.ts#ensureTaskExists@560", "kind": "function", "name": "ensureTaskExists", "qualifiedName": "ensureTaskExists", "location": { "file": "src/server/taskRepository.ts", "startLine": 560, "endLine": 565, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "ensureTaskExists(taskId: string)", "params": [ { "name": "taskId", "typeRef": "string", "optional": false } ], "loc": 6, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#ensureTaskExists@560:db:out:read:task", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "task", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "kind": "function", "name": "ensureWorkflowNodeExists", "qualifiedName": "ensureWorkflowNodeExists", "location": { "file": "src/server/taskRepository.ts", "startLine": 567, "endLine": 575, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "ensureWorkflowNodeExists(taskId: string, nodeId: string)", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodeId", "typeRef": "string", "optional": false } ], "loc": 9, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567:db:out:read:workflowNode", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "workflowNode", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#hasDependencyPath@577", "kind": "function", "name": "hasDependencyPath", "qualifiedName": "hasDependencyPath", "location": { "file": "src/server/taskRepository.ts", "startLine": 577, "endLine": 603, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "hasDependencyPath(taskId: string, fromNodeId: string, toNodeId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "fromNodeId", "typeRef": "string", "optional": false }, { "name": "toNodeId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 27, "interactions": [ { "id": "ix:func:src/server/taskRepository.ts#hasDependencyPath@577:db:out:read:nodeDependency", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "nodeDependency", "engine": "prisma" } ] }, { "id": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "kind": "function", "name": "replaceTaskNodes", "qualifiedName": "replaceTaskNodes", "location": { "file": "src/server/taskRepository.ts", "startLine": 605, "endLine": 669, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "replaceTaskNodes(tx: Parameters[0]>[0], taskId: string, nodes: WorkflowNode[])", "params": [ { "name": "tx", "typeRef": "Parameters[0]>[0]", "optional": false }, { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodes", "typeRef": "WorkflowNode[]", "optional": false } ], "loc": 65 }, { "id": "func:src/server/taskRepository.ts#map() 回调@618@618", "kind": "function", "name": "map() 回调@618", "qualifiedName": "map() 回调@618", "location": { "file": "src/server/taskRepository.ts", "startLine": 618, "endLine": 634, "startCol": 21, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/taskRepository.ts", "moduleId": "module:src/server", "signature": "map() 回调@618(node)", "params": [ { "name": "node", "optional": false } ], "loc": 17 }, { "id": "func:src/server/notificationRepository.ts#toNotificationLog@17", "kind": "function", "name": "toNotificationLog", "qualifiedName": "toNotificationLog", "location": { "file": "src/server/notificationRepository.ts", "startLine": 17, "endLine": 35, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/notificationRepository.ts", "moduleId": "module:src/server", "signature": "toNotificationLog(log: Awaited>): NotificationLog", "params": [ { "name": "log", "typeRef": "Awaited>", "optional": false } ], "returnType": "NotificationLog", "loc": 19 }, { "id": "func:src/server/notificationRepository.ts#createNotificationLog@37", "kind": "function", "name": "createNotificationLog", "qualifiedName": "createNotificationLog", "location": { "file": "src/server/notificationRepository.ts", "startLine": 37, "endLine": 45, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/notificationRepository.ts", "moduleId": "module:src/server", "signature": "createNotificationLog(input: CreateNotificationLogInput): Promise", "params": [ { "name": "input", "typeRef": "CreateNotificationLogInput", "optional": false } ], "returnType": "Promise", "loc": 9, "interactions": [ { "id": "ix:func:src/server/notificationRepository.ts#createNotificationLog@37:db:out:create:notificationLog", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "notificationLog", "engine": "prisma" } ] }, { "id": "func:src/server/notificationRepository.ts#listNotificationLogs@47", "kind": "function", "name": "listNotificationLogs", "qualifiedName": "listNotificationLogs", "location": { "file": "src/server/notificationRepository.ts", "startLine": 47, "endLine": 54, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/notificationRepository.ts", "moduleId": "module:src/server", "signature": "listNotificationLogs(limit): Promise", "params": [ { "name": "limit", "optional": true, "defaultValue": "50" } ], "returnType": "Promise", "loc": 8, "interactions": [ { "id": "ix:func:src/server/notificationRepository.ts#listNotificationLogs@47:db:out:read:notificationLog", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "notificationLog", "engine": "prisma" } ] }, { "id": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", "kind": "function", "name": "clearNotificationLogs", "qualifiedName": "clearNotificationLogs", "location": { "file": "src/server/notificationRepository.ts", "startLine": 56, "endLine": 58, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/notificationRepository.ts", "moduleId": "module:src/server", "signature": "clearNotificationLogs(): Promise", "params": [], "returnType": "Promise", "loc": 3, "interactions": [ { "id": "ix:func:src/server/notificationRepository.ts#clearNotificationLogs@56:db:out:delete:notificationLog", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "notificationLog", "engine": "prisma" } ] }, { "id": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "kind": "function", "name": "uniqueValues", "qualifiedName": "uniqueValues", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 13, "endLine": 15, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "uniqueValues(values: string[]): string[]", "params": [ { "name": "values", "typeRef": "string[]", "optional": true, "defaultValue": "[]" } ], "returnType": "string[]", "loc": 3 }, { "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "kind": "function", "name": "normalizeNodeProgress", "qualifiedName": "normalizeNodeProgress", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 17, "endLine": 21, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "normalizeNodeProgress(value: unknown): number", "params": [ { "name": "value", "typeRef": "unknown", "optional": false } ], "returnType": "number", "loc": 5 }, { "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "kind": "function", "name": "normalizeNodeTimeRanges", "qualifiedName": "normalizeNodeTimeRanges", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 23, "endLine": 52, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", "params": [ { "name": "ranges", "typeRef": "unknown", "optional": false }, { "name": "fallbackStartDate", "typeRef": "string", "optional": false }, { "name": "fallbackEndDate", "optional": true, "defaultValue": "fallbackStartDate" } ], "returnType": "NodeTimeRange[]", "loc": 30 }, { "id": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "kind": "function", "name": "normalizeTemplateNodes", "qualifiedName": "normalizeTemplateNodes", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 54, "endLine": 94, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "normalizeTemplateNodes(nodes: unknown): WorkflowNode[]", "params": [ { "name": "nodes", "typeRef": "unknown", "optional": false } ], "returnType": "WorkflowNode[]", "loc": 41 }, { "id": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "kind": "function", "name": "map() 回调@58", "qualifiedName": "map() 回调@58", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 58, "endLine": 86, "startCol": 10, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "map() 回调@58(node, index)", "params": [ { "name": "node", "optional": false }, { "name": "index", "optional": false } ], "loc": 29 }, { "id": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "kind": "function", "name": "toProjectTemplate", "qualifiedName": "toProjectTemplate", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 96, "endLine": 104, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "toProjectTemplate(template: ProjectTemplateRecord): ProjectTemplate", "params": [ { "name": "template", "typeRef": "ProjectTemplateRecord", "optional": false } ], "returnType": "ProjectTemplate", "loc": 9 }, { "id": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "kind": "function", "name": "toTemplateNodesJson", "qualifiedName": "toTemplateNodesJson", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 106, "endLine": 108, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "toTemplateNodesJson(nodes: unknown): Prisma.InputJsonValue", "params": [ { "name": "nodes", "typeRef": "unknown", "optional": false } ], "returnType": "Prisma.InputJsonValue", "loc": 3 }, { "id": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "kind": "function", "name": "listProjectTemplates", "qualifiedName": "listProjectTemplates", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 110, "endLine": 116, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "listProjectTemplates(): Promise", "params": [], "returnType": "Promise", "loc": 7, "interactions": [ { "id": "ix:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110:db:out:read:projectTemplate", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "projectTemplate", "engine": "prisma" } ] }, { "id": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "kind": "function", "name": "createProjectTemplate", "qualifiedName": "createProjectTemplate", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 118, "endLine": 134, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "createProjectTemplate(input: Partial): Promise", "params": [ { "name": "input", "typeRef": "Partial", "optional": false } ], "returnType": "Promise", "loc": 17, "interactions": [ { "id": "ix:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118:db:out:create:projectTemplate", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "projectTemplate", "engine": "prisma" } ] }, { "id": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "kind": "function", "name": "updateProjectTemplate", "qualifiedName": "updateProjectTemplate", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 136, "endLine": 156, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "updateProjectTemplate(id: string, input: Partial): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "Partial", "optional": false } ], "returnType": "Promise", "loc": 21, "interactions": [ { "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:read:projectTemplate", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "projectTemplate", "engine": "prisma" }, { "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:update:projectTemplate", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "update", "target": "projectTemplate", "engine": "prisma" } ] }, { "id": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "kind": "function", "name": "deleteProjectTemplate", "qualifiedName": "deleteProjectTemplate", "location": { "file": "src/server/projectTemplateRepository.ts", "startLine": 158, "endLine": 162, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/projectTemplateRepository.ts", "moduleId": "module:src/server", "signature": "deleteProjectTemplate(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 5, "interactions": [ { "id": "ix:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158:db:out:delete:projectTemplate", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "projectTemplate", "engine": "prisma" } ] }, { "id": "func:src/server/tagRepository.ts#toTagDefinition@4", "kind": "function", "name": "toTagDefinition", "qualifiedName": "toTagDefinition", "location": { "file": "src/server/tagRepository.ts", "startLine": 4, "endLine": 9, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/tagRepository.ts", "moduleId": "module:src/server", "signature": "toTagDefinition(tag: { id: string; name: string }): TagDefinition", "params": [ { "name": "tag", "typeRef": "{ id: string; name: string }", "optional": false } ], "returnType": "TagDefinition", "loc": 6 }, { "id": "func:src/server/tagRepository.ts#listTagDefinitions@11", "kind": "function", "name": "listTagDefinitions", "qualifiedName": "listTagDefinitions", "location": { "file": "src/server/tagRepository.ts", "startLine": 11, "endLine": 17, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/tagRepository.ts", "moduleId": "module:src/server", "signature": "listTagDefinitions(): Promise", "params": [], "returnType": "Promise", "loc": 7, "interactions": [ { "id": "ix:func:src/server/tagRepository.ts#listTagDefinitions@11:db:out:read:tagDefinition", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "tagDefinition", "engine": "prisma" } ] }, { "id": "func:src/server/tagRepository.ts#createTagDefinition@19", "kind": "function", "name": "createTagDefinition", "qualifiedName": "createTagDefinition", "location": { "file": "src/server/tagRepository.ts", "startLine": 19, "endLine": 32, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/tagRepository.ts", "moduleId": "module:src/server", "signature": "createTagDefinition(input: { name?: string }): Promise", "params": [ { "name": "input", "typeRef": "{ name?: string }", "optional": false } ], "returnType": "Promise", "loc": 14, "interactions": [ { "id": "ix:func:src/server/tagRepository.ts#createTagDefinition@19:db:out:create:tagDefinition", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "tagDefinition", "engine": "prisma" } ] }, { "id": "func:src/server/tagRepository.ts#deleteTagDefinition@34", "kind": "function", "name": "deleteTagDefinition", "qualifiedName": "deleteTagDefinition", "location": { "file": "src/server/tagRepository.ts", "startLine": 34, "endLine": 48, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/tagRepository.ts", "moduleId": "module:src/server", "signature": "deleteTagDefinition(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 15, "interactions": [ { "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:read:tagDefinition", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "tagDefinition", "engine": "prisma" }, { "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:other:", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "other", "engine": "prisma" }, { "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:taskTag", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "taskTag", "engine": "prisma" }, { "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:tagDefinition", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "tagDefinition", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#toPerson@4", "kind": "function", "name": "toPerson", "qualifiedName": "toPerson", "location": { "file": "src/server/personRepository.ts", "startLine": 4, "endLine": 26, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "toPerson(person: {\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}): Person", "params": [ { "name": "person", "typeRef": "{\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}", "optional": false } ], "returnType": "Person", "loc": 23 }, { "id": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "kind": "function", "name": "ensurePeopleFromExistingResponsibles", "qualifiedName": "ensurePeopleFromExistingResponsibles", "location": { "file": "src/server/personRepository.ts", "startLine": 28, "endLine": 51, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "ensurePeopleFromExistingResponsibles()", "params": [], "loc": 24, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "person", "engine": "prisma" }, { "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:taskResponsible", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "taskResponsible", "engine": "prisma" }, { "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:nodeResponsible", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "nodeResponsible", "engine": "prisma" }, { "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:create:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#listPeople@53", "kind": "function", "name": "listPeople", "qualifiedName": "listPeople", "location": { "file": "src/server/personRepository.ts", "startLine": 53, "endLine": 62, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "listPeople(): Promise", "params": [], "returnType": "Promise", "loc": 10, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#listPeople@53:db:out:read:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#getPersonOrThrow@64", "kind": "function", "name": "getPersonOrThrow", "qualifiedName": "getPersonOrThrow", "location": { "file": "src/server/personRepository.ts", "startLine": 64, "endLine": 71, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "getPersonOrThrow(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 8, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#getPersonOrThrow@64:db:out:read:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "read", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#createPerson@73", "kind": "function", "name": "createPerson", "qualifiedName": "createPerson", "location": { "file": "src/server/personRepository.ts", "startLine": 73, "endLine": 116, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "createPerson(input: {\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}): Promise", "params": [ { "name": "input", "typeRef": "{\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}", "optional": false } ], "returnType": "Promise", "loc": 44, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#createPerson@73:db:out:create:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#ensurePeople@118", "kind": "function", "name": "ensurePeople", "qualifiedName": "ensurePeople", "location": { "file": "src/server/personRepository.ts", "startLine": 118, "endLine": 140, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "ensurePeople(inputs: Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>): Promise", "params": [ { "name": "inputs", "typeRef": "Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>", "optional": false } ], "returnType": "Promise", "loc": 23, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#ensurePeople@118:db:out:create:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "create", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#updatePerson@142", "kind": "function", "name": "updatePerson", "qualifiedName": "updatePerson", "location": { "file": "src/server/personRepository.ts", "startLine": 142, "endLine": 175, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "updatePerson(id: string, input: { name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "{ name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }", "optional": false } ], "returnType": "Promise", "loc": 34, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#updatePerson@142:db:out:update:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "update", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/personRepository.ts#deletePerson@177", "kind": "function", "name": "deletePerson", "qualifiedName": "deletePerson", "location": { "file": "src/server/personRepository.ts", "startLine": 177, "endLine": 181, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/personRepository.ts", "moduleId": "module:src/server", "signature": "deletePerson(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 5, "interactions": [ { "id": "ix:func:src/server/personRepository.ts#deletePerson@177:db:out:delete:person", "kind": "db", "direction": "out", "provenance": "resolved", "operation": "delete", "target": "person", "engine": "prisma" } ] }, { "id": "func:src/server/botQueryTools.ts#getTodayStr@10", "kind": "function", "name": "getTodayStr", "qualifiedName": "getTodayStr", "location": { "file": "src/server/botQueryTools.ts", "startLine": 10, "endLine": 19, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getTodayStr(timeZone): string", "params": [ { "name": "timeZone", "optional": true, "defaultValue": "DEFAULT_TIME_ZONE" } ], "returnType": "string", "loc": 10 }, { "id": "func:src/server/botQueryTools.ts#value@17", "kind": "function", "name": "value", "qualifiedName": "value", "location": { "file": "src/server/botQueryTools.ts", "startLine": 17, "endLine": 17, "startCol": 9, "endCol": 88 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "value(type: string)", "params": [ { "name": "type", "typeRef": "string", "optional": false } ], "loc": 1 }, { "id": "func:src/server/botQueryTools.ts#nodeRanges@21", "kind": "function", "name": "nodeRanges", "qualifiedName": "nodeRanges", "location": { "file": "src/server/botQueryTools.ts", "startLine": 21, "endLine": 26, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "nodeRanges(node: WorkflowNode): { startDate: string; endDate: string }[]", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "{ startDate: string; endDate: string }[]", "loc": 6 }, { "id": "func:src/server/botQueryTools.ts#nodeStartDate@28", "kind": "function", "name": "nodeStartDate", "qualifiedName": "nodeStartDate", "location": { "file": "src/server/botQueryTools.ts", "startLine": 28, "endLine": 32, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "nodeStartDate(node: WorkflowNode): string", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "string", "loc": 5 }, { "id": "func:src/server/botQueryTools.ts#nodeEndDate@34", "kind": "function", "name": "nodeEndDate", "qualifiedName": "nodeEndDate", "location": { "file": "src/server/botQueryTools.ts", "startLine": 34, "endLine": 39, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "nodeEndDate(node: WorkflowNode): string", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "string", "loc": 6 }, { "id": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/server/botQueryTools.ts", "startLine": 41, "endLine": 48, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false }, { "name": "today", "typeRef": "string", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 8 }, { "id": "func:src/server/botQueryTools.ts#taskDateSpan@51", "kind": "function", "name": "taskDateSpan", "qualifiedName": "taskDateSpan", "location": { "file": "src/server/botQueryTools.ts", "startLine": 51, "endLine": 56, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "taskDateSpan(task: Task): { start: string | null; end: string | null }", "params": [ { "name": "task", "typeRef": "Task", "optional": false } ], "returnType": "{ start: string | null; end: string | null }", "loc": 6 }, { "id": "func:src/server/botQueryTools.ts#overlapsRange@59", "kind": "function", "name": "overlapsRange", "qualifiedName": "overlapsRange", "location": { "file": "src/server/botQueryTools.ts", "startLine": 59, "endLine": 69, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "overlapsRange(start: string | null, end: string | null, from: string, to: string): boolean", "params": [ { "name": "start", "typeRef": "string | null", "optional": false }, { "name": "end", "typeRef": "string | null", "optional": false }, { "name": "from", "typeRef": "string", "optional": false }, { "name": "to", "typeRef": "string", "optional": false } ], "returnType": "boolean", "loc": 11 }, { "id": "func:src/server/botQueryTools.ts#buildTaskLink@72", "kind": "function", "name": "buildTaskLink", "qualifiedName": "buildTaskLink", "location": { "file": "src/server/botQueryTools.ts", "startLine": 72, "endLine": 82, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "buildTaskLink(taskId: string, nodeId: string): string", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodeId", "typeRef": "string", "optional": true } ], "returnType": "string", "loc": 11 }, { "id": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "kind": "function", "name": "isTaskRelatedToPerson", "qualifiedName": "isTaskRelatedToPerson", "location": { "file": "src/server/botQueryTools.ts", "startLine": 98, "endLine": 101, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "isTaskRelatedToPerson(task: Task, personName: string): boolean", "params": [ { "name": "task", "typeRef": "Task", "optional": false }, { "name": "personName", "typeRef": "string", "optional": false } ], "returnType": "boolean", "loc": 4 }, { "id": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "kind": "function", "name": "isNodeOwnedByPerson", "qualifiedName": "isNodeOwnedByPerson", "location": { "file": "src/server/botQueryTools.ts", "startLine": 103, "endLine": 105, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "isNodeOwnedByPerson(node: WorkflowNode, personName: string): boolean", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false }, { "name": "personName", "typeRef": "string", "optional": false } ], "returnType": "boolean", "loc": 3 }, { "id": "func:src/server/botQueryTools.ts#createBotQueryContext@116", "kind": "function", "name": "createBotQueryContext", "qualifiedName": "createBotQueryContext", "location": { "file": "src/server/botQueryTools.ts", "startLine": 116, "endLine": 128, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "createBotQueryContext(person: Person): BotQueryContext", "params": [ { "name": "person", "typeRef": "Person", "optional": false } ], "returnType": "BotQueryContext", "loc": 13 }, { "id": "func:src/server/botQueryTools.ts#getTasks@124", "kind": "function", "name": "getTasks", "qualifiedName": "getTasks", "location": { "file": "src/server/botQueryTools.ts", "startLine": 124, "endLine": 124, "startCol": 5, "endCol": 49 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getTasks()", "params": [], "loc": 1 }, { "id": "func:src/server/botQueryTools.ts#getPeople@125", "kind": "function", "name": "getPeople", "qualifiedName": "getPeople", "location": { "file": "src/server/botQueryTools.ts", "startLine": 125, "endLine": 125, "startCol": 5, "endCol": 52 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getPeople()", "params": [], "loc": 1 }, { "id": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", "kind": "function", "name": "getWeeklyPlans", "qualifiedName": "getWeeklyPlans", "location": { "file": "src/server/botQueryTools.ts", "startLine": 126, "endLine": 126, "startCol": 5, "endCol": 61 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getWeeklyPlans()", "params": [], "loc": 1 }, { "id": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "kind": "function", "name": "resolveTaskScope", "qualifiedName": "resolveTaskScope", "location": { "file": "src/server/botQueryTools.ts", "startLine": 141, "endLine": 170, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "resolveTaskScope(ctx: BotQueryContext, personName: string, allMembers: boolean): Promise", "params": [ { "name": "ctx", "typeRef": "BotQueryContext", "optional": false }, { "name": "personName", "typeRef": "string", "optional": true }, { "name": "allMembers", "typeRef": "boolean", "optional": true } ], "returnType": "Promise", "loc": 30 }, { "id": "func:src/server/botQueryTools.ts#selfScope@149", "kind": "function", "name": "selfScope", "qualifiedName": "selfScope", "location": { "file": "src/server/botQueryTools.ts", "startLine": 149, "endLine": 153, "startCol": 9, "endCol": 5 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "selfScope(): TaskScope", "params": [], "returnType": "TaskScope", "loc": 5 }, { "id": "func:src/server/botQueryTools.ts#summarizeTask@172", "kind": "function", "name": "summarizeTask", "qualifiedName": "summarizeTask", "location": { "file": "src/server/botQueryTools.ts", "startLine": 172, "endLine": 196, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "summarizeTask(task: Task, planName: string, today: string)", "params": [ { "name": "task", "typeRef": "Task", "optional": false }, { "name": "planName", "typeRef": "string", "optional": false }, { "name": "today", "typeRef": "string", "optional": false } ], "loc": 25 }, { "id": "func:src/server/botQueryTools.ts#planNameById@198", "kind": "function", "name": "planNameById", "qualifiedName": "planNameById", "location": { "file": "src/server/botQueryTools.ts", "startLine": 198, "endLine": 201, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "planNameById(ctx: BotQueryContext): Promise>", "params": [ { "name": "ctx", "typeRef": "BotQueryContext", "optional": false } ], "returnType": "Promise>", "loc": 4 }, { "id": "func:src/server/botQueryTools.ts#resolveToolSchema@231", "kind": "function", "name": "resolveToolSchema", "qualifiedName": "resolveToolSchema", "location": { "file": "src/server/botQueryTools.ts", "startLine": 231, "endLine": 245, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "resolveToolSchema(tool: BotTool, isAdmin: boolean): { description: string; parameters: Record }", "params": [ { "name": "tool", "typeRef": "BotTool", "optional": false }, { "name": "isAdmin", "typeRef": "boolean", "optional": false } ], "returnType": "{ description: string; parameters: Record }", "loc": 15 }, { "id": "func:src/server/botQueryTools.ts#execute@253", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 253, "endLine": 261, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(_args, ctx)", "params": [ { "name": "_args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 9 }, { "id": "func:src/server/botQueryTools.ts#execute@297", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 297, "endLine": 336, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(args, ctx)", "params": [ { "name": "args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 40 }, { "id": "func:src/server/botQueryTools.ts#filter() 回调@310@310", "kind": "function", "name": "filter() 回调@310", "qualifiedName": "filter() 回调@310", "location": { "file": "src/server/botQueryTools.ts", "startLine": 310, "endLine": 327, "startCol": 39, "endCol": 8 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "filter() 回调@310(task)", "params": [ { "name": "task", "optional": false } ], "loc": 18 }, { "id": "func:src/server/botQueryTools.ts#execute@349", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 349, "endLine": 405, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(args, ctx)", "params": [ { "name": "args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 57 }, { "id": "func:src/server/botQueryTools.ts#execute@430", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 430, "endLine": 485, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(args, ctx)", "params": [ { "name": "args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 56 }, { "id": "func:src/server/botQueryTools.ts#addDays@440", "kind": "function", "name": "addDays", "qualifiedName": "addDays", "location": { "file": "src/server/botQueryTools.ts", "startLine": 440, "endLine": 444, "startCol": 13, "endCol": 8 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "addDays(base: string, delta: number)", "params": [ { "name": "base", "typeRef": "string", "optional": false }, { "name": "delta", "typeRef": "number", "optional": false } ], "loc": 5 }, { "id": "func:src/server/botQueryTools.ts#execute@500", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 500, "endLine": 529, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(args, ctx)", "params": [ { "name": "args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 30 }, { "id": "func:src/server/botQueryTools.ts#filter() 回调@516@516", "kind": "function", "name": "filter() 回调@516", "qualifiedName": "filter() 回调@516", "location": { "file": "src/server/botQueryTools.ts", "startLine": 516, "endLine": 519, "startCol": 17, "endCol": 10 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "filter() 回调@516(plan)", "params": [ { "name": "plan", "optional": false } ], "loc": 4 }, { "id": "func:src/server/botQueryTools.ts#execute@542", "kind": "function", "name": "execute", "qualifiedName": "execute", "location": { "file": "src/server/botQueryTools.ts", "startLine": 542, "endLine": 579, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "execute(args, ctx)", "params": [ { "name": "args", "optional": false }, { "name": "ctx", "optional": false } ], "loc": 38 }, { "id": "func:src/server/botQueryTools.ts#getBotToolByName@583", "kind": "function", "name": "getBotToolByName", "qualifiedName": "getBotToolByName", "location": { "file": "src/server/botQueryTools.ts", "startLine": 583, "endLine": 585, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/botQueryTools.ts", "moduleId": "module:src/server", "signature": "getBotToolByName(name: string): BotTool | undefined", "params": [ { "name": "name", "typeRef": "string", "optional": false } ], "returnType": "BotTool | undefined", "loc": 3 }, { "id": "func:src/server/aiChatService.ts#isAiConfigured@30", "kind": "function", "name": "isAiConfigured", "qualifiedName": "isAiConfigured", "location": { "file": "src/server/aiChatService.ts", "startLine": 30, "endLine": 32, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "isAiConfigured(): boolean", "params": [], "returnType": "boolean", "loc": 3 }, { "id": "func:src/server/aiChatService.ts#getMemoryTurns@62", "kind": "function", "name": "getMemoryTurns", "qualifiedName": "getMemoryTurns", "location": { "file": "src/server/aiChatService.ts", "startLine": 62, "endLine": 70, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "getMemoryTurns(sessionKey: string): ConversationTurn[]", "params": [ { "name": "sessionKey", "typeRef": "string", "optional": false } ], "returnType": "ConversationTurn[]", "loc": 9 }, { "id": "func:src/server/aiChatService.ts#appendMemoryTurn@72", "kind": "function", "name": "appendMemoryTurn", "qualifiedName": "appendMemoryTurn", "location": { "file": "src/server/aiChatService.ts", "startLine": 72, "endLine": 76, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "appendMemoryTurn(sessionKey: string, turn: ConversationTurn)", "params": [ { "name": "sessionKey", "typeRef": "string", "optional": false }, { "name": "turn", "typeRef": "ConversationTurn", "optional": false } ], "loc": 5 }, { "id": "func:src/server/aiChatService.ts#clearBotMemory@79", "kind": "function", "name": "clearBotMemory", "qualifiedName": "clearBotMemory", "location": { "file": "src/server/aiChatService.ts", "startLine": 79, "endLine": 81, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "clearBotMemory(sessionKey: string): void", "params": [ { "name": "sessionKey", "typeRef": "string", "optional": false } ], "returnType": "void", "loc": 3 }, { "id": "func:src/server/aiChatService.ts#setInterval() 回调@84@84", "kind": "function", "name": "setInterval() 回调@84", "qualifiedName": "setInterval() 回调@84", "location": { "file": "src/server/aiChatService.ts", "startLine": 84, "endLine": 89, "startCol": 13, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "setInterval() 回调@84()", "params": [], "loc": 6 }, { "id": "func:src/server/aiChatService.ts#buildToolSpecs@93", "kind": "function", "name": "buildToolSpecs", "qualifiedName": "buildToolSpecs", "location": { "file": "src/server/aiChatService.ts", "startLine": 93, "endLine": 105, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "buildToolSpecs(ctx: BotQueryContext)", "params": [ { "name": "ctx", "typeRef": "BotQueryContext", "optional": false } ], "loc": 13 }, { "id": "func:src/server/aiChatService.ts#map() 回调@94@94", "kind": "function", "name": "map() 回调@94", "qualifiedName": "map() 回调@94", "location": { "file": "src/server/aiChatService.ts", "startLine": 94, "endLine": 104, "startCol": 24, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "map() 回调@94(tool)", "params": [ { "name": "tool", "optional": false } ], "loc": 11 }, { "id": "func:src/server/aiChatService.ts#buildSystemPrompt@107", "kind": "function", "name": "buildSystemPrompt", "qualifiedName": "buildSystemPrompt", "location": { "file": "src/server/aiChatService.ts", "startLine": 107, "endLine": 122, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "buildSystemPrompt(ctx: BotQueryContext): string", "params": [ { "name": "ctx", "typeRef": "BotQueryContext", "optional": false } ], "returnType": "string", "loc": 16 }, { "id": "func:src/server/aiChatService.ts#callChatCompletion@124", "kind": "function", "name": "callChatCompletion", "qualifiedName": "callChatCompletion", "location": { "file": "src/server/aiChatService.ts", "startLine": 124, "endLine": 154, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "callChatCompletion(messages: ChatMessage[], tools: ReturnType): Promise", "params": [ { "name": "messages", "typeRef": "ChatMessage[]", "optional": false }, { "name": "tools", "typeRef": "ReturnType", "optional": false } ], "returnType": "Promise", "loc": 31, "interactions": [ { "id": "ix:func:src/server/aiChatService.ts#callChatCompletion@124:api:out:POST:`${OPENAI_BASE_URL}/chat/completions`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "`${OPENAI_BASE_URL}/chat/completions`" } ] }, { "id": "func:src/server/aiChatService.ts#executeToolCall@156", "kind": "function", "name": "executeToolCall", "qualifiedName": "executeToolCall", "location": { "file": "src/server/aiChatService.ts", "startLine": 156, "endLine": 180, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "executeToolCall(name: string, argsJson: string, ctx: BotQueryContext): Promise", "params": [ { "name": "name", "typeRef": "string", "optional": false }, { "name": "argsJson", "typeRef": "string", "optional": false }, { "name": "ctx", "typeRef": "BotQueryContext", "optional": false } ], "returnType": "Promise", "loc": 25 }, { "id": "func:src/server/aiChatService.ts#answerBotQuestion@185", "kind": "function", "name": "answerBotQuestion", "qualifiedName": "answerBotQuestion", "location": { "file": "src/server/aiChatService.ts", "startLine": 185, "endLine": 260, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "signature": "answerBotQuestion(question: string, ctx: BotQueryContext, sessionKey: string): Promise", "params": [ { "name": "question", "typeRef": "string", "optional": false }, { "name": "ctx", "typeRef": "BotQueryContext", "optional": false }, { "name": "sessionKey", "typeRef": "string", "optional": true } ], "returnType": "Promise", "loc": 76 }, { "id": "func:server.ts#ensureManualLoginPeople@84", "kind": "function", "name": "ensureManualLoginPeople", "qualifiedName": "ensureManualLoginPeople", "location": { "file": "server.ts", "startLine": 84, "endLine": 86, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "ensureManualLoginPeople()", "params": [], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#GET /api/health@90", "kind": "function", "name": "GET /api/health", "qualifiedName": "GET /api/health", "location": { "file": "server.ts", "startLine": 90, "endLine": 96, "startCol": 24, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/health(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/health@90:api:in:GET:/api/health", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/health" } ] }, { "id": "func:server.ts#readRemoteError@98", "kind": "function", "name": "readRemoteError", "qualifiedName": "readRemoteError", "location": { "file": "server.ts", "startLine": 98, "endLine": 108, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "readRemoteError(response: Response, fallback: string)", "params": [ { "name": "response", "typeRef": "Response", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 11 }, { "id": "func:server.ts#readRemoteJson@110", "kind": "function", "name": "readRemoteJson", "qualifiedName": "readRemoteJson", "location": { "file": "server.ts", "startLine": 110, "endLine": 118, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "readRemoteJson(response: Response, fallback: string)", "params": [ { "name": "response", "typeRef": "Response", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 9 }, { "id": "func:server.ts#ensureDingTalkRobotConfigured@122", "kind": "function", "name": "ensureDingTalkRobotConfigured", "qualifiedName": "ensureDingTalkRobotConfigured", "location": { "file": "server.ts", "startLine": 122, "endLine": 126, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "ensureDingTalkRobotConfigured()", "params": [], "isEntry": true, "loc": 5 }, { "id": "func:server.ts#getDingTalkRobotAccessToken@128", "kind": "function", "name": "getDingTalkRobotAccessToken", "qualifiedName": "getDingTalkRobotAccessToken", "location": { "file": "server.ts", "startLine": 128, "endLine": 160, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getDingTalkRobotAccessToken()", "params": [], "isEntry": true, "loc": 33, "interactions": [ { "id": "ix:func:server.ts#getDingTalkRobotAccessToken@128:api:out:POST:https://api.dingtalk.com/v1.0/oauth2/accessToken", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "https://api.dingtalk.com/v1.0/oauth2/accessToken", "peer": "api.dingtalk.com" } ] }, { "id": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "kind": "function", "name": "sendDingTalkRobotMarkdownMessage", "qualifiedName": "sendDingTalkRobotMarkdownMessage", "location": { "file": "server.ts", "startLine": 162, "endLine": 201, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "sendDingTalkRobotMarkdownMessage(input: {\n userIds: string[];\n title: string;\n text: string;\n})", "params": [ { "name": "input", "typeRef": "{\n userIds: string[];\n title: string;\n text: string;\n}", "optional": false } ], "isEntry": true, "loc": 40, "interactions": [ { "id": "ix:func:server.ts#sendDingTalkRobotMarkdownMessage@162:api:out:POST:https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", "peer": "api.dingtalk.com" } ] }, { "id": "func:server.ts#replyToDingTalkSession@204", "kind": "function", "name": "replyToDingTalkSession", "qualifiedName": "replyToDingTalkSession", "location": { "file": "server.ts", "startLine": 204, "endLine": 219, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "replyToDingTalkSession(sessionWebhook: string, content: string)", "params": [ { "name": "sessionWebhook", "typeRef": "string", "optional": false }, { "name": "content", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 16, "interactions": [ { "id": "ix:func:server.ts#replyToDingTalkSession@204:api:out:POST:", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST" } ] }, { "id": "func:server.ts#replyToDingTalkSessionMarkdown@222", "kind": "function", "name": "replyToDingTalkSessionMarkdown", "qualifiedName": "replyToDingTalkSessionMarkdown", "location": { "file": "server.ts", "startLine": 222, "endLine": 237, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "replyToDingTalkSessionMarkdown(sessionWebhook: string, title: string, text: string)", "params": [ { "name": "sessionWebhook", "typeRef": "string", "optional": false }, { "name": "title", "typeRef": "string", "optional": false }, { "name": "text", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 16, "interactions": [ { "id": "ix:func:server.ts#replyToDingTalkSessionMarkdown@222:api:out:POST:", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST" } ] }, { "id": "func:server.ts#getTaskRelatedPersonNames@239", "kind": "function", "name": "getTaskRelatedPersonNames", "qualifiedName": "getTaskRelatedPersonNames", "location": { "file": "server.ts", "startLine": 239, "endLine": 250, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getTaskRelatedPersonNames(task: Task)", "params": [ { "name": "task", "typeRef": "Task", "optional": false } ], "isEntry": true, "loc": 12 }, { "id": "func:server.ts#getWorkflowLink@252", "kind": "function", "name": "getWorkflowLink", "qualifiedName": "getWorkflowLink", "location": { "file": "server.ts", "startLine": 252, "endLine": 259, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getWorkflowLink(params: { weeklyPlanId?: string; taskId?: string; nodeId?: string })", "params": [ { "name": "params", "typeRef": "{ weeklyPlanId?: string; taskId?: string; nodeId?: string }", "optional": true, "defaultValue": "{}" } ], "isEntry": true, "loc": 8 }, { "id": "func:server.ts#getZonedDateParts@261", "kind": "function", "name": "getZonedDateParts", "qualifiedName": "getZonedDateParts", "location": { "file": "server.ts", "startLine": 261, "endLine": 278, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getZonedDateParts(date, timeZone)", "params": [ { "name": "date", "optional": true, "defaultValue": "new Date()" }, { "name": "timeZone", "optional": true, "defaultValue": "DUE_REMINDER_TIME_ZONE" } ], "isEntry": true, "loc": 18 }, { "id": "func:server.ts#value@271", "kind": "function", "name": "value", "qualifiedName": "value", "location": { "file": "server.ts", "startLine": 271, "endLine": 271, "startCol": 9, "endCol": 88 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "value(type: string)", "params": [ { "name": "type", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 1 }, { "id": "func:server.ts#getPersonNamesForDueNodeReminder@280", "kind": "function", "name": "getPersonNamesForDueNodeReminder", "qualifiedName": "getPersonNamesForDueNodeReminder", "location": { "file": "server.ts", "startLine": 280, "endLine": 288, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getPersonNamesForDueNodeReminder(node: Task[\"nodes\"][number])", "params": [ { "name": "node", "typeRef": "Task[\"nodes\"][number]", "optional": false } ], "isEntry": true, "loc": 9 }, { "id": "func:server.ts#getDueTimeRanges@290", "kind": "function", "name": "getDueTimeRanges", "qualifiedName": "getDueTimeRanges", "location": { "file": "server.ts", "startLine": 290, "endLine": 296, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getDueTimeRanges(node: Task[\"nodes\"][number], date: string)", "params": [ { "name": "node", "typeRef": "Task[\"nodes\"][number]", "optional": false }, { "name": "date", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 7 }, { "id": "func:server.ts#sendDailyDueNodeReminder@298", "kind": "function", "name": "sendDailyDueNodeReminder", "qualifiedName": "sendDailyDueNodeReminder", "location": { "file": "server.ts", "startLine": 298, "endLine": 361, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "sendDailyDueNodeReminder()", "params": [], "isEntry": true, "loc": 64 }, { "id": "func:server.ts#notifyTaskConfirmedCompleted@363", "kind": "function", "name": "notifyTaskConfirmedCompleted", "qualifiedName": "notifyTaskConfirmedCompleted", "location": { "file": "server.ts", "startLine": 363, "endLine": 415, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "notifyTaskConfirmedCompleted(task: Task, operatorName: string)", "params": [ { "name": "task", "typeRef": "Task", "optional": false }, { "name": "operatorName", "typeRef": "string", "optional": true } ], "isEntry": true, "loc": 53 }, { "id": "func:server.ts#ensureSsoConfigured@417", "kind": "function", "name": "ensureSsoConfigured", "qualifiedName": "ensureSsoConfigured", "location": { "file": "server.ts", "startLine": 417, "endLine": 421, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "ensureSsoConfigured()", "params": [], "isEntry": true, "loc": 5 }, { "id": "func:server.ts#getSsoRedirectUri@423", "kind": "function", "name": "getSsoRedirectUri", "qualifiedName": "getSsoRedirectUri", "location": { "file": "server.ts", "startLine": 423, "endLine": 430, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getSsoRedirectUri()", "params": [], "isEntry": true, "loc": 8 }, { "id": "func:server.ts#getSsoAuthUrl@432", "kind": "function", "name": "getSsoAuthUrl", "qualifiedName": "getSsoAuthUrl", "location": { "file": "server.ts", "startLine": 432, "endLine": 442, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getSsoAuthUrl(state: string)", "params": [ { "name": "state", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 11 }, { "id": "func:server.ts#getSsoUserAccessToken@444", "kind": "function", "name": "getSsoUserAccessToken", "qualifiedName": "getSsoUserAccessToken", "location": { "file": "server.ts", "startLine": 444, "endLine": 469, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getSsoUserAccessToken(authCode: string)", "params": [ { "name": "authCode", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 26, "interactions": [ { "id": "ix:func:server.ts#getSsoUserAccessToken@444:api:out:POST:`${OIDC_HOST}/oauth/token`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "`${OIDC_HOST}/oauth/token`" } ] }, { "id": "func:server.ts#getSsoCurrentUser@471", "kind": "function", "name": "getSsoCurrentUser", "qualifiedName": "getSsoCurrentUser", "location": { "file": "server.ts", "startLine": 471, "endLine": 496, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getSsoCurrentUser(accessToken: string)", "params": [ { "name": "accessToken", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 26, "interactions": [ { "id": "ix:func:server.ts#getSsoCurrentUser@471:api:out:GET:`${OIDC_HOST}/oauth/userinfo`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "`${OIDC_HOST}/oauth/userinfo`" } ] }, { "id": "func:server.ts#GET /api/auth/sso-config@498", "kind": "function", "name": "GET /api/auth/sso-config", "qualifiedName": "GET /api/auth/sso-config", "location": { "file": "server.ts", "startLine": 498, "endLine": 506, "startCol": 33, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/auth/sso-config(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#GET /api/auth/sso-config@498:api:in:GET:/api/auth/sso-config", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/auth/sso-config" } ] }, { "id": "func:server.ts#GET /api/auth/sso-login-url@508", "kind": "function", "name": "GET /api/auth/sso-login-url", "qualifiedName": "GET /api/auth/sso-login-url", "location": { "file": "server.ts", "startLine": 508, "endLine": 518, "startCol": 36, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/auth/sso-login-url(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 11, "interactions": [ { "id": "ix:func:server.ts#GET /api/auth/sso-login-url@508:api:in:GET:/api/auth/sso-login-url", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/auth/sso-login-url" } ] }, { "id": "func:server.ts#handleSsoCallback@520", "kind": "function", "name": "handleSsoCallback", "qualifiedName": "handleSsoCallback", "location": { "file": "server.ts", "startLine": 520, "endLine": 554, "startCol": 7, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "handleSsoCallback(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 35, "interactions": [ { "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/dingtalk/oauth-callback", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/dingtalk/oauth-callback" }, { "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/auth/sso-callback", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/auth/sso-callback" } ] }, { "id": "func:server.ts#GET /api/auth/manual-users@559", "kind": "function", "name": "GET /api/auth/manual-users", "qualifiedName": "GET /api/auth/manual-users", "location": { "file": "server.ts", "startLine": 559, "endLine": 561, "startCol": 35, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/auth/manual-users(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 3, "interactions": [ { "id": "ix:func:server.ts#GET /api/auth/manual-users@559:api:in:GET:/api/auth/manual-users", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/auth/manual-users" } ] }, { "id": "func:server.ts#POST /api/auth/manual-login@563", "kind": "function", "name": "POST /api/auth/manual-login", "qualifiedName": "POST /api/auth/manual-login", "location": { "file": "server.ts", "startLine": 563, "endLine": 573, "startCol": 36, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/auth/manual-login(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 11, "interactions": [ { "id": "ix:func:server.ts#POST /api/auth/manual-login@563:api:in:POST:/api/auth/manual-login", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/manual-login" } ] }, { "id": "func:server.ts#POST /api/auth/dev-login@575", "kind": "function", "name": "POST /api/auth/dev-login", "qualifiedName": "POST /api/auth/dev-login", "location": { "file": "server.ts", "startLine": 575, "endLine": 603, "startCol": 33, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/auth/dev-login(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 29, "interactions": [ { "id": "ix:func:server.ts#POST /api/auth/dev-login@575:api:in:POST:/api/auth/dev-login", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/dev-login" } ] }, { "id": "func:server.ts#POST /api/auth/sso-login@605", "kind": "function", "name": "POST /api/auth/sso-login", "qualifiedName": "POST /api/auth/sso-login", "location": { "file": "server.ts", "startLine": 605, "endLine": 640, "startCol": 33, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/auth/sso-login(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 36, "interactions": [ { "id": "ix:func:server.ts#POST /api/auth/sso-login@605:api:in:POST:/api/auth/sso-login", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/sso-login" } ] }, { "id": "func:server.ts#POST /api/auth/sso-join-person@642", "kind": "function", "name": "POST /api/auth/sso-join-person", "qualifiedName": "POST /api/auth/sso-join-person", "location": { "file": "server.ts", "startLine": 642, "endLine": 667, "startCol": 39, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/auth/sso-join-person(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 26, "interactions": [ { "id": "ix:func:server.ts#POST /api/auth/sso-join-person@642:api:in:POST:/api/auth/sso-join-person", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/sso-join-person" } ] }, { "id": "func:server.ts#GET /api/people@669", "kind": "function", "name": "GET /api/people", "qualifiedName": "GET /api/people", "location": { "file": "server.ts", "startLine": 669, "endLine": 676, "startCol": 24, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/people(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#GET /api/people@669:api:in:GET:/api/people", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/people" } ] }, { "id": "func:server.ts#POST /api/people@678", "kind": "function", "name": "POST /api/people", "qualifiedName": "POST /api/people", "location": { "file": "server.ts", "startLine": 678, "endLine": 685, "startCol": 25, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/people(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/people@678:api:in:POST:/api/people", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/people" } ] }, { "id": "func:server.ts#PUT /api/people/:id@687", "kind": "function", "name": "PUT /api/people/:id", "qualifiedName": "PUT /api/people/:id", "location": { "file": "server.ts", "startLine": 687, "endLine": 694, "startCol": 28, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "PUT /api/people/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#PUT /api/people/:id@687:api:in:PUT:/api/people/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "/api/people/:id" } ] }, { "id": "func:server.ts#DELETE /api/people/:id@696", "kind": "function", "name": "DELETE /api/people/:id", "qualifiedName": "DELETE /api/people/:id", "location": { "file": "server.ts", "startLine": 696, "endLine": 703, "startCol": 31, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/people/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/people/:id@696:api:in:DELETE:/api/people/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/people/:id" } ] }, { "id": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "kind": "function", "name": "POST /api/dingtalk/robot/send-message", "qualifiedName": "POST /api/dingtalk/robot/send-message", "location": { "file": "server.ts", "startLine": 705, "endLine": 735, "startCol": 46, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/dingtalk/robot/send-message(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 31, "interactions": [ { "id": "ix:func:server.ts#POST /api/dingtalk/robot/send-message@705:api:in:POST:/api/dingtalk/robot/send-message", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/dingtalk/robot/send-message" } ] }, { "id": "func:server.ts#GET /api/tags@737", "kind": "function", "name": "GET /api/tags", "qualifiedName": "GET /api/tags", "location": { "file": "server.ts", "startLine": 737, "endLine": 743, "startCol": 22, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/tags(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/tags@737:api:in:GET:/api/tags", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/tags" } ] }, { "id": "func:server.ts#POST /api/tags@745", "kind": "function", "name": "POST /api/tags", "qualifiedName": "POST /api/tags", "location": { "file": "server.ts", "startLine": 745, "endLine": 752, "startCol": 23, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/tags(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/tags@745:api:in:POST:/api/tags", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tags" } ] }, { "id": "func:server.ts#DELETE /api/tags/:id@754", "kind": "function", "name": "DELETE /api/tags/:id", "qualifiedName": "DELETE /api/tags/:id", "location": { "file": "server.ts", "startLine": 754, "endLine": 762, "startCol": 29, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/tags/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/tags/:id@754:api:in:DELETE:/api/tags/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/tags/:id" } ] }, { "id": "func:server.ts#GET /api/weekly-plans@764", "kind": "function", "name": "GET /api/weekly-plans", "qualifiedName": "GET /api/weekly-plans", "location": { "file": "server.ts", "startLine": 764, "endLine": 770, "startCol": 30, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/weekly-plans(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/weekly-plans@764:api:in:GET:/api/weekly-plans", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/weekly-plans" } ] }, { "id": "func:server.ts#POST /api/weekly-plans@772", "kind": "function", "name": "POST /api/weekly-plans", "qualifiedName": "POST /api/weekly-plans", "location": { "file": "server.ts", "startLine": 772, "endLine": 779, "startCol": 31, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/weekly-plans(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/weekly-plans@772:api:in:POST:/api/weekly-plans", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/weekly-plans" } ] }, { "id": "func:server.ts#DELETE /api/weekly-plans/:id@781", "kind": "function", "name": "DELETE /api/weekly-plans/:id", "qualifiedName": "DELETE /api/weekly-plans/:id", "location": { "file": "server.ts", "startLine": 781, "endLine": 789, "startCol": 37, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/weekly-plans/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/weekly-plans/:id@781:api:in:DELETE:/api/weekly-plans/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/weekly-plans/:id" } ] }, { "id": "func:server.ts#GET /api/project-templates@791", "kind": "function", "name": "GET /api/project-templates", "qualifiedName": "GET /api/project-templates", "location": { "file": "server.ts", "startLine": 791, "endLine": 797, "startCol": 35, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/project-templates(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/project-templates@791:api:in:GET:/api/project-templates", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/project-templates" } ] }, { "id": "func:server.ts#POST /api/project-templates@799", "kind": "function", "name": "POST /api/project-templates", "qualifiedName": "POST /api/project-templates", "location": { "file": "server.ts", "startLine": 799, "endLine": 806, "startCol": 36, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/project-templates(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/project-templates@799:api:in:POST:/api/project-templates", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/project-templates" } ] }, { "id": "func:server.ts#PUT /api/project-templates/:id@808", "kind": "function", "name": "PUT /api/project-templates/:id", "qualifiedName": "PUT /api/project-templates/:id", "location": { "file": "server.ts", "startLine": 808, "endLine": 815, "startCol": 39, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "PUT /api/project-templates/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#PUT /api/project-templates/:id@808:api:in:PUT:/api/project-templates/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "/api/project-templates/:id" } ] }, { "id": "func:server.ts#DELETE /api/project-templates/:id@817", "kind": "function", "name": "DELETE /api/project-templates/:id", "qualifiedName": "DELETE /api/project-templates/:id", "location": { "file": "server.ts", "startLine": 817, "endLine": 824, "startCol": 42, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/project-templates/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/project-templates/:id@817:api:in:DELETE:/api/project-templates/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/project-templates/:id" } ] }, { "id": "func:server.ts#GET /api/tasks@826", "kind": "function", "name": "GET /api/tasks", "qualifiedName": "GET /api/tasks", "location": { "file": "server.ts", "startLine": 826, "endLine": 832, "startCol": 23, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/tasks(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/tasks@826:api:in:GET:/api/tasks", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/tasks" } ] }, { "id": "func:server.ts#GET /api/tasks/:id@834", "kind": "function", "name": "GET /api/tasks/:id", "qualifiedName": "GET /api/tasks/:id", "location": { "file": "server.ts", "startLine": 834, "endLine": 841, "startCol": 27, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/tasks/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#GET /api/tasks/:id@834:api:in:GET:/api/tasks/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/tasks/:id" } ] }, { "id": "func:server.ts#POST /api/tasks@843", "kind": "function", "name": "POST /api/tasks", "qualifiedName": "POST /api/tasks", "location": { "file": "server.ts", "startLine": 843, "endLine": 850, "startCol": 24, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/tasks(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/tasks@843:api:in:POST:/api/tasks", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tasks" } ] }, { "id": "func:server.ts#PATCH /api/tasks/:id/list-state@852", "kind": "function", "name": "PATCH /api/tasks/:id/list-state", "qualifiedName": "PATCH /api/tasks/:id/list-state", "location": { "file": "server.ts", "startLine": 852, "endLine": 863, "startCol": 40, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "PATCH /api/tasks/:id/list-state(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 12, "interactions": [ { "id": "ix:func:server.ts#PATCH /api/tasks/:id/list-state@852:api:in:PATCH:/api/tasks/:id/list-state", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "PATCH", "path": "/api/tasks/:id/list-state" } ] }, { "id": "func:server.ts#PUT /api/tasks/:id@865", "kind": "function", "name": "PUT /api/tasks/:id", "qualifiedName": "PUT /api/tasks/:id", "location": { "file": "server.ts", "startLine": 865, "endLine": 884, "startCol": 27, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "PUT /api/tasks/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 20, "interactions": [ { "id": "ix:func:server.ts#PUT /api/tasks/:id@865:api:in:PUT:/api/tasks/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "/api/tasks/:id" } ] }, { "id": "func:server.ts#catch() 回调@876@876", "kind": "function", "name": "catch() 回调@876", "qualifiedName": "catch() 回调@876", "location": { "file": "server.ts", "startLine": 876, "endLine": 878, "startCol": 65, "endCol": 8 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "catch() 回调@876(err)", "params": [ { "name": "err", "optional": false } ], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#DELETE /api/tasks/:id@886", "kind": "function", "name": "DELETE /api/tasks/:id", "qualifiedName": "DELETE /api/tasks/:id", "location": { "file": "server.ts", "startLine": 886, "endLine": 893, "startCol": 30, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/tasks/:id(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/tasks/:id@886:api:in:DELETE:/api/tasks/:id", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/tasks/:id" } ] }, { "id": "func:server.ts#POST /api/tasks/:id/nodes@895", "kind": "function", "name": "POST /api/tasks/:id/nodes", "qualifiedName": "POST /api/tasks/:id/nodes", "location": { "file": "server.ts", "startLine": 895, "endLine": 903, "startCol": 34, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/tasks/:id/nodes(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#POST /api/tasks/:id/nodes@895:api:in:POST:/api/tasks/:id/nodes", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tasks/:id/nodes" } ] }, { "id": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "kind": "function", "name": "PATCH /api/tasks/:id/nodes/:nodeId", "qualifiedName": "PATCH /api/tasks/:id/nodes/:nodeId", "location": { "file": "server.ts", "startLine": 905, "endLine": 913, "startCol": 43, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "PATCH /api/tasks/:id/nodes/:nodeId(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:api:in:PATCH:/api/tasks/:id/nodes/:nodeId", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "PATCH", "path": "/api/tasks/:id/nodes/:nodeId" } ] }, { "id": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "kind": "function", "name": "DELETE /api/tasks/:id/nodes/:nodeId", "qualifiedName": "DELETE /api/tasks/:id/nodes/:nodeId", "location": { "file": "server.ts", "startLine": 915, "endLine": 923, "startCol": 44, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/tasks/:id/nodes/:nodeId(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:api:in:DELETE:/api/tasks/:id/nodes/:nodeId", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/tasks/:id/nodes/:nodeId" } ] }, { "id": "func:server.ts#POST /api/tasks/:id/dependencies@925", "kind": "function", "name": "POST /api/tasks/:id/dependencies", "qualifiedName": "POST /api/tasks/:id/dependencies", "location": { "file": "server.ts", "startLine": 925, "endLine": 932, "startCol": 41, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/tasks/:id/dependencies(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#POST /api/tasks/:id/dependencies@925:api:in:POST:/api/tasks/:id/dependencies", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tasks/:id/dependencies" } ] }, { "id": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "kind": "function", "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", "qualifiedName": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", "location": { "file": "server.ts", "startLine": 934, "endLine": 942, "startCol": 70, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 9, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:api:in:DELETE:/api/tasks/:id/dependencies/:parentNodeId/:childNodeId", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/tasks/:id/dependencies/:parentNodeId/:childNodeId" } ] }, { "id": "func:server.ts#POST /api/notify@944", "kind": "function", "name": "POST /api/notify", "qualifiedName": "POST /api/notify", "location": { "file": "server.ts", "startLine": 944, "endLine": 1039, "startCol": 25, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "POST /api/notify(req, res)", "params": [ { "name": "req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 96, "interactions": [ { "id": "ix:func:server.ts#POST /api/notify@944:api:in:POST:/api/notify", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/notify" }, { "id": "ix:func:server.ts#POST /api/notify@944:api:out:POST:", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST" } ] }, { "id": "func:server.ts#GET /api/logs@1041", "kind": "function", "name": "GET /api/logs", "qualifiedName": "GET /api/logs", "location": { "file": "server.ts", "startLine": 1041, "endLine": 1047, "startCol": 22, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET /api/logs(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 7, "interactions": [ { "id": "ix:func:server.ts#GET /api/logs@1041:api:in:GET:/api/logs", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/logs" } ] }, { "id": "func:server.ts#DELETE /api/logs@1049", "kind": "function", "name": "DELETE /api/logs", "qualifiedName": "DELETE /api/logs", "location": { "file": "server.ts", "startLine": 1049, "endLine": 1056, "startCol": 25, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "DELETE /api/logs(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 8, "interactions": [ { "id": "ix:func:server.ts#DELETE /api/logs@1049:api:in:DELETE:/api/logs", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "/api/logs" } ] }, { "id": "func:server.ts#normalizeActionType@1058", "kind": "function", "name": "normalizeActionType", "qualifiedName": "normalizeActionType", "location": { "file": "server.ts", "startLine": 1058, "endLine": 1063, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "normalizeActionType(actionType: string): \"completed\" | \"delayed\" | \"test\"", "params": [ { "name": "actionType", "typeRef": "string", "optional": false } ], "returnType": "\"completed\" | \"delayed\" | \"test\"", "isEntry": true, "loc": 6 }, { "id": "func:server.ts#getNotificationState@1065", "kind": "function", "name": "getNotificationState", "qualifiedName": "getNotificationState", "location": { "file": "server.ts", "startLine": 1065, "endLine": 1084, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "getNotificationState(actionType: \"completed\" | \"delayed\" | \"test\")", "params": [ { "name": "actionType", "typeRef": "\"completed\" | \"delayed\" | \"test\"", "optional": false } ], "isEntry": true, "loc": 20 }, { "id": "func:server.ts#startDailyDueNodeReminderScheduler@1089", "kind": "function", "name": "startDailyDueNodeReminderScheduler", "qualifiedName": "startDailyDueNodeReminderScheduler", "location": { "file": "server.ts", "startLine": 1089, "endLine": 1111, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "startDailyDueNodeReminderScheduler()", "params": [], "isEntry": true, "loc": 23 }, { "id": "func:server.ts#checkAndRun@1090", "kind": "function", "name": "checkAndRun", "qualifiedName": "checkAndRun", "location": { "file": "server.ts", "startLine": 1090, "endLine": 1104, "startCol": 9, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "checkAndRun()", "params": [], "isEntry": true, "loc": 15 }, { "id": "func:server.ts#catch() 回调@1098@1098", "kind": "function", "name": "catch() 回调@1098", "qualifiedName": "catch() 回调@1098", "location": { "file": "server.ts", "startLine": 1098, "endLine": 1100, "startCol": 14, "endCol": 8 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "catch() 回调@1098(err)", "params": [ { "name": "err", "optional": false } ], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#handleDingTalkRobotMessage@1114", "kind": "function", "name": "handleDingTalkRobotMessage", "qualifiedName": "handleDingTalkRobotMessage", "location": { "file": "server.ts", "startLine": 1114, "endLine": 1197, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "handleDingTalkRobotMessage(rawData: string)", "params": [ { "name": "rawData", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 84 }, { "id": "func:server.ts#replyText@1147", "kind": "function", "name": "replyText", "qualifiedName": "replyText", "location": { "file": "server.ts", "startLine": 1147, "endLine": 1150, "startCol": 9, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "replyText(text: string)", "params": [ { "name": "text", "typeRef": "string", "optional": false } ], "isEntry": true, "loc": 4 }, { "id": "func:server.ts#startDingTalkRobotStream@1204", "kind": "function", "name": "startDingTalkRobotStream", "qualifiedName": "startDingTalkRobotStream", "location": { "file": "server.ts", "startLine": 1204, "endLine": 1233, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "startDingTalkRobotStream()", "params": [], "isEntry": true, "loc": 30 }, { "id": "func:server.ts#registerCallbackListener() 回调@1215@1215", "kind": "function", "name": "registerCallbackListener() 回调@1215", "qualifiedName": "registerCallbackListener() 回调@1215", "location": { "file": "server.ts", "startLine": 1215, "endLine": 1221, "startCol": 48, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "registerCallbackListener() 回调@1215(event)", "params": [ { "name": "event", "optional": false } ], "isEntry": true, "loc": 7 }, { "id": "func:server.ts#catch() 回调@1218@1218", "kind": "function", "name": "catch() 回调@1218", "qualifiedName": "catch() 回调@1218", "location": { "file": "server.ts", "startLine": 1218, "endLine": 1220, "startCol": 50, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "catch() 回调@1218(err)", "params": [ { "name": "err", "optional": false } ], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#then() 回调@1225@1225", "kind": "function", "name": "then() 回调@1225", "qualifiedName": "then() 回调@1225", "location": { "file": "server.ts", "startLine": 1225, "endLine": 1227, "startCol": 11, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "then() 回调@1225()", "params": [], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#catch() 回调@1228@1228", "kind": "function", "name": "catch() 回调@1228", "qualifiedName": "catch() 回调@1228", "location": { "file": "server.ts", "startLine": 1228, "endLine": 1230, "startCol": 12, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "catch() 回调@1228(err)", "params": [ { "name": "err", "optional": false } ], "isEntry": true, "loc": 3 }, { "id": "func:server.ts#startServer@1235", "kind": "function", "name": "startServer", "qualifiedName": "startServer", "location": { "file": "server.ts", "startLine": 1235, "endLine": 1255, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "startServer()", "params": [], "isEntry": true, "loc": 21 }, { "id": "func:server.ts#GET *@1245", "kind": "function", "name": "GET *", "qualifiedName": "GET *", "location": { "file": "server.ts", "startLine": 1245, "endLine": 1247, "startCol": 18, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "GET *(_req, res)", "params": [ { "name": "_req", "optional": false }, { "name": "res", "optional": false } ], "isEntry": true, "loc": 3, "interactions": [ { "id": "ix:func:server.ts#GET *@1245:api:in:GET:*", "kind": "api", "direction": "in", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "*" } ] }, { "id": "func:server.ts#listen() 回调@1250@1250", "kind": "function", "name": "listen() 回调@1250", "qualifiedName": "listen() 回调@1250", "location": { "file": "server.ts", "startLine": 1250, "endLine": 1254, "startCol": 26, "endCol": 4 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "listen() 回调@1250()", "params": [], "isEntry": true, "loc": 5 }, { "id": "func:server.ts#catch() 回调@1257@1257", "kind": "function", "name": "catch() 回调@1257", "qualifiedName": "catch() 回调@1257", "location": { "file": "server.ts", "startLine": 1257, "endLine": 1260, "startCol": 21, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "signature": "catch() 回调@1257(err)", "params": [ { "name": "err", "optional": false } ], "isEntry": true, "loc": 4 }, { "id": "func:src/utils/date.ts#getLocalDateString@1", "kind": "function", "name": "getLocalDateString", "qualifiedName": "getLocalDateString", "location": { "file": "src/utils/date.ts", "startLine": 1, "endLine": 7, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/date.ts", "moduleId": "module:src/utils", "signature": "getLocalDateString(date)", "params": [ { "name": "date", "optional": true, "defaultValue": "new Date()" } ], "loc": 7 }, { "id": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "kind": "function", "name": "createNodeTimeRange", "qualifiedName": "createNodeTimeRange", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 3, "endLine": 9, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "createNodeTimeRange(startDate: string, endDate): NodeTimeRange", "params": [ { "name": "startDate", "typeRef": "string", "optional": false }, { "name": "endDate", "optional": true, "defaultValue": "startDate" } ], "returnType": "NodeTimeRange", "loc": 7 }, { "id": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "kind": "function", "name": "addDaysToDateString", "qualifiedName": "addDaysToDateString", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 11, "endLine": 15, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "addDaysToDateString(value: string, days: number)", "params": [ { "name": "value", "typeRef": "string", "optional": false }, { "name": "days", "typeRef": "number", "optional": false } ], "loc": 5 }, { "id": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "kind": "function", "name": "normalizeNodeTimeRanges", "qualifiedName": "normalizeNodeTimeRanges", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 17, "endLine": 44, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "normalizeNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", "params": [ { "name": "ranges", "typeRef": "Partial[] | undefined", "optional": false }, { "name": "fallbackStartDate", "typeRef": "string", "optional": false }, { "name": "fallbackEndDate", "optional": true, "defaultValue": "fallbackStartDate" } ], "returnType": "NodeTimeRange[]", "loc": 28 }, { "id": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "kind": "function", "name": "constrainNodeTimeRanges", "qualifiedName": "constrainNodeTimeRanges", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 46, "endLine": 73, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "constrainNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate, forcedFirstStartDate: string): NodeTimeRange[]", "params": [ { "name": "ranges", "typeRef": "Partial[] | undefined", "optional": false }, { "name": "fallbackStartDate", "typeRef": "string", "optional": false }, { "name": "fallbackEndDate", "optional": true, "defaultValue": "fallbackStartDate" }, { "name": "forcedFirstStartDate", "typeRef": "string", "optional": true } ], "returnType": "NodeTimeRange[]", "loc": 28 }, { "id": "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", "kind": "function", "name": "reduce() 回调@53", "qualifiedName": "reduce() 回调@53", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 53, "endLine": 70, "startCol": 5, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "reduce() 回调@53(constrainedRanges, range, index)", "params": [ { "name": "constrainedRanges", "optional": false }, { "name": "range", "optional": false }, { "name": "index", "optional": false } ], "loc": 18 }, { "id": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "function", "name": "getNodeTimeRanges", "qualifiedName": "getNodeTimeRanges", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 75, "endLine": 77, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "getNodeTimeRanges(node: Pick): NodeTimeRange[]", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "returnType": "NodeTimeRange[]", "loc": 3 }, { "id": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "function", "name": "getNodeStartDate", "qualifiedName": "getNodeStartDate", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 79, "endLine": 84, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "getNodeStartDate(node: Pick)", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "loc": 6 }, { "id": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "function", "name": "getNodeEndDate", "qualifiedName": "getNodeEndDate", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 86, "endLine": 91, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "getNodeEndDate(node: Pick)", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "loc": 6 }, { "id": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "kind": "function", "name": "formatNodeTimeRanges", "qualifiedName": "formatNodeTimeRanges", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 93, "endLine": 97, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "formatNodeTimeRanges(node: Pick)", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "loc": 5 }, { "id": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "kind": "function", "name": "constrainWorkflowNodesTimeRanges", "qualifiedName": "constrainWorkflowNodesTimeRanges", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 99, "endLine": 147, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "constrainWorkflowNodesTimeRanges(nodes: WorkflowNode[])", "params": [ { "name": "nodes", "typeRef": "WorkflowNode[]", "optional": false } ], "loc": 49 }, { "id": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "kind": "function", "name": "map() 回调@107", "qualifiedName": "map() 回调@107", "location": { "file": "src/utils/nodeTimeRanges.ts", "startLine": 107, "endLine": 141, "startCol": 31, "endCol": 6 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/nodeTimeRanges.ts", "moduleId": "module:src/utils", "signature": "map() 回调@107(node)", "params": [ { "name": "node", "optional": false } ], "loc": 35 }, { "id": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "function", "name": "getTaskDisplayStatus", "qualifiedName": "getTaskDisplayStatus", "location": { "file": "src/utils/taskStatus.ts", "startLine": 7, "endLine": 48, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/taskStatus.ts", "moduleId": "module:src/utils", "signature": "getTaskDisplayStatus(task: Pick): TaskDisplayStatus", "params": [ { "name": "task", "typeRef": "Pick", "optional": false } ], "returnType": "TaskDisplayStatus", "loc": 42 }, { "id": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "function", "name": "getTaskStatusMeta", "qualifiedName": "getTaskStatusMeta", "location": { "file": "src/utils/taskStatus.ts", "startLine": 50, "endLine": 93, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/taskStatus.ts", "moduleId": "module:src/utils", "signature": "getTaskStatusMeta(status: TaskDisplayStatus)", "params": [ { "name": "status", "typeRef": "TaskDisplayStatus", "optional": false } ], "loc": 44 }, { "id": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "kind": "function", "name": "normalizeTaskPriority", "qualifiedName": "normalizeTaskPriority", "location": { "file": "src/utils/taskPriority.ts", "startLine": 7, "endLine": 9, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/taskPriority.ts", "moduleId": "module:src/utils", "signature": "normalizeTaskPriority(value: unknown): TaskPriority", "params": [ { "name": "value", "typeRef": "unknown", "optional": false } ], "returnType": "TaskPriority", "loc": 3 }, { "id": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "function", "name": "getTaskPriorityMeta", "qualifiedName": "getTaskPriorityMeta", "location": { "file": "src/utils/taskPriority.ts", "startLine": 11, "endLine": 35, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/taskPriority.ts", "moduleId": "module:src/utils", "signature": "getTaskPriorityMeta(priority: TaskPriority)", "params": [ { "name": "priority", "typeRef": "TaskPriority", "optional": false } ], "loc": 25 }, { "id": "func:src/components/TaskList.tsx#TaskList@47", "kind": "function", "name": "TaskList", "qualifiedName": "TaskList", "location": { "file": "src/components/TaskList.tsx", "startLine": 47, "endLine": 513, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "TaskList({\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}: TaskListProps)", "params": [ { "name": "{\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}", "typeRef": "TaskListProps", "optional": false } ], "loc": 467 }, { "id": "func:src/components/TaskList.tsx#reduce() 回调@77@77", "kind": "function", "name": "reduce() 回调@77", "qualifiedName": "reduce() 回调@77", "location": { "file": "src/components/TaskList.tsx", "startLine": 77, "endLine": 81, "startCol": 5, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "reduce() 回调@77(counts, task)", "params": [ { "name": "counts", "optional": false }, { "name": "task", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskList.tsx#toggleSelectedTag@91", "kind": "function", "name": "toggleSelectedTag", "qualifiedName": "toggleSelectedTag", "location": { "file": "src/components/TaskList.tsx", "startLine": 91, "endLine": 95, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "toggleSelectedTag(tag: string)", "params": [ { "name": "tag", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", "kind": "function", "name": "toggleSelectedStatus", "qualifiedName": "toggleSelectedStatus", "location": { "file": "src/components/TaskList.tsx", "startLine": 97, "endLine": 101, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "toggleSelectedStatus(status: TaskDisplayStatus)", "params": [ { "name": "status", "typeRef": "TaskDisplayStatus", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", "kind": "function", "name": "toggleSelectedPriority", "qualifiedName": "toggleSelectedPriority", "location": { "file": "src/components/TaskList.tsx", "startLine": 103, "endLine": 107, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "toggleSelectedPriority(priority: TaskPriority)", "params": [ { "name": "priority", "typeRef": "TaskPriority", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskList.tsx#filter() 回调@110@110", "kind": "function", "name": "filter() 回调@110", "qualifiedName": "filter() 回调@110", "location": { "file": "src/components/TaskList.tsx", "startLine": 110, "endLine": 127, "startCol": 38, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "filter() 回调@110(task)", "params": [ { "name": "task", "optional": false } ], "loc": 18 }, { "id": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "kind": "function", "name": "getDropBeforeTaskId", "qualifiedName": "getDropBeforeTaskId", "location": { "file": "src/components/TaskList.tsx", "startLine": 129, "endLine": 145, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "getDropBeforeTaskId(event: React.DragEvent)", "params": [ { "name": "event", "typeRef": "React.DragEvent", "optional": false } ], "loc": 17 }, { "id": "func:src/components/TaskList.tsx#find() 回调@139@139", "kind": "function", "name": "find() 回调@139", "qualifiedName": "find() 回调@139", "location": { "file": "src/components/TaskList.tsx", "startLine": 139, "endLine": 142, "startCol": 39, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "find() 回调@139(element)", "params": [ { "name": "element", "optional": false } ], "loc": 4 }, { "id": "func:src/components/TaskList.tsx#clearQueueDropState@147", "kind": "function", "name": "clearQueueDropState", "qualifiedName": "clearQueueDropState", "location": { "file": "src/components/TaskList.tsx", "startLine": 147, "endLine": 150, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "clearQueueDropState()", "params": [], "loc": 4 }, { "id": "func:src/components/TaskList.tsx#map() 回调@202@202", "kind": "function", "name": "map() 回调@202", "qualifiedName": "map() 回调@202", "location": { "file": "src/components/TaskList.tsx", "startLine": 202, "endLine": 219, "startCol": 34, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "map() 回调@202(template)", "params": [ { "name": "template", "optional": false } ], "loc": 18 }, { "id": "func:src/components/TaskList.tsx#map() 回调@265@265", "kind": "function", "name": "map() 回调@265", "qualifiedName": "map() 回调@265", "location": { "file": "src/components/TaskList.tsx", "startLine": 265, "endLine": 282, "startCol": 36, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "map() 回调@265(status)", "params": [ { "name": "status", "optional": false } ], "loc": 18 }, { "id": "func:src/components/TaskList.tsx#map() 回调@297@297", "kind": "function", "name": "map() 回调@297", "qualifiedName": "map() 回调@297", "location": { "file": "src/components/TaskList.tsx", "startLine": 297, "endLine": 314, "startCol": 32, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "map() 回调@297(priority)", "params": [ { "name": "priority", "optional": false } ], "loc": 18 }, { "id": "func:src/components/TaskList.tsx#匿名函数@353@353", "kind": "function", "name": "匿名函数@353", "qualifiedName": "匿名函数@353", "location": { "file": "src/components/TaskList.tsx", "startLine": 353, "endLine": 365, "startCol": 21, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@353(event)", "params": [ { "name": "event", "optional": false } ], "loc": 13 }, { "id": "func:src/components/TaskList.tsx#匿名函数@366@366", "kind": "function", "name": "匿名函数@366", "qualifiedName": "匿名函数@366", "location": { "file": "src/components/TaskList.tsx", "startLine": 366, "endLine": 370, "startCol": 22, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@366(event)", "params": [ { "name": "event", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskList.tsx#匿名函数@371@371", "kind": "function", "name": "匿名函数@371", "qualifiedName": "匿名函数@371", "location": { "file": "src/components/TaskList.tsx", "startLine": 371, "endLine": 380, "startCol": 17, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@371(event)", "params": [ { "name": "event", "optional": false } ], "loc": 10 }, { "id": "func:src/components/TaskList.tsx#map() 回调@387@387", "kind": "function", "name": "map() 回调@387", "qualifiedName": "map() 回调@387", "location": { "file": "src/components/TaskList.tsx", "startLine": 387, "endLine": 503, "startCol": 29, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "map() 回调@387(task)", "params": [ { "name": "task", "optional": false } ], "loc": 117 }, { "id": "func:src/components/TaskList.tsx#匿名函数@400@400", "kind": "function", "name": "匿名函数@400", "qualifiedName": "匿名函数@400", "location": { "file": "src/components/TaskList.tsx", "startLine": 400, "endLine": 409, "startCol": 32, "endCol": 20 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@400(event)", "params": [ { "name": "event", "optional": false } ], "loc": 10 }, { "id": "func:src/components/TaskList.tsx#匿名函数@410@410", "kind": "function", "name": "匿名函数@410", "qualifiedName": "匿名函数@410", "location": { "file": "src/components/TaskList.tsx", "startLine": 410, "endLine": 413, "startCol": 30, "endCol": 20 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@410()", "params": [], "loc": 4 }, { "id": "func:src/components/TaskList.tsx#匿名函数@442@442", "kind": "function", "name": "匿名函数@442", "qualifiedName": "匿名函数@442", "location": { "file": "src/components/TaskList.tsx", "startLine": 442, "endLine": 445, "startCol": 34, "endCol": 26 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@442(e)", "params": [ { "name": "e", "optional": false } ], "loc": 4 }, { "id": "func:src/components/TaskList.tsx#匿名函数@458@458", "kind": "function", "name": "匿名函数@458", "qualifiedName": "匿名函数@458", "location": { "file": "src/components/TaskList.tsx", "startLine": 458, "endLine": 463, "startCol": 36, "endCol": 28 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@458(e)", "params": [ { "name": "e", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyPlanList.tsx#addDays@20", "kind": "function", "name": "addDays", "qualifiedName": "addDays", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 20, "endLine": 24, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "addDays(value: string, days: number)", "params": [ { "name": "value", "typeRef": "string", "optional": false }, { "name": "days", "typeRef": "number", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", "kind": "function", "name": "WeeklyPlanList", "qualifiedName": "WeeklyPlanList", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 26, "endLine": 369, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "WeeklyPlanList({\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}: WeeklyPlanListProps)", "params": [ { "name": "{\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}", "typeRef": "WeeklyPlanListProps", "optional": false } ], "loc": 344 }, { "id": "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", "kind": "function", "name": "useEffect() 回调@48", "qualifiedName": "useEffect() 回调@48", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 48, "endLine": 52, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@48()", "params": [], "loc": 5 }, { "id": "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", "kind": "function", "name": "forEach() 回调@56", "qualifiedName": "forEach() 回调@56", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 56, "endLine": 61, "startCol": 17, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@56(task)", "params": [ { "name": "task", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", "kind": "function", "name": "sort() 回调@62", "qualifiedName": "sort() 回调@62", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 62, "endLine": 68, "startCol": 39, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "sort() 回调@62(a, b)", "params": [ { "name": "a", "optional": false }, { "name": "b", "optional": false } ], "loc": 7 }, { "id": "func:src/components/WeeklyPlanList.tsx#resetForm@70", "kind": "function", "name": "resetForm", "qualifiedName": "resetForm", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 70, "endLine": 74, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "resetForm()", "params": [], "loc": 5 }, { "id": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", "kind": "function", "name": "handleCreatePlan", "qualifiedName": "handleCreatePlan", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 76, "endLine": 92, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "handleCreatePlan(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 17 }, { "id": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", "kind": "function", "name": "handleDeletePlan", "qualifiedName": "handleDeletePlan", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 94, "endLine": 100, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "handleDeletePlan(event: React.MouseEvent, plan: WeeklyPlan)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false }, { "name": "plan", "typeRef": "WeeklyPlan", "optional": false } ], "loc": 7 }, { "id": "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", "kind": "function", "name": "confirmDeletePlan", "qualifiedName": "confirmDeletePlan", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 102, "endLine": 114, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "confirmDeletePlan()", "params": [], "loc": 13 }, { "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", "kind": "function", "name": "匿名函数@162", "qualifiedName": "匿名函数@162", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 162, "endLine": 167, "startCol": 25, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@162(event)", "params": [ { "name": "event", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", "kind": "function", "name": "map() 回调@197", "qualifiedName": "map() 回调@197", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 197, "endLine": 304, "startCol": 27, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "map() 回调@197(plan)", "params": [ { "name": "plan", "optional": false } ], "loc": 108 }, { "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", "kind": "function", "name": "匿名函数@209", "qualifiedName": "匿名函数@209", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 209, "endLine": 212, "startCol": 30, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@209(event)", "params": [ { "name": "event", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", "kind": "function", "name": "匿名函数@213", "qualifiedName": "匿名函数@213", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 213, "endLine": 217, "startCol": 29, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@213(event)", "params": [ { "name": "event", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219", "kind": "function", "name": "匿名函数@219", "qualifiedName": "匿名函数@219", "location": { "file": "src/components/WeeklyPlanList.tsx", "startLine": 219, "endLine": 226, "startCol": 25, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyPlanList.tsx", "moduleId": "module:src/components", "signature": "匿名函数@219(event)", "params": [ { "name": "event", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "kind": "function", "name": "WorkflowCanvas", "qualifiedName": "WorkflowCanvas", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 26, "endLine": 1124, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "WorkflowCanvas({\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}: WorkflowCanvasProps)", "params": [ { "name": "{\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}", "typeRef": "WorkflowCanvasProps", "optional": false } ], "loc": 1099 }, { "id": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 74, "endLine": 84, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 11 }, { "id": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "kind": "function", "name": "getNodeProgressPercent", "qualifiedName": "getNodeProgressPercent", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 86, "endLine": 90, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getNodeProgressPercent(node: WorkflowNode): number", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "number", "loc": 5 }, { "id": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "kind": "function", "name": "getStatusMeta", "qualifiedName": "getStatusMeta", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 92, "endLine": 130, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getStatusMeta(status: EffectiveNodeStatus)", "params": [ { "name": "status", "typeRef": "EffectiveNodeStatus", "optional": false } ], "loc": 39 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "kind": "function", "name": "handleNodeMouseDown", "qualifiedName": "handleNodeMouseDown", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 133, "endLine": 148, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleNodeMouseDown(e: React.MouseEvent, node: WorkflowNode)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false }, { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 16 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "kind": "function", "name": "handleNodeClick", "qualifiedName": "handleNodeClick", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 150, "endLine": 157, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleNodeClick(e: React.MouseEvent, node: WorkflowNode)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false }, { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", "kind": "function", "name": "handleCanvasMouseDown", "qualifiedName": "handleCanvasMouseDown", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 159, "endLine": 173, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleCanvasMouseDown(e: React.MouseEvent)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 15 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", "kind": "function", "name": "handleContainerMouseMove", "qualifiedName": "handleContainerMouseMove", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 175, "endLine": 236, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleContainerMouseMove(e: React.MouseEvent)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 62 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", "kind": "function", "name": "map() 回调@212", "qualifiedName": "map() 回调@212", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 212, "endLine": 217, "startCol": 44, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@212(n)", "params": [ { "name": "n", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", "kind": "function", "name": "handleCanvasWheel", "qualifiedName": "handleCanvasWheel", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 238, "endLine": 254, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleCanvasWheel(e: React.WheelEvent)", "params": [ { "name": "e", "typeRef": "React.WheelEvent", "optional": false } ], "loc": 17 }, { "id": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "kind": "function", "name": "getLogicalPoint", "qualifiedName": "getLogicalPoint", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 256, "endLine": 263, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getLogicalPoint(clientX: number, clientY: number)", "params": [ { "name": "clientX", "typeRef": "number", "optional": false }, { "name": "clientY", "typeRef": "number", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", "kind": "function", "name": "isAncestor", "qualifiedName": "isAncestor", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 265, "endLine": 273, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "isAncestor(ancestorId: string, descendantId: string, visited): boolean", "params": [ { "name": "ancestorId", "typeRef": "string", "optional": false }, { "name": "descendantId", "typeRef": "string", "optional": false }, { "name": "visited", "optional": true, "defaultValue": "new Set()" } ], "returnType": "boolean", "loc": 9 }, { "id": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", "kind": "function", "name": "showConnectionToast", "qualifiedName": "showConnectionToast", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 275, "endLine": 280, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "showConnectionToast(message: string)", "params": [ { "name": "message", "typeRef": "string", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", "kind": "function", "name": "setTimeout() 回调@277", "qualifiedName": "setTimeout() 回调@277", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 277, "endLine": 279, "startCol": 23, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "setTimeout() 回调@277()", "params": [], "loc": 3 }, { "id": "func:src/components/WorkflowCanvas.tsx#addConnection@282", "kind": "function", "name": "addConnection", "qualifiedName": "addConnection", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 282, "endLine": 302, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "addConnection(firstNodeId: string, secondNodeId: string)", "params": [ { "name": "firstNodeId", "typeRef": "string", "optional": false }, { "name": "secondNodeId", "typeRef": "string", "optional": false } ], "loc": 21 }, { "id": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "kind": "function", "name": "completeConnectionDrag", "qualifiedName": "completeConnectionDrag", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 304, "endLine": 314, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "completeConnectionDrag(logicalX: number, logicalY: number)", "params": [ { "name": "logicalX", "typeRef": "number", "optional": false }, { "name": "logicalY", "typeRef": "number", "optional": false } ], "loc": 11 }, { "id": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "kind": "function", "name": "getConnectionTarget", "qualifiedName": "getConnectionTarget", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 316, "endLine": 323, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getConnectionTarget(logicalX: number, logicalY: number, sourceId: string)", "params": [ { "name": "logicalX", "typeRef": "number", "optional": false }, { "name": "logicalY", "typeRef": "number", "optional": false }, { "name": "sourceId", "typeRef": "string", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", "kind": "function", "name": "find() 回调@317", "qualifiedName": "find() 回调@317", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 317, "endLine": 322, "startCol": 29, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "find() 回调@317(node)", "params": [ { "name": "node", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "kind": "function", "name": "handleConnectionMouseDown", "qualifiedName": "handleConnectionMouseDown", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 325, "endLine": 341, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleConnectionMouseDown(e: React.MouseEvent, node: WorkflowNode)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false }, { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 17 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "kind": "function", "name": "handleConnectionHandleClick", "qualifiedName": "handleConnectionHandleClick", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 343, "endLine": 350, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleConnectionHandleClick(e: React.MouseEvent, node: WorkflowNode)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false }, { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "kind": "function", "name": "getOverlapArea", "qualifiedName": "getOverlapArea", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 352, "endLine": 359, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "getOverlapArea(a: { x: number; y: number; width: number; height: number }, b: { x: number; y: number; width: number; height: number })", "params": [ { "name": "a", "typeRef": "{ x: number; y: number; width: number; height: number }", "optional": false }, { "name": "b", "typeRef": "{ x: number; y: number; width: number; height: number }", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "kind": "function", "name": "findPreviewNodePosition", "qualifiedName": "findPreviewNodePosition", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 361, "endLine": 398, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "findPreviewNodePosition(anchorNode: WorkflowNode)", "params": [ { "name": "anchorNode", "typeRef": "WorkflowNode", "optional": false } ], "loc": 38 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", "kind": "function", "name": "handleCenterNodes", "qualifiedName": "handleCenterNodes", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 400, "endLine": 429, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleCenterNodes()", "params": [], "loc": 30 }, { "id": "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", "kind": "function", "name": "reduce() 回调@405", "qualifiedName": "reduce() 回调@405", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 405, "endLine": 412, "startCol": 7, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "reduce() 回调@405(acc, node)", "params": [ { "name": "acc", "optional": false }, { "name": "node", "optional": false } ], "loc": 8 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", "kind": "function", "name": "handleContainerMouseUp", "qualifiedName": "handleContainerMouseUp", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 431, "endLine": 462, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleContainerMouseUp(e: React.MouseEvent)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 32 }, { "id": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "kind": "function", "name": "createDraftNode", "qualifiedName": "createDraftNode", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 465, "endLine": 505, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "createDraftNode(mode: 'empty' | 'parent' | 'child', explicitAnchorNode: WorkflowNode)", "params": [ { "name": "mode", "typeRef": "'empty' | 'parent' | 'child'", "optional": false }, { "name": "explicitAnchorNode", "typeRef": "WorkflowNode", "optional": true } ], "loc": 41 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", "kind": "function", "name": "handleAddEmptyNode", "qualifiedName": "handleAddEmptyNode", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 507, "endLine": 510, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleAddEmptyNode()", "params": [], "loc": 4 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", "kind": "function", "name": "handleToolbarClick", "qualifiedName": "handleToolbarClick", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 512, "endLine": 518, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleToolbarClick(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 7 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", "kind": "function", "name": "handleDeleteNode", "qualifiedName": "handleDeleteNode", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 521, "endLine": 543, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleDeleteNode(nodeId: string)", "params": [ { "name": "nodeId", "typeRef": "string", "optional": false } ], "loc": 23 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", "kind": "function", "name": "map() 回调@533", "qualifiedName": "map() 回调@533", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 533, "endLine": 538, "startCol": 46, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@533(n)", "params": [ { "name": "n", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", "kind": "function", "name": "handleSelectConnection", "qualifiedName": "handleSelectConnection", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 545, "endLine": 550, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleSelectConnection(e: React.MouseEvent, parentId: string, childId: string)", "params": [ { "name": "e", "typeRef": "React.MouseEvent", "optional": false }, { "name": "parentId", "typeRef": "string", "optional": false }, { "name": "childId", "typeRef": "string", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "kind": "function", "name": "handleDeleteConnection", "qualifiedName": "handleDeleteConnection", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 552, "endLine": 562, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleDeleteConnection(parentId: string, childId: string)", "params": [ { "name": "parentId", "typeRef": "string", "optional": false }, { "name": "childId", "typeRef": "string", "optional": false } ], "loc": 11 }, { "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", "kind": "function", "name": "useEffect() 回调@564", "qualifiedName": "useEffect() 回调@564", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 564, "endLine": 590, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@564()", "params": [], "loc": 27 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", "kind": "function", "name": "handleKeyDown", "qualifiedName": "handleKeyDown", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 565, "endLine": 586, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleKeyDown(event: KeyboardEvent)", "params": [ { "name": "event", "typeRef": "KeyboardEvent", "optional": false } ], "loc": 22 }, { "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", "kind": "function", "name": "useEffect() 回调@593", "qualifiedName": "useEffect() 回调@593", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 593, "endLine": 602, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@593()", "params": [], "loc": 10 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", "kind": "function", "name": "handleClickOutside", "qualifiedName": "handleClickOutside", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 595, "endLine": 599, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleClickOutside(event: MouseEvent)", "params": [ { "name": "event", "typeRef": "MouseEvent", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "kind": "function", "name": "buildImportedTemplateNodes", "qualifiedName": "buildImportedTemplateNodes", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 619, "endLine": 665, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "buildImportedTemplateNodes(template: ProjectTemplate): WorkflowNode[]", "params": [ { "name": "template", "typeRef": "ProjectTemplate", "optional": false } ], "returnType": "WorkflowNode[]", "loc": 47 }, { "id": "func:src/components/WorkflowCanvas.tsx#toMs@623", "kind": "function", "name": "toMs", "qualifiedName": "toMs", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 623, "endLine": 623, "startCol": 11, "endCol": 81 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "toMs(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 1 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", "kind": "function", "name": "map() 回调@638", "qualifiedName": "map() 回调@638", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 638, "endLine": 664, "startCol": 23, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@638(node, index)", "params": [ { "name": "node", "optional": false }, { "name": "index", "optional": false } ], "loc": 27 }, { "id": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "kind": "function", "name": "handleImportTemplate", "qualifiedName": "handleImportTemplate", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 667, "endLine": 681, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "handleImportTemplate(templateId: string)", "params": [ { "name": "templateId", "typeRef": "string", "optional": false } ], "loc": 15 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", "kind": "function", "name": "map() 回调@837", "qualifiedName": "map() 回调@837", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 837, "endLine": 926, "startCol": 32, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@837(node)", "params": [ { "name": "node", "optional": false } ], "loc": 90 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", "kind": "function", "name": "map() 回调@838", "qualifiedName": "map() 回调@838", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 838, "endLine": 925, "startCol": 41, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@838(parentID)", "params": [ { "name": "parentID", "optional": false } ], "loc": 88 }, { "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", "kind": "function", "name": "匿名函数@890", "qualifiedName": "匿名函数@890", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 890, "endLine": 893, "startCol": 40, "endCol": 28 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "匿名函数@890(e)", "params": [ { "name": "e", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", "kind": "function", "name": "匿名函数@894", "qualifiedName": "匿名函数@894", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 894, "endLine": 897, "startCol": 38, "endCol": 28 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "匿名函数@894(e)", "params": [ { "name": "e", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", "kind": "function", "name": "匿名函数@900", "qualifiedName": "匿名函数@900", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 900, "endLine": 904, "startCol": 36, "endCol": 28 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "匿名函数@900(e)", "params": [ { "name": "e", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", "kind": "function", "name": "匿名函数@927", "qualifiedName": "匿名函数@927", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 927, "endLine": 949, "startCol": 43, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "匿名函数@927()", "params": [], "loc": 23 }, { "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "kind": "function", "name": "map() 回调@997", "qualifiedName": "map() 回调@997", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 997, "endLine": 1117, "startCol": 30, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "map() 回调@997(node)", "params": [ { "name": "node", "optional": false } ], "loc": 121 }, { "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073", "kind": "function", "name": "匿名函数@1073", "qualifiedName": "匿名函数@1073", "location": { "file": "src/components/WorkflowCanvas.tsx", "startLine": 1073, "endLine": 1077, "startCol": 34, "endCol": 26 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WorkflowCanvas.tsx", "moduleId": "module:src/components", "signature": "匿名函数@1073(event)", "params": [ { "name": "event", "optional": false } ], "loc": 5 }, { "id": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", "kind": "function", "name": "toDateMs", "qualifiedName": "toDateMs", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 23, "endLine": 25, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "toDateMs(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 3 }, { "id": "func:src/components/ProjectCreateModal.tsx#addDays@27", "kind": "function", "name": "addDays", "qualifiedName": "addDays", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 27, "endLine": 31, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "addDays(value: string, days: number)", "params": [ { "name": "value", "typeRef": "string", "optional": false }, { "name": "days", "typeRef": "number", "optional": false } ], "loc": 5 }, { "id": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "kind": "function", "name": "shiftTemplateNodes", "qualifiedName": "shiftTemplateNodes", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 33, "endLine": 62, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "shiftTemplateNodes(nodes: WorkflowNode[])", "params": [ { "name": "nodes", "typeRef": "WorkflowNode[]", "optional": false } ], "loc": 30 }, { "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", "kind": "function", "name": "map() 回调@45", "qualifiedName": "map() 回调@45", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 45, "endLine": 61, "startCol": 20, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "map() 回调@45(node, index)", "params": [ { "name": "node", "optional": false }, { "name": "index", "optional": false } ], "loc": 17 }, { "id": "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", "kind": "function", "name": "TemplateDagPreview", "qualifiedName": "TemplateDagPreview", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 64, "endLine": 121, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "TemplateDagPreview({ template }: { template: ProjectTemplate | null })", "params": [ { "name": "{ template }", "typeRef": "{ template: ProjectTemplate | null }", "optional": false } ], "loc": 58 }, { "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", "kind": "function", "name": "useEffect() 回调@68", "qualifiedName": "useEffect() 回调@68", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 68, "endLine": 71, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@68()", "params": [], "loc": 4 }, { "id": "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", "kind": "function", "name": "ProjectCreateModal", "qualifiedName": "ProjectCreateModal", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 123, "endLine": 317, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "ProjectCreateModal({\n availableTags,\n template,\n onClose,\n onCreateTask,\n}: ProjectCreateModalProps)", "params": [ { "name": "{\n availableTags,\n template,\n onClose,\n onCreateTask,\n}", "typeRef": "ProjectCreateModalProps", "optional": false } ], "loc": 195 }, { "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", "kind": "function", "name": "useEffect() 回调@137", "qualifiedName": "useEffect() 回调@137", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 137, "endLine": 144, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@137()", "params": [], "loc": 8 }, { "id": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", "kind": "function", "name": "toggleTag", "qualifiedName": "toggleTag", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 146, "endLine": 150, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "toggleTag(tagName: string)", "params": [ { "name": "tagName", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", "kind": "function", "name": "resetProjectForm", "qualifiedName": "resetProjectForm", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 152, "endLine": 158, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "resetProjectForm()", "params": [], "loc": 7 }, { "id": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", "kind": "function", "name": "handleCreateProject", "qualifiedName": "handleCreateProject", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 160, "endLine": 183, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "handleCreateProject(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 24 }, { "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", "kind": "function", "name": "map() 回调@234", "qualifiedName": "map() 回调@234", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 234, "endLine": 251, "startCol": 40, "endCol": 20 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "map() 回调@234(priority)", "params": [ { "name": "priority", "optional": false } ], "loc": 18 }, { "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", "kind": "function", "name": "map() 回调@271", "qualifiedName": "map() 回调@271", "location": { "file": "src/components/ProjectCreateModal.tsx", "startLine": 271, "endLine": 285, "startCol": 40, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectCreateModal.tsx", "moduleId": "module:src/components", "signature": "map() 回调@271(tagDefinition)", "params": [ { "name": "tagDefinition", "optional": false } ], "loc": 15 }, { "id": "func:src/components/TaskOverview.tsx#TaskOverview@14", "kind": "function", "name": "TaskOverview", "qualifiedName": "TaskOverview", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 14, "endLine": 463, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "TaskOverview({\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}: TaskOverviewProps)", "params": [ { "name": "{\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}", "typeRef": "TaskOverviewProps", "optional": false } ], "loc": 450 }, { "id": "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", "kind": "function", "name": "useEffect() 回调@48", "qualifiedName": "useEffect() 回调@48", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 48, "endLine": 56, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@48()", "params": [], "loc": 9 }, { "id": "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", "kind": "function", "name": "useLayoutEffect() 回调@58", "qualifiedName": "useLayoutEffect() 回调@58", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 58, "endLine": 62, "startCol": 19, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "useLayoutEffect() 回调@58()", "params": [], "loc": 5 }, { "id": "func:src/components/TaskOverview.tsx#handleSave@64", "kind": "function", "name": "handleSave", "qualifiedName": "handleSave", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 64, "endLine": 77, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "handleSave()", "params": [], "loc": 14 }, { "id": "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", "kind": "function", "name": "handleSaveBlackboard", "qualifiedName": "handleSaveBlackboard", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 79, "endLine": 86, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "handleSaveBlackboard()", "params": [], "loc": 8 }, { "id": "func:src/components/TaskOverview.tsx#toggleEditTag@89", "kind": "function", "name": "toggleEditTag", "qualifiedName": "toggleEditTag", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 89, "endLine": 93, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "toggleEditTag(tagName: string)", "params": [ { "name": "tagName", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", "kind": "function", "name": "handleOpenBlackboard", "qualifiedName": "handleOpenBlackboard", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 95, "endLine": 101, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "handleOpenBlackboard()", "params": [], "loc": 7 }, { "id": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", "kind": "function", "name": "runTaskCompletionUpdate", "qualifiedName": "runTaskCompletionUpdate", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 103, "endLine": 116, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "runTaskCompletionUpdate()", "params": [], "loc": 14 }, { "id": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", "kind": "function", "name": "handleToggleTaskCompletion", "qualifiedName": "handleToggleTaskCompletion", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 118, "endLine": 132, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "handleToggleTaskCompletion(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 15 }, { "id": "func:src/components/TaskOverview.tsx#map() 回调@240@240", "kind": "function", "name": "map() 回调@240", "qualifiedName": "map() 回调@240", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 240, "endLine": 257, "startCol": 38, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@240(priority)", "params": [ { "name": "priority", "optional": false } ], "loc": 18 }, { "id": "func:src/components/TaskOverview.tsx#map() 回调@294@294", "kind": "function", "name": "map() 回调@294", "qualifiedName": "map() 回调@294", "location": { "file": "src/components/TaskOverview.tsx", "startLine": 294, "endLine": 311, "startCol": 38, "endCol": 20 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TaskOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@294(tagDefinition)", "params": [ { "name": "tagDefinition", "optional": false } ], "loc": 18 }, { "id": "func:src/components/GanttChart.tsx#GanttChart@14", "kind": "function", "name": "GanttChart", "qualifiedName": "GanttChart", "location": { "file": "src/components/GanttChart.tsx", "startLine": 14, "endLine": 427, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "GanttChart({ task, onSelectNode, selectedNodeId, centerNonce = 0 }: GanttChartProps)", "params": [ { "name": "{ task, onSelectNode, selectedNodeId, centerNonce = 0 }", "typeRef": "GanttChartProps", "optional": false } ], "loc": 414 }, { "id": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", "kind": "function", "name": "useMemo() 回调@23", "qualifiedName": "useMemo() 回调@23", "location": { "file": "src/components/GanttChart.tsx", "startLine": 23, "endLine": 73, "startCol": 29, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@23()", "params": [], "loc": 51 }, { "id": "func:src/components/GanttChart.tsx#from() 回调@29@29", "kind": "function", "name": "from() 回调@29", "qualifiedName": "from() 回调@29", "location": { "file": "src/components/GanttChart.tsx", "startLine": 29, "endLine": 33, "startCol": 50, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "from() 回调@29(_, i)", "params": [ { "name": "_", "optional": false }, { "name": "i", "optional": false } ], "loc": 5 }, { "id": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", "kind": "function", "name": "forEach() 回调@40", "qualifiedName": "forEach() 回调@40", "location": { "file": "src/components/GanttChart.tsx", "startLine": 40, "endLine": 47, "startCol": 19, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@40(node)", "params": [ { "name": "node", "optional": false } ], "loc": 8 }, { "id": "func:src/components/GanttChart.tsx#forEach() 回调@41@41", "kind": "function", "name": "forEach() 回调@41", "qualifiedName": "forEach() 回调@41", "location": { "file": "src/components/GanttChart.tsx", "startLine": 41, "endLine": 46, "startCol": 39, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@41(range)", "params": [ { "name": "range", "optional": false } ], "loc": 6 }, { "id": "func:src/components/GanttChart.tsx#formatDateString@76", "kind": "function", "name": "formatDateString", "qualifiedName": "formatDateString", "location": { "file": "src/components/GanttChart.tsx", "startLine": 76, "endLine": 78, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "formatDateString(dt: Date)", "params": [ { "name": "dt", "typeRef": "Date", "optional": false } ], "loc": 3 }, { "id": "func:src/components/GanttChart.tsx#getDayLabel@80", "kind": "function", "name": "getDayLabel", "qualifiedName": "getDayLabel", "location": { "file": "src/components/GanttChart.tsx", "startLine": 80, "endLine": 83, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "getDayLabel(dt: Date)", "params": [ { "name": "dt", "typeRef": "Date", "optional": false } ], "loc": 4 }, { "id": "func:src/components/GanttChart.tsx#isWeekend@86", "kind": "function", "name": "isWeekend", "qualifiedName": "isWeekend", "location": { "file": "src/components/GanttChart.tsx", "startLine": 86, "endLine": 89, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "isWeekend(dt: Date)", "params": [ { "name": "dt", "typeRef": "Date", "optional": false } ], "loc": 4 }, { "id": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", "kind": "function", "name": "getTimelinePercentage", "qualifiedName": "getTimelinePercentage", "location": { "file": "src/components/GanttChart.tsx", "startLine": 92, "endLine": 110, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "getTimelinePercentage(startStr: string, endStr: string)", "params": [ { "name": "startStr", "typeRef": "string", "optional": false }, { "name": "endStr", "typeRef": "string", "optional": false } ], "loc": 19 }, { "id": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/components/GanttChart.tsx", "startLine": 115, "endLine": 125, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 11 }, { "id": "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", "kind": "function", "name": "handleTimelineMouseDown", "qualifiedName": "handleTimelineMouseDown", "location": { "file": "src/components/GanttChart.tsx", "startLine": 131, "endLine": 142, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "handleTimelineMouseDown(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 12 }, { "id": "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", "kind": "function", "name": "handleTimelineMouseMove", "qualifiedName": "handleTimelineMouseMove", "location": { "file": "src/components/GanttChart.tsx", "startLine": 144, "endLine": 153, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "handleTimelineMouseMove(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 10 }, { "id": "func:src/components/GanttChart.tsx#stopTimelineDrag@155", "kind": "function", "name": "stopTimelineDrag", "qualifiedName": "stopTimelineDrag", "location": { "file": "src/components/GanttChart.tsx", "startLine": 155, "endLine": 158, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "stopTimelineDrag()", "params": [], "loc": 4 }, { "id": "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", "kind": "function", "name": "handleTimelineClickCapture", "qualifiedName": "handleTimelineClickCapture", "location": { "file": "src/components/GanttChart.tsx", "startLine": 160, "endLine": 165, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "handleTimelineClickCapture(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 6 }, { "id": "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", "kind": "function", "name": "useEffect() 回调@167", "qualifiedName": "useEffect() 回调@167", "location": { "file": "src/components/GanttChart.tsx", "startLine": 167, "endLine": 192, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@167()", "params": [], "loc": 26 }, { "id": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "kind": "function", "name": "requestAnimationFrame() 回调@174", "qualifiedName": "requestAnimationFrame() 回调@174", "location": { "file": "src/components/GanttChart.tsx", "startLine": 174, "endLine": 189, "startCol": 46, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "requestAnimationFrame() 回调@174()", "params": [], "loc": 16 }, { "id": "func:src/components/GanttChart.tsx#map() 回调@260@260", "kind": "function", "name": "map() 回调@260", "qualifiedName": "map() 回调@260", "location": { "file": "src/components/GanttChart.tsx", "startLine": 260, "endLine": 298, "startCol": 45, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@260(day, idx)", "params": [ { "name": "day", "optional": false }, { "name": "idx", "optional": false } ], "loc": 39 }, { "id": "func:src/components/GanttChart.tsx#map() 回调@304@304", "kind": "function", "name": "map() 回调@304", "qualifiedName": "map() 回调@304", "location": { "file": "src/components/GanttChart.tsx", "startLine": 304, "endLine": 420, "startCol": 26, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@304(node)", "params": [ { "name": "node", "optional": false } ], "loc": 117 }, { "id": "func:src/components/GanttChart.tsx#map() 回调@375@375", "kind": "function", "name": "map() 回调@375", "qualifiedName": "map() 回调@375", "location": { "file": "src/components/GanttChart.tsx", "startLine": 375, "endLine": 386, "startCol": 53, "endCol": 26 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@375(day, idx)", "params": [ { "name": "day", "optional": false }, { "name": "idx", "optional": false } ], "loc": 12 }, { "id": "func:src/components/GanttChart.tsx#map() 回调@389@389", "kind": "function", "name": "map() 回调@389", "qualifiedName": "map() 回调@389", "location": { "file": "src/components/GanttChart.tsx", "startLine": 389, "endLine": 416, "startCol": 43, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@389(range, rangeIndex)", "params": [ { "name": "range", "optional": false }, { "name": "rangeIndex", "optional": false } ], "loc": 28 }, { "id": "func:src/components/GanttChart.tsx#匿名函数@399@399", "kind": "function", "name": "匿名函数@399", "qualifiedName": "匿名函数@399", "location": { "file": "src/components/GanttChart.tsx", "startLine": 399, "endLine": 402, "startCol": 38, "endCol": 30 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/GanttChart.tsx", "moduleId": "module:src/components", "signature": "匿名函数@399(event)", "params": [ { "name": "event", "optional": false } ], "loc": 4 }, { "id": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", "kind": "function", "name": "PersonGanttChart", "qualifiedName": "PersonGanttChart", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 25, "endLine": 377, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "PersonGanttChart({\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}: PersonGanttChartProps)", "params": [ { "name": "{\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}", "typeRef": "PersonGanttChartProps", "optional": false } ], "loc": 353 }, { "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", "kind": "function", "name": "useMemo() 回调@41", "qualifiedName": "useMemo() 回调@41", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 41, "endLine": 49, "startCol": 44, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@41()", "params": [], "loc": 9 }, { "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "kind": "function", "name": "useMemo() 回调@51", "qualifiedName": "useMemo() 回调@51", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 51, "endLine": 76, "startCol": 29, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@51()", "params": [], "loc": 26 }, { "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", "kind": "function", "name": "forEach() 回调@64", "qualifiedName": "forEach() 回调@64", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 64, "endLine": 71, "startCol": 19, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@64({ node })", "params": [ { "name": "{ node }", "optional": false } ], "loc": 8 }, { "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", "kind": "function", "name": "forEach() 回调@65", "qualifiedName": "forEach() 回调@65", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 65, "endLine": 70, "startCol": 39, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@65(range)", "params": [ { "name": "range", "optional": false } ], "loc": 6 }, { "id": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 87, "endLine": 97, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 11 }, { "id": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "kind": "function", "name": "getTimelinePercentage", "qualifiedName": "getTimelinePercentage", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 99, "endLine": 113, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "getTimelinePercentage(startStr: string, endStr: string)", "params": [ { "name": "startStr", "typeRef": "string", "optional": false }, { "name": "endStr", "typeRef": "string", "optional": false } ], "loc": 15 }, { "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", "kind": "function", "name": "handleTimelineMouseDown", "qualifiedName": "handleTimelineMouseDown", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 115, "endLine": 124, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "handleTimelineMouseDown(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 10 }, { "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", "kind": "function", "name": "handleTimelineMouseMove", "qualifiedName": "handleTimelineMouseMove", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 126, "endLine": 133, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "handleTimelineMouseMove(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 8 }, { "id": "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", "kind": "function", "name": "stopTimelineDrag", "qualifiedName": "stopTimelineDrag", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 135, "endLine": 138, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "stopTimelineDrag()", "params": [], "loc": 4 }, { "id": "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", "kind": "function", "name": "useEffect() 回调@140", "qualifiedName": "useEffect() 回调@140", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 140, "endLine": 170, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@140()", "params": [], "loc": 31 }, { "id": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", "kind": "function", "name": "requestAnimationFrame() 回调@149", "qualifiedName": "requestAnimationFrame() 回调@149", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 149, "endLine": 167, "startCol": 46, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "requestAnimationFrame() 回调@149()", "params": [], "loc": 19 }, { "id": "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", "kind": "function", "name": "匿名函数@218", "qualifiedName": "匿名函数@218", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 218, "endLine": 222, "startCol": 20, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "匿名函数@218(event)", "params": [ { "name": "event", "optional": false } ], "loc": 5 }, { "id": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", "kind": "function", "name": "map() 回调@235", "qualifiedName": "map() 回调@235", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 235, "endLine": 261, "startCol": 45, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@235(day, idx)", "params": [ { "name": "day", "optional": false }, { "name": "idx", "optional": false } ], "loc": 27 }, { "id": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "kind": "function", "name": "map() 回调@266", "qualifiedName": "map() 回调@266", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 266, "endLine": 370, "startCol": 26, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@266({ task, node })", "params": [ { "name": "{ task, node }", "optional": false } ], "loc": 105 }, { "id": "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", "kind": "function", "name": "map() 回调@322", "qualifiedName": "map() 回调@322", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 322, "endLine": 335, "startCol": 53, "endCol": 26 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@322(day, idx)", "params": [ { "name": "day", "optional": false }, { "name": "idx", "optional": false } ], "loc": 14 }, { "id": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", "kind": "function", "name": "map() 回调@337", "qualifiedName": "map() 回调@337", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 337, "endLine": 366, "startCol": 43, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "map() 回调@337(range, rangeIndex)", "params": [ { "name": "range", "optional": false }, { "name": "rangeIndex", "optional": false } ], "loc": 30 }, { "id": "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", "kind": "function", "name": "匿名函数@344", "qualifiedName": "匿名函数@344", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 344, "endLine": 351, "startCol": 38, "endCol": 30 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "匿名函数@344(event)", "params": [ { "name": "event", "optional": false } ], "loc": 8 }, { "id": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", "kind": "function", "name": "buildDateRange", "qualifiedName": "buildDateRange", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 379, "endLine": 391, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "buildDateRange(minDate: Date, maxDate: Date)", "params": [ { "name": "minDate", "typeRef": "Date", "optional": false }, { "name": "maxDate", "typeRef": "Date", "optional": false } ], "loc": 13 }, { "id": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", "kind": "function", "name": "getDayLabel", "qualifiedName": "getDayLabel", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 393, "endLine": 396, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "getDayLabel(dt: Date)", "params": [ { "name": "dt", "typeRef": "Date", "optional": false } ], "loc": 4 }, { "id": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "kind": "function", "name": "getStatusVisual", "qualifiedName": "getStatusVisual", "location": { "file": "src/components/PersonGanttChart.tsx", "startLine": 398, "endLine": 424, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PersonGanttChart.tsx", "moduleId": "module:src/components", "signature": "getStatusVisual(status: EffectiveNodeStatus)", "params": [ { "name": "status", "typeRef": "EffectiveNodeStatus", "optional": false } ], "loc": 27 }, { "id": "func:src/components/PeopleManager.tsx#getSearchTokens@29", "kind": "function", "name": "getSearchTokens", "qualifiedName": "getSearchTokens", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 29, "endLine": 43, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "getSearchTokens(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 15 }, { "id": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", "kind": "function", "name": "getPinyinSortKey", "qualifiedName": "getPinyinSortKey", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 45, "endLine": 49, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "getPinyinSortKey(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", "kind": "function", "name": "comparePeopleByPinyin", "qualifiedName": "comparePeopleByPinyin", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 51, "endLine": 56, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "comparePeopleByPinyin(a: Person, b: Person)", "params": [ { "name": "a", "typeRef": "Person", "optional": false }, { "name": "b", "typeRef": "Person", "optional": false } ], "loc": 6 }, { "id": "func:src/components/PeopleManager.tsx#PeopleManager@58", "kind": "function", "name": "PeopleManager", "qualifiedName": "PeopleManager", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 58, "endLine": 328, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "PeopleManager({\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}: PeopleManagerProps)", "params": [ { "name": "{\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}", "typeRef": "PeopleManagerProps", "optional": false } ], "loc": 271 }, { "id": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", "kind": "function", "name": "useMemo() 回调@107", "qualifiedName": "useMemo() 回调@107", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 107, "endLine": 116, "startCol": 34, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@107()", "params": [], "loc": 10 }, { "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", "kind": "function", "name": "useEffect() 回调@118", "qualifiedName": "useEffect() 回调@118", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 118, "endLine": 120, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@118()", "params": [], "loc": 3 }, { "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", "kind": "function", "name": "useEffect() 回调@122", "qualifiedName": "useEffect() 回调@122", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 122, "endLine": 125, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@122()", "params": [], "loc": 4 }, { "id": "func:src/components/PeopleManager.tsx#handleSaveRole@127", "kind": "function", "name": "handleSaveRole", "qualifiedName": "handleSaveRole", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 127, "endLine": 136, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "handleSaveRole()", "params": [], "loc": 10 }, { "id": "func:src/components/PeopleManager.tsx#匿名函数@250@250", "kind": "function", "name": "匿名函数@250", "qualifiedName": "匿名函数@250", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 250, "endLine": 253, "startCol": 30, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "匿名函数@250()", "params": [], "loc": 4 }, { "id": "func:src/components/PeopleManager.tsx#匿名函数@280@280", "kind": "function", "name": "匿名函数@280", "qualifiedName": "匿名函数@280", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 280, "endLine": 284, "startCol": 32, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "匿名函数@280(event)", "params": [ { "name": "event", "optional": false } ], "loc": 5 }, { "id": "func:src/components/PeopleManager.tsx#匿名函数@285@285", "kind": "function", "name": "匿名函数@285", "qualifiedName": "匿名函数@285", "location": { "file": "src/components/PeopleManager.tsx", "startLine": 285, "endLine": 290, "startCol": 34, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/PeopleManager.tsx", "moduleId": "module:src/components", "signature": "匿名函数@285(event)", "params": [ { "name": "event", "optional": false } ], "loc": 6 }, { "id": "func:src/utils/api.ts#appPath@7", "kind": "function", "name": "appPath", "qualifiedName": "appPath", "location": { "file": "src/utils/api.ts", "startLine": 7, "endLine": 13, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/api.ts", "moduleId": "module:src/utils", "signature": "appPath(path)", "params": [ { "name": "path", "optional": true, "defaultValue": "''" } ], "loc": 7 }, { "id": "func:src/utils/api.ts#apiPath@15", "kind": "function", "name": "apiPath", "qualifiedName": "apiPath", "location": { "file": "src/utils/api.ts", "startLine": 15, "endLine": 17, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/utils/api.ts", "moduleId": "module:src/utils", "signature": "apiPath(path: string)", "params": [ { "name": "path", "typeRef": "string", "optional": false } ], "loc": 3 }, { "id": "func:src/components/LoginPage.tsx#readApiJson@21", "kind": "function", "name": "readApiJson", "qualifiedName": "readApiJson", "location": { "file": "src/components/LoginPage.tsx", "startLine": 21, "endLine": 29, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "readApiJson(response: Response, fallback: string): Promise", "params": [ { "name": "response", "typeRef": "Response", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 9 }, { "id": "func:src/components/LoginPage.tsx#createOAuthState@31", "kind": "function", "name": "createOAuthState", "qualifiedName": "createOAuthState", "location": { "file": "src/components/LoginPage.tsx", "startLine": 31, "endLine": 37, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "createOAuthState()", "params": [], "loc": 7 }, { "id": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "kind": "function", "name": "requestSsoOAuthCode", "qualifiedName": "requestSsoOAuthCode", "location": { "file": "src/components/LoginPage.tsx", "startLine": 39, "endLine": 82, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "requestSsoOAuthCode(authorizeUrl: string, state: string)", "params": [ { "name": "authorizeUrl", "typeRef": "string", "optional": false }, { "name": "state", "typeRef": "string", "optional": false } ], "loc": 44 }, { "id": "func:src/components/LoginPage.tsx#匿名函数@40@40", "kind": "function", "name": "匿名函数@40", "qualifiedName": "匿名函数@40", "location": { "file": "src/components/LoginPage.tsx", "startLine": 40, "endLine": 81, "startCol": 30, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "匿名函数@40(resolve, reject)", "params": [ { "name": "resolve", "optional": false }, { "name": "reject", "optional": false } ], "loc": 42 }, { "id": "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", "kind": "function", "name": "setTimeout() 回调@52", "qualifiedName": "setTimeout() 回调@52", "location": { "file": "src/components/LoginPage.tsx", "startLine": 52, "endLine": 56, "startCol": 41, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "setTimeout() 回调@52()", "params": [], "loc": 5 }, { "id": "func:src/components/LoginPage.tsx#handleMessage@58", "kind": "function", "name": "handleMessage", "qualifiedName": "handleMessage", "location": { "file": "src/components/LoginPage.tsx", "startLine": 58, "endLine": 78, "startCol": 5, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "handleMessage(event: MessageEvent)", "params": [ { "name": "event", "typeRef": "MessageEvent", "optional": false } ], "loc": 21 }, { "id": "func:src/components/LoginPage.tsx#LoginPage@84", "kind": "function", "name": "LoginPage", "qualifiedName": "LoginPage", "location": { "file": "src/components/LoginPage.tsx", "startLine": 84, "endLine": 187, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "LoginPage({ onLogin }: LoginPageProps)", "params": [ { "name": "{ onLogin }", "typeRef": "LoginPageProps", "optional": false } ], "loc": 104 }, { "id": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "kind": "function", "name": "handleSsoLogin", "qualifiedName": "handleSsoLogin", "location": { "file": "src/components/LoginPage.tsx", "startLine": 90, "endLine": 119, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "handleSsoLogin()", "params": [], "loc": 30, "interactions": [ { "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:GET:`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`" }, { "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:POST:/api/auth/sso-login", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/sso-login" } ] }, { "id": "func:src/components/LoginPage.tsx#handleDevLogin@121", "kind": "function", "name": "handleDevLogin", "qualifiedName": "handleDevLogin", "location": { "file": "src/components/LoginPage.tsx", "startLine": 121, "endLine": 141, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/LoginPage.tsx", "moduleId": "module:src/components", "signature": "handleDevLogin()", "params": [], "loc": 21, "interactions": [ { "id": "ix:func:src/components/LoginPage.tsx#handleDevLogin@121:api:out:POST:/api/auth/dev-login", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/dev-login" } ] }, { "id": "func:src/components/TagManager.tsx#TagManager@11", "kind": "function", "name": "TagManager", "qualifiedName": "TagManager", "location": { "file": "src/components/TagManager.tsx", "startLine": 11, "endLine": 157, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TagManager.tsx", "moduleId": "module:src/components", "signature": "TagManager({ tags, onCreateTag, onDeleteTag }: TagManagerProps)", "params": [ { "name": "{ tags, onCreateTag, onDeleteTag }", "typeRef": "TagManagerProps", "optional": false } ], "loc": 147 }, { "id": "func:src/components/TagManager.tsx#useMemo() 回调@17@17", "kind": "function", "name": "useMemo() 回调@17", "qualifiedName": "useMemo() 回调@17", "location": { "file": "src/components/TagManager.tsx", "startLine": 17, "endLine": 21, "startCol": 32, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TagManager.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@17()", "params": [], "loc": 5 }, { "id": "func:src/components/TagManager.tsx#handleSubmit@23", "kind": "function", "name": "handleSubmit", "qualifiedName": "handleSubmit", "location": { "file": "src/components/TagManager.tsx", "startLine": 23, "endLine": 39, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TagManager.tsx", "moduleId": "module:src/components", "signature": "handleSubmit(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 17 }, { "id": "func:src/components/TagManager.tsx#匿名函数@136@136", "kind": "function", "name": "匿名函数@136", "qualifiedName": "匿名函数@136", "location": { "file": "src/components/TagManager.tsx", "startLine": 136, "endLine": 140, "startCol": 34, "endCol": 26 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/TagManager.tsx", "moduleId": "module:src/components", "signature": "匿名函数@136()", "params": [], "loc": 5 }, { "id": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", "kind": "function", "name": "emptyTemplateDraft", "qualifiedName": "emptyTemplateDraft", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 18, "endLine": 25, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "emptyTemplateDraft(): TemplateDraft", "params": [], "returnType": "TemplateDraft", "loc": 8 }, { "id": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", "kind": "function", "name": "createDefaultTemplateNode", "qualifiedName": "createDefaultTemplateNode", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 27, "endLine": 44, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "createDefaultTemplateNode(): WorkflowNode", "params": [], "returnType": "WorkflowNode", "loc": 18 }, { "id": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "kind": "function", "name": "getUniqueTemplateName", "qualifiedName": "getUniqueTemplateName", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 46, "endLine": 55, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "getUniqueTemplateName(baseName: string, templates: ProjectTemplate[])", "params": [ { "name": "baseName", "typeRef": "string", "optional": false }, { "name": "templates", "typeRef": "ProjectTemplate[]", "optional": false } ], "loc": 10 }, { "id": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "kind": "function", "name": "normalizeDraft", "qualifiedName": "normalizeDraft", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 57, "endLine": 64, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "normalizeDraft(draft: TemplateDraft): Omit", "params": [ { "name": "draft", "typeRef": "TemplateDraft", "optional": false } ], "returnType": "Omit", "loc": 8 }, { "id": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", "kind": "function", "name": "toCanvasTask", "qualifiedName": "toCanvasTask", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 66, "endLine": 83, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "toCanvasTask(draft: TemplateDraft): Task", "params": [ { "name": "draft", "typeRef": "TemplateDraft", "optional": false } ], "returnType": "Task", "loc": 18 }, { "id": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", "kind": "function", "name": "ProjectTemplateManager", "qualifiedName": "ProjectTemplateManager", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 85, "endLine": 534, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "ProjectTemplateManager({\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}: ProjectTemplateManagerProps)", "params": [ { "name": "{\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}", "typeRef": "ProjectTemplateManagerProps", "optional": false } ], "loc": 450 }, { "id": "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", "kind": "function", "name": "useEffect() 回调@104", "qualifiedName": "useEffect() 回调@104", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 104, "endLine": 109, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@104()", "params": [], "loc": 6 }, { "id": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", "kind": "function", "name": "toggleTag", "qualifiedName": "toggleTag", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 111, "endLine": 118, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "toggleTag(tagName: string)", "params": [ { "name": "tagName", "typeRef": "string", "optional": false } ], "loc": 8 }, { "id": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "function", "name": "loadTemplateIntoEditor", "qualifiedName": "loadTemplateIntoEditor", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 120, "endLine": 130, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "loadTemplateIntoEditor(template: ProjectTemplate)", "params": [ { "name": "template", "typeRef": "ProjectTemplate", "optional": false } ], "loc": 11 }, { "id": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", "kind": "function", "name": "handleNewTemplate", "qualifiedName": "handleNewTemplate", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 132, "endLine": 152, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "handleNewTemplate()", "params": [], "loc": 21 }, { "id": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", "kind": "function", "name": "handleSaveTemplate", "qualifiedName": "handleSaveTemplate", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 154, "endLine": 179, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "handleSaveTemplate(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 26 }, { "id": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", "kind": "function", "name": "handleCopyTemplate", "qualifiedName": "handleCopyTemplate", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 181, "endLine": 220, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "handleCopyTemplate()", "params": [], "loc": 40 }, { "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", "kind": "function", "name": "map() 回调@201", "qualifiedName": "map() 回调@201", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 201, "endLine": 210, "startCol": 30, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "map() 回调@201(node)", "params": [ { "name": "node", "optional": false } ], "loc": 10 }, { "id": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", "kind": "function", "name": "handleDeleteTemplate", "qualifiedName": "handleDeleteTemplate", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 222, "endLine": 245, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "handleDeleteTemplate()", "params": [], "loc": 24 }, { "id": "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", "kind": "function", "name": "handleUpdateNodes", "qualifiedName": "handleUpdateNodes", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 247, "endLine": 249, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "handleUpdateNodes(nodes: WorkflowNode[])", "params": [ { "name": "nodes", "typeRef": "WorkflowNode[]", "optional": false } ], "loc": 3 }, { "id": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", "kind": "function", "name": "updateSelectedNode", "qualifiedName": "updateSelectedNode", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 251, "endLine": 258, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "updateSelectedNode(patch: Partial)", "params": [ { "name": "patch", "typeRef": "Partial", "optional": false } ], "loc": 8 }, { "id": "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", "kind": "function", "name": "deleteSelectedNode", "qualifiedName": "deleteSelectedNode", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 260, "endLine": 273, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "deleteSelectedNode()", "params": [], "loc": 14 }, { "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", "kind": "function", "name": "map() 回调@308", "qualifiedName": "map() 回调@308", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 308, "endLine": 336, "startCol": 31, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "map() 回调@308(template)", "params": [ { "name": "template", "optional": false } ], "loc": 29 }, { "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", "kind": "function", "name": "map() 回调@393", "qualifiedName": "map() 回调@393", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 393, "endLine": 407, "startCol": 40, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "map() 回调@393(tagDefinition)", "params": [ { "name": "tagDefinition", "optional": false } ], "loc": 15 }, { "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504", "kind": "function", "name": "map() 回调@504", "qualifiedName": "map() 回调@504", "location": { "file": "src/components/ProjectTemplateManager.tsx", "startLine": 504, "endLine": 511, "startCol": 52, "endCol": 28 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/ProjectTemplateManager.tsx", "moduleId": "module:src/components", "signature": "map() 回调@504(parentId)", "params": [ { "name": "parentId", "optional": false } ], "loc": 8 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 49, "endLine": 59, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "Pick", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 11 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "kind": "function", "name": "getStatusMeta", "qualifiedName": "getStatusMeta", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 61, "endLine": 87, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getStatusMeta(status: EffectiveNodeStatus)", "params": [ { "name": "status", "typeRef": "EffectiveNodeStatus", "optional": false } ], "loc": 27 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "kind": "function", "name": "getLinkedNodeClassName", "qualifiedName": "getLinkedNodeClassName", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 89, "endLine": 105, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getLinkedNodeClassName(node: WorkflowNode)", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 17 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", "kind": "function", "name": "getSearchTokens", "qualifiedName": "getSearchTokens", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 107, "endLine": 121, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getSearchTokens(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 15 }, { "id": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "kind": "function", "name": "NodeEditorDrawer", "qualifiedName": "NodeEditorDrawer", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 123, "endLine": 755, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "NodeEditorDrawer({\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}: NodeEditorDrawerProps)", "params": [ { "name": "{\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}", "typeRef": "NodeEditorDrawerProps", "optional": false } ], "loc": 633 }, { "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", "kind": "function", "name": "useEffect() 回调@151", "qualifiedName": "useEffect() 回调@151", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 151, "endLine": 176, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@151()", "params": [], "loc": 26 }, { "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", "kind": "function", "name": "匿名函数@157", "qualifiedName": "匿名函数@157", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 157, "endLine": 159, "startCol": 14, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "匿名函数@157()", "params": [], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", "kind": "function", "name": "setTimeout() 回调@164", "qualifiedName": "setTimeout() 回调@164", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 164, "endLine": 167, "startCol": 30, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "setTimeout() 回调@164()", "params": [], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", "kind": "function", "name": "匿名函数@173", "qualifiedName": "匿名函数@173", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 173, "endLine": 175, "startCol": 12, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "匿名函数@173()", "params": [], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", "kind": "function", "name": "useEffect() 回调@178", "qualifiedName": "useEffect() 回调@178", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 178, "endLine": 196, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "useEffect() 回调@178()", "params": [], "loc": 19 }, { "id": "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", "kind": "function", "name": "filter() 回调@210", "qualifiedName": "filter() 回调@210", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 210, "endLine": 218, "startCol": 40, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "filter() 回调@210(person)", "params": [ { "name": "person", "optional": false } ], "loc": 9 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "kind": "function", "name": "getParentLatestEndDate", "qualifiedName": "getParentLatestEndDate", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 220, "endLine": 229, "startCol": 3, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getParentLatestEndDate(node: WorkflowNode | null)", "params": [ { "name": "node", "typeRef": "WorkflowNode | null", "optional": true, "defaultValue": "drawerNode" } ], "loc": 10 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "kind": "function", "name": "getMinimumFirstStartDate", "qualifiedName": "getMinimumFirstStartDate", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 231, "endLine": 237, "startCol": 3, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getMinimumFirstStartDate(node: WorkflowNode | null, locked)", "params": [ { "name": "node", "typeRef": "WorkflowNode | null", "optional": true, "defaultValue": "drawerNode" }, { "name": "locked", "optional": true, "defaultValue": "editStartDateLocked" } ], "loc": 7 }, { "id": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", "kind": "function", "name": "closeDrawer", "qualifiedName": "closeDrawer", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 239, "endLine": 242, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "closeDrawer()", "params": [], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "kind": "function", "name": "getDraftKey", "qualifiedName": "getDraftKey", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 244, "endLine": 249, "startCol": 3, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getDraftKey(draft: NodeEditDraft)", "params": [ { "name": "draft", "typeRef": "NodeEditDraft", "optional": false } ], "loc": 6 }, { "id": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "function", "name": "getCurrentDraft", "qualifiedName": "getCurrentDraft", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 251, "endLine": 259, "startCol": 3, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "getCurrentDraft(): NodeEditDraft", "params": [], "returnType": "NodeEditDraft", "loc": 9 }, { "id": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "kind": "function", "name": "normalizeProgress", "qualifiedName": "normalizeProgress", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 261, "endLine": 265, "startCol": 3, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "normalizeProgress(value: unknown)", "params": [ { "name": "value", "typeRef": "unknown", "optional": false } ], "loc": 5 }, { "id": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "kind": "function", "name": "selectResponsible", "qualifiedName": "selectResponsible", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 267, "endLine": 273, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "selectResponsible(personName: string)", "params": [ { "name": "personName", "typeRef": "string", "optional": false } ], "loc": 7 }, { "id": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "function", "name": "updateSelectedNode", "qualifiedName": "updateSelectedNode", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 275, "endLine": 326, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "updateSelectedNode(action: 'auto' | 'complete' | 'reopen', draft, startDateLocked)", "params": [ { "name": "action", "typeRef": "'auto' | 'complete' | 'reopen'", "optional": true, "defaultValue": "'auto'" }, { "name": "draft", "optional": true, "defaultValue": "getCurrentDraft()" }, { "name": "startDateLocked", "optional": true, "defaultValue": "editStartDateLocked" } ], "loc": 52 }, { "id": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", "kind": "function", "name": "completeNode", "qualifiedName": "completeNode", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 328, "endLine": 330, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "completeNode()", "params": [], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", "kind": "function", "name": "reopenNode", "qualifiedName": "reopenNode", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 332, "endLine": 334, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "reopenNode()", "params": [], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "kind": "function", "name": "changeEditName", "qualifiedName": "changeEditName", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 336, "endLine": 339, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "changeEditName(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "kind": "function", "name": "changeEditDesc", "qualifiedName": "changeEditDesc", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 341, "endLine": 344, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "changeEditDesc(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "kind": "function", "name": "updateTimeRanges", "qualifiedName": "updateTimeRanges", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 346, "endLine": 355, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "updateTimeRanges(nextRanges: NodeTimeRange[])", "params": [ { "name": "nextRanges", "typeRef": "NodeTimeRange[]", "optional": false } ], "loc": 10 }, { "id": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "kind": "function", "name": "changeTimeRange", "qualifiedName": "changeTimeRange", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 357, "endLine": 359, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "changeTimeRange(rangeId: string, patch: Partial)", "params": [ { "name": "rangeId", "typeRef": "string", "optional": false }, { "name": "patch", "typeRef": "Partial", "optional": false } ], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", "kind": "function", "name": "addTimeRange", "qualifiedName": "addTimeRange", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 361, "endLine": 365, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "addTimeRange()", "params": [], "loc": 5 }, { "id": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "kind": "function", "name": "removeTimeRange", "qualifiedName": "removeTimeRange", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 367, "endLine": 370, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "removeTimeRange(rangeId: string)", "params": [ { "name": "rangeId", "typeRef": "string", "optional": false } ], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "kind": "function", "name": "changeProgress", "qualifiedName": "changeProgress", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 372, "endLine": 376, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "changeProgress(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", "kind": "function", "name": "toggleStartDateLock", "qualifiedName": "toggleStartDateLock", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 378, "endLine": 382, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "toggleStartDateLock()", "params": [], "loc": 5 }, { "id": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", "kind": "function", "name": "deleteNode", "qualifiedName": "deleteNode", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 384, "endLine": 400, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "deleteNode()", "params": [], "loc": 17 }, { "id": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "kind": "function", "name": "focusLinkedNode", "qualifiedName": "focusLinkedNode", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 402, "endLine": 405, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "focusLinkedNode(node: WorkflowNode)", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 4 }, { "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", "kind": "function", "name": "map() 回调@466", "qualifiedName": "map() 回调@466", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 466, "endLine": 484, "startCol": 15, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "map() 回调@466({ id, label, icon: Icon })", "params": [ { "name": "{ id, label, icon: Icon }", "optional": false } ], "loc": 19 }, { "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", "kind": "function", "name": "匿名函数@524", "qualifiedName": "匿名函数@524", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 524, "endLine": 526, "startCol": 31, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "匿名函数@524()", "params": [], "loc": 3 }, { "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", "kind": "function", "name": "map() 回调@676", "qualifiedName": "map() 回调@676", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 676, "endLine": 693, "startCol": 44, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "signature": "map() 回调@676(parentId)", "params": [ { "name": "parentId", "optional": false } ], "loc": 18 }, { "id": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "kind": "function", "name": "getDropBeforeTaskId", "qualifiedName": "getDropBeforeTaskId", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 33, "endLine": 42, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "getDropBeforeTaskId(container: HTMLElement, clientY: number, draggingTaskId: string | null)", "params": [ { "name": "container", "typeRef": "HTMLElement", "optional": false }, { "name": "clientY", "typeRef": "number", "optional": false }, { "name": "draggingTaskId", "typeRef": "string | null", "optional": false } ], "loc": 10 }, { "id": "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", "kind": "function", "name": "find() 回调@37", "qualifiedName": "find() 回调@37", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 37, "endLine": 40, "startCol": 29, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "find() 回调@37(element)", "params": [ { "name": "element", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "kind": "function", "name": "normalizeProgress", "qualifiedName": "normalizeProgress", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 53, "endLine": 57, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "normalizeProgress(value: unknown)", "params": [ { "name": "value", "typeRef": "unknown", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyOverview.tsx#sortTasks@82", "kind": "function", "name": "sortTasks", "qualifiedName": "sortTasks", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 82, "endLine": 88, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "sortTasks(tasks: Task[])", "params": [ { "name": "tasks", "typeRef": "Task[]", "optional": false } ], "loc": 7 }, { "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", "kind": "function", "name": "sort() 回调@83", "qualifiedName": "sort() 回调@83", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 83, "endLine": 87, "startCol": 26, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "sort() 回调@83(a, b)", "params": [ { "name": "a", "optional": false }, { "name": "b", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "kind": "function", "name": "getEffectiveNodeStatus", "qualifiedName": "getEffectiveNodeStatus", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 90, "endLine": 97, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false }, { "name": "today", "typeRef": "string", "optional": false } ], "returnType": "EffectiveNodeStatus", "loc": 8 }, { "id": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", "kind": "function", "name": "WeeklyOverview", "qualifiedName": "WeeklyOverview", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 99, "endLine": 879, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "WeeklyOverview({\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}: WeeklyOverviewProps)", "params": [ { "name": "{\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}", "typeRef": "WeeklyOverviewProps", "optional": false } ], "loc": 781 }, { "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", "kind": "function", "name": "handleBoardMouseDown", "qualifiedName": "handleBoardMouseDown", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 118, "endLine": 129, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleBoardMouseDown(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 12 }, { "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", "kind": "function", "name": "handleBoardMouseMove", "qualifiedName": "handleBoardMouseMove", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 131, "endLine": 136, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleBoardMouseMove(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "kind": "function", "name": "stopBoardDrag", "qualifiedName": "stopBoardDrag", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 138, "endLine": 141, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "stopBoardDrag()", "params": [], "loc": 4 }, { "id": "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", "kind": "function", "name": "handleBoardClickCapture", "qualifiedName": "handleBoardClickCapture", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 143, "endLine": 148, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleBoardClickCapture(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", "kind": "function", "name": "handleDrawerMouseDown", "qualifiedName": "handleDrawerMouseDown", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 156, "endLine": 168, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleDrawerMouseDown(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 13 }, { "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", "kind": "function", "name": "handleDrawerMouseMove", "qualifiedName": "handleDrawerMouseMove", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 170, "endLine": 194, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleDrawerMouseMove(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 25 }, { "id": "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", "kind": "function", "name": "stopDrawerDrag", "qualifiedName": "stopDrawerDrag", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 196, "endLine": 199, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "stopDrawerDrag()", "params": [], "loc": 4 }, { "id": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "kind": "function", "name": "clearTaskDragState", "qualifiedName": "clearTaskDragState", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 207, "endLine": 212, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "clearTaskDragState()", "params": [], "loc": 6 }, { "id": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "kind": "function", "name": "handleTaskDragStart", "qualifiedName": "handleTaskDragStart", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 214, "endLine": 225, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleTaskDragStart(event: React.DragEvent, task: Task)", "params": [ { "name": "event", "typeRef": "React.DragEvent", "optional": false }, { "name": "task", "typeRef": "Task", "optional": false } ], "loc": 12 }, { "id": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "kind": "function", "name": "handleColumnDragOver", "qualifiedName": "handleColumnDragOver", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 227, "endLine": 235, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleColumnDragOver(event: React.DragEvent, planId: string)", "params": [ { "name": "event", "typeRef": "React.DragEvent", "optional": false }, { "name": "planId", "typeRef": "string", "optional": false } ], "loc": 9 }, { "id": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "kind": "function", "name": "handleColumnDrop", "qualifiedName": "handleColumnDrop", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 237, "endLine": 254, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "handleColumnDrop(event: React.DragEvent, planId: string)", "params": [ { "name": "event", "typeRef": "React.DragEvent", "optional": false }, { "name": "planId", "typeRef": "string", "optional": false } ], "loc": 18 }, { "id": "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", "kind": "function", "name": "useMemo() 回调@261", "qualifiedName": "useMemo() 回调@261", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 261, "endLine": 269, "startCol": 31, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "useMemo() 回调@261()", "params": [], "loc": 9 }, { "id": "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", "kind": "function", "name": "forEach() 回调@263", "qualifiedName": "forEach() 回调@263", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 263, "endLine": 267, "startCol": 19, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "forEach() 回调@263(task)", "params": [ { "name": "task", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", "kind": "function", "name": "sort() 回调@273", "qualifiedName": "sort() 回调@273", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 273, "endLine": 279, "startCol": 23, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "sort() 回调@273(a, b)", "params": [ { "name": "a", "optional": false }, { "name": "b", "optional": false } ], "loc": 7 }, { "id": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", "kind": "function", "name": "toggleSelectedPriority", "qualifiedName": "toggleSelectedPriority", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 283, "endLine": 287, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "toggleSelectedPriority(priority: TaskPriority)", "params": [ { "name": "priority", "typeRef": "TaskPriority", "optional": false } ], "loc": 5 }, { "id": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", "kind": "function", "name": "matchesFilters", "qualifiedName": "matchesFilters", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 290, "endLine": 300, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "matchesFilters(task: Task)", "params": [ { "name": "task", "typeRef": "Task", "optional": false } ], "loc": 11 }, { "id": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", "kind": "function", "name": "map() 回调@335", "qualifiedName": "map() 回调@335", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 335, "endLine": 350, "startCol": 32, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@335(priority)", "params": [ { "name": "priority", "optional": false } ], "loc": 16 }, { "id": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "kind": "function", "name": "map() 回调@382", "qualifiedName": "map() 回调@382", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 382, "endLine": 620, "startCol": 31, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@382(plan)", "params": [ { "name": "plan", "optional": false } ], "loc": 239 }, { "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", "kind": "function", "name": "reduce() 回调@394", "qualifiedName": "reduce() 回调@394", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 394, "endLine": 397, "startCol": 17, "endCol": 18 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "reduce() 回调@394(counts, task)", "params": [ { "name": "counts", "optional": false }, { "name": "task", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", "kind": "function", "name": "匿名函数@494", "qualifiedName": "匿名函数@494", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 494, "endLine": 499, "startCol": 34, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "匿名函数@494(event)", "params": [ { "name": "event", "optional": false } ], "loc": 6 }, { "id": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "kind": "function", "name": "map() 回调@513", "qualifiedName": "map() 回调@513", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 513, "endLine": 612, "startCol": 41, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@513(task)", "params": [ { "name": "task", "optional": false } ], "loc": 100 }, { "id": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "kind": "function", "name": "匿名函数@644", "qualifiedName": "匿名函数@644", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 644, "endLine": 775, "startCol": 25, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "匿名函数@644()", "params": [], "loc": 132 }, { "id": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "kind": "function", "name": "map() 回调@721", "qualifiedName": "map() 回调@721", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 721, "endLine": 757, "startCol": 40, "endCol": 24 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@721(node)", "params": [ { "name": "node", "optional": false } ], "loc": 37 }, { "id": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", "kind": "function", "name": "匿名函数@777", "qualifiedName": "匿名函数@777", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 777, "endLine": 875, "startCol": 25, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "匿名函数@777()", "params": [], "loc": 99 }, { "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", "kind": "function", "name": "reduce() 回调@785", "qualifiedName": "reduce() 回调@785", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 785, "endLine": 788, "startCol": 13, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "reduce() 回调@785(counts, task)", "params": [ { "name": "counts", "optional": false }, { "name": "task", "optional": false } ], "loc": 4 }, { "id": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", "kind": "function", "name": "map() 回调@840", "qualifiedName": "map() 回调@840", "location": { "file": "src/components/WeeklyOverview.tsx", "startLine": 840, "endLine": 858, "startCol": 39, "endCol": 22 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/WeeklyOverview.tsx", "moduleId": "module:src/components", "signature": "map() 回调@840(status)", "params": [ { "name": "status", "optional": false } ], "loc": 19 }, { "id": "func:src/App.tsx#readApiError@39", "kind": "function", "name": "readApiError", "qualifiedName": "readApiError", "location": { "file": "src/App.tsx", "startLine": 39, "endLine": 42, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "readApiError(res: Response, fallback: string)", "params": [ { "name": "res", "typeRef": "Response", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "loc": 4 }, { "id": "func:src/App.tsx#readApiJson@44", "kind": "function", "name": "readApiJson", "qualifiedName": "readApiJson", "location": { "file": "src/App.tsx", "startLine": 44, "endLine": 52, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "readApiJson(res: Response, fallback: string): Promise", "params": [ { "name": "res", "typeRef": "Response", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 9 }, { "id": "func:src/App.tsx#sortTasksForList@54", "kind": "function", "name": "sortTasksForList", "qualifiedName": "sortTasksForList", "location": { "file": "src/App.tsx", "startLine": 54, "endLine": 60, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "sortTasksForList(tasks: Task[])", "params": [ { "name": "tasks", "typeRef": "Task[]", "optional": false } ], "loc": 7 }, { "id": "func:src/App.tsx#sort() 回调@55@55", "kind": "function", "name": "sort() 回调@55", "qualifiedName": "sort() 回调@55", "location": { "file": "src/App.tsx", "startLine": 55, "endLine": 59, "startCol": 26, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "sort() 回调@55(a, b)", "params": [ { "name": "a", "optional": false }, { "name": "b", "optional": false } ], "loc": 5 }, { "id": "func:src/App.tsx#readStoredAuthUser@62", "kind": "function", "name": "readStoredAuthUser", "qualifiedName": "readStoredAuthUser", "location": { "file": "src/App.tsx", "startLine": 62, "endLine": 82, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "readStoredAuthUser(): AuthUser | null", "params": [], "returnType": "AuthUser | null", "loc": 21 }, { "id": "func:src/App.tsx#App@84", "kind": "function", "name": "App", "qualifiedName": "App", "location": { "file": "src/App.tsx", "startLine": 84, "endLine": 1974, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "App()", "params": [], "loc": 1891 }, { "id": "func:src/App.tsx#useEffect() 回调@133@133", "kind": "function", "name": "useEffect() 回调@133", "qualifiedName": "useEffect() 回调@133", "location": { "file": "src/App.tsx", "startLine": 133, "endLine": 145, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@133()", "params": [], "loc": 13 }, { "id": "func:src/App.tsx#useEffect() 回调@147@147", "kind": "function", "name": "useEffect() 回调@147", "qualifiedName": "useEffect() 回调@147", "location": { "file": "src/App.tsx", "startLine": 147, "endLine": 151, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@147()", "params": [], "loc": 5 }, { "id": "func:src/App.tsx#useEffect() 回调@153@153", "kind": "function", "name": "useEffect() 回调@153", "qualifiedName": "useEffect() 回调@153", "location": { "file": "src/App.tsx", "startLine": 153, "endLine": 157, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@153()", "params": [], "loc": 5 }, { "id": "func:src/App.tsx#useEffect() 回调@159@159", "kind": "function", "name": "useEffect() 回调@159", "qualifiedName": "useEffect() 回调@159", "location": { "file": "src/App.tsx", "startLine": 159, "endLine": 164, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@159()", "params": [], "loc": 6 }, { "id": "func:src/App.tsx#useEffect() 回调@171@171", "kind": "function", "name": "useEffect() 回调@171", "qualifiedName": "useEffect() 回调@171", "location": { "file": "src/App.tsx", "startLine": 171, "endLine": 176, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@171()", "params": [], "loc": 6 }, { "id": "func:src/App.tsx#useEffect() 回调@178@178", "kind": "function", "name": "useEffect() 回调@178", "qualifiedName": "useEffect() 回调@178", "location": { "file": "src/App.tsx", "startLine": 178, "endLine": 184, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@178()", "params": [], "loc": 7 }, { "id": "func:src/App.tsx#useEffect() 回调@186@186", "kind": "function", "name": "useEffect() 回调@186", "qualifiedName": "useEffect() 回调@186", "location": { "file": "src/App.tsx", "startLine": 186, "endLine": 211, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@186()", "params": [], "loc": 26 }, { "id": "func:src/App.tsx#useEffect() 回调@213@213", "kind": "function", "name": "useEffect() 回调@213", "qualifiedName": "useEffect() 回调@213", "location": { "file": "src/App.tsx", "startLine": 213, "endLine": 219, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@213()", "params": [], "loc": 7 }, { "id": "func:src/App.tsx#匿名函数@214@214", "kind": "function", "name": "匿名函数@214", "qualifiedName": "匿名函数@214", "location": { "file": "src/App.tsx", "startLine": 214, "endLine": 218, "startCol": 12, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "匿名函数@214()", "params": [], "loc": 5 }, { "id": "func:src/App.tsx#fetchTasks@221", "kind": "function", "name": "fetchTasks", "qualifiedName": "fetchTasks", "location": { "file": "src/App.tsx", "startLine": 221, "endLine": 239, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "fetchTasks()", "params": [], "loc": 19, "interactions": [ { "id": "ix:func:src/App.tsx#fetchTasks@221:api:out:GET:/api/tasks", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/tasks" } ] }, { "id": "func:src/App.tsx#fetchPeople@241", "kind": "function", "name": "fetchPeople", "qualifiedName": "fetchPeople", "location": { "file": "src/App.tsx", "startLine": 241, "endLine": 254, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "fetchPeople()", "params": [], "loc": 14, "interactions": [ { "id": "ix:func:src/App.tsx#fetchPeople@241:api:out:GET:/api/people", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/people" } ] }, { "id": "func:src/App.tsx#fetchTags@256", "kind": "function", "name": "fetchTags", "qualifiedName": "fetchTags", "location": { "file": "src/App.tsx", "startLine": 256, "endLine": 269, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "fetchTags()", "params": [], "loc": 14, "interactions": [ { "id": "ix:func:src/App.tsx#fetchTags@256:api:out:GET:/api/tags", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/tags" } ] }, { "id": "func:src/App.tsx#handleCreateTag@271", "kind": "function", "name": "handleCreateTag", "qualifiedName": "handleCreateTag", "location": { "file": "src/App.tsx", "startLine": 271, "endLine": 295, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCreateTag(name: string): Promise", "params": [ { "name": "name", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 25, "interactions": [ { "id": "ix:func:src/App.tsx#handleCreateTag@271:api:out:POST:/api/tags", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tags" } ] }, { "id": "func:src/App.tsx#setTags() 回调@281@281", "kind": "function", "name": "setTags() 回调@281", "qualifiedName": "setTags() 回调@281", "location": { "file": "src/App.tsx", "startLine": 281, "endLine": 284, "startCol": 17, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "setTags() 回调@281(prev)", "params": [ { "name": "prev", "optional": false } ], "loc": 4 }, { "id": "func:src/App.tsx#handleDeleteTag@297", "kind": "function", "name": "handleDeleteTag", "qualifiedName": "handleDeleteTag", "location": { "file": "src/App.tsx", "startLine": 297, "endLine": 321, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleDeleteTag(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 25, "interactions": [ { "id": "ix:func:src/App.tsx#handleDeleteTag@297:api:out:DELETE:`/api/tags/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "`/api/tags/${id}`" } ] }, { "id": "func:src/App.tsx#fetchProjectTemplates@323", "kind": "function", "name": "fetchProjectTemplates", "qualifiedName": "fetchProjectTemplates", "location": { "file": "src/App.tsx", "startLine": 323, "endLine": 336, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "fetchProjectTemplates()", "params": [], "loc": 14, "interactions": [ { "id": "ix:func:src/App.tsx#fetchProjectTemplates@323:api:out:GET:/api/project-templates", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/project-templates" } ] }, { "id": "func:src/App.tsx#fetchWeeklyPlans@338", "kind": "function", "name": "fetchWeeklyPlans", "qualifiedName": "fetchWeeklyPlans", "location": { "file": "src/App.tsx", "startLine": 338, "endLine": 351, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "fetchWeeklyPlans()", "params": [], "loc": 14, "interactions": [ { "id": "ix:func:src/App.tsx#fetchWeeklyPlans@338:api:out:GET:/api/weekly-plans", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "/api/weekly-plans" } ] }, { "id": "func:src/App.tsx#handleCreateWeeklyPlan@353", "kind": "function", "name": "handleCreateWeeklyPlan", "qualifiedName": "handleCreateWeeklyPlan", "location": { "file": "src/App.tsx", "startLine": 353, "endLine": 383, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCreateWeeklyPlan(input: Omit): Promise", "params": [ { "name": "input", "typeRef": "Omit", "optional": false } ], "returnType": "Promise", "loc": 31, "interactions": [ { "id": "ix:func:src/App.tsx#handleCreateWeeklyPlan@353:api:out:POST:/api/weekly-plans", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/weekly-plans" } ] }, { "id": "func:src/App.tsx#handleDeleteWeeklyPlan@385", "kind": "function", "name": "handleDeleteWeeklyPlan", "qualifiedName": "handleDeleteWeeklyPlan", "location": { "file": "src/App.tsx", "startLine": 385, "endLine": 425, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleDeleteWeeklyPlan(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 41, "interactions": [ { "id": "ix:func:src/App.tsx#handleDeleteWeeklyPlan@385:api:out:DELETE:`/api/weekly-plans/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "`/api/weekly-plans/${id}`" } ] }, { "id": "func:src/App.tsx#setWeeklyPlans() 回调@402@402", "kind": "function", "name": "setWeeklyPlans() 回调@402", "qualifiedName": "setWeeklyPlans() 回调@402", "location": { "file": "src/App.tsx", "startLine": 402, "endLine": 407, "startCol": 22, "endCol": 8 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "setWeeklyPlans() 回调@402(prev)", "params": [ { "name": "prev", "optional": false } ], "loc": 6 }, { "id": "func:src/App.tsx#handleCreateProjectTemplate@427", "kind": "function", "name": "handleCreateProjectTemplate", "qualifiedName": "handleCreateProjectTemplate", "location": { "file": "src/App.tsx", "startLine": 427, "endLine": 448, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCreateProjectTemplate(input: Omit): Promise", "params": [ { "name": "input", "typeRef": "Omit", "optional": false } ], "returnType": "Promise", "loc": 22, "interactions": [ { "id": "ix:func:src/App.tsx#handleCreateProjectTemplate@427:api:out:POST:/api/project-templates", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/project-templates" } ] }, { "id": "func:src/App.tsx#handleUpdateProjectTemplate@450", "kind": "function", "name": "handleUpdateProjectTemplate", "qualifiedName": "handleUpdateProjectTemplate", "location": { "file": "src/App.tsx", "startLine": 450, "endLine": 476, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleUpdateProjectTemplate(id: string, input: Omit): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false }, { "name": "input", "typeRef": "Omit", "optional": false } ], "returnType": "Promise", "loc": 27, "interactions": [ { "id": "ix:func:src/App.tsx#handleUpdateProjectTemplate@450:api:out:PUT:`/api/project-templates/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "`/api/project-templates/${id}`" } ] }, { "id": "func:src/App.tsx#handleDeleteProjectTemplate@478", "kind": "function", "name": "handleDeleteProjectTemplate", "qualifiedName": "handleDeleteProjectTemplate", "location": { "file": "src/App.tsx", "startLine": 478, "endLine": 496, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleDeleteProjectTemplate(id: string): Promise", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 19, "interactions": [ { "id": "ix:func:src/App.tsx#handleDeleteProjectTemplate@478:api:out:DELETE:`/api/project-templates/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "`/api/project-templates/${id}`" } ] }, { "id": "func:src/App.tsx#handleCreatePerson@498", "kind": "function", "name": "handleCreatePerson", "qualifiedName": "handleCreatePerson", "location": { "file": "src/App.tsx", "startLine": 498, "endLine": 519, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCreatePerson(input: { name: string; role: string })", "params": [ { "name": "input", "typeRef": "{ name: string; role: string }", "optional": false } ], "loc": 22, "interactions": [ { "id": "ix:func:src/App.tsx#handleCreatePerson@498:api:out:POST:/api/people", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/people" } ] }, { "id": "func:src/App.tsx#setPeople() 回调@508@508", "kind": "function", "name": "setPeople() 回调@508", "qualifiedName": "setPeople() 回调@508", "location": { "file": "src/App.tsx", "startLine": 508, "endLine": 511, "startCol": 19, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "setPeople() 回调@508(prev)", "params": [ { "name": "prev", "optional": false } ], "loc": 4 }, { "id": "func:src/App.tsx#handleJoinSsoPerson@521", "kind": "function", "name": "handleJoinSsoPerson", "qualifiedName": "handleJoinSsoPerson", "location": { "file": "src/App.tsx", "startLine": 521, "endLine": 546, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleJoinSsoPerson(authCode: string): Promise", "params": [ { "name": "authCode", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 26, "interactions": [ { "id": "ix:func:src/App.tsx#handleJoinSsoPerson@521:api:out:POST:/api/auth/sso-join-person", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/sso-join-person" } ] }, { "id": "func:src/App.tsx#setPeople() 回调@532@532", "kind": "function", "name": "setPeople() 回调@532", "qualifiedName": "setPeople() 回调@532", "location": { "file": "src/App.tsx", "startLine": 532, "endLine": 535, "startCol": 19, "endCol": 10 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "setPeople() 回调@532(prev)", "params": [ { "name": "prev", "optional": false } ], "loc": 4 }, { "id": "func:src/App.tsx#handleDeletePerson@548", "kind": "function", "name": "handleDeletePerson", "qualifiedName": "handleDeletePerson", "location": { "file": "src/App.tsx", "startLine": 548, "endLine": 563, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleDeletePerson(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 16, "interactions": [ { "id": "ix:func:src/App.tsx#handleDeletePerson@548:api:out:DELETE:`/api/people/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "`/api/people/${id}`" } ] }, { "id": "func:src/App.tsx#handleUpdatePersonRole@565", "kind": "function", "name": "handleUpdatePersonRole", "qualifiedName": "handleUpdatePersonRole", "location": { "file": "src/App.tsx", "startLine": 565, "endLine": 603, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleUpdatePersonRole(person: Person, role: string)", "params": [ { "name": "person", "typeRef": "Person", "optional": false }, { "name": "role", "typeRef": "string", "optional": false } ], "loc": 39, "interactions": [ { "id": "ix:func:src/App.tsx#handleUpdatePersonRole@565:api:out:PUT:`/api/people/${person.id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "`/api/people/${person.id}`" } ] }, { "id": "func:src/App.tsx#handleTogglePersonAdmin@605", "kind": "function", "name": "handleTogglePersonAdmin", "qualifiedName": "handleTogglePersonAdmin", "location": { "file": "src/App.tsx", "startLine": 605, "endLine": 637, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleTogglePersonAdmin(person: Person, isPersonAdmin: boolean)", "params": [ { "name": "person", "typeRef": "Person", "optional": false }, { "name": "isPersonAdmin", "typeRef": "boolean", "optional": false } ], "loc": 33, "interactions": [ { "id": "ix:func:src/App.tsx#handleTogglePersonAdmin@605:api:out:PUT:`/api/people/${person.id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "`/api/people/${person.id}`" } ] }, { "id": "func:src/App.tsx#handleLogin@639", "kind": "function", "name": "handleLogin", "qualifiedName": "handleLogin", "location": { "file": "src/App.tsx", "startLine": 639, "endLine": 648, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleLogin(user: AuthUser)", "params": [ { "name": "user", "typeRef": "AuthUser", "optional": false } ], "loc": 10 }, { "id": "func:src/App.tsx#handleUnlockAdmin@650", "kind": "function", "name": "handleUnlockAdmin", "qualifiedName": "handleUnlockAdmin", "location": { "file": "src/App.tsx", "startLine": 650, "endLine": 676, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleUnlockAdmin(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 27, "interactions": [ { "id": "ix:func:src/App.tsx#handleUnlockAdmin@650:api:out:POST:/api/auth/manual-login", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/auth/manual-login" } ] }, { "id": "func:src/App.tsx#handleCurrentUserClick@678", "kind": "function", "name": "handleCurrentUserClick", "qualifiedName": "handleCurrentUserClick", "location": { "file": "src/App.tsx", "startLine": 678, "endLine": 694, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCurrentUserClick()", "params": [], "loc": 17 }, { "id": "func:src/App.tsx#handleLogout@696", "kind": "function", "name": "handleLogout", "qualifiedName": "handleLogout", "location": { "file": "src/App.tsx", "startLine": 696, "endLine": 717, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleLogout()", "params": [], "loc": 22 }, { "id": "func:src/App.tsx#useMemo() 回调@720@720", "kind": "function", "name": "useMemo() 回调@720", "qualifiedName": "useMemo() 回调@720", "location": { "file": "src/App.tsx", "startLine": 720, "endLine": 724, "startCol": 32, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useMemo() 回调@720()", "params": [], "loc": 5 }, { "id": "func:src/App.tsx#useMemo() 回调@726@726", "kind": "function", "name": "useMemo() 回调@726", "qualifiedName": "useMemo() 回调@726", "location": { "file": "src/App.tsx", "startLine": 726, "endLine": 728, "startCol": 30, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useMemo() 回调@726()", "params": [], "loc": 3 }, { "id": "func:src/App.tsx#useMemo() 回调@730@730", "kind": "function", "name": "useMemo() 回调@730", "qualifiedName": "useMemo() 回调@730", "location": { "file": "src/App.tsx", "startLine": 730, "endLine": 732, "startCol": 43, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useMemo() 回调@730()", "params": [], "loc": 3 }, { "id": "func:src/App.tsx#useEffect() 回调@734@734", "kind": "function", "name": "useEffect() 回调@734", "qualifiedName": "useEffect() 回调@734", "location": { "file": "src/App.tsx", "startLine": 734, "endLine": 748, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@734()", "params": [], "loc": 15 }, { "id": "func:src/App.tsx#handleSelectWeeklyPlan@750", "kind": "function", "name": "handleSelectWeeklyPlan", "qualifiedName": "handleSelectWeeklyPlan", "location": { "file": "src/App.tsx", "startLine": 750, "endLine": 759, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleSelectWeeklyPlan(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 10 }, { "id": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", "kind": "function", "name": "handleMoveTaskToWeeklyPlan", "qualifiedName": "handleMoveTaskToWeeklyPlan", "location": { "file": "src/App.tsx", "startLine": 761, "endLine": 796, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleMoveTaskToWeeklyPlan(taskId: string, weeklyPlanId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "weeklyPlanId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 36, "interactions": [ { "id": "ix:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761:api:out:PUT:`/api/tasks/${taskId}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "`/api/tasks/${taskId}`" } ] }, { "id": "func:src/App.tsx#handleReorderTask@798", "kind": "function", "name": "handleReorderTask", "qualifiedName": "handleReorderTask", "location": { "file": "src/App.tsx", "startLine": 798, "endLine": 847, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleReorderTask(taskId: string, beforeTaskId: string | null)", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "beforeTaskId", "typeRef": "string | null", "optional": false } ], "loc": 50, "interactions": [ { "id": "ix:func:src/App.tsx#handleReorderTask@798:api:out:PATCH:`/api/tasks/${task.id}/list-state`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PATCH", "path": "`/api/tasks/${task.id}/list-state`" } ] }, { "id": "func:src/App.tsx#handleSelectTask@849", "kind": "function", "name": "handleSelectTask", "qualifiedName": "handleSelectTask", "location": { "file": "src/App.tsx", "startLine": 849, "endLine": 854, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleSelectTask(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 6 }, { "id": "func:src/App.tsx#handleStartCreateProject@856", "kind": "function", "name": "handleStartCreateProject", "qualifiedName": "handleStartCreateProject", "location": { "file": "src/App.tsx", "startLine": 856, "endLine": 863, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleStartCreateProject()", "params": [], "loc": 8 }, { "id": "func:src/App.tsx#handleCancelCreateProject@865", "kind": "function", "name": "handleCancelCreateProject", "qualifiedName": "handleCancelCreateProject", "location": { "file": "src/App.tsx", "startLine": 865, "endLine": 868, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCancelCreateProject()", "params": [], "loc": 4 }, { "id": "func:src/App.tsx#handleSelectNode@870", "kind": "function", "name": "handleSelectNode", "qualifiedName": "handleSelectNode", "location": { "file": "src/App.tsx", "startLine": 870, "endLine": 875, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleSelectNode(nodeId: string | null)", "params": [ { "name": "nodeId", "typeRef": "string | null", "optional": false } ], "loc": 6 }, { "id": "func:src/App.tsx#handleOpenTaskFromOverview@877", "kind": "function", "name": "handleOpenTaskFromOverview", "qualifiedName": "handleOpenTaskFromOverview", "location": { "file": "src/App.tsx", "startLine": 877, "endLine": 886, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleOpenTaskFromOverview(task: Task)", "params": [ { "name": "task", "typeRef": "Task", "optional": false } ], "loc": 10 }, { "id": "func:src/App.tsx#handleOpenPlanFromOverview@888", "kind": "function", "name": "handleOpenPlanFromOverview", "qualifiedName": "handleOpenPlanFromOverview", "location": { "file": "src/App.tsx", "startLine": 888, "endLine": 897, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleOpenPlanFromOverview(planId: string)", "params": [ { "name": "planId", "typeRef": "string", "optional": false } ], "loc": 10 }, { "id": "func:src/App.tsx#handleSelectTaskNode@899", "kind": "function", "name": "handleSelectTaskNode", "qualifiedName": "handleSelectTaskNode", "location": { "file": "src/App.tsx", "startLine": 899, "endLine": 907, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleSelectTaskNode(taskId: string, nodeId: string)", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "nodeId", "typeRef": "string", "optional": false } ], "loc": 9 }, { "id": "func:src/App.tsx#handleNavigateDrawerView@926", "kind": "function", "name": "handleNavigateDrawerView", "qualifiedName": "handleNavigateDrawerView", "location": { "file": "src/App.tsx", "startLine": 926, "endLine": 955, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleNavigateDrawerView(target: 'project-graph' | 'project-gantt' | 'person-gantt')", "params": [ { "name": "target", "typeRef": "'project-graph' | 'project-gantt' | 'person-gantt'", "optional": false } ], "loc": 30 }, { "id": "func:src/App.tsx#handleWorkspaceClick@957", "kind": "function", "name": "handleWorkspaceClick", "qualifiedName": "handleWorkspaceClick", "location": { "file": "src/App.tsx", "startLine": 957, "endLine": 978, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleWorkspaceClick(event: React.MouseEvent)", "params": [ { "name": "event", "typeRef": "React.MouseEvent", "optional": false } ], "loc": 22 }, { "id": "func:src/App.tsx#computeCenteredViewport@981", "kind": "function", "name": "computeCenteredViewport", "qualifiedName": "computeCenteredViewport", "location": { "file": "src/App.tsx", "startLine": 981, "endLine": 1014, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "computeCenteredViewport(task: Task)", "params": [ { "name": "task", "typeRef": "Task", "optional": false } ], "loc": 34 }, { "id": "func:src/App.tsx#focusNodeInCanvas@1016", "kind": "function", "name": "focusNodeInCanvas", "qualifiedName": "focusNodeInCanvas", "location": { "file": "src/App.tsx", "startLine": 1016, "endLine": 1062, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "focusNodeInCanvas(node: WorkflowNode)", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 47 }, { "id": "func:src/App.tsx#animate@1042", "kind": "function", "name": "animate", "qualifiedName": "animate", "location": { "file": "src/App.tsx", "startLine": 1042, "endLine": 1059, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "animate(now: number)", "params": [ { "name": "now", "typeRef": "number", "optional": false } ], "loc": 18 }, { "id": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", "kind": "function", "name": "revealNodeIfCoveredByDrawer", "qualifiedName": "revealNodeIfCoveredByDrawer", "location": { "file": "src/App.tsx", "startLine": 1064, "endLine": 1107, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "revealNodeIfCoveredByDrawer(node: WorkflowNode)", "params": [ { "name": "node", "typeRef": "WorkflowNode", "optional": false } ], "loc": 44 }, { "id": "func:src/App.tsx#animate@1088", "kind": "function", "name": "animate", "qualifiedName": "animate", "location": { "file": "src/App.tsx", "startLine": 1088, "endLine": 1104, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "animate(now: number)", "params": [ { "name": "now", "typeRef": "number", "optional": false } ], "loc": 17 }, { "id": "func:src/App.tsx#useEffect() 回调@1109@1109", "kind": "function", "name": "useEffect() 回调@1109", "qualifiedName": "useEffect() 回调@1109", "location": { "file": "src/App.tsx", "startLine": 1109, "endLine": 1119, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@1109()", "params": [], "loc": 11 }, { "id": "func:src/App.tsx#useEffect() 回调@1121@1121", "kind": "function", "name": "useEffect() 回调@1121", "qualifiedName": "useEffect() 回调@1121", "location": { "file": "src/App.tsx", "startLine": 1121, "endLine": 1130, "startCol": 13, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useEffect() 回调@1121()", "params": [], "loc": 10 }, { "id": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", "kind": "function", "name": "useLayoutEffect() 回调@1134", "qualifiedName": "useLayoutEffect() 回调@1134", "location": { "file": "src/App.tsx", "startLine": 1134, "endLine": 1162, "startCol": 19, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "useLayoutEffect() 回调@1134()", "params": [], "loc": 29 }, { "id": "func:src/App.tsx#applyCentered@1149", "kind": "function", "name": "applyCentered", "qualifiedName": "applyCentered", "location": { "file": "src/App.tsx", "startLine": 1149, "endLine": 1156, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "applyCentered()", "params": [], "loc": 8 }, { "id": "func:src/App.tsx#handleCreateTask@1165", "kind": "function", "name": "handleCreateTask", "qualifiedName": "handleCreateTask", "location": { "file": "src/App.tsx", "startLine": 1165, "endLine": 1209, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleCreateTask(name: string, description: string, priority: TaskPriority, tags: string[], requirementDocUrl: string, nodes: WorkflowNode[]): Promise", "params": [ { "name": "name", "typeRef": "string", "optional": false }, { "name": "description", "typeRef": "string", "optional": false }, { "name": "priority", "typeRef": "TaskPriority", "optional": false }, { "name": "tags", "typeRef": "string[]", "optional": false }, { "name": "requirementDocUrl", "typeRef": "string", "optional": false }, { "name": "nodes", "typeRef": "WorkflowNode[]", "optional": true } ], "returnType": "Promise", "loc": 45, "interactions": [ { "id": "ix:func:src/App.tsx#handleCreateTask@1165:api:out:POST:/api/tasks", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tasks" } ] }, { "id": "func:src/App.tsx#handleQuickRequirement@1212", "kind": "function", "name": "handleQuickRequirement", "qualifiedName": "handleQuickRequirement", "location": { "file": "src/App.tsx", "startLine": 1212, "endLine": 1217, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleQuickRequirement()", "params": [], "loc": 6 }, { "id": "func:src/App.tsx#handleSubmitRequirement@1219", "kind": "function", "name": "handleSubmitRequirement", "qualifiedName": "handleSubmitRequirement", "location": { "file": "src/App.tsx", "startLine": 1219, "endLine": 1276, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleSubmitRequirement(event: React.FormEvent)", "params": [ { "name": "event", "typeRef": "React.FormEvent", "optional": false } ], "loc": 58, "interactions": [ { "id": "ix:func:src/App.tsx#handleSubmitRequirement@1219:api:out:POST:/api/tasks", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "POST", "path": "/api/tasks" } ] }, { "id": "func:src/App.tsx#handleToggleTaskPinned@1278", "kind": "function", "name": "handleToggleTaskPinned", "qualifiedName": "handleToggleTaskPinned", "location": { "file": "src/App.tsx", "startLine": 1278, "endLine": 1296, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleToggleTaskPinned(taskId: string, isPinned: boolean)", "params": [ { "name": "taskId", "typeRef": "string", "optional": false }, { "name": "isPinned", "typeRef": "boolean", "optional": false } ], "loc": 19, "interactions": [ { "id": "ix:func:src/App.tsx#handleToggleTaskPinned@1278:api:out:PATCH:`/api/tasks/${taskId}/list-state`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PATCH", "path": "`/api/tasks/${taskId}/list-state`" } ] }, { "id": "func:src/App.tsx#handleDeleteTask@1299", "kind": "function", "name": "handleDeleteTask", "qualifiedName": "handleDeleteTask", "location": { "file": "src/App.tsx", "startLine": 1299, "endLine": 1326, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleDeleteTask(id: string)", "params": [ { "name": "id", "typeRef": "string", "optional": false } ], "loc": 28, "interactions": [ { "id": "ix:func:src/App.tsx#handleDeleteTask@1299:api:out:DELETE:`/api/tasks/${id}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "DELETE", "path": "`/api/tasks/${id}`" } ] }, { "id": "func:src/App.tsx#handleUpdateTaskMetadata@1329", "kind": "function", "name": "handleUpdateTaskMetadata", "qualifiedName": "handleUpdateTaskMetadata", "location": { "file": "src/App.tsx", "startLine": 1329, "endLine": 1351, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleUpdateTaskMetadata(updatedMetadata: Partial)", "params": [ { "name": "updatedMetadata", "typeRef": "Partial", "optional": false } ], "loc": 23, "interactions": [ { "id": "ix:func:src/App.tsx#handleUpdateTaskMetadata@1329:api:out:PUT:`/api/tasks/${selectedTaskId}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "PUT", "path": "`/api/tasks/${selectedTaskId}`" } ] }, { "id": "func:src/App.tsx#handleRefreshTask@1353", "kind": "function", "name": "handleRefreshTask", "qualifiedName": "handleRefreshTask", "location": { "file": "src/App.tsx", "startLine": 1353, "endLine": 1368, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleRefreshTask(taskId: string): Promise", "params": [ { "name": "taskId", "typeRef": "string", "optional": false } ], "returnType": "Promise", "loc": 16, "interactions": [ { "id": "ix:func:src/App.tsx#handleRefreshTask@1353:api:out:GET:`/api/tasks/${taskId}`", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET", "path": "`/api/tasks/${taskId}`" } ] }, { "id": "func:src/App.tsx#handleUpdateNodes@1371", "kind": "function", "name": "handleUpdateNodes", "qualifiedName": "handleUpdateNodes", "location": { "file": "src/App.tsx", "startLine": 1371, "endLine": 1490, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "handleUpdateNodes(updatedNodes: WorkflowNode[], options: { persist?: boolean; forceNodeIds?: string[] })", "params": [ { "name": "updatedNodes", "typeRef": "WorkflowNode[]", "optional": false }, { "name": "options", "typeRef": "{ persist?: boolean; forceNodeIds?: string[] }", "optional": true, "defaultValue": "{}" } ], "loc": 120 }, { "id": "func:src/App.tsx#edgeKey@1383", "kind": "function", "name": "edgeKey", "qualifiedName": "edgeKey", "location": { "file": "src/App.tsx", "startLine": 1383, "endLine": 1383, "startCol": 11, "endCol": 85 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "edgeKey(parentId: string, childId: string)", "params": [ { "name": "parentId", "typeRef": "string", "optional": false }, { "name": "childId", "typeRef": "string", "optional": false } ], "loc": 1 }, { "id": "func:src/App.tsx#filter() 回调@1393@1393", "kind": "function", "name": "filter() 回调@1393", "qualifiedName": "filter() 回调@1393", "location": { "file": "src/App.tsx", "startLine": 1393, "endLine": 1410, "startCol": 58, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "filter() 回调@1393(node)", "params": [ { "name": "node", "optional": false } ], "loc": 18 }, { "id": "func:src/App.tsx#requestTaskUpdate@1425", "kind": "function", "name": "requestTaskUpdate", "qualifiedName": "requestTaskUpdate", "location": { "file": "src/App.tsx", "startLine": 1425, "endLine": 1437, "startCol": 11, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "requestTaskUpdate(url: string, init: RequestInit, fallback: string)", "params": [ { "name": "url", "typeRef": "string", "optional": false }, { "name": "init", "typeRef": "RequestInit", "optional": false }, { "name": "fallback", "typeRef": "string", "optional": false } ], "loc": 13, "interactions": [ { "id": "ix:func:src/App.tsx#requestTaskUpdate@1425:api:out:GET:", "kind": "api", "direction": "out", "provenance": "resolved", "protocol": "http", "method": "GET" } ] }, { "id": "func:src/App.tsx#map() 回调@1526@1526", "kind": "function", "name": "map() 回调@1526", "qualifiedName": "map() 回调@1526", "location": { "file": "src/App.tsx", "startLine": 1526, "endLine": 1550, "startCol": 19, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "map() 回调@1526(item)", "params": [ { "name": "item", "optional": false } ], "loc": 25 }, { "id": "func:src/App.tsx#匿名函数@1533@1533", "kind": "function", "name": "匿名函数@1533", "qualifiedName": "匿名函数@1533", "location": { "file": "src/App.tsx", "startLine": 1533, "endLine": 1539, "startCol": 28, "endCol": 20 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "匿名函数@1533()", "params": [], "loc": 7 }, { "id": "func:src/App.tsx#匿名函数@1557@1557", "kind": "function", "name": "匿名函数@1557", "qualifiedName": "匿名函数@1557", "location": { "file": "src/App.tsx", "startLine": 1557, "endLine": 1563, "startCol": 22, "endCol": 14 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "匿名函数@1557()", "params": [], "loc": 7 }, { "id": "func:src/App.tsx#map() 回调@1700@1700", "kind": "function", "name": "map() 回调@1700", "qualifiedName": "map() 回调@1700", "location": { "file": "src/App.tsx", "startLine": 1700, "endLine": 1717, "startCol": 36, "endCol": 16 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/App.tsx", "moduleId": "module:src", "signature": "map() 回调@1700(priority)", "params": [ { "name": "priority", "optional": false } ], "loc": 18 }, { "id": "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", "kind": "function", "name": "DingTalkLogs", "qualifiedName": "DingTalkLogs", "location": { "file": "src/components/DingTalkLogs.tsx", "startLine": 11, "endLine": 158, "startCol": 1, "endCol": 2 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/DingTalkLogs.tsx", "moduleId": "module:src/components", "signature": "DingTalkLogs({ logs, onClearLogs, onRefreshLogs }: DingTalkLogsProps)", "params": [ { "name": "{ logs, onClearLogs, onRefreshLogs }", "typeRef": "DingTalkLogsProps", "optional": false } ], "loc": 148 }, { "id": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", "kind": "function", "name": "copyToClipboard", "qualifiedName": "copyToClipboard", "location": { "file": "src/components/DingTalkLogs.tsx", "startLine": 14, "endLine": 20, "startCol": 9, "endCol": 4 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/DingTalkLogs.tsx", "moduleId": "module:src/components", "signature": "copyToClipboard(text: string, logId: string)", "params": [ { "name": "text", "typeRef": "string", "optional": false }, { "name": "logId", "typeRef": "string", "optional": false } ], "loc": 7 }, { "id": "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", "kind": "function", "name": "setTimeout() 回调@17", "qualifiedName": "setTimeout() 回调@17", "location": { "file": "src/components/DingTalkLogs.tsx", "startLine": 17, "endLine": 19, "startCol": 16, "endCol": 6 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/DingTalkLogs.tsx", "moduleId": "module:src/components", "signature": "setTimeout() 回调@17()", "params": [], "loc": 3 }, { "id": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", "kind": "function", "name": "map() 回调@76", "qualifiedName": "map() 回调@76", "location": { "file": "src/components/DingTalkLogs.tsx", "startLine": 76, "endLine": 153, "startCol": 21, "endCol": 12 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/DingTalkLogs.tsx", "moduleId": "module:src/components", "signature": "map() 回调@76(log)", "params": [ { "name": "log", "optional": false } ], "loc": 78 }, { "id": "func:vite.config.ts#normalizeBasePath@6", "kind": "function", "name": "normalizeBasePath", "qualifiedName": "normalizeBasePath", "location": { "file": "vite.config.ts", "startLine": 6, "endLine": 10, "startCol": 1, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:vite.config.ts", "moduleId": "module:.", "signature": "normalizeBasePath(value: string)", "params": [ { "name": "value", "typeRef": "string", "optional": false } ], "loc": 5 }, { "id": "func:vite.config.ts#defineConfig() 回调@12@12", "kind": "function", "name": "defineConfig() 回调@12", "qualifiedName": "defineConfig() 回调@12", "location": { "file": "vite.config.ts", "startLine": 12, "endLine": 38, "startCol": 29, "endCol": 2 }, "language": "typescript", "provenance": "ast", "fileId": "file:vite.config.ts", "moduleId": "module:.", "signature": "defineConfig() 回调@12()", "params": [], "loc": 27 }, { "id": "func:prisma.config.ts#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "prisma.config.ts", "startLine": 1, "endLine": 14 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma.config.ts", "moduleId": "module:.", "params": [], "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:prisma/seed.ts#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "prisma/seed.ts", "startLine": 1, "endLine": 110 }, "language": "typescript", "provenance": "ast", "fileId": "file:prisma/seed.ts", "moduleId": "module:prisma", "params": [], "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:src/server/aiChatService.ts#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "src/server/aiChatService.ts", "startLine": 1, "endLine": 261 }, "language": "typescript", "provenance": "ast", "fileId": "file:src/server/aiChatService.ts", "moduleId": "module:src/server", "params": [], "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:server.ts#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "server.ts", "startLine": 1, "endLine": 1261 }, "language": "typescript", "provenance": "ast", "fileId": "file:server.ts", "moduleId": "module:.", "params": [], "isEntry": true, "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:src/components/NodeEditorDrawer.tsx#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "src/components/NodeEditorDrawer.tsx", "startLine": 1, "endLine": 756 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/components/NodeEditorDrawer.tsx", "moduleId": "module:src/components", "params": [], "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:src/main.tsx#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "src/main.tsx", "startLine": 1, "endLine": 11 }, "language": "tsx", "provenance": "ast", "fileId": "file:src/main.tsx", "moduleId": "module:src", "params": [], "isEntry": true, "summary": "模块顶层代码(副作用/初始化)" }, { "id": "func:vite.config.ts#@0", "kind": "function", "name": "", "qualifiedName": "", "location": { "file": "vite.config.ts", "startLine": 1, "endLine": 39 }, "language": "typescript", "provenance": "ast", "fileId": "file:vite.config.ts", "moduleId": "module:.", "params": [], "summary": "模块顶层代码(副作用/初始化)" } ], "fields": [], "edges": [ { "id": "edge:import:file:src/server/defaultData.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/defaultData.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:prisma/seed.ts=>file:src/server/defaultData.ts", "kind": "import", "sourceId": "file:prisma/seed.ts", "targetId": "file:src/server/defaultData.ts", "provenance": "ast" }, { "id": "edge:call:func:prisma/seed.ts#seed@13=>func:prisma/seed.ts#dateFromInput@9", "kind": "call", "sourceId": "func:prisma/seed.ts#seed@13", "targetId": "func:prisma/seed.ts#dateFromInput@9", "provenance": "resolved" }, { "id": "edge:call:func:prisma/seed.ts#@0=>func:prisma/seed.ts#seed@13", "kind": "call", "sourceId": "func:prisma/seed.ts#@0", "targetId": "func:prisma/seed.ts#seed@13", "provenance": "resolved" }, { "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/weeklyPlanRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/weeklyPlanRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "provenance": "resolved" }, { "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "kind": "call", "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "provenance": "resolved" }, { "id": "edge:import:file:src/server/taskRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/taskRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/taskRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/weeklyPlanRepository.ts", "kind": "import", "sourceId": "file:src/server/taskRepository.ts", "targetId": "file:src/server/weeklyPlanRepository.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#existingTagNames@96", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", "targetId": "func:src/server/taskRepository.ts#dateToInput@36", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#toTask@163", "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#toTask@163", "targetId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "targetId": "func:src/server/taskRepository.ts#findTaskRecord@111", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "targetId": "func:src/server/taskRepository.ts#toTask@163", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#getTask@190", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createTask@227", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateTask@302", "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateTask@302", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", "targetId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "targetId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", "targetId": "func:src/server/taskRepository.ts#hasDependencyPath@577", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "provenance": "resolved" }, { "id": "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40", "kind": "call", "sourceId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", "provenance": "resolved" }, { "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/notificationRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/notificationRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", "kind": "call", "sourceId": "func:src/server/notificationRepository.ts#createNotificationLog@37", "targetId": "func:src/server/notificationRepository.ts#toNotificationLog@17", "provenance": "resolved" }, { "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/projectTemplateRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/projectTemplateRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "provenance": "resolved" }, { "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "kind": "call", "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "provenance": "resolved" }, { "id": "edge:import:file:src/server/tagRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/tagRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/tagRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/tagRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", "kind": "call", "sourceId": "func:src/server/tagRepository.ts#createTagDefinition@19", "targetId": "func:src/server/tagRepository.ts#toTagDefinition@4", "provenance": "resolved" }, { "id": "edge:import:file:src/server/personRepository.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/personRepository.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/personRepository.ts=>file:src/server/db.ts", "kind": "import", "sourceId": "file:src/server/personRepository.ts", "targetId": "file:src/server/db.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "kind": "call", "sourceId": "func:src/server/personRepository.ts#listPeople@53", "targetId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "provenance": "resolved" }, { "id": "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", "kind": "call", "sourceId": "func:src/server/personRepository.ts#getPersonOrThrow@64", "targetId": "func:src/server/personRepository.ts#toPerson@4", "provenance": "resolved" }, { "id": "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", "kind": "call", "sourceId": "func:src/server/personRepository.ts#createPerson@73", "targetId": "func:src/server/personRepository.ts#toPerson@4", "provenance": "resolved" }, { "id": "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", "kind": "call", "sourceId": "func:src/server/personRepository.ts#updatePerson@142", "targetId": "func:src/server/personRepository.ts#toPerson@4", "provenance": "resolved" }, { "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/server/botQueryTools.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/personRepository.ts", "kind": "import", "sourceId": "file:src/server/botQueryTools.ts", "targetId": "file:src/server/personRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/taskRepository.ts", "kind": "import", "sourceId": "file:src/server/botQueryTools.ts", "targetId": "file:src/server/taskRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/weeklyPlanRepository.ts", "kind": "import", "sourceId": "file:src/server/botQueryTools.ts", "targetId": "file:src/server/weeklyPlanRepository.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getTodayStr@10", "targetId": "func:src/server/botQueryTools.ts#value@17", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", "targetId": "func:src/server/botQueryTools.ts#getTodayStr@10", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getTasks@124=>func:src/server/taskRepository.ts#listTasks@194", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getTasks@124", "targetId": "func:src/server/taskRepository.ts#listTasks@194", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getPeople@125=>func:src/server/personRepository.ts#listPeople@53", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getPeople@125", "targetId": "func:src/server/personRepository.ts#listPeople@53", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#getWeeklyPlans@126=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#selfScope@149", "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "targetId": "func:src/server/botQueryTools.ts#selfScope@149", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@297", "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@297", "targetId": "func:src/server/botQueryTools.ts#planNameById@198", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#taskDateSpan@51", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#overlapsRange@59", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@297", "targetId": "func:src/server/botQueryTools.ts#summarizeTask@172", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#planNameById@198", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@349", "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#planNameById@198", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#addDays@440", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@430", "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@500", "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@516@516=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@516@516", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@500", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@542", "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@542", "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "provenance": "resolved" }, { "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "kind": "call", "sourceId": "func:src/server/botQueryTools.ts#execute@542", "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "provenance": "resolved" }, { "id": "edge:import:file:src/server/aiChatService.ts=>file:src/server/botQueryTools.ts", "kind": "import", "sourceId": "file:src/server/aiChatService.ts", "targetId": "file:src/server/botQueryTools.ts", "provenance": "ast" }, { "id": "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#map() 回调@94@94=>func:src/server/botQueryTools.ts#resolveToolSchema@231", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#map() 回调@94@94", "targetId": "func:src/server/botQueryTools.ts#resolveToolSchema@231", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#executeToolCall@156", "targetId": "func:src/server/botQueryTools.ts#getBotToolByName@583", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#buildToolSpecs@93", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#callChatCompletion@124", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#executeToolCall@156", "provenance": "resolved" }, { "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", "kind": "call", "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "targetId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", "provenance": "resolved" }, { "id": "edge:import:file:server.ts=>file:src/server/taskRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/taskRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/notificationRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/notificationRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/projectTemplateRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/projectTemplateRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/tagRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/tagRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/weeklyPlanRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/weeklyPlanRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/personRepository.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/personRepository.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/botQueryTools.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/botQueryTools.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/server/aiChatService.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/server/aiChatService.ts", "provenance": "ast" }, { "id": "edge:import:file:server.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:server.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", "kind": "call", "sourceId": "func:server.ts#ensureManualLoginPeople@84", "targetId": "func:src/server/personRepository.ts#ensurePeople@118", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/health@90", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/health@90", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "kind": "call", "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", "targetId": "func:server.ts#ensureDingTalkRobotConfigured@122", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "kind": "call", "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "targetId": "func:server.ts#getDingTalkRobotAccessToken@128", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#replyToDingTalkSession@204", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#replyToDingTalkSession@204", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", "kind": "call", "sourceId": "func:server.ts#getZonedDateParts@261", "targetId": "func:server.ts#value@271", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:server.ts#getZonedDateParts@261", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:src/server/taskRepository.ts#listTasks@194", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:src/server/personRepository.ts#listPeople@53", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:server.ts#getDueTimeRanges@290", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:server.ts#getPersonNamesForDueNodeReminder@280", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", "kind": "call", "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", "targetId": "func:server.ts#getWorkflowLink@252", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", "kind": "call", "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", "targetId": "func:server.ts#getTaskRelatedPersonNames@239", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", "kind": "call", "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", "targetId": "func:src/server/personRepository.ts#listPeople@53", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "kind": "call", "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", "kind": "call", "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", "targetId": "func:server.ts#getWorkflowLink@252", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", "kind": "call", "sourceId": "func:server.ts#getSsoAuthUrl@432", "targetId": "func:server.ts#getSsoRedirectUri@423", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", "kind": "call", "sourceId": "func:server.ts#getSsoUserAccessToken@444", "targetId": "func:server.ts#getSsoRedirectUri@423", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#getSsoUserAccessToken@444", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#getSsoUserAccessToken@444", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", "kind": "call", "sourceId": "func:server.ts#getSsoCurrentUser@471", "targetId": "func:server.ts#readRemoteError@98", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", "kind": "call", "sourceId": "func:server.ts#getSsoCurrentUser@471", "targetId": "func:server.ts#readRemoteJson@110", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-config@498", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/auth/sso-config@498", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423", "kind": "call", "sourceId": "func:server.ts#GET /api/auth/sso-config@498", "targetId": "func:server.ts#getSsoRedirectUri@423", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-login-url@508", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/auth/sso-login-url@508", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", "kind": "call", "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", "targetId": "func:server.ts#ensureSsoConfigured@417", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432", "kind": "call", "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", "targetId": "func:server.ts#getSsoAuthUrl@432", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#handleSsoCallback@520", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#handleSsoCallback@520", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/manual-users@559", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/auth/manual-users@559", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/manual-login@563", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/auth/manual-login@563", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/dev-login@575", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/auth/dev-login@575", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/dev-login@575", "targetId": "func:src/server/personRepository.ts#createPerson@73", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-login@605", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/auth/sso-login@605", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-login@605", "targetId": "func:server.ts#ensureSsoConfigured@417", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-login@605", "targetId": "func:server.ts#getSsoUserAccessToken@444", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-login@605", "targetId": "func:server.ts#getSsoCurrentUser@471", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-login@605", "targetId": "func:src/server/personRepository.ts#createPerson@73", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-join-person@642", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/auth/sso-join-person@642", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", "targetId": "func:server.ts#ensureSsoConfigured@417", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", "targetId": "func:server.ts#getSsoUserAccessToken@444", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", "targetId": "func:server.ts#getSsoCurrentUser@471", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73", "kind": "call", "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", "targetId": "func:src/server/personRepository.ts#createPerson@73", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/people@669", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/people@669", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", "kind": "call", "sourceId": "func:server.ts#GET /api/people@669", "targetId": "func:server.ts#ensureManualLoginPeople@84", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53", "kind": "call", "sourceId": "func:server.ts#GET /api/people@669", "targetId": "func:src/server/personRepository.ts#listPeople@53", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/people@678", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/people@678", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73", "kind": "call", "sourceId": "func:server.ts#POST /api/people@678", "targetId": "func:src/server/personRepository.ts#createPerson@73", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/people/:id@687", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#PUT /api/people/:id@687", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142", "kind": "call", "sourceId": "func:server.ts#PUT /api/people/:id@687", "targetId": "func:src/server/personRepository.ts#updatePerson@142", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/people/:id@696", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/people/:id@696", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177", "kind": "call", "sourceId": "func:server.ts#DELETE /api/people/:id@696", "targetId": "func:src/server/personRepository.ts#deletePerson@177", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/dingtalk/robot/send-message@705", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", "kind": "call", "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "targetId": "func:src/server/personRepository.ts#getPersonOrThrow@64", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "kind": "call", "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tags@737", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/tags@737", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11", "kind": "call", "sourceId": "func:server.ts#GET /api/tags@737", "targetId": "func:src/server/tagRepository.ts#listTagDefinitions@11", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tags@745", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/tags@745", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19", "kind": "call", "sourceId": "func:server.ts#POST /api/tags@745", "targetId": "func:src/server/tagRepository.ts#createTagDefinition@19", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tags/:id@754", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/tags/:id@754", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34", "kind": "call", "sourceId": "func:server.ts#DELETE /api/tags/:id@754", "targetId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/weekly-plans@764", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/weekly-plans@764", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "kind": "call", "sourceId": "func:server.ts#GET /api/weekly-plans@764", "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/weekly-plans@772", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/weekly-plans@772", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "kind": "call", "sourceId": "func:server.ts#POST /api/weekly-plans@772", "targetId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/weekly-plans/:id@781", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/weekly-plans/:id@781", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "kind": "call", "sourceId": "func:server.ts#DELETE /api/weekly-plans/:id@781", "targetId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/project-templates@791", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/project-templates@791", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "kind": "call", "sourceId": "func:server.ts#GET /api/project-templates@791", "targetId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/project-templates@799", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/project-templates@799", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "kind": "call", "sourceId": "func:server.ts#POST /api/project-templates@799", "targetId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/project-templates/:id@808", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#PUT /api/project-templates/:id@808", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "kind": "call", "sourceId": "func:server.ts#PUT /api/project-templates/:id@808", "targetId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/project-templates/:id@817", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/project-templates/:id@817", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "kind": "call", "sourceId": "func:server.ts#DELETE /api/project-templates/:id@817", "targetId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks@826", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/tasks@826", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194", "kind": "call", "sourceId": "func:server.ts#GET /api/tasks@826", "targetId": "func:src/server/taskRepository.ts#listTasks@194", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks/:id@834", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/tasks/:id@834", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190", "kind": "call", "sourceId": "func:server.ts#GET /api/tasks/:id@834", "targetId": "func:src/server/taskRepository.ts#getTask@190", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks@843", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/tasks@843", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227", "kind": "call", "sourceId": "func:server.ts#POST /api/tasks@843", "targetId": "func:src/server/taskRepository.ts#createTask@227", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/list-state@852", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353", "kind": "call", "sourceId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", "targetId": "func:src/server/taskRepository.ts#updateTaskListState@353", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/tasks/:id@865", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#PUT /api/tasks/:id@865", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", "kind": "call", "sourceId": "func:server.ts#PUT /api/tasks/:id@865", "targetId": "func:src/server/taskRepository.ts#getTask@190", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", "kind": "call", "sourceId": "func:server.ts#PUT /api/tasks/:id@865", "targetId": "func:src/server/taskRepository.ts#updateTask@302", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363", "kind": "call", "sourceId": "func:server.ts#PUT /api/tasks/:id@865", "targetId": "func:server.ts#notifyTaskConfirmedCompleted@363", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id@886", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/tasks/:id@886", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383", "kind": "call", "sourceId": "func:server.ts#DELETE /api/tasks/:id@886", "targetId": "func:src/server/taskRepository.ts#deleteTask@383", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/nodes@895", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/tasks/:id/nodes@895", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389", "kind": "call", "sourceId": "func:server.ts#POST /api/tasks/:id/nodes@895", "targetId": "func:src/server/taskRepository.ts#createWorkflowNode@389", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423", "kind": "call", "sourceId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "targetId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472", "kind": "call", "sourceId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "targetId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/dependencies@925", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/tasks/:id/dependencies@925", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494", "kind": "call", "sourceId": "func:server.ts#POST /api/tasks/:id/dependencies@925", "targetId": "func:src/server/taskRepository.ts#createNodeDependency@494", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535", "kind": "call", "sourceId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "targetId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/notify@944", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#POST /api/notify@944", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", "kind": "call", "sourceId": "func:server.ts#POST /api/notify@944", "targetId": "func:server.ts#normalizeActionType@1058", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", "kind": "call", "sourceId": "func:server.ts#POST /api/notify@944", "targetId": "func:server.ts#getNotificationState@1065", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", "kind": "call", "sourceId": "func:server.ts#POST /api/notify@944", "targetId": "func:server.ts#getWorkflowLink@252", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37", "kind": "call", "sourceId": "func:server.ts#POST /api/notify@944", "targetId": "func:src/server/notificationRepository.ts#createNotificationLog@37", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/logs@1041", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#GET /api/logs@1041", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47", "kind": "call", "sourceId": "func:server.ts#GET /api/logs@1041", "targetId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/logs@1049", "kind": "trigger", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#DELETE /api/logs@1049", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56", "kind": "call", "sourceId": "func:server.ts#DELETE /api/logs@1049", "targetId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", "kind": "call", "sourceId": "func:server.ts#checkAndRun@1090", "targetId": "func:server.ts#getZonedDateParts@261", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298", "kind": "call", "sourceId": "func:server.ts#checkAndRun@1090", "targetId": "func:server.ts#sendDailyDueNodeReminder@298", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", "kind": "call", "sourceId": "func:server.ts#replyText@1147", "targetId": "func:server.ts#replyToDingTalkSession@204", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:server.ts#replyText@1147", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:src/server/aiChatService.ts#clearBotMemory@79", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:src/server/personRepository.ts#listPeople@53", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", "kind": "call", "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", "targetId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114", "kind": "call", "sourceId": "func:server.ts#registerCallbackListener() 回调@1215@1215", "targetId": "func:server.ts#handleDingTalkRobotMessage@1114", "provenance": "resolved" }, { "id": "edge:trigger:func:server.ts#startServer@1235=>func:server.ts#GET *@1245", "kind": "trigger", "sourceId": "func:server.ts#startServer@1235", "targetId": "func:server.ts#GET *@1245", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", "kind": "call", "sourceId": "func:server.ts#listen() 回调@1250@1250", "targetId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204", "kind": "call", "sourceId": "func:server.ts#listen() 回调@1250@1250", "targetId": "func:server.ts#startDingTalkRobotStream@1204", "provenance": "resolved" }, { "id": "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235", "kind": "call", "sourceId": "func:server.ts#@0", "targetId": "func:server.ts#startServer@1235", "provenance": "resolved" }, { "id": "edge:import:file:src/utils/nodeTimeRanges.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/utils/nodeTimeRanges.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/utils/taskStatus.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/utils/taskStatus.ts", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/utils/taskStatus.ts", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:import:file:src/utils/taskPriority.ts=>file:src/types.ts", "kind": "import", "sourceId": "file:src/utils/taskPriority.ts", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/TaskList.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/TaskList.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskStatus.ts", "kind": "import", "sourceId": "file:src/components/TaskList.tsx", "targetId": "file:src/utils/taskStatus.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/TaskList.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/TaskList.tsx#reduce() 回调@77@77=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#reduce() 回调@77@77", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/components/TaskList.tsx#toggleSelectedStatus@97", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", "targetId": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/components/TaskList.tsx#toggleSelectedPriority@103", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", "targetId": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#TaskList@47=>func:src/components/TaskList.tsx#toggleSelectedTag@91", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#TaskList@47", "targetId": "func:src/components/TaskList.tsx#toggleSelectedTag@91", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#clearQueueDropState@147", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@366@366=>func:src/components/TaskList.tsx#clearQueueDropState@147", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@366@366", "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#clearQueueDropState@147", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@410@410=>func:src/components/TaskList.tsx#clearQueueDropState@147", "kind": "call", "sourceId": "func:src/components/TaskList.tsx#匿名函数@410@410", "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", "provenance": "resolved" }, { "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/WeeklyPlanList.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/WeeklyPlanList.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/components/WeeklyPlanList.tsx#addDays@20", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#resetForm@70=>func:src/components/WeeklyPlanList.tsx#addDays@20", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76=>func:src/components/WeeklyPlanList.tsx#resetForm@70", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", "targetId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#匿名函数@162@162=>func:src/components/WeeklyPlanList.tsx#addDays@20", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", "kind": "call", "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", "targetId": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", "provenance": "resolved" }, { "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/WorkflowCanvas.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/WorkflowCanvas.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/WorkflowCanvas.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#isAncestor@265", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", "targetId": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", "targetId": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#addConnection@282", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "targetId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "targetId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", "targetId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "targetId": "func:src/components/WorkflowCanvas.tsx#toMs@623", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "targetId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "targetId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", "targetId": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#匿名函数@900@900=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "kind": "call", "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "targetId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "provenance": "resolved" }, { "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/ProjectCreateModal.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/ProjectCreateModal.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/ProjectCreateModal.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/ProjectCreateModal.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/components/WorkflowCanvas.tsx", "kind": "import", "sourceId": "file:src/components/ProjectCreateModal.tsx", "targetId": "file:src/components/WorkflowCanvas.tsx", "provenance": "ast" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/components/ProjectCreateModal.tsx#toDateMs@23", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "targetId": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/components/ProjectCreateModal.tsx#addDays@27", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", "targetId": "func:src/components/ProjectCreateModal.tsx#addDays@27", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", "targetId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", "targetId": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@234@234=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@271@271=>func:src/components/ProjectCreateModal.tsx#toggleTag@146", "kind": "call", "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", "targetId": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", "provenance": "resolved" }, { "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/TaskOverview.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskStatus.ts", "kind": "import", "sourceId": "file:src/components/TaskOverview.tsx", "targetId": "file:src/utils/taskStatus.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/TaskOverview.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118=>func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", "targetId": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@240@240=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@240@240", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@294@294=>func:src/components/TaskOverview.tsx#toggleEditTag@89", "kind": "call", "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@294@294", "targetId": "func:src/components/TaskOverview.tsx#toggleEditTag@89", "provenance": "resolved" }, { "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/GanttChart.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/GanttChart.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/GanttChart.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#forEach() 回调@40@40=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#GanttChart@14=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#GanttChart@14", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", "targetId": "func:src/components/GanttChart.tsx#formatDateString@76", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", "targetId": "func:src/components/GanttChart.tsx#getDayLabel@80", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", "targetId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@375@375=>func:src/components/GanttChart.tsx#isWeekend@86", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@375@375", "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@389@389=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", "kind": "call", "sourceId": "func:src/components/GanttChart.tsx#map() 回调@389@389", "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", "provenance": "resolved" }, { "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/PersonGanttChart.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/PersonGanttChart.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/PersonGanttChart.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/PersonGanttChart.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#PersonGanttChart@25=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "targetId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@235@235=>func:src/components/PersonGanttChart.tsx#getDayLabel@393", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", "targetId": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "targetId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "targetId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@337@337=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "kind": "call", "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", "provenance": "resolved" }, { "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/PeopleManager.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/components/PersonGanttChart.tsx", "kind": "import", "sourceId": "file:src/components/PeopleManager.tsx", "targetId": "file:src/components/PersonGanttChart.tsx", "provenance": "ast" }, { "id": "edge:call:func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51=>func:src/components/PeopleManager.tsx#getPinyinSortKey@45", "kind": "call", "sourceId": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", "targetId": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", "provenance": "resolved" }, { "id": "edge:call:func:src/components/PeopleManager.tsx#useMemo() 回调@107@107=>func:src/components/PeopleManager.tsx#getSearchTokens@29", "kind": "call", "sourceId": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", "targetId": "func:src/components/PeopleManager.tsx#getSearchTokens@29", "provenance": "resolved" }, { "id": "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", "kind": "call", "sourceId": "func:src/utils/api.ts#apiPath@15", "targetId": "func:src/utils/api.ts#appPath@7", "provenance": "resolved" }, { "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/LoginPage.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/utils/api.ts", "kind": "import", "sourceId": "file:src/components/LoginPage.tsx", "targetId": "file:src/utils/api.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "targetId": "func:src/components/LoginPage.tsx#createOAuthState@31", "provenance": "resolved" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", "provenance": "resolved" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "targetId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "provenance": "resolved" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/components/LoginPage.tsx#readApiJson@21", "kind": "call", "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", "provenance": "resolved" }, { "id": "edge:import:file:src/components/TagManager.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/TagManager.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/ProjectTemplateManager.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/ProjectTemplateManager.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/ProjectTemplateManager.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/components/WorkflowCanvas.tsx", "kind": "import", "sourceId": "file:src/components/ProjectTemplateManager.tsx", "targetId": "file:src/components/WorkflowCanvas.tsx", "provenance": "ast" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", "targetId": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", "targetId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", "targetId": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393=>func:src/components/ProjectTemplateManager.tsx#toggleTag@111", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", "targetId": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", "provenance": "resolved" }, { "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", "kind": "call", "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", "targetId": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", "provenance": "resolved" }, { "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/NodeEditorDrawer.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/NodeEditorDrawer.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/NodeEditorDrawer.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#@0=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#@0", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#completeNode@328=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#reopenNode@332=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#deleteNode@384=>func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", "targetId": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "provenance": "resolved" }, { "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "kind": "call", "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "provenance": "resolved" }, { "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/WeeklyOverview.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/date.ts", "kind": "import", "sourceId": "file:src/components/WeeklyOverview.tsx", "targetId": "file:src/utils/date.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/components/WeeklyOverview.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskStatus.ts", "kind": "import", "sourceId": "file:src/components/WeeklyOverview.tsx", "targetId": "file:src/utils/taskStatus.ts", "provenance": "ast" }, { "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/components/WeeklyOverview.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/utils/date.ts#getLocalDateString@1", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", "targetId": "func:src/utils/date.ts#getLocalDateString@1", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "targetId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "targetId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#sort() 回调@273@273=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#matchesFilters@290=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", "targetId": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "targetId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "targetId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "targetId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "targetId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@777@777=>func:src/types.ts#isPublicPoolPlan@68", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", "targetId": "func:src/types.ts#isPublicPoolPlan@68", "provenance": "resolved" }, { "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@840@840=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "kind": "call", "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "provenance": "resolved" }, { "id": "edge:import:file:src/App.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/TaskList.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/TaskList.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyPlanList.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/WeeklyPlanList.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectCreateModal.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/ProjectCreateModal.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/TaskOverview.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/TaskOverview.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/WorkflowCanvas.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/WorkflowCanvas.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/GanttChart.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/GanttChart.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/PeopleManager.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/PeopleManager.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/LoginPage.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/LoginPage.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/TagManager.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/TagManager.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectTemplateManager.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/ProjectTemplateManager.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/NodeEditorDrawer.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/NodeEditorDrawer.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyOverview.tsx", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/components/WeeklyOverview.tsx", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/utils/api.ts", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/utils/api.ts", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/utils/nodeTimeRanges.ts", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/utils/nodeTimeRanges.ts", "provenance": "ast" }, { "id": "edge:import:file:src/App.tsx=>file:src/utils/taskPriority.ts", "kind": "import", "sourceId": "file:src/App.tsx", "targetId": "file:src/utils/taskPriority.ts", "provenance": "ast" }, { "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#readStoredAuthUser@62", "kind": "call", "sourceId": "func:src/App.tsx#App@84", "targetId": "func:src/App.tsx#readStoredAuthUser@62", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", "targetId": "func:src/App.tsx#fetchTasks@221", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", "targetId": "func:src/App.tsx#fetchPeople@241", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", "targetId": "func:src/App.tsx#fetchTags@256", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", "targetId": "func:src/App.tsx#fetchProjectTemplates@323", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", "targetId": "func:src/App.tsx#fetchWeeklyPlans@338", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@147@147=>func:src/App.tsx#fetchTags@256", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@147@147", "targetId": "func:src/App.tsx#fetchTags@256", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#fetchTasks@221", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#fetchTasks@221", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#fetchPeople@241", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#fetchPeople@241", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#fetchTags@256", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#fetchTags@256", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateTag@271", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateTag@271", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteTag@297", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteTag@297", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiJson@44", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", "targetId": "func:src/App.tsx#readApiJson@44", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleCreatePerson@498", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleCreatePerson@498", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiJson@44", "kind": "call", "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", "targetId": "func:src/App.tsx#readApiJson@44", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleDeletePerson@548", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleDeletePerson@548", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiJson@44", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", "targetId": "func:src/App.tsx#readApiJson@44", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiJson@44", "kind": "call", "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", "targetId": "func:src/App.tsx#readApiJson@44", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/App.tsx#readApiJson@44", "kind": "call", "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", "targetId": "func:src/App.tsx#readApiJson@44", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#sortTasksForList@54", "kind": "call", "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", "targetId": "func:src/App.tsx#sortTasksForList@54", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", "kind": "call", "sourceId": "func:src/App.tsx#handleReorderTask@798", "targetId": "func:src/App.tsx#sortTasksForList@54", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleReorderTask@798", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleReorderTask@798", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221", "kind": "call", "sourceId": "func:src/App.tsx#handleReorderTask@798", "targetId": "func:src/App.tsx#fetchTasks@221", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleWorkspaceClick@957=>func:src/App.tsx#handleSelectNode@870", "kind": "call", "sourceId": "func:src/App.tsx#handleWorkspaceClick@957", "targetId": "func:src/App.tsx#handleSelectNode@870", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@1109@1109=>func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@1109@1109", "targetId": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useEffect() 回调@1121@1121=>func:src/App.tsx#focusNodeInCanvas@1016", "kind": "call", "sourceId": "func:src/App.tsx#useEffect() 回调@1121@1121", "targetId": "func:src/App.tsx#focusNodeInCanvas@1016", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#applyCentered@1149=>func:src/App.tsx#computeCenteredViewport@981", "kind": "call", "sourceId": "func:src/App.tsx#applyCentered@1149", "targetId": "func:src/App.tsx#computeCenteredViewport@981", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#useLayoutEffect() 回调@1134@1134=>func:src/App.tsx#applyCentered@1149", "kind": "call", "sourceId": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", "targetId": "func:src/App.tsx#applyCentered@1149", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateTask@1165", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#sortTasksForList@54", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateTask@1165", "targetId": "func:src/App.tsx#sortTasksForList@54", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleCreateTask@1165", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#sortTasksForList@54", "kind": "call", "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", "targetId": "func:src/App.tsx#sortTasksForList@54", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#sortTasksForList@54", "kind": "call", "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", "targetId": "func:src/App.tsx#sortTasksForList@54", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteTask@1299", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleDeleteTask@1299", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#handleRefreshTask@1353", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#handleRefreshTask@1353", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", "targetId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", "targetId": "func:src/App.tsx#edgeKey@1383", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", "kind": "call", "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", "targetId": "func:src/utils/api.ts#apiPath@15", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", "kind": "call", "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", "targetId": "func:src/App.tsx#readApiError@39", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", "targetId": "func:src/App.tsx#requestTaskUpdate@1425", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353", "kind": "call", "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", "targetId": "func:src/App.tsx#handleRefreshTask@1353", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#map() 回调@1700@1700=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "kind": "call", "sourceId": "func:src/App.tsx#map() 回调@1700@1700", "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "provenance": "resolved" }, { "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#handleSelectNode@870", "kind": "call", "sourceId": "func:src/App.tsx#App@84", "targetId": "func:src/App.tsx#handleSelectNode@870", "provenance": "resolved" }, { "id": "edge:import:file:src/components/DingTalkLogs.tsx=>file:src/types.ts", "kind": "import", "sourceId": "file:src/components/DingTalkLogs.tsx", "targetId": "file:src/types.ts", "provenance": "ast" }, { "id": "edge:call:func:src/components/DingTalkLogs.tsx#map() 回调@76@76=>func:src/components/DingTalkLogs.tsx#copyToClipboard@14", "kind": "call", "sourceId": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", "targetId": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", "provenance": "resolved" }, { "id": "edge:import:file:src/main.tsx=>file:src/App.tsx", "kind": "import", "sourceId": "file:src/main.tsx", "targetId": "file:src/App.tsx", "provenance": "ast" }, { "id": "edge:call:func:vite.config.ts#defineConfig() 回调@12@12=>func:vite.config.ts#normalizeBasePath@6", "kind": "call", "sourceId": "func:vite.config.ts#defineConfig() 回调@12@12", "targetId": "func:vite.config.ts#normalizeBasePath@6", "provenance": "resolved" } ], "flows": [ { "id": "flow:call:func:server.ts#sendDailyDueNodeReminder@298", "name": "sendDailyDueNodeReminder (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#sendDailyDueNodeReminder@298", "steps": [ { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDailyDueNodeReminder@298", "order": 0, "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", "title": "sendDailyDueNodeReminder", "nextStepIds": [ "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252" ] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", "order": 1, "nodeId": "func:server.ts#getZonedDateParts@261", "title": "getZonedDateParts", "nextStepIds": [ "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271" ] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", "order": 2, "nodeId": "func:src/server/taskRepository.ts#listTasks@194", "title": "listTasks", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", "order": 3, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", "order": 4, "nodeId": "func:server.ts#getDueTimeRanges@290", "title": "getDueTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", "order": 5, "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", "title": "getPersonNamesForDueNodeReminder", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 6, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252", "order": 7, "nodeId": "func:server.ts#getWorkflowLink@252", "title": "getWorkflowLink", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271", "order": 8, "nodeId": "func:server.ts#value@271", "title": "value", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 9, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", "order": 10, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", "order": 11, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110", "order": 12, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 13, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252" ], "summary": "以 sendDailyDueNodeReminder 为入口的调用链,覆盖 14 个函数" }, { "id": "flow:call:func:server.ts#handleDingTalkRobotMessage@1114", "name": "handleDingTalkRobotMessage (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#handleDingTalkRobotMessage@1114", "steps": [ { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#handleDingTalkRobotMessage@1114", "order": 0, "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", "title": "handleDingTalkRobotMessage", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", "order": 1, "nodeId": "func:server.ts#replyText@1147", "title": "replyText", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", "order": 2, "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", "title": "isAiConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", "order": 3, "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", "title": "clearBotMemory", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", "order": 4, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", "order": 5, "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", "title": "createBotQueryContext", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", "order": 6, "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "title": "answerBotQuestion", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222", "order": 7, "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "title": "replyToDingTalkSessionMarkdown", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204", "order": 8, "nodeId": "func:server.ts#replyToDingTalkSession@204", "title": "replyToDingTalkSession", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 9, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10", "order": 10, "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", "title": "getTodayStr", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", "order": 11, "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", "title": "getMemoryTurns", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", "order": 12, "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", "title": "buildSystemPrompt", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", "order": 13, "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", "title": "buildToolSpecs", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", "order": 14, "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", "title": "callChatCompletion", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", "order": 15, "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", "title": "executeToolCall", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72", "order": 16, "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", "title": "appendMemoryTurn", "nextStepIds": [ "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62" ] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", "order": 17, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110", "order": 18, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17", "order": 19, "nodeId": "func:src/server/botQueryTools.ts#value@17", "title": "value", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583", "order": 20, "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", "title": "getBotToolByName", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222" ], "summary": "以 handleDingTalkRobotMessage 为入口的调用链,覆盖 21 个函数" }, { "id": "flow:call:func:server.ts#notifyTaskConfirmedCompleted@363", "name": "notifyTaskConfirmedCompleted (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", "steps": [ { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#notifyTaskConfirmedCompleted@363", "order": 0, "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", "title": "notifyTaskConfirmedCompleted", "nextStepIds": [ "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252" ] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", "order": 1, "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", "title": "getTaskRelatedPersonNames", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", "order": 2, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 3, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252", "order": 4, "nodeId": "func:server.ts#getWorkflowLink@252", "title": "getWorkflowLink", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 5, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", "order": 6, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", "order": 7, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110", "order": 8, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 9, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252" ], "summary": "以 notifyTaskConfirmedCompleted 为入口的调用链,覆盖 10 个函数" }, { "id": "flow:call:func:server.ts#POST /api/auth/sso-login@605", "name": "POST /api/auth/sso-login (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/auth/sso-login@605", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#POST /api/auth/sso-login@605", "order": 0, "nodeId": "func:server.ts#POST /api/auth/sso-login@605", "title": "POST /api/auth/sso-login", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", "order": 1, "nodeId": "func:server.ts#ensureSsoConfigured@417", "title": "ensureSsoConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", "order": 2, "nodeId": "func:server.ts#getSsoUserAccessToken@444", "title": "getSsoUserAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", "order": 3, "nodeId": "func:server.ts#getSsoCurrentUser@471", "title": "getSsoCurrentUser", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73", "order": 4, "nodeId": "func:src/server/personRepository.ts#createPerson@73", "title": "createPerson", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", "order": 5, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", "order": 6, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110", "order": 7, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4", "order": 8, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73" ], "summary": "以 POST /api/auth/sso-login 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:server.ts#POST /api/auth/sso-join-person@642", "name": "POST /api/auth/sso-join-person (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/auth/sso-join-person@642", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#POST /api/auth/sso-join-person@642", "order": 0, "nodeId": "func:server.ts#POST /api/auth/sso-join-person@642", "title": "POST /api/auth/sso-join-person", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", "order": 1, "nodeId": "func:server.ts#ensureSsoConfigured@417", "title": "ensureSsoConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", "order": 2, "nodeId": "func:server.ts#getSsoUserAccessToken@444", "title": "getSsoUserAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", "order": 3, "nodeId": "func:server.ts#getSsoCurrentUser@471", "title": "getSsoCurrentUser", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73", "order": 4, "nodeId": "func:src/server/personRepository.ts#createPerson@73", "title": "createPerson", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", "order": 5, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", "order": 6, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110", "order": 7, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4", "order": 8, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73" ], "summary": "以 POST /api/auth/sso-join-person 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:server.ts#POST /api/notify@944", "name": "POST /api/notify (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/notify@944", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#POST /api/notify@944", "order": 0, "nodeId": "func:server.ts#POST /api/notify@944", "title": "POST /api/notify", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37" ] }, { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", "order": 1, "nodeId": "func:server.ts#normalizeActionType@1058", "title": "normalizeActionType", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", "order": 2, "nodeId": "func:server.ts#getNotificationState@1065", "title": "getNotificationState", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", "order": 3, "nodeId": "func:server.ts#getWorkflowLink@252", "title": "getWorkflowLink", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37", "order": 4, "nodeId": "func:src/server/notificationRepository.ts#createNotificationLog@37", "title": "createNotificationLog", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17" ] }, { "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17", "order": 5, "nodeId": "func:src/server/notificationRepository.ts#toNotificationLog@17", "title": "toNotificationLog", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37" ], "summary": "以 POST /api/notify 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:server.ts#getDingTalkRobotAccessToken@128", "name": "getDingTalkRobotAccessToken (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "steps": [ { "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#getDingTalkRobotAccessToken@128", "order": 0, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 1, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", "order": 2, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110", "order": 3, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110" ], "summary": "以 getDingTalkRobotAccessToken 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "name": "sendDingTalkRobotMarkdownMessage (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "steps": [ { "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 0, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", "order": 1, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", "order": 2, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110", "order": 3, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 4, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110" ], "summary": "以 sendDingTalkRobotMarkdownMessage 为入口的调用链,覆盖 5 个函数" }, { "id": "flow:call:func:server.ts#getSsoUserAccessToken@444", "name": "getSsoUserAccessToken (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#getSsoUserAccessToken@444", "steps": [ { "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoUserAccessToken@444", "order": 0, "nodeId": "func:server.ts#getSsoUserAccessToken@444", "title": "getSsoUserAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", "order": 1, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", "order": 2, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110", "order": 3, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110" ], "summary": "以 getSsoUserAccessToken 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:server.ts#PUT /api/tasks/:id@865", "name": "PUT /api/tasks/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#PUT /api/tasks/:id@865", "steps": [ { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#PUT /api/tasks/:id@865", "order": 0, "nodeId": "func:server.ts#PUT /api/tasks/:id@865", "title": "PUT /api/tasks/:id", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", "order": 1, "nodeId": "func:src/server/taskRepository.ts#getTask@190", "title": "getTask", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", "order": 2, "nodeId": "func:src/server/taskRepository.ts#updateTask@302", "title": "updateTask", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363", "order": 3, "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", "title": "notifyTaskConfirmedCompleted", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 4, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "order": 5, "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "title": "getWeeklyPlanOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", "order": 6, "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", "title": "getTaskRelatedPersonNames", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", "order": 7, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 8, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252", "order": 9, "nodeId": "func:server.ts#getWorkflowLink@252", "title": "getWorkflowLink", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 10, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163", "order": 11, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "order": 12, "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "title": "toWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 13, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", "order": 14, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", "order": 15, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110", "order": 16, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 17, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 18, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9", "order": 19, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "title": "dateToInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 20, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363" ], "summary": "以 PUT /api/tasks/:id 为入口的调用链,覆盖 21 个函数" }, { "id": "flow:call:func:server.ts#replyToDingTalkSession@204", "name": "replyToDingTalkSession (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#replyToDingTalkSession@204", "steps": [ { "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#replyToDingTalkSession@204", "order": 0, "nodeId": "func:server.ts#replyToDingTalkSession@204", "title": "replyToDingTalkSession", "nextStepIds": [ "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", "order": 1, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110", "order": 2, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110" ], "summary": "以 replyToDingTalkSession 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222", "name": "replyToDingTalkSessionMarkdown (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "steps": [ { "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#replyToDingTalkSessionMarkdown@222", "order": 0, "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "title": "replyToDingTalkSessionMarkdown", "nextStepIds": [ "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", "order": 1, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110", "order": 2, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110" ], "summary": "以 replyToDingTalkSessionMarkdown 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#getSsoCurrentUser@471", "name": "getSsoCurrentUser (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#getSsoCurrentUser@471", "steps": [ { "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#getSsoCurrentUser@471", "order": 0, "nodeId": "func:server.ts#getSsoCurrentUser@471", "title": "getSsoCurrentUser", "nextStepIds": [ "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", "order": 1, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110", "order": 2, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110" ], "summary": "以 getSsoCurrentUser 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#GET /api/auth/sso-login-url@508", "name": "GET /api/auth/sso-login-url (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/auth/sso-login-url@508", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#GET /api/auth/sso-login-url@508", "order": 0, "nodeId": "func:server.ts#GET /api/auth/sso-login-url@508", "title": "GET /api/auth/sso-login-url", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432" ] }, { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", "order": 1, "nodeId": "func:server.ts#ensureSsoConfigured@417", "title": "ensureSsoConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432", "order": 2, "nodeId": "func:server.ts#getSsoAuthUrl@432", "title": "getSsoAuthUrl", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423" ] }, { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423", "order": 3, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432" ], "summary": "以 GET /api/auth/sso-login-url 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:server.ts#GET /api/people@669", "name": "GET /api/people (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/people@669", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#GET /api/people@669", "order": 0, "nodeId": "func:server.ts#GET /api/people@669", "title": "GET /api/people", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53" ] }, { "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", "order": 1, "nodeId": "func:server.ts#ensureManualLoginPeople@84", "title": "ensureManualLoginPeople", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118" ] }, { "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53", "order": 2, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118", "order": 3, "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", "title": "ensurePeople", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 4, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53" ], "summary": "以 GET /api/people 为入口的调用链,覆盖 5 个函数" }, { "id": "flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705", "name": "POST /api/dingtalk/robot/send-message (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#POST /api/dingtalk/robot/send-message@705", "order": 0, "nodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", "title": "POST /api/dingtalk/robot/send-message", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162" ] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", "order": 1, "nodeId": "func:src/server/personRepository.ts#getPersonOrThrow@64", "title": "getPersonOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 2, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4", "order": 3, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", "order": 4, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", "order": 5, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110", "order": 6, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 7, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162" ], "summary": "以 POST /api/dingtalk/robot/send-message 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#checkAndRun@1090", "name": "checkAndRun (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#checkAndRun@1090", "steps": [ { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#checkAndRun@1090", "order": 0, "nodeId": "func:server.ts#checkAndRun@1090", "title": "checkAndRun", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", "order": 1, "nodeId": "func:server.ts#getZonedDateParts@261", "title": "getZonedDateParts", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298", "order": 2, "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", "title": "sendDailyDueNodeReminder", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271", "order": 3, "nodeId": "func:server.ts#value@271", "title": "value", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", "order": 4, "nodeId": "func:src/server/taskRepository.ts#listTasks@194", "title": "listTasks", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", "order": 5, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", "order": 6, "nodeId": "func:server.ts#getDueTimeRanges@290", "title": "getDueTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", "order": 7, "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", "title": "getPersonNamesForDueNodeReminder", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", "order": 8, "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", "title": "sendDingTalkRobotMarkdownMessage", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252", "order": 9, "nodeId": "func:server.ts#getWorkflowLink@252", "title": "getWorkflowLink", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 10, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", "order": 11, "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", "title": "getDingTalkRobotAccessToken", "nextStepIds": [ "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", "order": 12, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110", "order": 13, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", "order": 14, "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", "title": "ensureDingTalkRobotConfigured", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298" ], "summary": "以 checkAndRun 为入口的调用链,覆盖 15 个函数" }, { "id": "flow:call:func:server.ts#listen() 回调@1250@1250", "name": "listen() 回调@1250 (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#listen() 回调@1250@1250", "steps": [ { "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#listen() 回调@1250@1250", "order": 0, "nodeId": "func:server.ts#listen() 回调@1250@1250", "title": "listen() 回调@1250", "nextStepIds": [ "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204" ] }, { "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", "order": 1, "nodeId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", "title": "startDailyDueNodeReminderScheduler", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204", "order": 2, "nodeId": "func:server.ts#startDingTalkRobotStream@1204", "title": "startDingTalkRobotStream", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204" ], "summary": "以 listen() 回调@1250 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#ensureManualLoginPeople@84", "name": "ensureManualLoginPeople (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#ensureManualLoginPeople@84", "steps": [ { "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:server.ts#ensureManualLoginPeople@84", "order": 0, "nodeId": "func:server.ts#ensureManualLoginPeople@84", "title": "ensureManualLoginPeople", "nextStepIds": [ "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118" ] }, { "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118", "order": 1, "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", "title": "ensurePeople", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118" ], "summary": "以 ensureManualLoginPeople 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#getZonedDateParts@261", "name": "getZonedDateParts (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#getZonedDateParts@261", "steps": [ { "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#getZonedDateParts@261", "order": 0, "nodeId": "func:server.ts#getZonedDateParts@261", "title": "getZonedDateParts", "nextStepIds": [ "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271" ] }, { "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271", "order": 1, "nodeId": "func:server.ts#value@271", "title": "value", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271" ], "summary": "以 getZonedDateParts 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#getSsoAuthUrl@432", "name": "getSsoAuthUrl (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#getSsoAuthUrl@432", "steps": [ { "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoAuthUrl@432", "order": 0, "nodeId": "func:server.ts#getSsoAuthUrl@432", "title": "getSsoAuthUrl", "nextStepIds": [ "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423" ] }, { "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423", "order": 1, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423" ], "summary": "以 getSsoAuthUrl 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#GET /api/auth/sso-config@498", "name": "GET /api/auth/sso-config (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/auth/sso-config@498", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#GET /api/auth/sso-config@498", "order": 0, "nodeId": "func:server.ts#GET /api/auth/sso-config@498", "title": "GET /api/auth/sso-config", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423" ] }, { "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423", "order": 1, "nodeId": "func:server.ts#getSsoRedirectUri@423", "title": "getSsoRedirectUri", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423" ], "summary": "以 GET /api/auth/sso-config 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#POST /api/auth/dev-login@575", "name": "POST /api/auth/dev-login (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/auth/dev-login@575", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:server.ts#POST /api/auth/dev-login@575", "order": 0, "nodeId": "func:server.ts#POST /api/auth/dev-login@575", "title": "POST /api/auth/dev-login", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73", "order": 1, "nodeId": "func:src/server/personRepository.ts#createPerson@73", "title": "createPerson", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4", "order": 2, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73" ], "summary": "以 POST /api/auth/dev-login 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#POST /api/people@678", "name": "POST /api/people (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/people@678", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/people@678:func:server.ts#POST /api/people@678", "order": 0, "nodeId": "func:server.ts#POST /api/people@678", "title": "POST /api/people", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73" ] }, { "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73", "order": 1, "nodeId": "func:src/server/personRepository.ts#createPerson@73", "title": "createPerson", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4", "order": 2, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73" ], "summary": "以 POST /api/people 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#PUT /api/people/:id@687", "name": "PUT /api/people/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#PUT /api/people/:id@687", "steps": [ { "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:server.ts#PUT /api/people/:id@687", "order": 0, "nodeId": "func:server.ts#PUT /api/people/:id@687", "title": "PUT /api/people/:id", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142", "order": 1, "nodeId": "func:src/server/personRepository.ts#updatePerson@142", "title": "updatePerson", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4", "order": 2, "nodeId": "func:src/server/personRepository.ts#toPerson@4", "title": "toPerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142" ], "summary": "以 PUT /api/people/:id 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/people/:id@696", "name": "DELETE /api/people/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/people/:id@696", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:server.ts#DELETE /api/people/:id@696", "order": 0, "nodeId": "func:server.ts#DELETE /api/people/:id@696", "title": "DELETE /api/people/:id", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177", "order": 1, "nodeId": "func:src/server/personRepository.ts#deletePerson@177", "title": "deletePerson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177" ], "summary": "以 DELETE /api/people/:id 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#GET /api/tags@737", "name": "GET /api/tags (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/tags@737", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:server.ts#GET /api/tags@737", "order": 0, "nodeId": "func:server.ts#GET /api/tags@737", "title": "GET /api/tags", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11", "order": 1, "nodeId": "func:src/server/tagRepository.ts#listTagDefinitions@11", "title": "listTagDefinitions", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11" ], "summary": "以 GET /api/tags 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#POST /api/tags@745", "name": "POST /api/tags (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/tags@745", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:server.ts#POST /api/tags@745", "order": 0, "nodeId": "func:server.ts#POST /api/tags@745", "title": "POST /api/tags", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19", "order": 1, "nodeId": "func:src/server/tagRepository.ts#createTagDefinition@19", "title": "createTagDefinition", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4", "order": 2, "nodeId": "func:src/server/tagRepository.ts#toTagDefinition@4", "title": "toTagDefinition", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19" ], "summary": "以 POST /api/tags 为入口的调用链,覆盖 3 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/tags/:id@754", "name": "DELETE /api/tags/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/tags/:id@754", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:server.ts#DELETE /api/tags/:id@754", "order": 0, "nodeId": "func:server.ts#DELETE /api/tags/:id@754", "title": "DELETE /api/tags/:id", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34", "order": 1, "nodeId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", "title": "deleteTagDefinition", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34" ], "summary": "以 DELETE /api/tags/:id 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#GET /api/weekly-plans@764", "name": "GET /api/weekly-plans (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/weekly-plans@764", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:server.ts#GET /api/weekly-plans@764", "order": 0, "nodeId": "func:server.ts#GET /api/weekly-plans@764", "title": "GET /api/weekly-plans", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" ] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "order": 1, "nodeId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "title": "listWeeklyPlans", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" ] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "order": 2, "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "title": "ensurePublicPoolPlan", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "order": 3, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", "order": 4, "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "title": "addDays", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "order": 5, "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "title": "toWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9", "order": 6, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "title": "dateToInput", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" ], "summary": "以 GET /api/weekly-plans 为入口的调用链,覆盖 7 个函数" }, { "id": "flow:call:func:server.ts#POST /api/weekly-plans@772", "name": "POST /api/weekly-plans (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/weekly-plans@772", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:server.ts#POST /api/weekly-plans@772", "order": 0, "nodeId": "func:server.ts#POST /api/weekly-plans@772", "title": "POST /api/weekly-plans", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" ] }, { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "order": 1, "nodeId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "title": "createWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", "order": 2, "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "title": "addDays", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "order": 3, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "order": 4, "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "title": "toWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9", "order": 5, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "title": "dateToInput", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" ], "summary": "以 POST /api/weekly-plans 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781", "name": "DELETE /api/weekly-plans/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:server.ts#DELETE /api/weekly-plans/:id@781", "order": 0, "nodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", "title": "DELETE /api/weekly-plans/:id", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "order": 1, "nodeId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "title": "deleteWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "order": 2, "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "title": "toWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "order": 3, "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "title": "getDefaultWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9", "order": 4, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "title": "dateToInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "order": 5, "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "title": "ensurePublicPoolPlan", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "order": 6, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", "order": 7, "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "title": "addDays", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] } ], "edgeIds": [ "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" ], "summary": "以 DELETE /api/weekly-plans/:id 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#GET /api/project-templates@791", "name": "GET /api/project-templates (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/project-templates@791", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:server.ts#GET /api/project-templates@791", "order": 0, "nodeId": "func:server.ts#GET /api/project-templates@791", "title": "GET /api/project-templates", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" ] }, { "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "order": 1, "nodeId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "title": "listProjectTemplates", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" ], "summary": "以 GET /api/project-templates 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#POST /api/project-templates@799", "name": "POST /api/project-templates (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/project-templates@799", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:server.ts#POST /api/project-templates@799", "order": 0, "nodeId": "func:server.ts#POST /api/project-templates@799", "title": "POST /api/project-templates", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" ] }, { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "order": 1, "nodeId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "title": "createProjectTemplate", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" ] }, { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "order": 2, "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "order": 3, "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "title": "toTemplateNodesJson", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" ] }, { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "order": 4, "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "title": "toProjectTemplate", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" ] }, { "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "order": 5, "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "title": "normalizeTemplateNodes", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" ], "summary": "以 POST /api/project-templates 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:server.ts#PUT /api/project-templates/:id@808", "name": "PUT /api/project-templates/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#PUT /api/project-templates/:id@808", "steps": [ { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:server.ts#PUT /api/project-templates/:id@808", "order": 0, "nodeId": "func:server.ts#PUT /api/project-templates/:id@808", "title": "PUT /api/project-templates/:id", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "order": 1, "nodeId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "title": "updateProjectTemplate", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "order": 2, "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "order": 3, "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "title": "toTemplateNodesJson", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "order": 4, "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "title": "toProjectTemplate", "nextStepIds": [ "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" ] }, { "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "order": 5, "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "title": "normalizeTemplateNodes", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" ], "summary": "以 PUT /api/project-templates/:id 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/project-templates/:id@817", "name": "DELETE /api/project-templates/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/project-templates/:id@817", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:server.ts#DELETE /api/project-templates/:id@817", "order": 0, "nodeId": "func:server.ts#DELETE /api/project-templates/:id@817", "title": "DELETE /api/project-templates/:id", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "order": 1, "nodeId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "title": "deleteProjectTemplate", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" ], "summary": "以 DELETE /api/project-templates/:id 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#GET /api/tasks@826", "name": "GET /api/tasks (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/tasks@826", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:server.ts#GET /api/tasks@826", "order": 0, "nodeId": "func:server.ts#GET /api/tasks@826", "title": "GET /api/tasks", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194", "order": 1, "nodeId": "func:src/server/taskRepository.ts#listTasks@194", "title": "listTasks", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194" ], "summary": "以 GET /api/tasks 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#GET /api/tasks/:id@834", "name": "GET /api/tasks/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/tasks/:id@834", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:server.ts#GET /api/tasks/:id@834", "order": 0, "nodeId": "func:server.ts#GET /api/tasks/:id@834", "title": "GET /api/tasks/:id", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190", "order": 1, "nodeId": "func:src/server/taskRepository.ts#getTask@190", "title": "getTask", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 2, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 3, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163", "order": 4, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 5, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 6, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190" ], "summary": "以 GET /api/tasks/:id 为入口的调用链,覆盖 7 个函数" }, { "id": "flow:call:func:server.ts#POST /api/tasks@843", "name": "POST /api/tasks (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/tasks@843", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:server.ts#POST /api/tasks@843", "order": 0, "nodeId": "func:server.ts#POST /api/tasks@843", "title": "POST /api/tasks", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227", "order": 1, "nodeId": "func:src/server/taskRepository.ts#createTask@227", "title": "createTask", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", "order": 2, "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "order": 3, "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "title": "getWeeklyPlanOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "order": 4, "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "title": "getDefaultWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "order": 5, "nodeId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "title": "getNextTaskSortOrder", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", "order": 6, "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", "title": "existingTagNames", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 7, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "order": 8, "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "title": "toWeeklyPlan", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "order": 9, "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "title": "ensurePublicPoolPlan", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 10, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163", "order": 11, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9", "order": 12, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", "title": "dateToInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "order": 13, "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", "order": 14, "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", "title": "addDays", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 15, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 16, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227" ], "summary": "以 POST /api/tasks 为入口的调用链,覆盖 17 个函数" }, { "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852", "name": "PATCH /api/tasks/:id/list-state (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", "steps": [ { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:server.ts#PATCH /api/tasks/:id/list-state@852", "order": 0, "nodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", "title": "PATCH /api/tasks/:id/list-state", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353", "order": 1, "nodeId": "func:src/server/taskRepository.ts#updateTaskListState@353", "title": "updateTaskListState", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "order": 2, "nodeId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "title": "getFirstTaskSortOrder", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 3, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 4, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163", "order": 5, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 7, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353" ], "summary": "以 PATCH /api/tasks/:id/list-state 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/tasks/:id@886", "name": "DELETE /api/tasks/:id (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/tasks/:id@886", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:server.ts#DELETE /api/tasks/:id@886", "order": 0, "nodeId": "func:server.ts#DELETE /api/tasks/:id@886", "title": "DELETE /api/tasks/:id", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383", "order": 1, "nodeId": "func:src/server/taskRepository.ts#deleteTask@383", "title": "deleteTask", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383" ], "summary": "以 DELETE /api/tasks/:id 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#POST /api/tasks/:id/nodes@895", "name": "POST /api/tasks/:id/nodes (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:server.ts#POST /api/tasks/:id/nodes@895", "order": 0, "nodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", "title": "POST /api/tasks/:id/nodes", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389", "order": 1, "nodeId": "func:src/server/taskRepository.ts#createWorkflowNode@389", "title": "createWorkflowNode", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", "order": 2, "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", "title": "ensureTaskExists", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 3, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 4, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163", "order": 5, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 7, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389" ], "summary": "以 POST /api/tasks/:id/nodes 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "name": "PATCH /api/tasks/:id/nodes/:nodeId (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "steps": [ { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "order": 0, "nodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", "title": "PATCH /api/tasks/:id/nodes/:nodeId", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423", "order": 1, "nodeId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", "title": "updateWorkflowNode", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "order": 2, "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "title": "ensureWorkflowNodeExists", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 3, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 4, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163", "order": 5, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 7, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423" ], "summary": "以 PATCH /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "name": "DELETE /api/tasks/:id/nodes/:nodeId (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "order": 0, "nodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", "title": "DELETE /api/tasks/:id/nodes/:nodeId", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472", "order": 1, "nodeId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "title": "deleteWorkflowNode", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "order": 2, "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "title": "ensureWorkflowNodeExists", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 3, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 4, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163", "order": 5, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 7, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472" ], "summary": "以 DELETE /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925", "name": "POST /api/tasks/:id/dependencies (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", "steps": [ { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:server.ts#POST /api/tasks/:id/dependencies@925", "order": 0, "nodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", "title": "POST /api/tasks/:id/dependencies", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494", "order": 1, "nodeId": "func:src/server/taskRepository.ts#createNodeDependency@494", "title": "createNodeDependency", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "order": 2, "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "title": "ensureWorkflowNodeExists", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", "order": 3, "nodeId": "func:src/server/taskRepository.ts#hasDependencyPath@577", "title": "hasDependencyPath", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 4, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 5, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163", "order": 6, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 7, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 8, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494" ], "summary": "以 POST /api/tasks/:id/dependencies 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "order": 0, "nodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", "title": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535", "order": 1, "nodeId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", "title": "deleteNodeDependency", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", "order": 2, "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", "title": "ensureTaskExists", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182", "order": 3, "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", "title": "getTaskOrThrow", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", "order": 4, "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", "title": "findTaskRecord", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163", "order": 5, "nodeId": "func:src/server/taskRepository.ts#toTask@163", "title": "toTask", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "order": 7, "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "title": "resolveTaskCompletionStatus", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535" ], "summary": "以 DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:server.ts#GET /api/logs@1041", "name": "GET /api/logs (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#GET /api/logs@1041", "steps": [ { "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:server.ts#GET /api/logs@1041", "order": 0, "nodeId": "func:server.ts#GET /api/logs@1041", "title": "GET /api/logs", "nextStepIds": [ "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47" ] }, { "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47", "order": 1, "nodeId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", "title": "listNotificationLogs", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47" ], "summary": "以 GET /api/logs 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#DELETE /api/logs@1049", "name": "DELETE /api/logs (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#DELETE /api/logs@1049", "steps": [ { "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:server.ts#DELETE /api/logs@1049", "order": 0, "nodeId": "func:server.ts#DELETE /api/logs@1049", "title": "DELETE /api/logs", "nextStepIds": [ "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56" ] }, { "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56", "order": 1, "nodeId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", "title": "clearNotificationLogs", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56" ], "summary": "以 DELETE /api/logs 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:server.ts#replyText@1147", "name": "replyText (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#replyText@1147", "steps": [ { "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyText@1147", "order": 0, "nodeId": "func:server.ts#replyText@1147", "title": "replyText", "nextStepIds": [ "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204" ] }, { "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204", "order": 1, "nodeId": "func:server.ts#replyToDingTalkSession@204", "title": "replyToDingTalkSession", "nextStepIds": [ "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", "order": 2, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110", "order": 3, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204" ], "summary": "以 replyText 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215", "name": "registerCallbackListener() 回调@1215 (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", "steps": [ { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#registerCallbackListener() 回调@1215@1215", "order": 0, "nodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", "title": "registerCallbackListener() 回调@1215", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114", "order": 1, "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", "title": "handleDingTalkRobotMessage", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", "order": 2, "nodeId": "func:server.ts#replyText@1147", "title": "replyText", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", "order": 3, "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", "title": "isAiConfigured", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", "order": 4, "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", "title": "clearBotMemory", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", "order": 5, "nodeId": "func:src/server/personRepository.ts#listPeople@53", "title": "listPeople", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", "order": 6, "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", "title": "createBotQueryContext", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", "order": 7, "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", "title": "answerBotQuestion", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222", "order": 8, "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", "title": "replyToDingTalkSessionMarkdown", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204", "order": 9, "nodeId": "func:server.ts#replyToDingTalkSession@204", "title": "replyToDingTalkSession", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "order": 10, "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "title": "ensurePeopleFromExistingResponsibles", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10", "order": 11, "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", "title": "getTodayStr", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", "order": 12, "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", "title": "getMemoryTurns", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", "order": 13, "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", "title": "buildSystemPrompt", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", "order": 14, "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", "title": "buildToolSpecs", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", "order": 15, "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", "title": "callChatCompletion", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", "order": 16, "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", "title": "executeToolCall", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72", "order": 17, "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", "title": "appendMemoryTurn", "nextStepIds": [ "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62" ] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", "order": 18, "nodeId": "func:server.ts#readRemoteError@98", "title": "readRemoteError", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110", "order": 19, "nodeId": "func:server.ts#readRemoteJson@110", "title": "readRemoteJson", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17", "order": 20, "nodeId": "func:src/server/botQueryTools.ts#value@17", "title": "value", "nextStepIds": [] }, { "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583", "order": 21, "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", "title": "getBotToolByName", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114" ], "summary": "以 registerCallbackListener() 回调@1215 为入口的调用链,覆盖 22 个函数" }, { "id": "flow:call:func:server.ts#@0", "name": " (server.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:server.ts#@0", "steps": [ { "id": "step:flow:call:func:server.ts#@0:func:server.ts#@0", "order": 0, "nodeId": "func:server.ts#@0", "title": "", "nextStepIds": [ "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235" ] }, { "id": "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235", "order": 1, "nodeId": "func:server.ts#startServer@1235", "title": "startServer", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235" ], "summary": "以 为入口的调用链,覆盖 2 个函数" }, { "id": "flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "name": "NodeEditorDrawer (src/components/NodeEditorDrawer.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "steps": [ { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "order": 0, "nodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", "title": "NodeEditorDrawer", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "order": 1, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 2, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 3, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "order": 4, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "title": "getStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "order": 5, "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "title": "changeEditName", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "order": 6, "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "title": "changeEditDesc", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "order": 7, "nodeId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "title": "selectResponsible", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "order": 8, "nodeId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "title": "removeTimeRange", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "order": 9, "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "title": "changeTimeRange", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "order": 10, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "title": "getMinimumFirstStartDate", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "order": 11, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "title": "getParentLatestEndDate", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "order": 12, "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "title": "changeProgress", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "order": 13, "nodeId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "title": "focusLinkedNode", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "order": 14, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", "title": "getLinkedNodeClassName", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 15, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "order": 16, "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "title": "updateSelectedNode", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "order": 17, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "title": "getCurrentDraft", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "order": 18, "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "title": "updateTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "order": 19, "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "title": "addDaysToDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "order": 20, "nodeId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "title": "normalizeProgress", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 21, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "order": 22, "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "title": "constrainNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "order": 23, "nodeId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "title": "getDraftKey", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" ], "summary": "以 NodeEditorDrawer 为入口的调用链,覆盖 24 个函数" }, { "id": "flow:call:func:src/server/botQueryTools.ts#execute@430", "name": "execute (src/server/botQueryTools.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/botQueryTools.ts#execute@430", "steps": [ { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#execute@430", "order": 0, "nodeId": "func:src/server/botQueryTools.ts#execute@430", "title": "execute", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", "order": 1, "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "title": "resolveTaskScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", "order": 2, "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", "title": "planNameById", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", "order": 3, "nodeId": "func:src/server/botQueryTools.ts#addDays@440", "title": "addDays", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "order": 4, "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "title": "isNodeOwnedByPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "order": 5, "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", "order": 6, "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "title": "nodeStartDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", "order": 7, "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "title": "nodeEndDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", "order": 8, "nodeId": "func:src/server/botQueryTools.ts#overlapsRange@59", "title": "overlapsRange", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72", "order": 9, "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "title": "buildTaskLink", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", "order": 10, "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", "title": "selfScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "order": 11, "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "title": "isTaskRelatedToPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21", "order": 12, "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", "title": "nodeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72" ], "summary": "以 execute 为入口的调用链,覆盖 13 个函数" }, { "id": "flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "name": "map() 回调@997 (src/components/WorkflowCanvas.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "steps": [ { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "order": 0, "nodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", "title": "map() 回调@997", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "order": 1, "nodeId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "order": 2, "nodeId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "title": "getStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "order": 3, "nodeId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "title": "getNodeProgressPercent", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "order": 5, "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "title": "handleNodeMouseDown", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "order": 6, "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "title": "handleNodeClick", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "order": 7, "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "title": "handleConnectionMouseDown", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "order": 8, "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "title": "handleConnectionHandleClick", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "order": 9, "nodeId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", "title": "formatNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 10, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 11, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 12, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "order": 13, "nodeId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "title": "createDraftNode", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "order": 14, "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "title": "findPreviewNodePosition", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "order": 15, "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "title": "addDaysToDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "order": 16, "nodeId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "title": "createNodeTimeRange", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "order": 17, "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "title": "getOverlapArea", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" ], "summary": "以 map() 回调@997 为入口的调用链,覆盖 18 个函数" }, { "id": "flow:call:func:src/server/botQueryTools.ts#execute@349", "name": "execute (src/server/botQueryTools.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/botQueryTools.ts#execute@349", "steps": [ { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#execute@349", "order": 0, "nodeId": "func:src/server/botQueryTools.ts#execute@349", "title": "execute", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "order": 1, "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "title": "isTaskRelatedToPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", "order": 2, "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", "title": "planNameById", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", "order": 3, "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "title": "taskDateSpan", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", "order": 4, "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "title": "buildTaskLink", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "order": 5, "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", "order": 6, "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "title": "nodeStartDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", "order": 7, "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "title": "nodeEndDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "order": 8, "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "title": "isNodeOwnedByPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21", "order": 9, "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", "title": "nodeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" ], "summary": "以 execute 为入口的调用链,覆盖 10 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313", "name": "$transaction() 回调@313 (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#$transaction() 回调@313@313", "order": 0, "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", "title": "$transaction() 回调@313", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 1, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "order": 2, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "title": "normalizeTaskCompletionStatus", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", "order": 3, "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", "title": "existingTagNames", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", "order": 4, "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605", "order": 5, "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "title": "replaceTaskNodes", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" ] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" ], "summary": "以 $transaction() 回调@313 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392", "name": "$transaction() 回调@392 (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#$transaction() 回调@392@392", "order": 0, "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", "title": "$transaction() 回调@392", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "order": 1, "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "title": "getNodeTimeBounds", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", "order": 2, "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "order": 3, "nodeId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "title": "nodeTimeRangesToJson", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "order": 4, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "title": "normalizeNodeProgress", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40", "order": 5, "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "order": 6, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40" ], "summary": "以 $transaction() 回调@392 为入口的调用链,覆盖 7 个函数" }, { "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "name": "map() 回调@382 (src/components/WeeklyOverview.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "steps": [ { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "order": 0, "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", "title": "map() 回调@382", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", "order": 1, "nodeId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", "title": "sortTasks", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", "order": 2, "nodeId": "func:src/types.ts#isPublicPoolPlan@68", "title": "isPublicPoolPlan", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "order": 3, "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "title": "getTaskStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "order": 4, "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "title": "handleColumnDragOver", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "order": 5, "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", "title": "handleColumnDrop", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "order": 6, "nodeId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "title": "getDropBeforeTaskId", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "order": 7, "nodeId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "title": "clearTaskDragState", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" ], "summary": "以 map() 回调@382 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:src/App.tsx#useEffect() 回调@133@133", "name": "useEffect() 回调@133 (src/App.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/App.tsx#useEffect() 回调@133@133", "steps": [ { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#useEffect() 回调@133@133", "order": 0, "nodeId": "func:src/App.tsx#useEffect() 回调@133@133", "title": "useEffect() 回调@133", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", "order": 1, "nodeId": "func:src/App.tsx#fetchTasks@221", "title": "fetchTasks", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", "order": 2, "nodeId": "func:src/App.tsx#fetchPeople@241", "title": "fetchPeople", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", "order": 3, "nodeId": "func:src/App.tsx#fetchTags@256", "title": "fetchTags", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", "order": 4, "nodeId": "func:src/App.tsx#fetchProjectTemplates@323", "title": "fetchProjectTemplates", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338", "order": 5, "nodeId": "func:src/App.tsx#fetchWeeklyPlans@338", "title": "fetchWeeklyPlans", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", "order": 6, "nodeId": "func:src/utils/api.ts#apiPath@15", "title": "apiPath", "nextStepIds": [ "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7" ] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39", "order": 7, "nodeId": "func:src/App.tsx#readApiError@39", "title": "readApiError", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7", "order": 8, "nodeId": "func:src/utils/api.ts#appPath@7", "title": "appPath", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39" ], "summary": "以 useEffect() 回调@133 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430", "name": "$transaction() 回调@430 (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#$transaction() 回调@430@430", "order": 0, "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", "title": "$transaction() 回调@430", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "order": 1, "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "title": "getNodeTimeBounds", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", "order": 2, "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "order": 3, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "title": "normalizeNodeProgress", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40", "order": 4, "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "order": 5, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40" ], "summary": "以 $transaction() 回调@430 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "name": "map() 回调@107 (src/utils/nodeTimeRanges.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "steps": [ { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "order": 0, "nodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", "title": "map() 回调@107", "nextStepIds": [ "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 1, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "order": 2, "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "title": "addDaysToDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "order": 3, "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "title": "constrainNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ], "summary": "以 map() 回调@107 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "name": "map() 回调@266 (src/components/PersonGanttChart.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "steps": [ { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "order": 0, "nodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", "title": "map() 回调@266", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "order": 1, "nodeId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "order": 2, "nodeId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "title": "getStatusVisual", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "order": 3, "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "title": "getTaskPriorityMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 7, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ], "summary": "以 map() 回调@266 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90", "name": "handleSsoLogin (src/components/LoginPage.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "steps": [ { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#handleSsoLogin@90", "order": 0, "nodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", "title": "handleSsoLogin", "nextStepIds": [ "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" ] }, { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", "order": 1, "nodeId": "func:src/components/LoginPage.tsx#createOAuthState@31", "title": "createOAuthState", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", "order": 2, "nodeId": "func:src/utils/api.ts#apiPath@15", "title": "apiPath", "nextStepIds": [ "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7" ] }, { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", "order": 3, "nodeId": "func:src/components/LoginPage.tsx#readApiJson@21", "title": "readApiJson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "order": 4, "nodeId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", "title": "requestSsoOAuthCode", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7", "order": 5, "nodeId": "func:src/utils/api.ts#appPath@7", "title": "appPath", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" ], "summary": "以 handleSsoLogin 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "name": "map() 回调@513 (src/components/WeeklyOverview.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "steps": [ { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "order": 0, "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", "title": "map() 回调@513", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "order": 1, "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "title": "getTaskDisplayStatus", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "order": 2, "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "title": "getTaskStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "order": 3, "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "title": "getTaskPriorityMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "order": 4, "nodeId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", "title": "handleTaskDragStart", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", "order": 5, "nodeId": "func:src/utils/date.ts#getLocalDateString@1", "title": "getLocalDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 7, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "order": 8, "nodeId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "title": "stopBoardDrag", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 9, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 10, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" ], "summary": "以 map() 回调@513 为入口的调用链,覆盖 11 个函数" }, { "id": "flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "name": "匿名函数@644 (src/components/WeeklyOverview.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "steps": [ { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "order": 0, "nodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", "title": "匿名函数@644", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "order": 1, "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "title": "getTaskDisplayStatus", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "order": 2, "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "title": "getTaskStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "order": 3, "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "title": "getTaskPriorityMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", "order": 5, "nodeId": "func:src/utils/date.ts#getLocalDateString@1", "title": "getLocalDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 7, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 8, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" ], "summary": "以 匿名函数@644 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "name": "map() 回调@721 (src/components/WeeklyOverview.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "steps": [ { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "order": 0, "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", "title": "map() 回调@721", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "order": 1, "nodeId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "order": 2, "nodeId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "title": "normalizeProgress", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 3, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ], "summary": "以 map() 回调@721 为入口的调用链,覆盖 7 个函数" }, { "id": "flow:call:func:src/App.tsx#handleReorderTask@798", "name": "handleReorderTask (src/App.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/App.tsx#handleReorderTask@798", "steps": [ { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#handleReorderTask@798", "order": 0, "nodeId": "func:src/App.tsx#handleReorderTask@798", "title": "handleReorderTask", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221" ] }, { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", "order": 1, "nodeId": "func:src/App.tsx#sortTasksForList@54", "title": "sortTasksForList", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", "order": 2, "nodeId": "func:src/utils/api.ts#apiPath@15", "title": "apiPath", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7" ] }, { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", "order": 3, "nodeId": "func:src/App.tsx#readApiError@39", "title": "readApiError", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221", "order": 4, "nodeId": "func:src/App.tsx#fetchTasks@221", "title": "fetchTasks", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7", "order": 5, "nodeId": "func:src/utils/api.ts#appPath@7", "title": "appPath", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221" ], "summary": "以 handleReorderTask 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/App.tsx#handleUpdateNodes@1371", "name": "handleUpdateNodes (src/App.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/App.tsx#handleUpdateNodes@1371", "steps": [ { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleUpdateNodes@1371", "order": 0, "nodeId": "func:src/App.tsx#handleUpdateNodes@1371", "title": "handleUpdateNodes", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353" ] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "order": 1, "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "title": "constrainWorkflowNodesTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", "order": 2, "nodeId": "func:src/App.tsx#edgeKey@1383", "title": "edgeKey", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", "order": 3, "nodeId": "func:src/App.tsx#requestTaskUpdate@1425", "title": "requestTaskUpdate", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353", "order": 4, "nodeId": "func:src/App.tsx#handleRefreshTask@1353", "title": "handleRefreshTask", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" ] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", "order": 5, "nodeId": "func:src/utils/api.ts#apiPath@15", "title": "apiPath", "nextStepIds": [ "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7" ] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39", "order": 6, "nodeId": "func:src/App.tsx#readApiError@39", "title": "readApiError", "nextStepIds": [] }, { "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7", "order": 7, "nodeId": "func:src/utils/api.ts#appPath@7", "title": "appPath", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353" ], "summary": "以 handleUpdateNodes 为入口的调用链,覆盖 8 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118", "name": "toWorkflowNode (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#toWorkflowNode@118", "order": 0, "nodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", "title": "toWorkflowNode", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", "order": 1, "nodeId": "func:src/server/taskRepository.ts#dateToInput@36", "title": "dateToInput", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "order": 2, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "title": "normalizeNodeTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "order": 3, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "title": "normalizeNodeProgress", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" ], "summary": "以 toWorkflowNode 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273", "name": "$transaction() 回调@273 (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#$transaction() 回调@273@273", "order": 0, "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", "title": "$transaction() 回调@273", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", "order": 1, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", "title": "normalizeTaskPriority", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "order": 2, "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "title": "normalizeTaskCompletionStatus", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605", "order": 3, "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", "title": "replaceTaskNodes", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40", "order": 4, "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", "title": "uniqueValues", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" ], "summary": "以 $transaction() 回调@273 为入口的调用链,覆盖 5 个函数" }, { "id": "flow:call:func:src/server/taskRepository.ts#map() 回调@618@618", "name": "map() 回调@618 (src/server/taskRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", "steps": [ { "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#map() 回调@618@618", "order": 0, "nodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", "title": "map() 回调@618", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", "order": 1, "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", "title": "getNodeTimeBounds", "nextStepIds": [ "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" ] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", "order": 2, "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", "title": "dateFromInput", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44", "order": 3, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", "title": "normalizeNodeProgress", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "order": 4, "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" ], "summary": "以 map() 回调@618 为入口的调用链,覆盖 5 个函数" }, { "id": "flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "name": "map() 回调@58 (src/server/projectTemplateRepository.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "steps": [ { "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "order": 0, "nodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", "title": "map() 回调@58", "nextStepIds": [ "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" ] }, { "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "order": 1, "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "title": "normalizeNodeTimeRanges", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", "order": 2, "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", "title": "uniqueValues", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "order": 3, "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", "title": "normalizeNodeProgress", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" ], "summary": "以 map() 回调@58 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:src/server/botQueryTools.ts#execute@297", "name": "execute (src/server/botQueryTools.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/botQueryTools.ts#execute@297", "steps": [ { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#execute@297", "order": 0, "nodeId": "func:src/server/botQueryTools.ts#execute@297", "title": "execute", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", "order": 1, "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "title": "resolveTaskScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", "order": 2, "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", "title": "planNameById", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172", "order": 3, "nodeId": "func:src/server/botQueryTools.ts#summarizeTask@172", "title": "summarizeTask", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", "order": 4, "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", "title": "selfScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "order": 5, "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "title": "isTaskRelatedToPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "order": 6, "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", "order": 7, "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", "title": "taskDateSpan", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72", "order": 8, "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", "title": "buildTaskLink", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", "order": 9, "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "title": "nodeStartDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34", "order": 10, "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "title": "nodeEndDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21", "order": 11, "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", "title": "nodeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172" ], "summary": "以 execute 为入口的调用链,覆盖 12 个函数" }, { "id": "flow:call:func:src/server/botQueryTools.ts#execute@542", "name": "execute (src/server/botQueryTools.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/server/botQueryTools.ts#execute@542", "steps": [ { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#execute@542", "order": 0, "nodeId": "func:src/server/botQueryTools.ts#execute@542", "title": "execute", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", "order": 1, "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", "title": "resolveTaskScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "order": 2, "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "title": "isNodeOwnedByPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "order": 3, "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", "title": "getEffectiveNodeStatus", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", "order": 4, "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", "title": "selfScope", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "order": 5, "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "title": "isTaskRelatedToPerson", "nextStepIds": [] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", "order": 6, "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", "title": "nodeStartDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34", "order": 7, "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", "title": "nodeEndDate", "nextStepIds": [ "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" ] }, { "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21", "order": 8, "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", "title": "nodeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" ], "summary": "以 execute 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:src/components/TaskList.tsx#map() 回调@387@387", "name": "map() 回调@387 (src/components/TaskList.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", "steps": [ { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/components/TaskList.tsx#map() 回调@387@387", "order": 0, "nodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", "title": "map() 回调@387", "nextStepIds": [ "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" ] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "order": 1, "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "title": "getTaskDisplayStatus", "nextStepIds": [ "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "order": 2, "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "title": "getTaskStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "order": 3, "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "title": "getTaskPriorityMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", "order": 4, "nodeId": "func:src/utils/date.ts#getLocalDateString@1", "title": "getLocalDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 7, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 8, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" ], "summary": "以 map() 回调@387 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "name": "WorkflowCanvas (src/components/WorkflowCanvas.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "steps": [ { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "order": 0, "nodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", "title": "WorkflowCanvas", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", "order": 1, "nodeId": "func:src/utils/date.ts#getLocalDateString@1", "title": "getLocalDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "order": 2, "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "title": "findPreviewNodePosition", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "order": 3, "nodeId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", "title": "handleImportTemplate", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "order": 4, "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "title": "getOverlapArea", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "order": 5, "nodeId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "title": "buildImportedTemplateNodes", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623", "order": 7, "nodeId": "func:src/components/WorkflowCanvas.tsx#toMs@623", "title": "toMs", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 8, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 9, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" ], "summary": "以 WorkflowCanvas 为入口的调用链,覆盖 10 个函数" }, { "id": "flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14", "name": "TaskOverview (src/components/TaskOverview.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", "steps": [ { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/components/TaskOverview.tsx#TaskOverview@14", "order": 0, "nodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", "title": "TaskOverview", "nextStepIds": [ "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" ] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "order": 1, "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "title": "getTaskDisplayStatus", "nextStepIds": [ "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "order": 2, "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "title": "getTaskStatusMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "order": 3, "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", "title": "getTaskPriorityMeta", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", "order": 4, "nodeId": "func:src/utils/date.ts#getLocalDateString@1", "title": "getLocalDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 6, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 7, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 8, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" ], "summary": "以 TaskOverview 为入口的调用链,覆盖 9 个函数" }, { "id": "flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "name": "requestAnimationFrame() 回调@174 (src/components/GanttChart.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "steps": [ { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "order": 0, "nodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", "title": "requestAnimationFrame() 回调@174", "nextStepIds": [ "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", "order": 1, "nodeId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", "title": "getTimelinePercentage", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 2, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 3, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ], "summary": "以 requestAnimationFrame() 回调@174 为入口的调用链,覆盖 6 个函数" }, { "id": "flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260", "name": "map() 回调@260 (src/components/GanttChart.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", "steps": [ { "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#map() 回调@260@260", "order": 0, "nodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", "title": "map() 回调@260", "nextStepIds": [ "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80" ] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", "order": 1, "nodeId": "func:src/components/GanttChart.tsx#isWeekend@86", "title": "isWeekend", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", "order": 2, "nodeId": "func:src/components/GanttChart.tsx#formatDateString@76", "title": "formatDateString", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80", "order": 3, "nodeId": "func:src/components/GanttChart.tsx#getDayLabel@80", "title": "getDayLabel", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80" ], "summary": "以 map() 回调@260 为入口的调用链,覆盖 4 个函数" }, { "id": "flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "name": "useMemo() 回调@51 (src/components/PersonGanttChart.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "steps": [ { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "order": 0, "nodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", "title": "useMemo() 回调@51", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", "order": 1, "nodeId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", "title": "buildDateRange", "nextStepIds": [] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "order": 2, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "title": "getNodeStartDate", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "order": 3, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", "title": "getNodeEndDate", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "order": 4, "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "title": "getNodeTimeRanges", "nextStepIds": [ "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" ] }, { "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "order": 5, "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "title": "normalizeNodeTimeRanges", "nextStepIds": [] } ], "edgeIds": [ "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" ], "summary": "以 useMemo() 回调@51 为入口的调用链,覆盖 6 个函数" } ], "externalSystems": [ { "id": "ext:db:prisma", "kind": "database", "name": "prisma", "engine": "prisma", "tables": [ "nodeDependency", "nodeResponsible", "notificationLog", "person", "projectTemplate", "tagDefinition", "task", "taskResponsible", "taskTag", "weeklyPlan", "workflowNode" ], "functionIds": [ "func:prisma/seed.ts#seed@13", "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", "func:src/server/taskRepository.ts#existingTagNames@96", "func:src/server/taskRepository.ts#findTaskRecord@111", "func:src/server/taskRepository.ts#listTasks@194", "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", "func:src/server/taskRepository.ts#createTask@227", "func:src/server/taskRepository.ts#updateTask@302", "func:src/server/taskRepository.ts#updateTaskListState@353", "func:src/server/taskRepository.ts#deleteTask@383", "func:src/server/taskRepository.ts#createWorkflowNode@389", "func:src/server/taskRepository.ts#updateWorkflowNode@423", "func:src/server/taskRepository.ts#deleteWorkflowNode@472", "func:src/server/taskRepository.ts#createNodeDependency@494", "func:src/server/taskRepository.ts#deleteNodeDependency@535", "func:src/server/taskRepository.ts#ensureTaskExists@560", "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", "func:src/server/taskRepository.ts#hasDependencyPath@577", "func:src/server/notificationRepository.ts#createNotificationLog@37", "func:src/server/notificationRepository.ts#listNotificationLogs@47", "func:src/server/notificationRepository.ts#clearNotificationLogs@56", "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", "func:src/server/tagRepository.ts#listTagDefinitions@11", "func:src/server/tagRepository.ts#createTagDefinition@19", "func:src/server/tagRepository.ts#deleteTagDefinition@34", "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", "func:src/server/personRepository.ts#listPeople@53", "func:src/server/personRepository.ts#getPersonOrThrow@64", "func:src/server/personRepository.ts#createPerson@73", "func:src/server/personRepository.ts#ensurePeople@118", "func:src/server/personRepository.ts#updatePerson@142", "func:src/server/personRepository.ts#deletePerson@177" ], "interactionCount": 58, "provenance": "resolved" }, { "id": "ext:service:api.dingtalk.com", "kind": "service", "name": "api.dingtalk.com", "protocol": "http", "endpoints": [ "https://api.dingtalk.com/v1.0/oauth2/accessToken", "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend" ], "functionIds": [ "func:server.ts#getDingTalkRobotAccessToken@128", "func:server.ts#sendDingTalkRobotMarkdownMessage@162" ], "interactionCount": 2, "provenance": "resolved" } ] }