agentstudio 0.1.18 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -505
- package/bin/agentstudio.js +305 -0
- package/bin/agentstudio.js.map +1 -0
- package/bin/serviceManager.d.ts +16 -0
- package/bin/serviceManager.d.ts.map +1 -0
- package/bin/serviceManager.js +434 -0
- package/bin/serviceManager.js.map +1 -0
- package/config/index.d.ts +74 -0
- package/config/index.d.ts.map +1 -0
- package/config/index.js +166 -0
- package/config/index.js.map +1 -0
- package/config/paths.d.ts +81 -0
- package/config/paths.d.ts.map +1 -0
- package/config/paths.js +98 -0
- package/config/paths.js.map +1 -0
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -0
- package/index.js +369 -0
- package/index.js.map +1 -0
- package/jobs/taskTimeoutMonitor.d.ts +25 -0
- package/jobs/taskTimeoutMonitor.d.ts.map +1 -0
- package/jobs/taskTimeoutMonitor.js +94 -0
- package/jobs/taskTimeoutMonitor.js.map +1 -0
- package/middleware/a2aAuth.d.ts +38 -0
- package/middleware/a2aAuth.d.ts.map +1 -0
- package/middleware/a2aAuth.js +134 -0
- package/middleware/a2aAuth.js.map +1 -0
- package/{backend/dist/middleware → middleware}/auth.d.ts +3 -1
- package/middleware/auth.d.ts.map +1 -0
- package/middleware/auth.js +35 -0
- package/middleware/auth.js.map +1 -0
- package/middleware/httpsOnly.d.ts +38 -0
- package/middleware/httpsOnly.d.ts.map +1 -0
- package/middleware/httpsOnly.js +105 -0
- package/middleware/httpsOnly.js.map +1 -0
- package/middleware/rateLimiting.d.ts +37 -0
- package/middleware/rateLimiting.d.ts.map +1 -0
- package/middleware/rateLimiting.js +118 -0
- package/middleware/rateLimiting.js.map +1 -0
- package/package.json +43 -38
- package/public/assets/AgentsPage-Nvg2xu6K.js +10 -0
- package/public/assets/Button-Co56C389.js +1 -0
- package/public/assets/ChatPage-D6sol0ad.js +442 -0
- package/public/assets/CommandForm-Bk7F_HU8.js +7 -0
- package/public/assets/CommandsPage-DZHyOdKd.js +1 -0
- package/public/assets/DashboardPage-29qC7Ev1.js +15 -0
- package/public/assets/FileBrowser-BYweUPH4.js +6 -0
- package/public/assets/FileExplorer-DNYj6Tsx.js +1 -0
- package/public/assets/GeneralSettingsPage-D9Xa7Nd8.js +1 -0
- package/public/assets/LandingPage-CjnT-cvO.js +1 -0
- package/public/assets/LoginPage-DcaGNCXH.js +16 -0
- package/public/assets/McpAdminSettingsPage-DgR3E2Bd.js +7 -0
- package/public/assets/McpPage-CtWf1CoL.js +40 -0
- package/public/assets/MemorySettingsPage-JTry4Ccp.js +1 -0
- package/public/assets/PluginsPage-D-BHjQ3P.js +1 -0
- package/public/assets/ProjectSelector-DSXOjMQC.js +1 -0
- package/public/assets/ProjectsPage-lLUk4-Xa.js +21 -0
- package/public/assets/ScheduledTasksPage-5hPbd9Vs.js +1 -0
- package/public/assets/SettingsLayout-DGJspXLp.js +1 -0
- package/public/assets/SkillsPage-DBw0m7D2.js +18 -0
- package/{backend/dist/frontend/assets/SubagentForm-DXtTTIKg.js → public/assets/SubagentForm-BdUK1U4y.js} +2 -2
- package/public/assets/SubagentsPage-Dnq70IFd.js +1 -0
- package/{backend/dist/frontend/assets/ToastTestPage-DT4wuN5C.js → public/assets/ToastTestPage-BfJQRFIm.js} +1 -1
- package/public/assets/ToolsList-Dl5F2fWk.js +1 -0
- package/public/assets/UnifiedToolSelector-CNbPsiuq.js +1 -0
- package/public/assets/VersionSettingsPage-BfoCcham.js +5 -0
- package/public/assets/_basePickBy-7C_e0Xv1.js +1 -0
- package/public/assets/_baseUniq-eGJNLBzx.js +1 -0
- package/public/assets/agents-ChrA1R0y.js +1 -0
- package/public/assets/arc-CuA752eE.js +1 -0
- package/public/assets/architectureDiagram-VXUJARFQ-BnPYh1OW.js +36 -0
- package/public/assets/blockDiagram-VD42YOAC-72nsMt_i.js +122 -0
- package/public/assets/c4Diagram-YG6GDRKO-BNJSAXcg.js +10 -0
- package/public/assets/channel-CIunGC5m.js +1 -0
- package/public/assets/chunk-4BX2VUAB-RPxkCWhH.js +1 -0
- package/public/assets/chunk-55IACEB6-3ePDt0kp.js +1 -0
- package/public/assets/chunk-B4BG7PRW-CBg_BBfl.js +165 -0
- package/public/assets/chunk-DI55MBZ5-DIh69TUJ.js +220 -0
- package/public/assets/chunk-FMBD7UC4-BbjwhyTe.js +15 -0
- package/public/assets/chunk-QN33PNHL-BpH-o_YR.js +1 -0
- package/public/assets/chunk-QZHKN3VN-DYB7rh5Q.js +1 -0
- package/public/assets/chunk-TZMSLE5B-DPCYEVb3.js +1 -0
- package/public/assets/classDiagram-2ON5EDUG-aUQHFsTA.js +1 -0
- package/public/assets/classDiagram-v2-WZHVMYZB-aUQHFsTA.js +1 -0
- package/public/assets/clone-Ckf7tA1V.js +1 -0
- package/public/assets/cose-bilkent-S5V4N54A-CnpfmL-Y.js +1 -0
- package/public/assets/cytoscape.esm-DtBltrT8.js +331 -0
- package/public/assets/dagre-6UL2VRFP-DR9x77Xf.js +4 -0
- package/{backend/dist/frontend/assets/data-structures-DLJedtzx.js → public/assets/data-structures-C0h9Oap1.js} +1 -1
- package/public/assets/defaultLocale-C4B-KCzX.js +1 -0
- package/public/assets/diagram-PSM6KHXK-SONPsQNx.js +24 -0
- package/public/assets/diagram-QEK2KX5R-BKYFSfC1.js +43 -0
- package/public/assets/diagram-S2PKOQOG-CkM0APZj.js +24 -0
- package/public/assets/erDiagram-Q2GNP2WA-BX1DpOGx.js +60 -0
- package/public/assets/flowDiagram-NV44I4VS-HAAlzNbq.js +162 -0
- package/public/assets/ganttDiagram-LVOFAZNH-BqzWexqa.js +267 -0
- package/public/assets/gitGraphDiagram-NY62KEGX-CIPmSp43.js +65 -0
- package/public/assets/graph-m515btDj.js +1 -0
- package/public/assets/index-Bn3v3S9-.js +293 -0
- package/public/assets/index-DWieeYj4.css +1 -0
- package/public/assets/infoDiagram-F6ZHWCRC-Pn4yNWrF.js +2 -0
- package/public/assets/init-Gi6I4Gst.js +1 -0
- package/public/assets/journeyDiagram-XKPGCS4Q-BfzTomS0.js +139 -0
- package/public/assets/kanban-definition-3W4ZIXB7-Cgju7b-L.js +89 -0
- package/public/assets/katex-qrhCpa0F.js +261 -0
- package/public/assets/layout-BKQfQSxJ.js +1 -0
- package/public/assets/linear-DigtLz3B.js +1 -0
- package/public/assets/mindmap-definition-VGOIOE7T-qopraVFy.js +68 -0
- package/public/assets/monaco-editor-DHKm5-VF.js +19 -0
- package/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/public/assets/pieDiagram-ADFJNKIX-BcoaAI-L.js +30 -0
- package/public/assets/quadrantDiagram-AYHSOK5B-D-DwcoSd.js +7 -0
- package/public/assets/requirementDiagram-UZGBJVZJ-DbQCpx77.js +64 -0
- package/public/assets/sankeyDiagram-TZEHDZUN-BVk8387S.js +10 -0
- package/public/assets/sequenceDiagram-WL72ISMW-BdzICjxO.js +145 -0
- package/public/assets/stateDiagram-FKZM4ZOC-CYY-uUvJ.js +1 -0
- package/public/assets/stateDiagram-v2-4FDKWEC3-Dh2Kvomq.js +1 -0
- package/{backend/dist/frontend/assets/syntax-highlighting-YWvMU4Hm.js → public/assets/syntax-highlighting-CnREyncB.js} +5 -5
- package/public/assets/tabManager-B2LQO_Ll.js +30 -0
- package/{backend/dist/frontend/assets/table-D6q1rytw.js → public/assets/table-D0L2RL5i.js} +1 -1
- package/public/assets/timeline-definition-IT6M3QCI-BAvjPYvX.js +61 -0
- package/public/assets/tools-IcPNZlPj.js +1 -0
- package/public/assets/treemap-KMMF4GRG-DtkpVA56.js +128 -0
- package/{backend/dist/frontend/assets/ui-components-Cw21Epuw.js → public/assets/ui-components-D1St49qC.js} +231 -96
- package/public/assets/useAgents-BnDTkOG8.js +2 -0
- package/public/assets/useClaudeVersions-CD59tFWM.js +1 -0
- package/public/assets/useCommands-mvMu3mMD.js +1 -0
- package/public/assets/useProjects-YXOjaOwL.js +1 -0
- package/public/assets/xychartDiagram-PRI3JC2R-ByBTDWE2.js +7 -0
- package/{backend/dist/frontend → public}/index.html +8 -8
- package/routes/__tests__/a2a.integration.test.d.ts +11 -0
- package/routes/__tests__/a2a.integration.test.d.ts.map +1 -0
- package/routes/__tests__/a2a.integration.test.js +314 -0
- package/routes/__tests__/a2a.integration.test.js.map +1 -0
- package/routes/__tests__/a2a.test.d.ts +6 -0
- package/routes/__tests__/a2a.test.d.ts.map +1 -0
- package/routes/__tests__/a2a.test.js +622 -0
- package/routes/__tests__/a2a.test.js.map +1 -0
- package/routes/__tests__/agents.test.d.ts +6 -0
- package/routes/__tests__/agents.test.d.ts.map +1 -0
- package/routes/__tests__/agents.test.js +315 -0
- package/routes/__tests__/agents.test.js.map +1 -0
- package/routes/__tests__/sessions.test.d.ts +7 -0
- package/routes/__tests__/sessions.test.d.ts.map +1 -0
- package/routes/__tests__/sessions.test.js +330 -0
- package/routes/__tests__/sessions.test.js.map +1 -0
- package/routes/a2a.d.ts +18 -0
- package/routes/a2a.d.ts.map +1 -0
- package/routes/a2a.js +649 -0
- package/routes/a2a.js.map +1 -0
- package/routes/a2a.streaming.test.d.ts +2 -0
- package/routes/a2a.streaming.test.d.ts.map +1 -0
- package/routes/a2a.streaming.test.js +167 -0
- package/routes/a2a.streaming.test.js.map +1 -0
- package/routes/a2aManagement.d.ts +21 -0
- package/routes/a2aManagement.d.ts.map +1 -0
- package/routes/a2aManagement.js +466 -0
- package/routes/a2aManagement.js.map +1 -0
- package/{backend/dist/routes → routes}/agents.d.ts.map +1 -1
- package/routes/agents.js +997 -0
- package/routes/agents.js.map +1 -0
- package/{backend/dist/routes → routes}/auth.d.ts.map +1 -1
- package/routes/auth.js +135 -0
- package/routes/auth.js.map +1 -0
- package/{backend/dist/routes → routes}/commands.d.ts.map +1 -1
- package/{backend/dist/routes → routes}/commands.js +115 -31
- package/routes/commands.js.map +1 -0
- package/routes/config.d.ts +4 -0
- package/routes/config.d.ts.map +1 -0
- package/routes/config.js +211 -0
- package/routes/config.js.map +1 -0
- package/{backend/dist/routes → routes}/files.d.ts.map +1 -1
- package/{backend/dist/routes → routes}/files.js +103 -43
- package/routes/files.js.map +1 -0
- package/routes/mcp.d.ts +27 -0
- package/routes/mcp.d.ts.map +1 -0
- package/{backend/dist/routes → routes}/mcp.js +195 -105
- package/routes/mcp.js.map +1 -0
- package/routes/mcpAdmin.d.ts +16 -0
- package/routes/mcpAdmin.d.ts.map +1 -0
- package/routes/mcpAdmin.js +308 -0
- package/routes/mcpAdmin.js.map +1 -0
- package/routes/mcpAdminManagement.d.ts +17 -0
- package/routes/mcpAdminManagement.d.ts.map +1 -0
- package/routes/mcpAdminManagement.js +345 -0
- package/routes/mcpAdminManagement.js.map +1 -0
- package/routes/media.d.ts.map +1 -0
- package/{backend/dist/routes → routes}/media.js +52 -42
- package/routes/media.js.map +1 -0
- package/routes/mediaAuth.d.ts +8 -0
- package/routes/mediaAuth.d.ts.map +1 -0
- package/routes/mediaAuth.js +136 -0
- package/routes/mediaAuth.js.map +1 -0
- package/routes/plugins.d.ts +4 -0
- package/routes/plugins.d.ts.map +1 -0
- package/routes/plugins.js +339 -0
- package/routes/plugins.js.map +1 -0
- package/{backend/dist/routes → routes}/projects.d.ts.map +1 -1
- package/routes/projects.js +884 -0
- package/routes/projects.js.map +1 -0
- package/routes/scheduledTasks.d.ts +9 -0
- package/routes/scheduledTasks.d.ts.map +1 -0
- package/routes/scheduledTasks.js +320 -0
- package/routes/scheduledTasks.js.map +1 -0
- package/{backend/dist/routes → routes}/sessions.d.ts.map +1 -1
- package/{backend/dist/routes → routes}/sessions.js +258 -39
- package/routes/sessions.js.map +1 -0
- package/{backend/dist/routes → routes}/settings.d.ts.map +1 -1
- package/{backend/dist/routes → routes}/settings.js +82 -241
- package/routes/settings.js.map +1 -0
- package/{backend/dist/routes/mcp.d.ts → routes/skills.d.ts} +1 -1
- package/routes/skills.d.ts.map +1 -0
- package/routes/skills.js +272 -0
- package/routes/skills.js.map +1 -0
- package/routes/slack.d.ts +10 -0
- package/routes/slack.d.ts.map +1 -0
- package/routes/slack.js +189 -0
- package/routes/slack.js.map +1 -0
- package/{backend/dist/routes → routes}/slides.d.ts.map +1 -1
- package/{backend/dist/routes → routes}/slides.js +29 -27
- package/routes/slides.js.map +1 -0
- package/{backend/dist/routes → routes}/subagents.js +27 -22
- package/routes/subagents.js.map +1 -0
- package/schemas/a2a.d.ts +858 -0
- package/schemas/a2a.d.ts.map +1 -0
- package/schemas/a2a.js +300 -0
- package/schemas/a2a.js.map +1 -0
- package/scripts/postinstall.js +10 -0
- package/services/__tests__/pluginInstaller.test.d.ts +5 -0
- package/services/__tests__/pluginInstaller.test.d.ts.map +1 -0
- package/services/__tests__/pluginInstaller.test.js +290 -0
- package/services/__tests__/pluginInstaller.test.js.map +1 -0
- package/services/__tests__/pluginParser.test.d.ts +5 -0
- package/services/__tests__/pluginParser.test.d.ts.map +1 -0
- package/services/__tests__/pluginParser.test.js +272 -0
- package/services/__tests__/pluginParser.test.js.map +1 -0
- package/services/__tests__/pluginPaths.test.d.ts +5 -0
- package/services/__tests__/pluginPaths.test.d.ts.map +1 -0
- package/services/__tests__/pluginPaths.test.js +221 -0
- package/services/__tests__/pluginPaths.test.js.map +1 -0
- package/services/__tests__/pluginScanner.test.d.ts +5 -0
- package/services/__tests__/pluginScanner.test.d.ts.map +1 -0
- package/services/__tests__/pluginScanner.test.js +272 -0
- package/services/__tests__/pluginScanner.test.js.map +1 -0
- package/services/__tests__/pluginSymlink.test.d.ts +5 -0
- package/services/__tests__/pluginSymlink.test.d.ts.map +1 -0
- package/services/__tests__/pluginSymlink.test.js +318 -0
- package/services/__tests__/pluginSymlink.test.js.map +1 -0
- package/services/__tests__/slackAIService.test.d.ts +5 -0
- package/services/__tests__/slackAIService.test.d.ts.map +1 -0
- package/services/__tests__/slackAIService.test.js +477 -0
- package/services/__tests__/slackAIService.test.js.map +1 -0
- package/services/__tests__/slackThreadMapper.test.d.ts +5 -0
- package/services/__tests__/slackThreadMapper.test.d.ts.map +1 -0
- package/services/__tests__/slackThreadMapper.test.js +194 -0
- package/services/__tests__/slackThreadMapper.test.js.map +1 -0
- package/services/a2a/__tests__/a2aClientTool.integration.test.d.ts +6 -0
- package/services/a2a/__tests__/a2aClientTool.integration.test.d.ts.map +1 -0
- package/services/a2a/__tests__/a2aClientTool.integration.test.js +264 -0
- package/services/a2a/__tests__/a2aClientTool.integration.test.js.map +1 -0
- package/services/a2a/__tests__/a2aClientTool.test.d.ts +6 -0
- package/services/a2a/__tests__/a2aClientTool.test.d.ts.map +1 -0
- package/services/a2a/__tests__/a2aClientTool.test.js +418 -0
- package/services/a2a/__tests__/a2aClientTool.test.js.map +1 -0
- package/services/a2a/__tests__/a2aConfigService.test.d.ts +6 -0
- package/services/a2a/__tests__/a2aConfigService.test.d.ts.map +1 -0
- package/services/a2a/__tests__/a2aConfigService.test.js +431 -0
- package/services/a2a/__tests__/a2aConfigService.test.js.map +1 -0
- package/services/a2a/__tests__/a2aConfigServicePath.test.d.ts +2 -0
- package/services/a2a/__tests__/a2aConfigServicePath.test.d.ts.map +1 -0
- package/services/a2a/__tests__/a2aConfigServicePath.test.js +49 -0
- package/services/a2a/__tests__/a2aConfigServicePath.test.js.map +1 -0
- package/services/a2a/__tests__/a2aSdkMcp.test.d.ts +10 -0
- package/services/a2a/__tests__/a2aSdkMcp.test.d.ts.map +1 -0
- package/services/a2a/__tests__/a2aSdkMcp.test.js +239 -0
- package/services/a2a/__tests__/a2aSdkMcp.test.js.map +1 -0
- package/services/a2a/__tests__/agentCardService.test.d.ts +6 -0
- package/services/a2a/__tests__/agentCardService.test.d.ts.map +1 -0
- package/services/a2a/__tests__/agentCardService.test.js +292 -0
- package/services/a2a/__tests__/agentCardService.test.js.map +1 -0
- package/services/a2a/__tests__/apiKeyService.test.d.ts +6 -0
- package/services/a2a/__tests__/apiKeyService.test.d.ts.map +1 -0
- package/services/a2a/__tests__/apiKeyService.test.js +284 -0
- package/services/a2a/__tests__/apiKeyService.test.js.map +1 -0
- package/services/a2a/__tests__/buildQueryOptionsIntegration.test.d.ts +2 -0
- package/services/a2a/__tests__/buildQueryOptionsIntegration.test.d.ts.map +1 -0
- package/services/a2a/__tests__/buildQueryOptionsIntegration.test.js +70 -0
- package/services/a2a/__tests__/buildQueryOptionsIntegration.test.js.map +1 -0
- package/services/a2a/__tests__/dynamic_config_verification.test.d.ts +2 -0
- package/services/a2a/__tests__/dynamic_config_verification.test.d.ts.map +1 -0
- package/services/a2a/__tests__/dynamic_config_verification.test.js +67 -0
- package/services/a2a/__tests__/dynamic_config_verification.test.js.map +1 -0
- package/services/a2a/__tests__/integrateA2AMcpServer.test.d.ts +2 -0
- package/services/a2a/__tests__/integrateA2AMcpServer.test.d.ts.map +1 -0
- package/services/a2a/__tests__/integrateA2AMcpServer.test.js +112 -0
- package/services/a2a/__tests__/integrateA2AMcpServer.test.js.map +1 -0
- package/services/a2a/__tests__/taskManager.integration.test.d.ts +7 -0
- package/services/a2a/__tests__/taskManager.integration.test.d.ts.map +1 -0
- package/services/a2a/__tests__/taskManager.integration.test.js +346 -0
- package/services/a2a/__tests__/taskManager.integration.test.js.map +1 -0
- package/services/a2a/__tests__/taskManager.test.d.ts +7 -0
- package/services/a2a/__tests__/taskManager.test.d.ts.map +1 -0
- package/services/a2a/__tests__/taskManager.test.js +423 -0
- package/services/a2a/__tests__/taskManager.test.js.map +1 -0
- package/services/a2a/a2aClientTool.d.ts +73 -0
- package/services/a2a/a2aClientTool.d.ts.map +1 -0
- package/services/a2a/a2aClientTool.js +572 -0
- package/services/a2a/a2aClientTool.js.map +1 -0
- package/services/a2a/a2aConfigService.d.ts +50 -0
- package/services/a2a/a2aConfigService.d.ts.map +1 -0
- package/services/a2a/a2aConfigService.js +186 -0
- package/services/a2a/a2aConfigService.js.map +1 -0
- package/services/a2a/a2aHistoryService.d.ts +32 -0
- package/services/a2a/a2aHistoryService.d.ts.map +1 -0
- package/services/a2a/a2aHistoryService.js +108 -0
- package/services/a2a/a2aHistoryService.js.map +1 -0
- package/services/a2a/a2aIntegration.d.ts +9 -0
- package/services/a2a/a2aIntegration.d.ts.map +1 -0
- package/services/a2a/a2aIntegration.js +41 -0
- package/services/a2a/a2aIntegration.js.map +1 -0
- package/services/a2a/a2aQueryService.d.ts +71 -0
- package/services/a2a/a2aQueryService.d.ts.map +1 -0
- package/services/a2a/a2aQueryService.js +166 -0
- package/services/a2a/a2aQueryService.js.map +1 -0
- package/services/a2a/a2aSdkMcp.d.ts +51 -0
- package/services/a2a/a2aSdkMcp.d.ts.map +1 -0
- package/services/a2a/a2aSdkMcp.js +185 -0
- package/services/a2a/a2aSdkMcp.js.map +1 -0
- package/services/a2a/a2aStreamEvents.d.ts +94 -0
- package/services/a2a/a2aStreamEvents.d.ts.map +1 -0
- package/services/a2a/a2aStreamEvents.js +92 -0
- package/services/a2a/a2aStreamEvents.js.map +1 -0
- package/services/a2a/agentCardService.d.ts +34 -0
- package/services/a2a/agentCardService.d.ts.map +1 -0
- package/services/a2a/agentCardService.js +228 -0
- package/services/a2a/agentCardService.js.map +1 -0
- package/services/a2a/agentMappingService.d.ts +53 -0
- package/services/a2a/agentMappingService.d.ts.map +1 -0
- package/services/a2a/agentMappingService.js +185 -0
- package/services/a2a/agentMappingService.js.map +1 -0
- package/services/a2a/apiKeyService.d.ts +101 -0
- package/services/a2a/apiKeyService.d.ts.map +1 -0
- package/services/a2a/apiKeyService.js +314 -0
- package/services/a2a/apiKeyService.js.map +1 -0
- package/services/a2a/taskCleanup.d.ts +30 -0
- package/services/a2a/taskCleanup.d.ts.map +1 -0
- package/services/a2a/taskCleanup.js +184 -0
- package/services/a2a/taskCleanup.js.map +1 -0
- package/services/a2a/taskManager.d.ts +86 -0
- package/services/a2a/taskManager.d.ts.map +1 -0
- package/services/a2a/taskManager.js +263 -0
- package/services/a2a/taskManager.js.map +1 -0
- package/services/agentStorage.d.ts +27 -0
- package/services/agentStorage.d.ts.map +1 -0
- package/services/agentStorage.js +487 -0
- package/services/agentStorage.js.map +1 -0
- package/services/askUserQuestion/askUserQuestionIntegration.d.ts +24 -0
- package/services/askUserQuestion/askUserQuestionIntegration.d.ts.map +1 -0
- package/services/askUserQuestion/askUserQuestionIntegration.js +52 -0
- package/services/askUserQuestion/askUserQuestionIntegration.js.map +1 -0
- package/services/askUserQuestion/askUserQuestionMcp.d.ts +103 -0
- package/services/askUserQuestion/askUserQuestionMcp.d.ts.map +1 -0
- package/services/askUserQuestion/askUserQuestionMcp.js +129 -0
- package/services/askUserQuestion/askUserQuestionMcp.js.map +1 -0
- package/services/askUserQuestion/index.d.ts +13 -0
- package/services/askUserQuestion/index.d.ts.map +1 -0
- package/services/askUserQuestion/index.js +35 -0
- package/services/askUserQuestion/index.js.map +1 -0
- package/services/askUserQuestion/init.d.ts +17 -0
- package/services/askUserQuestion/init.d.ts.map +1 -0
- package/services/askUserQuestion/init.js +47 -0
- package/services/askUserQuestion/init.js.map +1 -0
- package/services/askUserQuestion/notificationChannel.d.ts +97 -0
- package/services/askUserQuestion/notificationChannel.d.ts.map +1 -0
- package/services/askUserQuestion/notificationChannel.js +147 -0
- package/services/askUserQuestion/notificationChannel.js.map +1 -0
- package/services/askUserQuestion/slackNotificationChannel.d.ts +35 -0
- package/services/askUserQuestion/slackNotificationChannel.d.ts.map +1 -0
- package/services/askUserQuestion/slackNotificationChannel.js +129 -0
- package/services/askUserQuestion/slackNotificationChannel.js.map +1 -0
- package/services/askUserQuestion/sseNotificationChannel.d.ts +36 -0
- package/services/askUserQuestion/sseNotificationChannel.d.ts.map +1 -0
- package/services/askUserQuestion/sseNotificationChannel.js +88 -0
- package/services/askUserQuestion/sseNotificationChannel.js.map +1 -0
- package/services/askUserQuestion/userInputRegistry.d.ts +107 -0
- package/services/askUserQuestion/userInputRegistry.d.ts.map +1 -0
- package/services/askUserQuestion/userInputRegistry.js +253 -0
- package/services/askUserQuestion/userInputRegistry.js.map +1 -0
- package/{backend/dist/services → services}/claudeSession.d.ts +20 -5
- package/services/claudeSession.d.ts.map +1 -0
- package/{backend/dist/services → services}/claudeSession.js +123 -41
- package/services/claudeSession.js.map +1 -0
- package/services/claudeVersionStorage.d.ts +20 -0
- package/services/claudeVersionStorage.d.ts.map +1 -0
- package/services/claudeVersionStorage.js +331 -0
- package/services/claudeVersionStorage.js.map +1 -0
- package/services/mcpAdmin/__tests__/adminApiKeyService.test.d.ts +5 -0
- package/services/mcpAdmin/__tests__/adminApiKeyService.test.d.ts.map +1 -0
- package/services/mcpAdmin/__tests__/adminApiKeyService.test.js +289 -0
- package/services/mcpAdmin/__tests__/adminApiKeyService.test.js.map +1 -0
- package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.d.ts +5 -0
- package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.d.ts.map +1 -0
- package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.js +345 -0
- package/services/mcpAdmin/__tests__/mcpAdminRoutes.test.js.map +1 -0
- package/services/mcpAdmin/__tests__/mcpAdminServer.test.d.ts +5 -0
- package/services/mcpAdmin/__tests__/mcpAdminServer.test.d.ts.map +1 -0
- package/services/mcpAdmin/__tests__/mcpAdminServer.test.js +453 -0
- package/services/mcpAdmin/__tests__/mcpAdminServer.test.js.map +1 -0
- package/services/mcpAdmin/__tests__/tools.test.d.ts +5 -0
- package/services/mcpAdmin/__tests__/tools.test.d.ts.map +1 -0
- package/services/mcpAdmin/__tests__/tools.test.js +371 -0
- package/services/mcpAdmin/__tests__/tools.test.js.map +1 -0
- package/services/mcpAdmin/adminApiKeyService.d.ts +61 -0
- package/services/mcpAdmin/adminApiKeyService.d.ts.map +1 -0
- package/services/mcpAdmin/adminApiKeyService.js +270 -0
- package/services/mcpAdmin/adminApiKeyService.js.map +1 -0
- package/services/mcpAdmin/index.d.ts +10 -0
- package/services/mcpAdmin/index.d.ts.map +1 -0
- package/services/mcpAdmin/index.js +43 -0
- package/services/mcpAdmin/index.js.map +1 -0
- package/services/mcpAdmin/mcpAdminServer.d.ts +76 -0
- package/services/mcpAdmin/mcpAdminServer.d.ts.map +1 -0
- package/services/mcpAdmin/mcpAdminServer.js +243 -0
- package/services/mcpAdmin/mcpAdminServer.js.map +1 -0
- package/services/mcpAdmin/tools/agentTools.d.ts +27 -0
- package/services/mcpAdmin/tools/agentTools.d.ts.map +1 -0
- package/services/mcpAdmin/tools/agentTools.js +359 -0
- package/services/mcpAdmin/tools/agentTools.js.map +1 -0
- package/services/mcpAdmin/tools/index.d.ts +15 -0
- package/services/mcpAdmin/tools/index.d.ts.map +1 -0
- package/services/mcpAdmin/tools/index.js +30 -0
- package/services/mcpAdmin/tools/index.js.map +1 -0
- package/services/mcpAdmin/tools/mcpServerTools.d.ts +27 -0
- package/services/mcpAdmin/tools/mcpServerTools.d.ts.map +1 -0
- package/services/mcpAdmin/tools/mcpServerTools.js +334 -0
- package/services/mcpAdmin/tools/mcpServerTools.js.map +1 -0
- package/services/mcpAdmin/tools/projectTools.d.ts +27 -0
- package/services/mcpAdmin/tools/projectTools.d.ts.map +1 -0
- package/services/mcpAdmin/tools/projectTools.js +353 -0
- package/services/mcpAdmin/tools/projectTools.js.map +1 -0
- package/services/mcpAdmin/tools/systemTools.d.ts +23 -0
- package/services/mcpAdmin/tools/systemTools.d.ts.map +1 -0
- package/services/mcpAdmin/tools/systemTools.js +241 -0
- package/services/mcpAdmin/tools/systemTools.js.map +1 -0
- package/services/mcpAdmin/types.d.ts +124 -0
- package/services/mcpAdmin/types.d.ts.map +1 -0
- package/services/mcpAdmin/types.js +18 -0
- package/services/mcpAdmin/types.js.map +1 -0
- package/{backend/dist/services → services}/messageQueue.d.ts.map +1 -1
- package/{backend/dist/services → services}/messageQueue.js +16 -3
- package/services/messageQueue.js.map +1 -0
- package/services/pluginInstaller.d.ts +58 -0
- package/services/pluginInstaller.d.ts.map +1 -0
- package/services/pluginInstaller.js +321 -0
- package/services/pluginInstaller.js.map +1 -0
- package/services/pluginParser.d.ts +45 -0
- package/services/pluginParser.d.ts.map +1 -0
- package/services/pluginParser.js +437 -0
- package/services/pluginParser.js.map +1 -0
- package/services/pluginPaths.d.ts +80 -0
- package/services/pluginPaths.d.ts.map +1 -0
- package/services/pluginPaths.js +274 -0
- package/services/pluginPaths.js.map +1 -0
- package/services/pluginScanner.d.ts +36 -0
- package/services/pluginScanner.d.ts.map +1 -0
- package/services/pluginScanner.js +251 -0
- package/services/pluginScanner.js.map +1 -0
- package/services/pluginSymlink.d.ts +54 -0
- package/services/pluginSymlink.d.ts.map +1 -0
- package/services/pluginSymlink.js +223 -0
- package/services/pluginSymlink.js.map +1 -0
- package/services/projectMetadataStorage.d.ts +114 -0
- package/services/projectMetadataStorage.d.ts.map +1 -0
- package/services/projectMetadataStorage.js +711 -0
- package/services/projectMetadataStorage.js.map +1 -0
- package/services/scheduledTaskStorage.d.ts +52 -0
- package/services/scheduledTaskStorage.d.ts.map +1 -0
- package/services/scheduledTaskStorage.js +285 -0
- package/services/scheduledTaskStorage.js.map +1 -0
- package/services/schedulerService.d.ts +81 -0
- package/services/schedulerService.d.ts.map +1 -0
- package/services/schedulerService.js +743 -0
- package/services/schedulerService.js.map +1 -0
- package/{backend/dist/services → services}/sessionManager.d.ts +6 -4
- package/services/sessionManager.d.ts.map +1 -0
- package/{backend/dist/services → services}/sessionManager.js +77 -16
- package/services/sessionManager.js.map +1 -0
- package/services/skillStorage.d.ts +60 -0
- package/services/skillStorage.d.ts.map +1 -0
- package/services/skillStorage.js +398 -0
- package/services/skillStorage.js.map +1 -0
- package/services/slackAIService.d.ts +81 -0
- package/services/slackAIService.d.ts.map +1 -0
- package/services/slackAIService.js +1091 -0
- package/services/slackAIService.js.map +1 -0
- package/services/slackClient.d.ts +46 -0
- package/services/slackClient.d.ts.map +1 -0
- package/services/slackClient.js +85 -0
- package/services/slackClient.js.map +1 -0
- package/services/slackSessionLock.d.ts +79 -0
- package/services/slackSessionLock.d.ts.map +1 -0
- package/services/slackSessionLock.js +353 -0
- package/services/slackSessionLock.js.map +1 -0
- package/services/slackThreadMapper.d.ts +57 -0
- package/services/slackThreadMapper.d.ts.map +1 -0
- package/services/slackThreadMapper.js +140 -0
- package/services/slackThreadMapper.js.map +1 -0
- package/types/a2a.d.ts +275 -0
- package/types/a2a.d.ts.map +1 -0
- package/types/a2a.js +23 -0
- package/types/a2a.js.map +1 -0
- package/types/agents.d.ts +95 -0
- package/types/agents.d.ts.map +1 -0
- package/types/agents.js +46 -0
- package/types/agents.js.map +1 -0
- package/types/claude-history.d.ts +62 -0
- package/types/claude-history.d.ts.map +1 -0
- package/types/claude-history.js +4 -0
- package/types/claude-history.js.map +1 -0
- package/types/claude-versions.d.ts +36 -0
- package/types/claude-versions.d.ts.map +1 -0
- package/types/claude-versions.js +3 -0
- package/types/claude-versions.js.map +1 -0
- package/types/commands.d.ts +50 -0
- package/types/commands.d.ts.map +1 -0
- package/types/commands.js +23 -0
- package/types/commands.js.map +1 -0
- package/types/plugins.d.ts +144 -0
- package/types/plugins.d.ts.map +1 -0
- package/types/plugins.js +8 -0
- package/types/plugins.js.map +1 -0
- package/types/projects.d.ts +42 -0
- package/types/projects.d.ts.map +1 -0
- package/types/projects.js +4 -0
- package/types/projects.js.map +1 -0
- package/types/scheduledTasks.d.ts +164 -0
- package/types/scheduledTasks.d.ts.map +1 -0
- package/types/scheduledTasks.js +17 -0
- package/types/scheduledTasks.js.map +1 -0
- package/types/skills.d.ts +91 -0
- package/types/skills.d.ts.map +1 -0
- package/types/skills.js +6 -0
- package/types/skills.js.map +1 -0
- package/types/slack.d.ts +97 -0
- package/types/slack.d.ts.map +1 -0
- package/types/slack.js +8 -0
- package/types/slack.js.map +1 -0
- package/types/streaming.d.ts +12 -0
- package/types/streaming.d.ts.map +1 -0
- package/types/streaming.js +8 -0
- package/types/streaming.js.map +1 -0
- package/types/subagents.d.ts +26 -0
- package/types/subagents.d.ts.map +1 -0
- package/types/subagents.js +3 -0
- package/types/subagents.js.map +1 -0
- package/utils/__tests__/claudeUtils.test.d.ts +5 -0
- package/utils/__tests__/claudeUtils.test.d.ts.map +1 -0
- package/utils/__tests__/claudeUtils.test.js +282 -0
- package/utils/__tests__/claudeUtils.test.js.map +1 -0
- package/utils/__tests__/sessionUtils.test.d.ts +5 -0
- package/utils/__tests__/sessionUtils.test.d.ts.map +1 -0
- package/utils/__tests__/sessionUtils.test.js +295 -0
- package/utils/__tests__/sessionUtils.test.js.map +1 -0
- package/utils/agentCardCache.d.ts +93 -0
- package/utils/agentCardCache.d.ts.map +1 -0
- package/utils/agentCardCache.js +212 -0
- package/utils/agentCardCache.js.map +1 -0
- package/utils/claudeUtils.d.ts +54 -0
- package/utils/claudeUtils.d.ts.map +1 -0
- package/utils/claudeUtils.js +387 -0
- package/utils/claudeUtils.js.map +1 -0
- package/utils/fileUtils.d.ts +2 -0
- package/utils/fileUtils.d.ts.map +1 -0
- package/utils/fileUtils.js +11 -0
- package/utils/fileUtils.js.map +1 -0
- package/utils/jwt.d.ts +30 -0
- package/utils/jwt.d.ts.map +1 -0
- package/utils/jwt.js +95 -0
- package/utils/jwt.js.map +1 -0
- package/utils/sessionUtils.d.ts +64 -0
- package/utils/sessionUtils.d.ts.map +1 -0
- package/utils/sessionUtils.js +266 -0
- package/utils/sessionUtils.js.map +1 -0
- package/README.zh-CN.md +0 -525
- package/backend/dist/bin/agentstudio.js +0 -120
- package/backend/dist/bin/agentstudio.js.map +0 -1
- package/backend/dist/frontend/assets/AgentsPage-Dqb_aqAA.js +0 -1
- package/backend/dist/frontend/assets/ChatPage-L8Paywyc.js +0 -91
- package/backend/dist/frontend/assets/CommandForm-DLl7EIMS.js +0 -7
- package/backend/dist/frontend/assets/CommandsPage-Bzavq0Ec.js +0 -1
- package/backend/dist/frontend/assets/DashboardPage-B3o4AYFT.js +0 -15
- package/backend/dist/frontend/assets/FileBrowser-DL3ayaqb.js +0 -1
- package/backend/dist/frontend/assets/GeneralSettingsPage-CBN_de-V.js +0 -1
- package/backend/dist/frontend/assets/LandingPage-Dl4ioKos.js +0 -1
- package/backend/dist/frontend/assets/LoginPage-4QqRdiSi.js +0 -12
- package/backend/dist/frontend/assets/McpPage-CY3tYiqj.js +0 -39
- package/backend/dist/frontend/assets/MemorySettingsPage-DGxrok5K.js +0 -1
- package/backend/dist/frontend/assets/ProjectSelector-hgmGYVFh.js +0 -1
- package/backend/dist/frontend/assets/ProjectsPage-D399IM0c.js +0 -14
- package/backend/dist/frontend/assets/SettingsLayout-CL_K-lzJ.js +0 -1
- package/backend/dist/frontend/assets/SubagentsPage-Chbhj8p2.js +0 -1
- package/backend/dist/frontend/assets/UnifiedToolSelector-CsM9qBvs.js +0 -1
- package/backend/dist/frontend/assets/VersionSettingsPage-74Q-LVgA.js +0 -5
- package/backend/dist/frontend/assets/agents-ClAzIJTw.js +0 -1
- package/backend/dist/frontend/assets/authFetch-BATQyPG5.js +0 -1
- package/backend/dist/frontend/assets/index-B9YHa7XT.css +0 -1
- package/backend/dist/frontend/assets/index-B_CTNvca.js +0 -268
- package/backend/dist/frontend/assets/monaco-editor-C7Z4sOhS.js +0 -19
- package/backend/dist/frontend/assets/tabManager-DV8urRBM.js +0 -30
- package/backend/dist/frontend/assets/tools-C4EPanYi.js +0 -1
- package/backend/dist/frontend/assets/useAgents-DwnOE1_k.js +0 -2
- package/backend/dist/frontend/assets/useClaudeVersions-CQdGnCqv.js +0 -1
- package/backend/dist/frontend/assets/useCommands-CCVaurbt.js +0 -1
- package/backend/dist/index.d.ts +0 -3
- package/backend/dist/index.d.ts.map +0 -1
- package/backend/dist/index.js +0 -157
- package/backend/dist/index.js.map +0 -1
- package/backend/dist/middleware/auth.d.ts.map +0 -1
- package/backend/dist/middleware/auth.js +0 -21
- package/backend/dist/middleware/auth.js.map +0 -1
- package/backend/dist/routes/agents.js +0 -803
- package/backend/dist/routes/agents.js.map +0 -1
- package/backend/dist/routes/auth.js +0 -60
- package/backend/dist/routes/auth.js.map +0 -1
- package/backend/dist/routes/commands.js.map +0 -1
- package/backend/dist/routes/files.js.map +0 -1
- package/backend/dist/routes/mcp.d.ts.map +0 -1
- package/backend/dist/routes/mcp.js.map +0 -1
- package/backend/dist/routes/media.d.ts.map +0 -1
- package/backend/dist/routes/media.js.map +0 -1
- package/backend/dist/routes/projects.js +0 -528
- package/backend/dist/routes/projects.js.map +0 -1
- package/backend/dist/routes/sessions.js.map +0 -1
- package/backend/dist/routes/settings.js.map +0 -1
- package/backend/dist/routes/slides.js.map +0 -1
- package/backend/dist/routes/subagents.js.map +0 -1
- package/backend/dist/services/claudeSession.d.ts.map +0 -1
- package/backend/dist/services/claudeSession.js.map +0 -1
- package/backend/dist/services/messageQueue.js.map +0 -1
- package/backend/dist/services/sessionManager.d.ts.map +0 -1
- package/backend/dist/services/sessionManager.js.map +0 -1
- package/backend/dist/utils/jwt.d.ts +0 -15
- package/backend/dist/utils/jwt.d.ts.map +0 -1
- package/backend/dist/utils/jwt.js +0 -28
- package/backend/dist/utils/jwt.js.map +0 -1
- /package/{backend/dist/bin → bin}/agentstudio.d.ts +0 -0
- /package/{backend/dist/bin → bin}/agentstudio.d.ts.map +0 -0
- /package/{backend/dist/frontend → public}/assets/ChatPage-BvQmXfcP.css +0 -0
- /package/{backend/dist/frontend → public}/assets/agents-DwCY2K8p.css +0 -0
- /package/{backend/dist/frontend → public}/assets/dateFormat-CXa8VnEC.js +0 -0
- /package/{backend/dist/frontend → public}/cc-studio.png +0 -0
- /package/{backend/dist/frontend → public}/vite.svg +0 -0
- /package/{backend/dist/routes → routes}/agents.d.ts +0 -0
- /package/{backend/dist/routes → routes}/auth.d.ts +0 -0
- /package/{backend/dist/routes → routes}/commands.d.ts +0 -0
- /package/{backend/dist/routes → routes}/files.d.ts +0 -0
- /package/{backend/dist/routes → routes}/media.d.ts +0 -0
- /package/{backend/dist/routes → routes}/projects.d.ts +0 -0
- /package/{backend/dist/routes → routes}/sessions.d.ts +0 -0
- /package/{backend/dist/routes → routes}/settings.d.ts +0 -0
- /package/{backend/dist/routes → routes}/slides.d.ts +0 -0
- /package/{backend/dist/routes → routes}/subagents.d.ts +0 -0
- /package/{backend/dist/routes → routes}/subagents.d.ts.map +0 -0
- /package/{backend/dist/services → services}/messageQueue.d.ts +0 -0
|
@@ -0,0 +1,743 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scheduler Service
|
|
4
|
+
*
|
|
5
|
+
* Manages scheduled task execution using cron-like scheduling.
|
|
6
|
+
* Supports both interval-based and cron expression-based scheduling.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Concurrent task execution with configurable limit
|
|
10
|
+
* - Automatic task recovery on startup
|
|
11
|
+
* - Execution history tracking
|
|
12
|
+
* - Integration with Agent execution
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.initializeScheduler = initializeScheduler;
|
|
52
|
+
exports.shutdownScheduler = shutdownScheduler;
|
|
53
|
+
exports.enableScheduler = enableScheduler;
|
|
54
|
+
exports.disableScheduler = disableScheduler;
|
|
55
|
+
exports.scheduleTask = scheduleTask;
|
|
56
|
+
exports.unscheduleTask = unscheduleTask;
|
|
57
|
+
exports.rescheduleTask = rescheduleTask;
|
|
58
|
+
exports.executeTask = executeTask;
|
|
59
|
+
exports.stopExecution = stopExecution;
|
|
60
|
+
exports.getRunningExecutions = getRunningExecutions;
|
|
61
|
+
exports.getSchedulerStatus = getSchedulerStatus;
|
|
62
|
+
exports.getActiveTaskIds = getActiveTaskIds;
|
|
63
|
+
const node_cron_1 = __importDefault(require("node-cron"));
|
|
64
|
+
const uuid_1 = require("uuid");
|
|
65
|
+
const claude_agent_sdk_1 = require("@anthropic-ai/claude-agent-sdk");
|
|
66
|
+
const scheduledTasks_js_1 = require("../types/scheduledTasks.js");
|
|
67
|
+
const scheduledTaskStorage_js_1 = require("./scheduledTaskStorage.js");
|
|
68
|
+
const agentStorage_js_1 = require("./agentStorage.js");
|
|
69
|
+
const claudeUtils_js_1 = require("../utils/claudeUtils.js");
|
|
70
|
+
// Scheduler enabled state (independent from initialization)
|
|
71
|
+
let schedulerEnabled = false;
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// Service State
|
|
74
|
+
// ============================================================================
|
|
75
|
+
let isInitialized = false;
|
|
76
|
+
let config = { ...scheduledTasks_js_1.DEFAULT_SCHEDULER_CONFIG };
|
|
77
|
+
const activeJobs = new Map();
|
|
78
|
+
let runningTaskCount = 0;
|
|
79
|
+
const agentStorage = new agentStorage_js_1.AgentStorage();
|
|
80
|
+
const runningExecutions = new Map();
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Orphaned Task Cleanup
|
|
83
|
+
// ============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Clean up orphaned "running" tasks from previous server runs
|
|
86
|
+
* When the server restarts, any tasks that were "running" are now orphaned
|
|
87
|
+
* since the actual execution is lost. Mark them as "error" with a clear message.
|
|
88
|
+
*/
|
|
89
|
+
function cleanupOrphanedRunningTasks() {
|
|
90
|
+
const tasks = (0, scheduledTaskStorage_js_1.loadScheduledTasks)();
|
|
91
|
+
let cleanedCount = 0;
|
|
92
|
+
for (const task of tasks) {
|
|
93
|
+
if (task.lastRunStatus === 'running') {
|
|
94
|
+
console.info(`[Scheduler] Cleaning up orphaned running task: ${task.id} (${task.name})`);
|
|
95
|
+
(0, scheduledTaskStorage_js_1.updateTaskRunStatus)(task.id, 'error', 'Server restarted while task was running');
|
|
96
|
+
cleanedCount++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (cleanedCount > 0) {
|
|
100
|
+
console.info(`[Scheduler] Cleaned up ${cleanedCount} orphaned running tasks`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Initialization
|
|
105
|
+
// ============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Initialize the scheduler service
|
|
108
|
+
* Loads all enabled tasks and schedules them
|
|
109
|
+
*/
|
|
110
|
+
function initializeScheduler(customConfig) {
|
|
111
|
+
if (isInitialized) {
|
|
112
|
+
console.warn('[Scheduler] Already initialized');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (customConfig) {
|
|
116
|
+
config = { ...config, ...customConfig };
|
|
117
|
+
}
|
|
118
|
+
console.info(`[Scheduler] Initializing with config: maxConcurrent=${config.maxConcurrent}`);
|
|
119
|
+
// Clean up orphaned "running" tasks from previous server runs
|
|
120
|
+
cleanupOrphanedRunningTasks();
|
|
121
|
+
// Load and schedule all enabled tasks
|
|
122
|
+
const tasks = (0, scheduledTaskStorage_js_1.loadScheduledTasks)();
|
|
123
|
+
const enabledTasks = tasks.filter(t => t.enabled);
|
|
124
|
+
console.info(`[Scheduler] Found ${enabledTasks.length} enabled tasks out of ${tasks.length} total`);
|
|
125
|
+
// Set initial enabled state based on config
|
|
126
|
+
const shouldEnable = customConfig?.enabled !== undefined ? customConfig.enabled : true;
|
|
127
|
+
if (shouldEnable) {
|
|
128
|
+
for (const task of enabledTasks) {
|
|
129
|
+
scheduleTask(task);
|
|
130
|
+
}
|
|
131
|
+
schedulerEnabled = true;
|
|
132
|
+
console.info('[Scheduler] Initialization complete - scheduler ENABLED');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
schedulerEnabled = false;
|
|
136
|
+
console.info('[Scheduler] Initialization complete - scheduler DISABLED (can be enabled via API)');
|
|
137
|
+
}
|
|
138
|
+
isInitialized = true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Shutdown the scheduler service
|
|
142
|
+
* Stops all scheduled jobs
|
|
143
|
+
*/
|
|
144
|
+
function shutdownScheduler() {
|
|
145
|
+
console.info('[Scheduler] Shutting down...');
|
|
146
|
+
for (const [taskId, activeJob] of activeJobs) {
|
|
147
|
+
if (activeJob.cronJob) {
|
|
148
|
+
activeJob.cronJob.stop();
|
|
149
|
+
}
|
|
150
|
+
if (activeJob.timeout) {
|
|
151
|
+
clearTimeout(activeJob.timeout);
|
|
152
|
+
}
|
|
153
|
+
console.debug(`[Scheduler] Stopped job for task: ${taskId}`);
|
|
154
|
+
}
|
|
155
|
+
activeJobs.clear();
|
|
156
|
+
isInitialized = false;
|
|
157
|
+
schedulerEnabled = false;
|
|
158
|
+
console.info('[Scheduler] Shutdown complete');
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Enable the scheduler (start executing scheduled tasks)
|
|
162
|
+
*/
|
|
163
|
+
function enableScheduler() {
|
|
164
|
+
if (!isInitialized) {
|
|
165
|
+
console.warn('[Scheduler] Cannot enable: scheduler not initialized');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (schedulerEnabled) {
|
|
169
|
+
console.warn('[Scheduler] Already enabled');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
console.info('[Scheduler] Enabling scheduler...');
|
|
173
|
+
// Re-schedule all enabled tasks
|
|
174
|
+
const tasks = (0, scheduledTaskStorage_js_1.loadScheduledTasks)();
|
|
175
|
+
const enabledTasks = tasks.filter(t => t.enabled);
|
|
176
|
+
for (const task of enabledTasks) {
|
|
177
|
+
if (!activeJobs.has(task.id)) {
|
|
178
|
+
scheduleTask(task);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
schedulerEnabled = true;
|
|
182
|
+
console.info('[Scheduler] Enabled');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Disable the scheduler (stop executing scheduled tasks)
|
|
186
|
+
*/
|
|
187
|
+
function disableScheduler() {
|
|
188
|
+
if (!schedulerEnabled) {
|
|
189
|
+
console.warn('[Scheduler] Already disabled');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
console.info('[Scheduler] Disabling scheduler...');
|
|
193
|
+
// Stop all scheduled jobs but keep them in memory
|
|
194
|
+
for (const [taskId, activeJob] of activeJobs) {
|
|
195
|
+
if (activeJob.cronJob) {
|
|
196
|
+
activeJob.cronJob.stop();
|
|
197
|
+
}
|
|
198
|
+
if (activeJob.timeout) {
|
|
199
|
+
clearTimeout(activeJob.timeout);
|
|
200
|
+
}
|
|
201
|
+
console.debug(`[Scheduler] Stopped job for task: ${taskId}`);
|
|
202
|
+
}
|
|
203
|
+
activeJobs.clear();
|
|
204
|
+
schedulerEnabled = false;
|
|
205
|
+
console.info('[Scheduler] Disabled');
|
|
206
|
+
}
|
|
207
|
+
// ============================================================================
|
|
208
|
+
// Task Scheduling
|
|
209
|
+
// ============================================================================
|
|
210
|
+
/**
|
|
211
|
+
* Schedule a task for execution
|
|
212
|
+
*/
|
|
213
|
+
function scheduleTask(task) {
|
|
214
|
+
// Stop existing job if any
|
|
215
|
+
if (activeJobs.has(task.id)) {
|
|
216
|
+
unscheduleTask(task.id);
|
|
217
|
+
}
|
|
218
|
+
if (!task.enabled) {
|
|
219
|
+
console.debug(`[Scheduler] Task ${task.id} is disabled, not scheduling`);
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
// Handle one-time execution
|
|
224
|
+
if (task.schedule.type === 'once' && task.schedule.executeAt) {
|
|
225
|
+
return scheduleOnceTask(task);
|
|
226
|
+
}
|
|
227
|
+
const cronExpression = getCronExpression(task);
|
|
228
|
+
if (!cronExpression || !node_cron_1.default.validate(cronExpression)) {
|
|
229
|
+
console.error(`[Scheduler] Invalid cron expression for task ${task.id}: ${cronExpression}`);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
const cronJob = node_cron_1.default.schedule(cronExpression, () => {
|
|
233
|
+
executeTask(task.id).catch(error => {
|
|
234
|
+
console.error(`[Scheduler] Error executing task ${task.id}:`, error);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
activeJobs.set(task.id, { task, cronJob });
|
|
238
|
+
// Calculate and update next run time
|
|
239
|
+
const nextRunAt = getNextRunTime(cronExpression);
|
|
240
|
+
(0, scheduledTaskStorage_js_1.updateTaskNextRunAt)(task.id, nextRunAt);
|
|
241
|
+
console.info(`[Scheduler] Scheduled task ${task.id} (${task.name}) with cron: ${cronExpression}`);
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error(`[Scheduler] Failed to schedule task ${task.id}:`, error);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Schedule a one-time task execution
|
|
251
|
+
*/
|
|
252
|
+
function scheduleOnceTask(task) {
|
|
253
|
+
const executeAt = task.schedule.executeAt;
|
|
254
|
+
if (!executeAt) {
|
|
255
|
+
console.error(`[Scheduler] No executeAt time for once task ${task.id}`);
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
const executeTime = new Date(executeAt).getTime();
|
|
259
|
+
const now = Date.now();
|
|
260
|
+
const delay = executeTime - now;
|
|
261
|
+
if (delay <= 0) {
|
|
262
|
+
console.warn(`[Scheduler] Task ${task.id} executeAt time is in the past, skipping`);
|
|
263
|
+
// Disable the task since it's already past
|
|
264
|
+
Promise.resolve().then(() => __importStar(require('./scheduledTaskStorage.js'))).then(storage => {
|
|
265
|
+
storage.updateScheduledTask(task.id, { enabled: false });
|
|
266
|
+
});
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
// Maximum delay for setTimeout is ~24.8 days (2^31 - 1 ms)
|
|
270
|
+
const MAX_DELAY = 2147483647;
|
|
271
|
+
if (delay > MAX_DELAY) {
|
|
272
|
+
// Schedule a check for later
|
|
273
|
+
const checkDelay = MAX_DELAY;
|
|
274
|
+
console.info(`[Scheduler] Task ${task.id} executeAt is too far in future, will re-check later`);
|
|
275
|
+
const timeout = setTimeout(() => {
|
|
276
|
+
// Re-schedule when timer fires
|
|
277
|
+
const currentTask = (0, scheduledTaskStorage_js_1.getScheduledTask)(task.id);
|
|
278
|
+
if (currentTask && currentTask.enabled) {
|
|
279
|
+
scheduleOnceTask(currentTask);
|
|
280
|
+
}
|
|
281
|
+
}, checkDelay);
|
|
282
|
+
activeJobs.set(task.id, { task, timeout });
|
|
283
|
+
(0, scheduledTaskStorage_js_1.updateTaskNextRunAt)(task.id, executeAt);
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
// Schedule the execution
|
|
287
|
+
const timeout = setTimeout(async () => {
|
|
288
|
+
try {
|
|
289
|
+
await executeTask(task.id);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.error(`[Scheduler] Error executing one-time task ${task.id}:`, error);
|
|
293
|
+
}
|
|
294
|
+
// Disable the task after execution
|
|
295
|
+
Promise.resolve().then(() => __importStar(require('./scheduledTaskStorage.js'))).then(storage => {
|
|
296
|
+
storage.updateScheduledTask(task.id, { enabled: false });
|
|
297
|
+
console.info(`[Scheduler] One-time task ${task.id} executed and disabled`);
|
|
298
|
+
});
|
|
299
|
+
// Remove from active jobs
|
|
300
|
+
activeJobs.delete(task.id);
|
|
301
|
+
}, delay);
|
|
302
|
+
activeJobs.set(task.id, { task, timeout });
|
|
303
|
+
(0, scheduledTaskStorage_js_1.updateTaskNextRunAt)(task.id, executeAt);
|
|
304
|
+
const delayMinutes = Math.round(delay / 60000);
|
|
305
|
+
console.info(`[Scheduler] Scheduled one-time task ${task.id} (${task.name}) to execute at ${executeAt} (in ${delayMinutes} minutes)`);
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Unschedule a task
|
|
310
|
+
*/
|
|
311
|
+
function unscheduleTask(taskId) {
|
|
312
|
+
const activeJob = activeJobs.get(taskId);
|
|
313
|
+
if (activeJob) {
|
|
314
|
+
if (activeJob.cronJob) {
|
|
315
|
+
activeJob.cronJob.stop();
|
|
316
|
+
}
|
|
317
|
+
if (activeJob.timeout) {
|
|
318
|
+
clearTimeout(activeJob.timeout);
|
|
319
|
+
}
|
|
320
|
+
activeJobs.delete(taskId);
|
|
321
|
+
(0, scheduledTaskStorage_js_1.updateTaskNextRunAt)(taskId, undefined);
|
|
322
|
+
console.info(`[Scheduler] Unscheduled task: ${taskId}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Reschedule a task (after update)
|
|
327
|
+
*/
|
|
328
|
+
function rescheduleTask(taskId) {
|
|
329
|
+
const task = (0, scheduledTaskStorage_js_1.getScheduledTask)(taskId);
|
|
330
|
+
if (!task) {
|
|
331
|
+
console.warn(`[Scheduler] Task not found for reschedule: ${taskId}`);
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
return scheduleTask(task);
|
|
335
|
+
}
|
|
336
|
+
// ============================================================================
|
|
337
|
+
// Task Execution
|
|
338
|
+
// ============================================================================
|
|
339
|
+
/**
|
|
340
|
+
* Execute a scheduled task
|
|
341
|
+
*/
|
|
342
|
+
async function executeTask(taskId) {
|
|
343
|
+
const task = (0, scheduledTaskStorage_js_1.getScheduledTask)(taskId);
|
|
344
|
+
if (!task) {
|
|
345
|
+
console.error(`[Scheduler] Task not found: ${taskId}`);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
// Check concurrent limit
|
|
349
|
+
if (runningTaskCount >= config.maxConcurrent) {
|
|
350
|
+
console.warn(`[Scheduler] Concurrent limit reached (${config.maxConcurrent}), skipping task ${taskId}`);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
// Check if task is already running (prevent double execution)
|
|
354
|
+
if (task.lastRunStatus === 'running') {
|
|
355
|
+
console.warn(`[Scheduler] Task ${taskId} is already running, skipping`);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
const executionId = `exec_${(0, uuid_1.v4)().slice(0, 8)}`;
|
|
359
|
+
const startedAt = new Date().toISOString();
|
|
360
|
+
// Create AbortController for this execution
|
|
361
|
+
const abortController = new AbortController();
|
|
362
|
+
// Create execution record (include agentId and projectPath for "continue chat" functionality)
|
|
363
|
+
const execution = {
|
|
364
|
+
id: executionId,
|
|
365
|
+
taskId,
|
|
366
|
+
startedAt,
|
|
367
|
+
status: 'running',
|
|
368
|
+
agentId: task.agentId,
|
|
369
|
+
projectPath: task.projectPath,
|
|
370
|
+
};
|
|
371
|
+
(0, scheduledTaskStorage_js_1.addTaskExecution)(execution);
|
|
372
|
+
(0, scheduledTaskStorage_js_1.updateTaskRunStatus)(taskId, 'running');
|
|
373
|
+
runningTaskCount++;
|
|
374
|
+
// Track running execution
|
|
375
|
+
runningExecutions.set(executionId, {
|
|
376
|
+
taskId,
|
|
377
|
+
executionId,
|
|
378
|
+
abortController,
|
|
379
|
+
startedAt,
|
|
380
|
+
});
|
|
381
|
+
console.info(`[Scheduler] Executing task ${taskId} (${task.name}), execution: ${executionId}`);
|
|
382
|
+
try {
|
|
383
|
+
// Execute the agent with abort signal
|
|
384
|
+
const result = await executeAgentTask(task, abortController.signal);
|
|
385
|
+
// Update execution record with logs
|
|
386
|
+
(0, scheduledTaskStorage_js_1.updateTaskExecution)(taskId, executionId, {
|
|
387
|
+
status: 'success',
|
|
388
|
+
completedAt: new Date().toISOString(),
|
|
389
|
+
responseSummary: result.summary,
|
|
390
|
+
sessionId: result.sessionId,
|
|
391
|
+
logs: result.logs,
|
|
392
|
+
});
|
|
393
|
+
(0, scheduledTaskStorage_js_1.updateTaskRunStatus)(taskId, 'success');
|
|
394
|
+
console.info(`[Scheduler] Task ${taskId} completed successfully`);
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
398
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
399
|
+
// Try to get logs from the error context if available
|
|
400
|
+
const errorLogs = [
|
|
401
|
+
{
|
|
402
|
+
timestamp: new Date().toISOString(),
|
|
403
|
+
level: 'error',
|
|
404
|
+
type: 'system',
|
|
405
|
+
message: `Execution failed: ${errorMessage}`,
|
|
406
|
+
data: { stack: errorStack },
|
|
407
|
+
}
|
|
408
|
+
];
|
|
409
|
+
(0, scheduledTaskStorage_js_1.updateTaskExecution)(taskId, executionId, {
|
|
410
|
+
status: 'error',
|
|
411
|
+
completedAt: new Date().toISOString(),
|
|
412
|
+
error: errorMessage,
|
|
413
|
+
errorStack: errorStack,
|
|
414
|
+
logs: errorLogs,
|
|
415
|
+
});
|
|
416
|
+
(0, scheduledTaskStorage_js_1.updateTaskRunStatus)(taskId, 'error', errorMessage);
|
|
417
|
+
console.error(`[Scheduler] Task ${taskId} failed:`, error);
|
|
418
|
+
}
|
|
419
|
+
finally {
|
|
420
|
+
runningTaskCount--;
|
|
421
|
+
// Remove from running executions
|
|
422
|
+
runningExecutions.delete(executionId);
|
|
423
|
+
// Update next run time (only for recurring tasks)
|
|
424
|
+
if (task.schedule.type !== 'once') {
|
|
425
|
+
const cronExpression = getCronExpression(task);
|
|
426
|
+
if (cronExpression) {
|
|
427
|
+
const nextRunAt = getNextRunTime(cronExpression);
|
|
428
|
+
(0, scheduledTaskStorage_js_1.updateTaskNextRunAt)(taskId, nextRunAt);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Stop a running task execution
|
|
435
|
+
* @param executionId - The execution ID to stop
|
|
436
|
+
* @returns true if stopped successfully, false if not found or already completed
|
|
437
|
+
*/
|
|
438
|
+
function stopExecution(executionId) {
|
|
439
|
+
const execution = runningExecutions.get(executionId);
|
|
440
|
+
if (!execution) {
|
|
441
|
+
return { success: false, message: 'Execution not found or already completed' };
|
|
442
|
+
}
|
|
443
|
+
console.info(`[Scheduler] Stopping execution: ${executionId} (task: ${execution.taskId})`);
|
|
444
|
+
// Abort the execution
|
|
445
|
+
execution.abortController.abort();
|
|
446
|
+
// Update execution status
|
|
447
|
+
(0, scheduledTaskStorage_js_1.updateTaskExecution)(execution.taskId, executionId, {
|
|
448
|
+
status: 'stopped',
|
|
449
|
+
completedAt: new Date().toISOString(),
|
|
450
|
+
error: 'Execution stopped by user',
|
|
451
|
+
logs: [{
|
|
452
|
+
timestamp: new Date().toISOString(),
|
|
453
|
+
level: 'warn',
|
|
454
|
+
type: 'system',
|
|
455
|
+
message: 'Execution stopped by user',
|
|
456
|
+
}],
|
|
457
|
+
});
|
|
458
|
+
// Update task status
|
|
459
|
+
(0, scheduledTaskStorage_js_1.updateTaskRunStatus)(execution.taskId, 'stopped', 'Stopped by user');
|
|
460
|
+
// Remove from running executions
|
|
461
|
+
runningExecutions.delete(executionId);
|
|
462
|
+
runningTaskCount--;
|
|
463
|
+
console.info(`[Scheduler] Execution ${executionId} stopped successfully`);
|
|
464
|
+
return { success: true, message: 'Execution stopped successfully' };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Get list of currently running executions
|
|
468
|
+
*/
|
|
469
|
+
function getRunningExecutions() {
|
|
470
|
+
return Array.from(runningExecutions.values()).map(exec => ({
|
|
471
|
+
executionId: exec.executionId,
|
|
472
|
+
taskId: exec.taskId,
|
|
473
|
+
startedAt: exec.startedAt,
|
|
474
|
+
}));
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Extract MCP tools from agent's allowedTools configuration
|
|
478
|
+
* Follows the same logic as frontend's useToolSelector.ts
|
|
479
|
+
*/
|
|
480
|
+
function extractMcpToolsFromAgent(agent) {
|
|
481
|
+
const mcpTools = [];
|
|
482
|
+
if (!agent.allowedTools || !Array.isArray(agent.allowedTools)) {
|
|
483
|
+
return mcpTools;
|
|
484
|
+
}
|
|
485
|
+
for (const tool of agent.allowedTools) {
|
|
486
|
+
if (!tool.enabled)
|
|
487
|
+
continue;
|
|
488
|
+
const toolName = tool.name;
|
|
489
|
+
if (toolName.includes('.') && !toolName.startsWith('mcp__')) {
|
|
490
|
+
// MCP tool format: serverName.toolName -> mcp__serverName__toolName
|
|
491
|
+
const [serverName, ...toolNameParts] = toolName.split('.');
|
|
492
|
+
const mcpToolId = `mcp__${serverName}__${toolNameParts.join('.')}`;
|
|
493
|
+
mcpTools.push(mcpToolId);
|
|
494
|
+
}
|
|
495
|
+
else if (toolName.startsWith('mcp__')) {
|
|
496
|
+
// Already formatted MCP tool
|
|
497
|
+
mcpTools.push(toolName);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return mcpTools;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Execute agent task using Claude SDK
|
|
504
|
+
*/
|
|
505
|
+
async function executeAgentTask(task, abortSignal) {
|
|
506
|
+
const logs = [];
|
|
507
|
+
const addLog = (level, type, message, data) => {
|
|
508
|
+
logs.push({
|
|
509
|
+
timestamp: new Date().toISOString(),
|
|
510
|
+
level,
|
|
511
|
+
type,
|
|
512
|
+
message,
|
|
513
|
+
data,
|
|
514
|
+
});
|
|
515
|
+
};
|
|
516
|
+
// Get agent configuration
|
|
517
|
+
const agent = agentStorage.getAgent(task.agentId);
|
|
518
|
+
if (!agent) {
|
|
519
|
+
addLog('error', 'system', `Agent not found: ${task.agentId}`);
|
|
520
|
+
throw new Error(`Agent not found: ${task.agentId}`);
|
|
521
|
+
}
|
|
522
|
+
addLog('info', 'system', `Using agent: ${agent.name} (${agent.id})`);
|
|
523
|
+
addLog('info', 'system', `Working directory: ${task.projectPath}`);
|
|
524
|
+
addLog('info', 'system', `Trigger message: ${task.triggerMessage}`);
|
|
525
|
+
// Determine the model to use (override or agent default)
|
|
526
|
+
let modelToUse = agent.model || 'sonnet'; // Default to sonnet if not specified
|
|
527
|
+
addLog('info', 'system', `Agent default model: ${agent.model || '(not specified)'}`);
|
|
528
|
+
if (task.modelOverride?.modelId) {
|
|
529
|
+
modelToUse = task.modelOverride.modelId;
|
|
530
|
+
addLog('info', 'system', `Model override applied: ${modelToUse} (from task config)`);
|
|
531
|
+
}
|
|
532
|
+
addLog('info', 'system', `Final model to use: ${modelToUse}`);
|
|
533
|
+
// Determine Claude version to use (from task override)
|
|
534
|
+
// Note: AgentConfig doesn't have claudeVersionId, it's only in AgentSession
|
|
535
|
+
const claudeVersionToUse = task.modelOverride?.versionId;
|
|
536
|
+
if (claudeVersionToUse) {
|
|
537
|
+
addLog('info', 'system', `Using supplier/version: ${claudeVersionToUse}`);
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
addLog('info', 'system', `No supplier/version specified, using default`);
|
|
541
|
+
}
|
|
542
|
+
// Extract MCP tools from agent configuration
|
|
543
|
+
const mcpTools = extractMcpToolsFromAgent(agent);
|
|
544
|
+
if (mcpTools.length > 0) {
|
|
545
|
+
addLog('info', 'system', `MCP tools extracted from agent config: ${mcpTools.join(', ')}`);
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
addLog('info', 'system', 'No MCP tools configured for this agent');
|
|
549
|
+
}
|
|
550
|
+
// Build query options using the shared utility function
|
|
551
|
+
// This handles: MCP tools, environment variables, Claude version, A2A integration
|
|
552
|
+
// NOTE: Scheduled tasks run unattended, so we MUST use bypassPermissions mode
|
|
553
|
+
addLog('info', 'system', 'Building query options with MCP and environment support...');
|
|
554
|
+
// Determine permission mode based on model
|
|
555
|
+
// IMPORTANT: Some models do NOT work in scheduled tasks (unattended mode)
|
|
556
|
+
// These models require 'default' permission mode with user interaction, but scheduled tasks
|
|
557
|
+
// run unattended and require 'bypassPermissions' mode
|
|
558
|
+
const modelLower = modelToUse.toLowerCase();
|
|
559
|
+
const isGlmModel = modelLower.includes('glm') ||
|
|
560
|
+
modelLower.includes('zhipu') ||
|
|
561
|
+
modelLower.includes('chatglm') ||
|
|
562
|
+
modelLower.startsWith('glm');
|
|
563
|
+
addLog('info', 'system', `Model compatibility check: model="${modelToUse}", isGlmModel=${isGlmModel}`);
|
|
564
|
+
if (isGlmModel) {
|
|
565
|
+
// NOTE: GLM models may have limitations with bypassPermissions mode
|
|
566
|
+
// Previously this was blocked, but now we allow testing with a warning
|
|
567
|
+
addLog('warn', 'system', `GLM model detected: ${modelToUse}. GLM models may have compatibility issues with scheduled tasks.`);
|
|
568
|
+
addLog('warn', 'system', `If this task fails, consider using Claude models (Sonnet, Haiku, Opus) instead.`);
|
|
569
|
+
}
|
|
570
|
+
// Additional check: some models might not support bypassPermissions mode
|
|
571
|
+
// Log a warning for unrecognized model names
|
|
572
|
+
const knownClaudeModels = ['sonnet', 'haiku', 'opus', 'claude'];
|
|
573
|
+
const isKnownClaudeModel = knownClaudeModels.some(m => modelLower.includes(m));
|
|
574
|
+
if (!isKnownClaudeModel) {
|
|
575
|
+
addLog('warn', 'system', `Warning: Model "${modelToUse}" may not support bypassPermissions mode required for scheduled tasks`);
|
|
576
|
+
}
|
|
577
|
+
// For Claude models, use bypassPermissions mode (unattended execution)
|
|
578
|
+
const permissionMode = 'bypassPermissions';
|
|
579
|
+
addLog('info', 'system', `Using 'bypassPermissions' mode for Claude model: ${modelToUse}`);
|
|
580
|
+
const { queryOptions } = await (0, claudeUtils_js_1.buildQueryOptions)(agent, task.projectPath, mcpTools.length > 0 ? mcpTools : undefined, permissionMode, modelToUse, claudeVersionToUse, undefined, // defaultEnv - will be loaded from Claude version config
|
|
581
|
+
undefined, // userEnv - scheduled tasks don't have user-provided env vars
|
|
582
|
+
undefined, // sessionIdForAskUser - scheduled tasks don't support user interaction
|
|
583
|
+
undefined // agentIdForAskUser
|
|
584
|
+
);
|
|
585
|
+
// Override maxTurns for scheduled tasks to prevent infinite loops
|
|
586
|
+
queryOptions.maxTurns = agent.maxTurns || 10;
|
|
587
|
+
addLog('info', 'system', `Query options built: permissionMode=bypassPermissions, model=${modelToUse}, maxTurns=${queryOptions.maxTurns}`);
|
|
588
|
+
// Log MCP servers if configured
|
|
589
|
+
if (queryOptions.mcpServers) {
|
|
590
|
+
const mcpServerNames = Object.keys(queryOptions.mcpServers);
|
|
591
|
+
addLog('info', 'system', `MCP servers configured: ${mcpServerNames.join(', ')}`);
|
|
592
|
+
// Log detailed MCP server config for debugging
|
|
593
|
+
for (const [serverName, serverConfig] of Object.entries(queryOptions.mcpServers)) {
|
|
594
|
+
addLog('info', 'system', ` - ${serverName}: ${JSON.stringify(serverConfig)}`);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
addLog('warn', 'system', `No MCP servers configured in queryOptions (mcpTools passed: ${mcpTools.join(', ') || 'none'})`);
|
|
599
|
+
}
|
|
600
|
+
// Collect response
|
|
601
|
+
let fullResponse = '';
|
|
602
|
+
let sessionId;
|
|
603
|
+
addLog('info', 'system', 'Starting Claude Code query...');
|
|
604
|
+
try {
|
|
605
|
+
for await (const message of (0, claude_agent_sdk_1.query)({
|
|
606
|
+
prompt: task.triggerMessage,
|
|
607
|
+
options: queryOptions,
|
|
608
|
+
})) {
|
|
609
|
+
// Check if execution was aborted
|
|
610
|
+
if (abortSignal?.aborted) {
|
|
611
|
+
addLog('warn', 'system', 'Execution aborted by user');
|
|
612
|
+
throw new Error('Execution aborted by user');
|
|
613
|
+
}
|
|
614
|
+
// Capture session ID
|
|
615
|
+
if (message.session_id && !sessionId) {
|
|
616
|
+
sessionId = message.session_id;
|
|
617
|
+
addLog('info', 'system', `Session ID: ${sessionId}`);
|
|
618
|
+
}
|
|
619
|
+
// Log different message types
|
|
620
|
+
if (message.type === 'assistant' && message.message?.content) {
|
|
621
|
+
for (const block of message.message.content) {
|
|
622
|
+
if (block.type === 'text') {
|
|
623
|
+
fullResponse += block.text;
|
|
624
|
+
addLog('info', 'assistant', block.text);
|
|
625
|
+
}
|
|
626
|
+
else if (block.type === 'tool_use') {
|
|
627
|
+
addLog('info', 'tool_use', `Tool: ${block.name}`, {
|
|
628
|
+
tool: block.name,
|
|
629
|
+
input: block.input
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
else if (message.type === 'result') {
|
|
635
|
+
addLog('info', 'result', `Execution completed`, {
|
|
636
|
+
costUsd: message.total_cost_usd,
|
|
637
|
+
durationMs: message.duration_ms,
|
|
638
|
+
numTurns: message.num_turns,
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
else if (message.type === 'system') {
|
|
642
|
+
// System messages might contain error info
|
|
643
|
+
addLog('info', 'system', `System: ${JSON.stringify(message)}`);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
catch (queryError) {
|
|
648
|
+
const errorMessage = queryError instanceof Error ? queryError.message : String(queryError);
|
|
649
|
+
const errorStack = queryError instanceof Error ? queryError.stack : undefined;
|
|
650
|
+
addLog('error', 'system', `Query failed: ${errorMessage}`, { stack: errorStack });
|
|
651
|
+
throw queryError;
|
|
652
|
+
}
|
|
653
|
+
addLog('info', 'system', 'Query completed successfully');
|
|
654
|
+
// Create summary (first 500 chars)
|
|
655
|
+
const summary = fullResponse.length > 500
|
|
656
|
+
? fullResponse.slice(0, 497) + '...'
|
|
657
|
+
: fullResponse;
|
|
658
|
+
return { summary, sessionId, logs };
|
|
659
|
+
}
|
|
660
|
+
// ============================================================================
|
|
661
|
+
// Utility Functions
|
|
662
|
+
// ============================================================================
|
|
663
|
+
/**
|
|
664
|
+
* Convert task schedule to cron expression
|
|
665
|
+
*/
|
|
666
|
+
function getCronExpression(task) {
|
|
667
|
+
const { schedule } = task;
|
|
668
|
+
if (schedule.type === 'cron' && schedule.cronExpression) {
|
|
669
|
+
return schedule.cronExpression;
|
|
670
|
+
}
|
|
671
|
+
if (schedule.type === 'interval' && schedule.intervalMinutes) {
|
|
672
|
+
// Convert interval to cron expression
|
|
673
|
+
// e.g., 30 minutes -> "*/30 * * * *"
|
|
674
|
+
if (schedule.intervalMinutes < 60) {
|
|
675
|
+
return `*/${schedule.intervalMinutes} * * * *`;
|
|
676
|
+
}
|
|
677
|
+
else {
|
|
678
|
+
// For hourly or longer intervals
|
|
679
|
+
const hours = Math.floor(schedule.intervalMinutes / 60);
|
|
680
|
+
return `0 */${hours} * * *`;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Calculate next run time from cron expression
|
|
687
|
+
*/
|
|
688
|
+
function getNextRunTime(cronExpression) {
|
|
689
|
+
try {
|
|
690
|
+
// node-cron doesn't have a built-in method to get next run time
|
|
691
|
+
// We'll use a simple calculation based on the cron expression
|
|
692
|
+
const now = new Date();
|
|
693
|
+
const parts = cronExpression.split(' ');
|
|
694
|
+
// For simple cases, calculate approximate next run
|
|
695
|
+
if (parts[0].startsWith('*/')) {
|
|
696
|
+
// Interval in minutes
|
|
697
|
+
const interval = parseInt(parts[0].slice(2));
|
|
698
|
+
const currentMinutes = now.getMinutes();
|
|
699
|
+
const nextMinutes = Math.ceil(currentMinutes / interval) * interval;
|
|
700
|
+
const next = new Date(now);
|
|
701
|
+
if (nextMinutes >= 60) {
|
|
702
|
+
next.setHours(next.getHours() + 1);
|
|
703
|
+
next.setMinutes(nextMinutes - 60);
|
|
704
|
+
}
|
|
705
|
+
else if (nextMinutes === currentMinutes) {
|
|
706
|
+
next.setMinutes(currentMinutes + interval);
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
next.setMinutes(nextMinutes);
|
|
710
|
+
}
|
|
711
|
+
next.setSeconds(0);
|
|
712
|
+
next.setMilliseconds(0);
|
|
713
|
+
return next.toISOString();
|
|
714
|
+
}
|
|
715
|
+
// For other patterns, return undefined (will be calculated on next check)
|
|
716
|
+
return undefined;
|
|
717
|
+
}
|
|
718
|
+
catch {
|
|
719
|
+
return undefined;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
// ============================================================================
|
|
723
|
+
// Status Functions
|
|
724
|
+
// ============================================================================
|
|
725
|
+
/**
|
|
726
|
+
* Get scheduler status
|
|
727
|
+
*/
|
|
728
|
+
function getSchedulerStatus() {
|
|
729
|
+
return {
|
|
730
|
+
isInitialized,
|
|
731
|
+
enabled: schedulerEnabled,
|
|
732
|
+
config,
|
|
733
|
+
activeTaskCount: activeJobs.size,
|
|
734
|
+
runningTaskCount,
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Get list of active task IDs
|
|
739
|
+
*/
|
|
740
|
+
function getActiveTaskIds() {
|
|
741
|
+
return Array.from(activeJobs.keys());
|
|
742
|
+
}
|
|
743
|
+
//# sourceMappingURL=schedulerService.js.map
|