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,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Card Service
|
|
4
|
+
*
|
|
5
|
+
* Generates Agent Cards from AgentConfig for A2A protocol discovery.
|
|
6
|
+
* Agent Cards are auto-generated and should never be manually maintained.
|
|
7
|
+
*
|
|
8
|
+
* Pure function approach: generateAgentCard(agentConfig, projectContext) -> AgentCard
|
|
9
|
+
*
|
|
10
|
+
* Phase 4: US2 - Agent Card Auto-Generation
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.generateAgentCard = generateAgentCard;
|
|
14
|
+
/**
|
|
15
|
+
* Generate Agent Card from agent configuration (pure function)
|
|
16
|
+
*
|
|
17
|
+
* This is a pure function with no side effects - it takes agent config and project context
|
|
18
|
+
* and returns a complete Agent Card compliant with A2A protocol v1.0.
|
|
19
|
+
*
|
|
20
|
+
* @param agentConfig - Agent configuration with tools and metadata
|
|
21
|
+
* @param projectContext - Project-specific context (ID, name, working directory, A2A ID, baseUrl)
|
|
22
|
+
* @returns Complete Agent Card ready for A2A protocol exposure
|
|
23
|
+
*/
|
|
24
|
+
function generateAgentCard(agentConfig, projectContext) {
|
|
25
|
+
// Extract skills from agent's tools
|
|
26
|
+
const skills = extractSkillsFromTools(agentConfig.allowedTools);
|
|
27
|
+
// Determine agent category
|
|
28
|
+
const agentCategory = agentConfig.source === 'plugin' ? 'subagent' : 'builtin';
|
|
29
|
+
// Build Agent Card
|
|
30
|
+
const agentCard = {
|
|
31
|
+
// A2A Protocol required fields
|
|
32
|
+
name: agentConfig.name,
|
|
33
|
+
description: agentConfig.description,
|
|
34
|
+
version: agentConfig.version,
|
|
35
|
+
url: `${projectContext.baseUrl}/a2a/${projectContext.a2aAgentId}`,
|
|
36
|
+
// Agent capabilities (skills extracted from tools)
|
|
37
|
+
skills,
|
|
38
|
+
// Authentication requirements (API key only for now)
|
|
39
|
+
securitySchemes: [
|
|
40
|
+
{
|
|
41
|
+
type: 'apiKey',
|
|
42
|
+
in: 'header',
|
|
43
|
+
name: 'Authorization',
|
|
44
|
+
scheme: 'bearer',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
// AgentStudio-specific context
|
|
48
|
+
context: {
|
|
49
|
+
a2aAgentId: projectContext.a2aAgentId,
|
|
50
|
+
projectId: projectContext.projectId,
|
|
51
|
+
projectName: projectContext.projectName,
|
|
52
|
+
workingDirectory: projectContext.workingDirectory,
|
|
53
|
+
agentType: agentConfig.id,
|
|
54
|
+
agentCategory,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return agentCard;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract skills from agent's enabled MCP tools
|
|
61
|
+
*
|
|
62
|
+
* Converts AgentTool[] to Skill[] by mapping tool names to skill definitions.
|
|
63
|
+
* Only includes enabled tools.
|
|
64
|
+
*
|
|
65
|
+
* @param tools - Array of agent tools with enable/disable state
|
|
66
|
+
* @returns Array of skills for Agent Card
|
|
67
|
+
*/
|
|
68
|
+
function extractSkillsFromTools(tools) {
|
|
69
|
+
const skills = [];
|
|
70
|
+
// Filter to enabled tools only
|
|
71
|
+
const enabledTools = tools.filter((tool) => tool.enabled);
|
|
72
|
+
for (const tool of enabledTools) {
|
|
73
|
+
const skill = toolToSkill(tool);
|
|
74
|
+
if (skill) {
|
|
75
|
+
skills.push(skill);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return skills;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Convert a single AgentTool to a Skill definition
|
|
82
|
+
*
|
|
83
|
+
* Maps common tool names to their skill schemas. For unknown tools,
|
|
84
|
+
* generates a generic skill with minimal schema.
|
|
85
|
+
*
|
|
86
|
+
* @param tool - Agent tool configuration
|
|
87
|
+
* @returns Skill definition or null if tool should be excluded
|
|
88
|
+
*/
|
|
89
|
+
function toolToSkill(tool) {
|
|
90
|
+
// Map common tools to skill definitions
|
|
91
|
+
const toolSchemas = {
|
|
92
|
+
// File operations
|
|
93
|
+
read_file: {
|
|
94
|
+
description: 'Read content from a file',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: {
|
|
98
|
+
path: { type: 'string', description: 'File path to read' },
|
|
99
|
+
},
|
|
100
|
+
required: ['path'],
|
|
101
|
+
},
|
|
102
|
+
outputSchema: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
properties: {
|
|
105
|
+
content: { type: 'string', description: 'File content' },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
write_file: {
|
|
110
|
+
description: 'Write content to a file',
|
|
111
|
+
inputSchema: {
|
|
112
|
+
type: 'object',
|
|
113
|
+
properties: {
|
|
114
|
+
path: { type: 'string', description: 'File path to write' },
|
|
115
|
+
content: { type: 'string', description: 'Content to write' },
|
|
116
|
+
},
|
|
117
|
+
required: ['path', 'content'],
|
|
118
|
+
},
|
|
119
|
+
outputSchema: {
|
|
120
|
+
type: 'object',
|
|
121
|
+
properties: {
|
|
122
|
+
success: { type: 'boolean' },
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
edit_file: {
|
|
127
|
+
description: 'Edit file content with search and replace',
|
|
128
|
+
inputSchema: {
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
path: { type: 'string', description: 'File path to edit' },
|
|
132
|
+
old_string: { type: 'string', description: 'Text to replace' },
|
|
133
|
+
new_string: { type: 'string', description: 'Replacement text' },
|
|
134
|
+
},
|
|
135
|
+
required: ['path', 'old_string', 'new_string'],
|
|
136
|
+
},
|
|
137
|
+
outputSchema: {
|
|
138
|
+
type: 'object',
|
|
139
|
+
properties: {
|
|
140
|
+
success: { type: 'boolean' },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
// Command execution
|
|
145
|
+
execute_command: {
|
|
146
|
+
description: 'Execute shell command',
|
|
147
|
+
inputSchema: {
|
|
148
|
+
type: 'object',
|
|
149
|
+
properties: {
|
|
150
|
+
command: { type: 'string', description: 'Shell command to execute' },
|
|
151
|
+
},
|
|
152
|
+
required: ['command'],
|
|
153
|
+
},
|
|
154
|
+
outputSchema: {
|
|
155
|
+
type: 'object',
|
|
156
|
+
properties: {
|
|
157
|
+
stdout: { type: 'string' },
|
|
158
|
+
stderr: { type: 'string' },
|
|
159
|
+
exitCode: { type: 'number' },
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
// Search
|
|
164
|
+
grep: {
|
|
165
|
+
description: 'Search for patterns in files',
|
|
166
|
+
inputSchema: {
|
|
167
|
+
type: 'object',
|
|
168
|
+
properties: {
|
|
169
|
+
pattern: { type: 'string', description: 'Search pattern' },
|
|
170
|
+
path: { type: 'string', description: 'Directory to search' },
|
|
171
|
+
},
|
|
172
|
+
required: ['pattern'],
|
|
173
|
+
},
|
|
174
|
+
outputSchema: {
|
|
175
|
+
type: 'object',
|
|
176
|
+
properties: {
|
|
177
|
+
matches: {
|
|
178
|
+
type: 'array',
|
|
179
|
+
items: { type: 'string' },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
glob: {
|
|
185
|
+
description: 'Find files matching glob pattern',
|
|
186
|
+
inputSchema: {
|
|
187
|
+
type: 'object',
|
|
188
|
+
properties: {
|
|
189
|
+
pattern: { type: 'string', description: 'Glob pattern' },
|
|
190
|
+
},
|
|
191
|
+
required: ['pattern'],
|
|
192
|
+
},
|
|
193
|
+
outputSchema: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
properties: {
|
|
196
|
+
files: {
|
|
197
|
+
type: 'array',
|
|
198
|
+
items: { type: 'string' },
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
// Check if we have a predefined schema for this tool
|
|
205
|
+
const schema = toolSchemas[tool.name];
|
|
206
|
+
if (schema) {
|
|
207
|
+
return {
|
|
208
|
+
name: tool.name,
|
|
209
|
+
...schema,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// For unknown tools, generate generic schema
|
|
213
|
+
return {
|
|
214
|
+
name: tool.name,
|
|
215
|
+
description: `Execute ${tool.name} tool`,
|
|
216
|
+
inputSchema: {
|
|
217
|
+
type: 'object',
|
|
218
|
+
properties: {},
|
|
219
|
+
},
|
|
220
|
+
outputSchema: {
|
|
221
|
+
type: 'object',
|
|
222
|
+
properties: {
|
|
223
|
+
result: { type: 'string' },
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=agentCardService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentCardService.js","sourceRoot":"","sources":["../../../src/services/a2a/agentCardService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Mapping Service
|
|
3
|
+
*
|
|
4
|
+
* Maps A2A agent IDs (UUID v4) to internal project/agent identifiers.
|
|
5
|
+
* Provides bidirectional resolution and lazy generation of A2A IDs.
|
|
6
|
+
*
|
|
7
|
+
* Storage: ~/.claude-agent/a2a-agent-mappings.json (global registry)
|
|
8
|
+
* Format: { version: "1.0.0", mappings: { [a2aAgentId]: AgentMapping } }
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentMapping } from '../../types/a2a.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get or create A2A agent ID for a project/agent combination
|
|
13
|
+
* Lazily generates UUID v4 on first request
|
|
14
|
+
*
|
|
15
|
+
* @param projectId - Internal project identifier
|
|
16
|
+
* @param agentType - Internal agent type identifier
|
|
17
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
18
|
+
* @returns A2A agent ID (UUID v4)
|
|
19
|
+
*/
|
|
20
|
+
export declare function getOrCreateA2AId(projectId: string, agentType: string, workingDirectory: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve A2A agent ID to internal project/agent mapping
|
|
23
|
+
*
|
|
24
|
+
* @param a2aAgentId - A2A agent ID (UUID v4)
|
|
25
|
+
* @returns AgentMapping or null if not found
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveA2AId(a2aAgentId: string): Promise<AgentMapping | null>;
|
|
28
|
+
/**
|
|
29
|
+
* List all agent mappings
|
|
30
|
+
*
|
|
31
|
+
* @returns Array of all agent mappings
|
|
32
|
+
*/
|
|
33
|
+
export declare function listAgentMappings(): Promise<AgentMapping[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Delete agent mapping (used when project or agent is deleted)
|
|
36
|
+
*
|
|
37
|
+
* @param a2aAgentId - A2A agent ID to delete
|
|
38
|
+
* @returns true if deleted, false if not found
|
|
39
|
+
*/
|
|
40
|
+
export declare function deleteAgentMapping(a2aAgentId: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Get A2A agent ID for a project/agent combination without creating
|
|
43
|
+
*
|
|
44
|
+
* @param projectId - Internal project identifier
|
|
45
|
+
* @param agentType - Internal agent type identifier
|
|
46
|
+
* @returns A2A agent ID or null if not found
|
|
47
|
+
*/
|
|
48
|
+
export declare function getA2AId(projectId: string, agentType: string): Promise<string | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Invalidate in-memory cache (useful for testing)
|
|
51
|
+
*/
|
|
52
|
+
export declare function invalidateCache(): void;
|
|
53
|
+
//# sourceMappingURL=agentMappingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentMappingService.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/agentMappingService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAqE7E;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAanF;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAGjE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7E;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU3F;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Mapping Service
|
|
4
|
+
*
|
|
5
|
+
* Maps A2A agent IDs (UUID v4) to internal project/agent identifiers.
|
|
6
|
+
* Provides bidirectional resolution and lazy generation of A2A IDs.
|
|
7
|
+
*
|
|
8
|
+
* Storage: ~/.claude-agent/a2a-agent-mappings.json (global registry)
|
|
9
|
+
* Format: { version: "1.0.0", mappings: { [a2aAgentId]: AgentMapping } }
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getOrCreateA2AId = getOrCreateA2AId;
|
|
16
|
+
exports.resolveA2AId = resolveA2AId;
|
|
17
|
+
exports.listAgentMappings = listAgentMappings;
|
|
18
|
+
exports.deleteAgentMapping = deleteAgentMapping;
|
|
19
|
+
exports.getA2AId = getA2AId;
|
|
20
|
+
exports.invalidateCache = invalidateCache;
|
|
21
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
22
|
+
const path_1 = __importDefault(require("path"));
|
|
23
|
+
const uuid_1 = require("uuid");
|
|
24
|
+
const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
|
|
25
|
+
const paths_js_1 = require("../../config/paths.js");
|
|
26
|
+
const MAPPINGS_FILE = paths_js_1.A2A_AGENT_MAPPINGS_FILE;
|
|
27
|
+
const LOCK_OPTIONS = {
|
|
28
|
+
retries: { retries: 5, minTimeout: 100, maxTimeout: 500 },
|
|
29
|
+
};
|
|
30
|
+
// In-memory cache for fast lookups
|
|
31
|
+
let cachedRegistry = null;
|
|
32
|
+
/**
|
|
33
|
+
* Load agent mapping registry from disk
|
|
34
|
+
* Uses in-memory cache if available and not explicitly bypassed
|
|
35
|
+
*/
|
|
36
|
+
async function loadRegistry(bypassCache = false) {
|
|
37
|
+
if (cachedRegistry && !bypassCache) {
|
|
38
|
+
return cachedRegistry;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const data = await promises_1.default.readFile(MAPPINGS_FILE, 'utf-8');
|
|
42
|
+
const registry = JSON.parse(data);
|
|
43
|
+
cachedRegistry = registry;
|
|
44
|
+
return registry;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// If file doesn't exist, return empty registry
|
|
48
|
+
if (error.code === 'ENOENT') {
|
|
49
|
+
const emptyRegistry = {
|
|
50
|
+
version: '1.0.0',
|
|
51
|
+
mappings: {},
|
|
52
|
+
};
|
|
53
|
+
cachedRegistry = emptyRegistry;
|
|
54
|
+
return emptyRegistry;
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Save agent mapping registry to disk with file locking
|
|
61
|
+
* Invalidates in-memory cache
|
|
62
|
+
*/
|
|
63
|
+
async function saveRegistry(registry) {
|
|
64
|
+
// Ensure directory exists
|
|
65
|
+
const dir = path_1.default.dirname(MAPPINGS_FILE);
|
|
66
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
67
|
+
// Check if file exists, if not create it first (for lockfile to work)
|
|
68
|
+
let fileExists = true;
|
|
69
|
+
try {
|
|
70
|
+
await promises_1.default.access(MAPPINGS_FILE);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
fileExists = false;
|
|
74
|
+
// Create empty file first so lockfile can work
|
|
75
|
+
await promises_1.default.writeFile(MAPPINGS_FILE, JSON.stringify({ version: '1.0.0', mappings: {} }, null, 2), 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
// Acquire lock for atomic write
|
|
78
|
+
const release = await proper_lockfile_1.default.lock(MAPPINGS_FILE, LOCK_OPTIONS);
|
|
79
|
+
try {
|
|
80
|
+
await promises_1.default.writeFile(MAPPINGS_FILE, JSON.stringify(registry, null, 2), 'utf-8');
|
|
81
|
+
cachedRegistry = registry;
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
await release();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get or create A2A agent ID for a project/agent combination
|
|
89
|
+
* Lazily generates UUID v4 on first request
|
|
90
|
+
*
|
|
91
|
+
* @param projectId - Internal project identifier
|
|
92
|
+
* @param agentType - Internal agent type identifier
|
|
93
|
+
* @param workingDirectory - Absolute path to project working directory
|
|
94
|
+
* @returns A2A agent ID (UUID v4)
|
|
95
|
+
*/
|
|
96
|
+
async function getOrCreateA2AId(projectId, agentType, workingDirectory) {
|
|
97
|
+
const registry = await loadRegistry();
|
|
98
|
+
// Check if mapping already exists
|
|
99
|
+
for (const [a2aAgentId, mapping] of Object.entries(registry.mappings)) {
|
|
100
|
+
if (mapping.projectId === projectId && mapping.agentType === agentType) {
|
|
101
|
+
// Update last accessed timestamp
|
|
102
|
+
mapping.lastAccessedAt = new Date().toISOString();
|
|
103
|
+
await saveRegistry(registry);
|
|
104
|
+
return a2aAgentId;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Create new mapping
|
|
108
|
+
const a2aAgentId = (0, uuid_1.v4)();
|
|
109
|
+
const now = new Date().toISOString();
|
|
110
|
+
const newMapping = {
|
|
111
|
+
a2aAgentId,
|
|
112
|
+
projectId,
|
|
113
|
+
agentType,
|
|
114
|
+
workingDirectory,
|
|
115
|
+
createdAt: now,
|
|
116
|
+
lastAccessedAt: now,
|
|
117
|
+
};
|
|
118
|
+
registry.mappings[a2aAgentId] = newMapping;
|
|
119
|
+
await saveRegistry(registry);
|
|
120
|
+
return a2aAgentId;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Resolve A2A agent ID to internal project/agent mapping
|
|
124
|
+
*
|
|
125
|
+
* @param a2aAgentId - A2A agent ID (UUID v4)
|
|
126
|
+
* @returns AgentMapping or null if not found
|
|
127
|
+
*/
|
|
128
|
+
async function resolveA2AId(a2aAgentId) {
|
|
129
|
+
const registry = await loadRegistry();
|
|
130
|
+
const mapping = registry.mappings[a2aAgentId];
|
|
131
|
+
if (!mapping) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
// Update last accessed timestamp
|
|
135
|
+
mapping.lastAccessedAt = new Date().toISOString();
|
|
136
|
+
await saveRegistry(registry);
|
|
137
|
+
return mapping;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* List all agent mappings
|
|
141
|
+
*
|
|
142
|
+
* @returns Array of all agent mappings
|
|
143
|
+
*/
|
|
144
|
+
async function listAgentMappings() {
|
|
145
|
+
const registry = await loadRegistry();
|
|
146
|
+
return Object.values(registry.mappings);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete agent mapping (used when project or agent is deleted)
|
|
150
|
+
*
|
|
151
|
+
* @param a2aAgentId - A2A agent ID to delete
|
|
152
|
+
* @returns true if deleted, false if not found
|
|
153
|
+
*/
|
|
154
|
+
async function deleteAgentMapping(a2aAgentId) {
|
|
155
|
+
const registry = await loadRegistry(true); // Bypass cache
|
|
156
|
+
if (!registry.mappings[a2aAgentId]) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
delete registry.mappings[a2aAgentId];
|
|
160
|
+
await saveRegistry(registry);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get A2A agent ID for a project/agent combination without creating
|
|
165
|
+
*
|
|
166
|
+
* @param projectId - Internal project identifier
|
|
167
|
+
* @param agentType - Internal agent type identifier
|
|
168
|
+
* @returns A2A agent ID or null if not found
|
|
169
|
+
*/
|
|
170
|
+
async function getA2AId(projectId, agentType) {
|
|
171
|
+
const registry = await loadRegistry();
|
|
172
|
+
for (const [a2aAgentId, mapping] of Object.entries(registry.mappings)) {
|
|
173
|
+
if (mapping.projectId === projectId && mapping.agentType === agentType) {
|
|
174
|
+
return a2aAgentId;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Invalidate in-memory cache (useful for testing)
|
|
181
|
+
*/
|
|
182
|
+
function invalidateCache() {
|
|
183
|
+
cachedRegistry = null;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=agentMappingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentMappingService.js","sourceRoot":"","sources":["../../../src/services/a2a/agentMappingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Service
|
|
3
|
+
*
|
|
4
|
+
* Manages inbound API keys for authenticating external callers to AgentStudio agents.
|
|
5
|
+
* Keys are stored hashed with bcryptjs (pure JavaScript, salt rounds 10) for security.
|
|
6
|
+
* Original keys are also encrypted with AES-256-GCM for display purposes.
|
|
7
|
+
*
|
|
8
|
+
* Storage: {projectPath}/.a2a/api-keys.json
|
|
9
|
+
* Format: { version: "1.0.0", keys: [A2AApiKey[]] }
|
|
10
|
+
*
|
|
11
|
+
* Key Format: agt_proj_{projectId}_{32-hex-chars}
|
|
12
|
+
*/
|
|
13
|
+
import type { A2AApiKey } from '../../types/a2a.js';
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new API key for a project
|
|
16
|
+
*
|
|
17
|
+
* @param projectId - Internal project identifier (can be a path)
|
|
18
|
+
* @param description - Human-readable description of the key
|
|
19
|
+
* @returns Object containing the generated key (plaintext, shown once) and key metadata
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateApiKey(projectId: string, description: string): Promise<{
|
|
22
|
+
key: string;
|
|
23
|
+
keyData: A2AApiKey;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Hash an API key using bcrypt
|
|
27
|
+
* This is a pure function used internally and for testing
|
|
28
|
+
*
|
|
29
|
+
* @param key - Plaintext API key
|
|
30
|
+
* @returns Bcrypt hash
|
|
31
|
+
*/
|
|
32
|
+
export declare function hashApiKey(key: string): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Validate an API key against project's stored hashes
|
|
35
|
+
*
|
|
36
|
+
* @param projectId - Internal project identifier
|
|
37
|
+
* @param key - Plaintext API key to validate
|
|
38
|
+
* @returns Object with validation result and key ID if valid
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateApiKey(projectId: string, key: string): Promise<{
|
|
41
|
+
valid: boolean;
|
|
42
|
+
keyId?: string;
|
|
43
|
+
keyData?: A2AApiKey;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Revoke an API key (soft delete - kept for audit trail)
|
|
47
|
+
*
|
|
48
|
+
* @param projectId - Internal project identifier
|
|
49
|
+
* @param keyId - Key ID to revoke
|
|
50
|
+
* @returns true if key was revoked, false if not found
|
|
51
|
+
*/
|
|
52
|
+
export declare function revokeApiKey(projectId: string, keyId: string): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* List all API keys for a project (excluding revoked keys by default)
|
|
55
|
+
*
|
|
56
|
+
* @param projectId - Internal project identifier
|
|
57
|
+
* @param includeRevoked - Whether to include revoked keys
|
|
58
|
+
* @returns Array of API key metadata (hashes only, never plaintext)
|
|
59
|
+
*/
|
|
60
|
+
export declare function listApiKeys(projectId: string, includeRevoked?: boolean): Promise<A2AApiKey[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Rotate an API key (generate new key and revoke old one)
|
|
63
|
+
*
|
|
64
|
+
* @param projectId - Internal project identifier
|
|
65
|
+
* @param oldKeyId - ID of key to rotate
|
|
66
|
+
* @param description - Description for new key
|
|
67
|
+
* @param gracePeriodMs - Grace period in milliseconds before revoking old key (default 5 minutes)
|
|
68
|
+
* @returns New key data
|
|
69
|
+
*/
|
|
70
|
+
export declare function rotateApiKey(projectId: string, oldKeyId: string, description: string, gracePeriodMs?: number): Promise<{
|
|
71
|
+
key: string;
|
|
72
|
+
keyData: A2AApiKey;
|
|
73
|
+
oldKeyId: string;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Get API key metadata by ID
|
|
77
|
+
*
|
|
78
|
+
* @param projectId - Internal project identifier
|
|
79
|
+
* @param keyId - Key ID
|
|
80
|
+
* @returns API key metadata or null if not found
|
|
81
|
+
*/
|
|
82
|
+
export declare function getApiKey(projectId: string, keyId: string): Promise<A2AApiKey | null>;
|
|
83
|
+
/**
|
|
84
|
+
* Get decrypted API key by ID
|
|
85
|
+
*
|
|
86
|
+
* @param projectId - Internal project identifier
|
|
87
|
+
* @param keyId - Key ID
|
|
88
|
+
* @returns Decrypted plaintext key or null if not found
|
|
89
|
+
*/
|
|
90
|
+
export declare function getDecryptedApiKey(projectId: string, keyId: string): Promise<string | null>;
|
|
91
|
+
/**
|
|
92
|
+
* List all API keys with decrypted values
|
|
93
|
+
*
|
|
94
|
+
* @param projectId - Internal project identifier
|
|
95
|
+
* @param includeRevoked - Whether to include revoked keys
|
|
96
|
+
* @returns Array of API keys with decrypted key values
|
|
97
|
+
*/
|
|
98
|
+
export declare function listApiKeysWithDecryption(projectId: string, includeRevoked?: boolean): Promise<Array<A2AApiKey & {
|
|
99
|
+
decryptedKey?: string;
|
|
100
|
+
}>>;
|
|
101
|
+
//# sourceMappingURL=apiKeyService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKeyService.d.ts","sourceRoot":"","sources":["../../../src/services/a2a/apiKeyService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAgIvE;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,CAkC9C;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CA2BlE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcrF;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAQjG;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,SAAgB,GAC5B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBhE;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAG3F;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMjG;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,cAAc,UAAQ,GACrB,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAOvD"}
|