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,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* API Key Service
|
|
4
|
+
*
|
|
5
|
+
* Manages inbound API keys for authenticating external callers to AgentStudio agents.
|
|
6
|
+
* Keys are stored hashed with bcryptjs (pure JavaScript, salt rounds 10) for security.
|
|
7
|
+
* Original keys are also encrypted with AES-256-GCM for display purposes.
|
|
8
|
+
*
|
|
9
|
+
* Storage: {projectPath}/.a2a/api-keys.json
|
|
10
|
+
* Format: { version: "1.0.0", keys: [A2AApiKey[]] }
|
|
11
|
+
*
|
|
12
|
+
* Key Format: agt_proj_{projectId}_{32-hex-chars}
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.generateApiKey = generateApiKey;
|
|
19
|
+
exports.hashApiKey = hashApiKey;
|
|
20
|
+
exports.validateApiKey = validateApiKey;
|
|
21
|
+
exports.revokeApiKey = revokeApiKey;
|
|
22
|
+
exports.listApiKeys = listApiKeys;
|
|
23
|
+
exports.rotateApiKey = rotateApiKey;
|
|
24
|
+
exports.getApiKey = getApiKey;
|
|
25
|
+
exports.getDecryptedApiKey = getDecryptedApiKey;
|
|
26
|
+
exports.listApiKeysWithDecryption = listApiKeysWithDecryption;
|
|
27
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
28
|
+
const path_1 = __importDefault(require("path"));
|
|
29
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
30
|
+
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
|
31
|
+
const uuid_1 = require("uuid");
|
|
32
|
+
const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
|
|
33
|
+
const paths_js_1 = require("../../config/paths.js");
|
|
34
|
+
const SALT_ROUNDS = 10;
|
|
35
|
+
// AES-256-GCM encryption key derived from a stable secret
|
|
36
|
+
// In production, this should come from environment variable
|
|
37
|
+
const ENCRYPTION_KEY = crypto_1.default.createHash('sha256')
|
|
38
|
+
.update(process.env.API_KEY_ENCRYPTION_SECRET || 'agentstudio-api-key-encryption-secret-v1')
|
|
39
|
+
.digest();
|
|
40
|
+
/**
|
|
41
|
+
* Encrypt a plaintext API key using AES-256-GCM
|
|
42
|
+
*/
|
|
43
|
+
function encryptKey(plaintext) {
|
|
44
|
+
const iv = crypto_1.default.randomBytes(12); // 96-bit IV for GCM
|
|
45
|
+
const cipher = crypto_1.default.createCipheriv('aes-256-gcm', ENCRYPTION_KEY, iv);
|
|
46
|
+
let encrypted = cipher.update(plaintext, 'utf8', 'hex');
|
|
47
|
+
encrypted += cipher.final('hex');
|
|
48
|
+
const authTag = cipher.getAuthTag();
|
|
49
|
+
// Format: iv:authTag:encrypted
|
|
50
|
+
return `${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Decrypt an encrypted API key
|
|
54
|
+
*/
|
|
55
|
+
function decryptKey(encryptedData) {
|
|
56
|
+
try {
|
|
57
|
+
const [ivHex, authTagHex, encrypted] = encryptedData.split(':');
|
|
58
|
+
if (!ivHex || !authTagHex || !encrypted) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const iv = Buffer.from(ivHex, 'hex');
|
|
62
|
+
const authTag = Buffer.from(authTagHex, 'hex');
|
|
63
|
+
const decipher = crypto_1.default.createDecipheriv('aes-256-gcm', ENCRYPTION_KEY, iv);
|
|
64
|
+
decipher.setAuthTag(authTag);
|
|
65
|
+
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
|
|
66
|
+
decrypted += decipher.final('utf8');
|
|
67
|
+
return decrypted;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const hashKey = async (key) => {
|
|
74
|
+
return bcryptjs_1.default.hash(key, SALT_ROUNDS);
|
|
75
|
+
};
|
|
76
|
+
const compareKey = async (key, hash) => {
|
|
77
|
+
return bcryptjs_1.default.compare(key, hash);
|
|
78
|
+
};
|
|
79
|
+
const LOCK_OPTIONS = {
|
|
80
|
+
retries: { retries: 5, minTimeout: 100, maxTimeout: 500 },
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Get path to project's API keys file
|
|
84
|
+
* @param projectPath - Absolute path to the project working directory
|
|
85
|
+
*/
|
|
86
|
+
function getApiKeysPath(projectPath) {
|
|
87
|
+
return (0, paths_js_1.getProjectApiKeysFile)(projectPath);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Load API key registry for a project
|
|
91
|
+
*/
|
|
92
|
+
async function loadApiKeyRegistry(projectId) {
|
|
93
|
+
const filePath = getApiKeysPath(projectId);
|
|
94
|
+
try {
|
|
95
|
+
const data = await promises_1.default.readFile(filePath, 'utf-8');
|
|
96
|
+
return JSON.parse(data);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// If file doesn't exist, return empty registry
|
|
100
|
+
if (error.code === 'ENOENT') {
|
|
101
|
+
return {
|
|
102
|
+
version: '1.0.0',
|
|
103
|
+
keys: [],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Save API key registry for a project with file locking
|
|
111
|
+
*/
|
|
112
|
+
async function saveApiKeyRegistry(projectId, registry) {
|
|
113
|
+
const filePath = getApiKeysPath(projectId);
|
|
114
|
+
const dir = path_1.default.dirname(filePath);
|
|
115
|
+
// Ensure directory exists
|
|
116
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
117
|
+
// Create empty file if it doesn't exist (helps with file locking)
|
|
118
|
+
try {
|
|
119
|
+
await promises_1.default.access(filePath);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// File doesn't exist, create empty file
|
|
123
|
+
await promises_1.default.writeFile(filePath, JSON.stringify({ version: '1.0.0', keys: [] }, null, 2), 'utf-8');
|
|
124
|
+
}
|
|
125
|
+
// Acquire lock for atomic write
|
|
126
|
+
const release = await proper_lockfile_1.default.lock(filePath, LOCK_OPTIONS);
|
|
127
|
+
try {
|
|
128
|
+
await promises_1.default.writeFile(filePath, JSON.stringify(registry, null, 2), 'utf-8');
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await release();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate a short project identifier from project path
|
|
136
|
+
* Uses first 8 characters of SHA256 hash of the path
|
|
137
|
+
*/
|
|
138
|
+
function generateProjectIdentifier(projectPath) {
|
|
139
|
+
return crypto_1.default.createHash('sha256').update(projectPath).digest('hex').substring(0, 8);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Generate a new API key for a project
|
|
143
|
+
*
|
|
144
|
+
* @param projectId - Internal project identifier (can be a path)
|
|
145
|
+
* @param description - Human-readable description of the key
|
|
146
|
+
* @returns Object containing the generated key (plaintext, shown once) and key metadata
|
|
147
|
+
*/
|
|
148
|
+
async function generateApiKey(projectId, description) {
|
|
149
|
+
// Generate short project identifier from path (8-char hash instead of full path)
|
|
150
|
+
const projectIdHash = generateProjectIdentifier(projectId);
|
|
151
|
+
// Generate random API key
|
|
152
|
+
const random = crypto_1.default.randomBytes(16).toString('hex'); // 32 hex characters
|
|
153
|
+
const key = `agt_proj_${projectIdHash}_${random}`;
|
|
154
|
+
// Hash the key with bcrypt for validation
|
|
155
|
+
const keyHash = await hashKey(key);
|
|
156
|
+
// Encrypt the key for later retrieval
|
|
157
|
+
const encryptedKey = encryptKey(key);
|
|
158
|
+
// Create key metadata
|
|
159
|
+
const keyId = (0, uuid_1.v4)();
|
|
160
|
+
const now = new Date().toISOString();
|
|
161
|
+
const keyData = {
|
|
162
|
+
id: keyId,
|
|
163
|
+
projectId,
|
|
164
|
+
keyHash,
|
|
165
|
+
encryptedKey,
|
|
166
|
+
description,
|
|
167
|
+
createdAt: now,
|
|
168
|
+
};
|
|
169
|
+
// Load registry and add key
|
|
170
|
+
const registry = await loadApiKeyRegistry(projectId);
|
|
171
|
+
registry.keys.push(keyData);
|
|
172
|
+
await saveApiKeyRegistry(projectId, registry);
|
|
173
|
+
// Return plaintext key and metadata
|
|
174
|
+
return { key, keyData };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Hash an API key using bcrypt
|
|
178
|
+
* This is a pure function used internally and for testing
|
|
179
|
+
*
|
|
180
|
+
* @param key - Plaintext API key
|
|
181
|
+
* @returns Bcrypt hash
|
|
182
|
+
*/
|
|
183
|
+
async function hashApiKey(key) {
|
|
184
|
+
return hashKey(key);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Validate an API key against project's stored hashes
|
|
188
|
+
*
|
|
189
|
+
* @param projectId - Internal project identifier
|
|
190
|
+
* @param key - Plaintext API key to validate
|
|
191
|
+
* @returns Object with validation result and key ID if valid
|
|
192
|
+
*/
|
|
193
|
+
async function validateApiKey(projectId, key) {
|
|
194
|
+
const registry = await loadApiKeyRegistry(projectId);
|
|
195
|
+
// Try to match key against each stored hash
|
|
196
|
+
for (const keyData of registry.keys) {
|
|
197
|
+
// Skip revoked keys
|
|
198
|
+
if (keyData.revokedAt) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// Compare key with hash
|
|
202
|
+
const isMatch = await compareKey(key, keyData.keyHash);
|
|
203
|
+
if (isMatch) {
|
|
204
|
+
// Update last used timestamp
|
|
205
|
+
keyData.lastUsedAt = new Date().toISOString();
|
|
206
|
+
await saveApiKeyRegistry(projectId, registry);
|
|
207
|
+
return {
|
|
208
|
+
valid: true,
|
|
209
|
+
keyId: keyData.id,
|
|
210
|
+
keyData,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return { valid: false };
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Revoke an API key (soft delete - kept for audit trail)
|
|
218
|
+
*
|
|
219
|
+
* @param projectId - Internal project identifier
|
|
220
|
+
* @param keyId - Key ID to revoke
|
|
221
|
+
* @returns true if key was revoked, false if not found
|
|
222
|
+
*/
|
|
223
|
+
async function revokeApiKey(projectId, keyId) {
|
|
224
|
+
const registry = await loadApiKeyRegistry(projectId);
|
|
225
|
+
const key = registry.keys.find((k) => k.id === keyId);
|
|
226
|
+
if (!key) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
// Mark as revoked
|
|
230
|
+
key.revokedAt = new Date().toISOString();
|
|
231
|
+
await saveApiKeyRegistry(projectId, registry);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* List all API keys for a project (excluding revoked keys by default)
|
|
236
|
+
*
|
|
237
|
+
* @param projectId - Internal project identifier
|
|
238
|
+
* @param includeRevoked - Whether to include revoked keys
|
|
239
|
+
* @returns Array of API key metadata (hashes only, never plaintext)
|
|
240
|
+
*/
|
|
241
|
+
async function listApiKeys(projectId, includeRevoked = false) {
|
|
242
|
+
const registry = await loadApiKeyRegistry(projectId);
|
|
243
|
+
if (includeRevoked) {
|
|
244
|
+
return registry.keys;
|
|
245
|
+
}
|
|
246
|
+
return registry.keys.filter((key) => !key.revokedAt);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Rotate an API key (generate new key and revoke old one)
|
|
250
|
+
*
|
|
251
|
+
* @param projectId - Internal project identifier
|
|
252
|
+
* @param oldKeyId - ID of key to rotate
|
|
253
|
+
* @param description - Description for new key
|
|
254
|
+
* @param gracePeriodMs - Grace period in milliseconds before revoking old key (default 5 minutes)
|
|
255
|
+
* @returns New key data
|
|
256
|
+
*/
|
|
257
|
+
async function rotateApiKey(projectId, oldKeyId, description, gracePeriodMs = 5 * 60 * 1000 // 5 minutes
|
|
258
|
+
) {
|
|
259
|
+
// Generate new key
|
|
260
|
+
const newKey = await generateApiKey(projectId, description);
|
|
261
|
+
// Schedule revocation of old key after grace period
|
|
262
|
+
setTimeout(async () => {
|
|
263
|
+
try {
|
|
264
|
+
await revokeApiKey(projectId, oldKeyId);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
console.error(`Failed to revoke old key ${oldKeyId} after rotation:`, error);
|
|
268
|
+
}
|
|
269
|
+
}, gracePeriodMs);
|
|
270
|
+
return {
|
|
271
|
+
...newKey,
|
|
272
|
+
oldKeyId,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get API key metadata by ID
|
|
277
|
+
*
|
|
278
|
+
* @param projectId - Internal project identifier
|
|
279
|
+
* @param keyId - Key ID
|
|
280
|
+
* @returns API key metadata or null if not found
|
|
281
|
+
*/
|
|
282
|
+
async function getApiKey(projectId, keyId) {
|
|
283
|
+
const registry = await loadApiKeyRegistry(projectId);
|
|
284
|
+
return registry.keys.find((k) => k.id === keyId) || null;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get decrypted API key by ID
|
|
288
|
+
*
|
|
289
|
+
* @param projectId - Internal project identifier
|
|
290
|
+
* @param keyId - Key ID
|
|
291
|
+
* @returns Decrypted plaintext key or null if not found
|
|
292
|
+
*/
|
|
293
|
+
async function getDecryptedApiKey(projectId, keyId) {
|
|
294
|
+
const keyData = await getApiKey(projectId, keyId);
|
|
295
|
+
if (!keyData || !keyData.encryptedKey) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
return decryptKey(keyData.encryptedKey);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* List all API keys with decrypted values
|
|
302
|
+
*
|
|
303
|
+
* @param projectId - Internal project identifier
|
|
304
|
+
* @param includeRevoked - Whether to include revoked keys
|
|
305
|
+
* @returns Array of API keys with decrypted key values
|
|
306
|
+
*/
|
|
307
|
+
async function listApiKeysWithDecryption(projectId, includeRevoked = false) {
|
|
308
|
+
const keys = await listApiKeys(projectId, includeRevoked);
|
|
309
|
+
return keys.map((key) => ({
|
|
310
|
+
...key,
|
|
311
|
+
decryptedKey: key.encryptedKey ? decryptKey(key.encryptedKey) || undefined : undefined,
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=apiKeyService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKeyService.js","sourceRoot":"","sources":["../../../src/services/a2a/apiKeyService.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;AA+IH,wCAqCC;AASD,gCAEC;AASD,wCA8BC;AASD,oCAcC;AASD,kCAQC;AAWD,oCAsBC;AASD,8BAGC;AASD,gDAMC;AASD,8DAUC;AA3VD,2DAA6B;AAC7B,gDAAwB;AACxB,oDAA4B;AAC5B,wDAA8B;AAC9B,+BAAoC;AACpC,sEAAuC;AAEvC,oDAA8D;AAE9D,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,0DAA0D;AAC1D,4DAA4D;AAC5D,MAAM,cAAc,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;KAC/C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,0CAA0C,CAAC;KAC3F,MAAM,EAAE,CAAC;AAEZ;;GAEG;AACH,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,EAAE,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;IACvD,MAAM,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IAExE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACxD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,+BAA+B;IAC/B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,aAAqB;IACvC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhE,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,gBAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAC5E,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAmB,EAAE;IACrD,OAAO,kBAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAoB,EAAE;IACvE,OAAO,kBAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC;AACF,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;CAC1D,CAAC;AAEF;;;GAGG;AACH,SAAS,cAAc,CAAC,WAAmB;IACzC,OAAO,IAAA,gCAAqB,EAAC,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,EAAE;aACT,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,QAA2B;IAC9E,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,0BAA0B;IAC1B,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,kEAAkE;IAClE,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;QACxC,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG,MAAM,yBAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,WAAmB;IACpD,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,WAAmB;IAEnB,iFAAiF;IACjF,MAAM,aAAa,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAE3D,0BAA0B;IAC1B,MAAM,MAAM,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;IAC3E,MAAM,GAAG,GAAG,YAAY,aAAa,IAAI,MAAM,EAAE,CAAC;IAElD,0CAA0C;IAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAEnC,sCAAsC;IACtC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,sBAAsB;IACtB,MAAM,KAAK,GAAG,IAAA,SAAM,GAAE,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,OAAO,GAAc;QACzB,EAAE,EAAE,KAAK;QACT,SAAS;QACT,OAAO;QACP,YAAY;QACZ,WAAW;QACX,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9C,oCAAoC;IACpC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,GAAW;IAEX,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAErD,4CAA4C;IAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,oBAAoB;QACpB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,OAAO,EAAE,CAAC;YACZ,6BAA6B;YAC7B,OAAO,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAE9C,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,OAAO,CAAC,EAAE;gBACjB,OAAO;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,KAAa;IACjE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;IAClB,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,cAAc,GAAG,KAAK;IACzE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,QAAgB,EAChB,WAAmB,EACnB,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY;;IAE1C,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAE5D,oDAAoD;IACpD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,EAAE,aAAa,CAAC,CAAC;IAElB,OAAO;QACL,GAAG,MAAM;QACT,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAa;IACvE,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,cAAc,GAAG,KAAK;IAEtB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,GAAG,GAAG;QACN,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;KACvF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Task Cleanup Service
|
|
3
|
+
*
|
|
4
|
+
* Handles cleanup of orphaned tasks on server startup.
|
|
5
|
+
* Orphaned tasks are tasks with status='running' that were left
|
|
6
|
+
* in that state due to server crash or restart.
|
|
7
|
+
*
|
|
8
|
+
* This service scans all registered projects' task directories and marks
|
|
9
|
+
* any running tasks as 'failed' with an appropriate error message.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Clean up orphaned tasks across all projects
|
|
13
|
+
*
|
|
14
|
+
* Scans all registered projects' .a2a/tasks/ directories and marks any tasks
|
|
15
|
+
* with status='running' as 'failed' (indicating they were orphaned
|
|
16
|
+
* due to server restart).
|
|
17
|
+
*
|
|
18
|
+
* @returns Count of tasks cleaned up
|
|
19
|
+
*/
|
|
20
|
+
export declare function cleanupOrphanedTasks(): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Clean up timed-out tasks across all projects
|
|
23
|
+
*
|
|
24
|
+
* Scans all registered projects and marks tasks that have exceeded their timeout
|
|
25
|
+
* as 'failed'. This is called periodically by the timeout monitor.
|
|
26
|
+
*
|
|
27
|
+
* @returns Count of tasks marked as timed out
|
|
28
|
+
*/
|
|
29
|
+
export declare function cleanupTimedOutTasks(): Promise<number>;
|
|
30
|
+
//# sourceMappingURL=taskCleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskCleanup.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/taskCleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CA+D5D;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CA2D5D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A2A Task Cleanup Service
|
|
4
|
+
*
|
|
5
|
+
* Handles cleanup of orphaned tasks on server startup.
|
|
6
|
+
* Orphaned tasks are tasks with status='running' that were left
|
|
7
|
+
* in that state due to server crash or restart.
|
|
8
|
+
*
|
|
9
|
+
* This service scans all registered projects' task directories and marks
|
|
10
|
+
* any running tasks as 'failed' with an appropriate error message.
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.cleanupOrphanedTasks = cleanupOrphanedTasks;
|
|
17
|
+
exports.cleanupTimedOutTasks = cleanupTimedOutTasks;
|
|
18
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
19
|
+
const taskManager_js_1 = require("./taskManager.js");
|
|
20
|
+
const agentMappingService_js_1 = require("./agentMappingService.js");
|
|
21
|
+
const paths_js_1 = require("../../config/paths.js");
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Helper Functions
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Get all unique working directories from agent mappings
|
|
27
|
+
*/
|
|
28
|
+
async function getAllWorkingDirectories() {
|
|
29
|
+
try {
|
|
30
|
+
const mappings = await (0, agentMappingService_js_1.listAgentMappings)();
|
|
31
|
+
// Extract unique working directories
|
|
32
|
+
const workingDirs = new Set();
|
|
33
|
+
for (const mapping of mappings) {
|
|
34
|
+
if (mapping.workingDirectory) {
|
|
35
|
+
workingDirs.add(mapping.workingDirectory);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return Array.from(workingDirs);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.warn('[TaskCleanup] Failed to get agent mappings:', error.message);
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a task directory exists for a project
|
|
47
|
+
*/
|
|
48
|
+
async function taskDirectoryExists(workingDirectory) {
|
|
49
|
+
try {
|
|
50
|
+
const tasksDir = (0, paths_js_1.getProjectTasksDir)(workingDirectory);
|
|
51
|
+
await promises_1.default.access(tasksDir);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Main Cleanup Function
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* Clean up orphaned tasks across all projects
|
|
63
|
+
*
|
|
64
|
+
* Scans all registered projects' .a2a/tasks/ directories and marks any tasks
|
|
65
|
+
* with status='running' as 'failed' (indicating they were orphaned
|
|
66
|
+
* due to server restart).
|
|
67
|
+
*
|
|
68
|
+
* @returns Count of tasks cleaned up
|
|
69
|
+
*/
|
|
70
|
+
async function cleanupOrphanedTasks() {
|
|
71
|
+
console.info('[TaskCleanup] Starting orphaned task cleanup...');
|
|
72
|
+
let totalCleaned = 0;
|
|
73
|
+
const startTime = Date.now();
|
|
74
|
+
try {
|
|
75
|
+
// Get all unique working directories from agent mappings
|
|
76
|
+
const workingDirectories = await getAllWorkingDirectories();
|
|
77
|
+
console.info(`[TaskCleanup] Scanning ${workingDirectories.length} project directories...`);
|
|
78
|
+
// Process each project
|
|
79
|
+
for (const workingDirectory of workingDirectories) {
|
|
80
|
+
// Check if project has tasks directory
|
|
81
|
+
const hasTasksDir = await taskDirectoryExists(workingDirectory);
|
|
82
|
+
if (!hasTasksDir) {
|
|
83
|
+
continue; // No tasks for this project
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
// Get all running tasks for this project
|
|
87
|
+
const runningTasks = await taskManager_js_1.taskManager.listTasks(workingDirectory, 'running');
|
|
88
|
+
if (runningTasks.length === 0) {
|
|
89
|
+
continue; // No orphaned tasks
|
|
90
|
+
}
|
|
91
|
+
console.info(`[TaskCleanup] Found ${runningTasks.length} orphaned tasks in ${workingDirectory}`);
|
|
92
|
+
// Mark each running task as failed
|
|
93
|
+
for (const task of runningTasks) {
|
|
94
|
+
try {
|
|
95
|
+
await taskManager_js_1.taskManager.updateTaskStatus(workingDirectory, task.id, 'failed', {
|
|
96
|
+
errorDetails: {
|
|
97
|
+
message: 'Task was orphaned due to server restart',
|
|
98
|
+
code: 'TASK_ORPHANED',
|
|
99
|
+
},
|
|
100
|
+
completedAt: new Date().toISOString(),
|
|
101
|
+
});
|
|
102
|
+
totalCleaned++;
|
|
103
|
+
console.info(`[TaskCleanup] Cleaned orphaned task: ${task.id}`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error(`[TaskCleanup] Failed to clean task ${task.id}:`, error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`[TaskCleanup] Error processing ${workingDirectory}:`, error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const duration = Date.now() - startTime;
|
|
115
|
+
console.info(`[TaskCleanup] Cleanup complete. Cleaned ${totalCleaned} tasks in ${duration}ms`);
|
|
116
|
+
return totalCleaned;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error('[TaskCleanup] Fatal error during cleanup:', error);
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Clean up timed-out tasks across all projects
|
|
125
|
+
*
|
|
126
|
+
* Scans all registered projects and marks tasks that have exceeded their timeout
|
|
127
|
+
* as 'failed'. This is called periodically by the timeout monitor.
|
|
128
|
+
*
|
|
129
|
+
* @returns Count of tasks marked as timed out
|
|
130
|
+
*/
|
|
131
|
+
async function cleanupTimedOutTasks() {
|
|
132
|
+
let totalTimedOut = 0;
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
try {
|
|
135
|
+
// Get all unique working directories from agent mappings
|
|
136
|
+
const workingDirectories = await getAllWorkingDirectories();
|
|
137
|
+
// Process each project
|
|
138
|
+
for (const workingDirectory of workingDirectories) {
|
|
139
|
+
// Check if project has tasks directory
|
|
140
|
+
const hasTasksDir = await taskDirectoryExists(workingDirectory);
|
|
141
|
+
if (!hasTasksDir) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
// Get all running tasks for this project
|
|
146
|
+
const runningTasks = await taskManager_js_1.taskManager.listTasks(workingDirectory, 'running');
|
|
147
|
+
// Check each task for timeout
|
|
148
|
+
for (const task of runningTasks) {
|
|
149
|
+
const createdTime = new Date(task.createdAt).getTime();
|
|
150
|
+
const elapsedMs = now - createdTime;
|
|
151
|
+
if (elapsedMs > task.timeoutMs) {
|
|
152
|
+
// Task has timed out
|
|
153
|
+
try {
|
|
154
|
+
await taskManager_js_1.taskManager.updateTaskStatus(workingDirectory, task.id, 'failed', {
|
|
155
|
+
errorDetails: {
|
|
156
|
+
message: `Task timed out after ${task.timeoutMs}ms (elapsed: ${elapsedMs}ms)`,
|
|
157
|
+
code: 'TASK_TIMEOUT',
|
|
158
|
+
},
|
|
159
|
+
completedAt: new Date().toISOString(),
|
|
160
|
+
});
|
|
161
|
+
totalTimedOut++;
|
|
162
|
+
console.warn(`[TaskCleanup] Task timed out: ${task.id} (elapsed: ${elapsedMs}ms)`);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`[TaskCleanup] Failed to mark task ${task.id} as timed out:`, error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.error(`[TaskCleanup] Error checking timeouts for ${workingDirectory}:`, error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (totalTimedOut > 0) {
|
|
175
|
+
console.info(`[TaskCleanup] Marked ${totalTimedOut} tasks as timed out`);
|
|
176
|
+
}
|
|
177
|
+
return totalTimedOut;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error('[TaskCleanup] Fatal error during timeout cleanup:', error);
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=taskCleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskCleanup.js","sourceRoot":"","sources":["../../../src/services/a2a/taskCleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Task Manager Service
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of A2A asynchronous tasks with file-based persistence.
|
|
5
|
+
* Tasks are stored as JSON files in {workingDirectory}/.a2a/tasks/{taskId}.json
|
|
6
|
+
*
|
|
7
|
+
* State Transitions:
|
|
8
|
+
* - pending → running
|
|
9
|
+
* - running → completed | failed | canceled
|
|
10
|
+
* - pending → canceled
|
|
11
|
+
*
|
|
12
|
+
* All state transitions are validated and atomic using file locking.
|
|
13
|
+
*/
|
|
14
|
+
import { A2ATask, TaskStatus, TaskInput, TaskOutput, TaskError } from '../../types/a2a.js';
|
|
15
|
+
interface CreateTaskParams {
|
|
16
|
+
workingDirectory: string;
|
|
17
|
+
projectId: string;
|
|
18
|
+
agentId: string;
|
|
19
|
+
a2aAgentId: string;
|
|
20
|
+
input: TaskInput;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
}
|
|
23
|
+
interface UpdateTaskParams {
|
|
24
|
+
output?: TaskOutput;
|
|
25
|
+
errorDetails?: TaskError;
|
|
26
|
+
startedAt?: string;
|
|
27
|
+
completedAt?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Task Manager Service
|
|
31
|
+
* Handles all task CRUD operations with file-based persistence
|
|
32
|
+
*/
|
|
33
|
+
export declare class TaskManager {
|
|
34
|
+
/**
|
|
35
|
+
* Create a new task
|
|
36
|
+
* Task starts in 'pending' state
|
|
37
|
+
*
|
|
38
|
+
* @param params - Task creation parameters
|
|
39
|
+
* @returns Created task object
|
|
40
|
+
* @throws Error if task creation fails
|
|
41
|
+
*/
|
|
42
|
+
createTask(params: CreateTaskParams): Promise<A2ATask>;
|
|
43
|
+
/**
|
|
44
|
+
* Get task by ID
|
|
45
|
+
*
|
|
46
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
47
|
+
* @param taskId - Task ID
|
|
48
|
+
* @returns Task object or null if not found
|
|
49
|
+
*/
|
|
50
|
+
getTask(workingDirectory: string, taskId: string): Promise<A2ATask | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Update task status and related fields
|
|
53
|
+
* Validates state transitions and uses file locking for atomicity
|
|
54
|
+
*
|
|
55
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
56
|
+
* @param taskId - Task ID
|
|
57
|
+
* @param newStatus - New task status
|
|
58
|
+
* @param updates - Additional fields to update
|
|
59
|
+
* @throws Error if task not found or invalid transition
|
|
60
|
+
*/
|
|
61
|
+
updateTaskStatus(workingDirectory: string, taskId: string, newStatus: TaskStatus, updates?: UpdateTaskParams): Promise<A2ATask>;
|
|
62
|
+
/**
|
|
63
|
+
* Cancel a task
|
|
64
|
+
* Only pending or running tasks can be canceled
|
|
65
|
+
*
|
|
66
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
67
|
+
* @param taskId - Task ID
|
|
68
|
+
* @returns Updated task object
|
|
69
|
+
* @throws Error if task cannot be canceled
|
|
70
|
+
*/
|
|
71
|
+
cancelTask(workingDirectory: string, taskId: string): Promise<A2ATask>;
|
|
72
|
+
/**
|
|
73
|
+
* List all tasks for a project
|
|
74
|
+
*
|
|
75
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
76
|
+
* @param statusFilter - Optional status filter
|
|
77
|
+
* @returns Array of tasks
|
|
78
|
+
*/
|
|
79
|
+
listTasks(workingDirectory: string, statusFilter?: TaskStatus): Promise<A2ATask[]>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Singleton instance of TaskManager
|
|
83
|
+
*/
|
|
84
|
+
export declare const taskManager: TaskManager;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=taskManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskManager.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/taskManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAqB3F,UAAU,gBAAgB;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2DD;;;GAGG;AACH,qBAAa,WAAW;IACtB;;;;;;;OAOG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAwC5D;;;;;;OAMG;IACG,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAchF;;;;;;;;;OASG;IACG,gBAAgB,CACpB,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC;IAiDnB;;;;;;;;OAQG;IACG,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5E;;;;;;OAMG;IACG,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CA6BzF;AAMD;;GAEG;AACH,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|