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,711 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ProjectMetadataStorage = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const agentStorage_1 = require("./agentStorage");
|
|
41
|
+
const paths_js_1 = require("../config/paths.js");
|
|
42
|
+
class ProjectMetadataStorage {
|
|
43
|
+
metadataFilePath; // ~/.claude-agent/projects.json
|
|
44
|
+
projectsDir; // ~/.claude/projects/
|
|
45
|
+
claudeConfigPath; // ~/.claude.json
|
|
46
|
+
agentStorage;
|
|
47
|
+
metadataCache = null;
|
|
48
|
+
constructor() {
|
|
49
|
+
this.metadataFilePath = paths_js_1.PROJECTS_METADATA_FILE;
|
|
50
|
+
this.projectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
51
|
+
this.claudeConfigPath = path.join(os.homedir(), '.claude.json');
|
|
52
|
+
this.agentStorage = new agentStorage_1.AgentStorage();
|
|
53
|
+
// Ensure directories exist
|
|
54
|
+
this.ensureDirectoriesExist();
|
|
55
|
+
}
|
|
56
|
+
ensureDirectoriesExist() {
|
|
57
|
+
if (!fs.existsSync(paths_js_1.CLAUDE_AGENT_DIR)) {
|
|
58
|
+
fs.mkdirSync(paths_js_1.CLAUDE_AGENT_DIR, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
if (!fs.existsSync(this.projectsDir)) {
|
|
61
|
+
fs.mkdirSync(this.projectsDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load all metadata from the single JSON file
|
|
66
|
+
*/
|
|
67
|
+
loadMetadata() {
|
|
68
|
+
if (this.metadataCache) {
|
|
69
|
+
return this.metadataCache;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
if (fs.existsSync(this.metadataFilePath)) {
|
|
73
|
+
const content = fs.readFileSync(this.metadataFilePath, 'utf-8');
|
|
74
|
+
this.metadataCache = JSON.parse(content);
|
|
75
|
+
return this.metadataCache;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('Failed to load project metadata:', error);
|
|
80
|
+
}
|
|
81
|
+
// If file doesn't exist, try to migrate from old format
|
|
82
|
+
console.log('📦 Migrating project metadata from old format...');
|
|
83
|
+
this.metadataCache = this.migrateFromOldFormat();
|
|
84
|
+
// Save the migrated data
|
|
85
|
+
if (Object.keys(this.metadataCache).length > 0) {
|
|
86
|
+
this.saveMetadata(this.metadataCache);
|
|
87
|
+
console.log(`✅ Migrated ${Object.keys(this.metadataCache).length} projects`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.metadataCache = {};
|
|
91
|
+
}
|
|
92
|
+
return this.metadataCache;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Migrate from old format (~/.claude-agent/projects/*.json) to new format
|
|
96
|
+
*/
|
|
97
|
+
migrateFromOldFormat() {
|
|
98
|
+
const oldProjectsDir = path.join(path.dirname(this.metadataFilePath), 'projects');
|
|
99
|
+
const store = {};
|
|
100
|
+
if (!fs.existsSync(oldProjectsDir)) {
|
|
101
|
+
return store;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const files = fs.readdirSync(oldProjectsDir);
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
if (!file.endsWith('.json'))
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
const filePath = path.join(oldProjectsDir, file);
|
|
110
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
111
|
+
const metadata = JSON.parse(content);
|
|
112
|
+
// The old metadata.path points to ~/.claude/projects/{encoded-name}
|
|
113
|
+
// We need to extract the real project path from session files
|
|
114
|
+
const realPath = this.extractRealProjectPath(metadata.path);
|
|
115
|
+
if (realPath) {
|
|
116
|
+
// Update metadata with real path
|
|
117
|
+
metadata.path = realPath;
|
|
118
|
+
store[realPath] = metadata;
|
|
119
|
+
console.log(` ✓ Migrated: ${metadata.name} (${realPath})`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.warn(` ⚠ Could not find real path for ${metadata.name}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.warn(` ⚠ Failed to migrate ${file}:`, error);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('Failed to read old projects directory:', error);
|
|
132
|
+
}
|
|
133
|
+
return store;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Extract real project path from session files in ~/.claude/projects/
|
|
137
|
+
*/
|
|
138
|
+
extractRealProjectPath(claudeProjectDir) {
|
|
139
|
+
try {
|
|
140
|
+
if (!fs.existsSync(claudeProjectDir)) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
// Find all jsonl files in the project directory
|
|
144
|
+
const files = fs.readdirSync(claudeProjectDir).filter(file => file.endsWith('.jsonl'));
|
|
145
|
+
for (const file of files) {
|
|
146
|
+
try {
|
|
147
|
+
const filePath = path.join(claudeProjectDir, file);
|
|
148
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
149
|
+
const firstLine = content.split('\n')[0];
|
|
150
|
+
if (firstLine) {
|
|
151
|
+
const message = JSON.parse(firstLine);
|
|
152
|
+
if (message.cwd) {
|
|
153
|
+
return message.cwd;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Skip this file and try the next one
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Directory doesn't exist or can't be read
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Save all metadata to the single JSON file
|
|
170
|
+
*/
|
|
171
|
+
saveMetadata(metadata) {
|
|
172
|
+
try {
|
|
173
|
+
fs.writeFileSync(this.metadataFilePath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
174
|
+
this.metadataCache = metadata;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error('Failed to save project metadata:', error);
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Read all project paths from ~/.claude.json
|
|
183
|
+
*/
|
|
184
|
+
getClaudeProjects() {
|
|
185
|
+
try {
|
|
186
|
+
if (fs.existsSync(this.claudeConfigPath)) {
|
|
187
|
+
const content = fs.readFileSync(this.claudeConfigPath, 'utf-8');
|
|
188
|
+
const config = JSON.parse(content);
|
|
189
|
+
if (config.projects && typeof config.projects === 'object') {
|
|
190
|
+
return Object.keys(config.projects);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
console.error('Failed to read Claude config:', error);
|
|
196
|
+
}
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get or create metadata for a project path
|
|
201
|
+
*/
|
|
202
|
+
getOrCreateMetadataForPath(projectPath) {
|
|
203
|
+
const allMetadata = this.loadMetadata();
|
|
204
|
+
// Check if metadata exists for this path
|
|
205
|
+
if (allMetadata[projectPath]) {
|
|
206
|
+
const existing = allMetadata[projectPath];
|
|
207
|
+
let shouldUpdate = false;
|
|
208
|
+
// Always get fresh timestamps to compare with stored ones
|
|
209
|
+
const timestamps = this.getProjectTimestamps(projectPath);
|
|
210
|
+
// Check if we need to refresh timestamps
|
|
211
|
+
const refreshConditions = [
|
|
212
|
+
// Condition 1: Migration artifacts (same timestamps)
|
|
213
|
+
existing.createdAt === existing.lastAccessed,
|
|
214
|
+
// Condition 2: Session directory is newer than stored lastAccessed
|
|
215
|
+
(() => {
|
|
216
|
+
const sessionDirPath = this.findClaudeSessionDir(projectPath);
|
|
217
|
+
if (sessionDirPath && fs.existsSync(sessionDirPath)) {
|
|
218
|
+
const sessionStats = fs.statSync(sessionDirPath);
|
|
219
|
+
const sessionTime = new Date(sessionStats.mtime).getTime();
|
|
220
|
+
const storedTime = new Date(existing.lastAccessed).getTime();
|
|
221
|
+
return sessionTime > storedTime + 60000; // More than 1 minute newer
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
})(),
|
|
225
|
+
// Condition 3: Creation time looks wrong (much older than reasonable)
|
|
226
|
+
(() => {
|
|
227
|
+
const storedCreatedTime = new Date(existing.createdAt).getTime();
|
|
228
|
+
const filesystemCreatedTime = new Date(timestamps.createdAt).getTime();
|
|
229
|
+
const timeDiff = Math.abs(storedCreatedTime - filesystemCreatedTime);
|
|
230
|
+
return timeDiff > 24 * 60 * 60 * 1000; // More than 1 day difference
|
|
231
|
+
})()
|
|
232
|
+
];
|
|
233
|
+
shouldUpdate = refreshConditions.some(condition => condition);
|
|
234
|
+
if (shouldUpdate) {
|
|
235
|
+
// Only update if we got better timestamps (not current time)
|
|
236
|
+
const now = new Date();
|
|
237
|
+
const timestampDate = new Date(timestamps.createdAt);
|
|
238
|
+
const timeDiff = Math.abs(now.getTime() - timestampDate.getTime());
|
|
239
|
+
// If timestamp is more than 1 minute old, it's likely from filesystem
|
|
240
|
+
if (timeDiff > 60000) {
|
|
241
|
+
existing.createdAt = timestamps.createdAt;
|
|
242
|
+
existing.lastAccessed = timestamps.lastAccessed;
|
|
243
|
+
allMetadata[projectPath] = existing;
|
|
244
|
+
this.saveMetadata(allMetadata);
|
|
245
|
+
console.log(`🔄 Refreshed timestamps for: ${projectPath}`);
|
|
246
|
+
console.log(` Created: ${existing.createdAt}`);
|
|
247
|
+
console.log(` Accessed: ${existing.lastAccessed}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return existing;
|
|
251
|
+
}
|
|
252
|
+
// Create new metadata if not found
|
|
253
|
+
// Try to get real timestamps from filesystem
|
|
254
|
+
const timestamps = this.getProjectTimestamps(projectPath);
|
|
255
|
+
const metadataId = `project_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
256
|
+
const metadata = {
|
|
257
|
+
id: metadataId,
|
|
258
|
+
name: path.basename(projectPath),
|
|
259
|
+
description: '',
|
|
260
|
+
path: projectPath,
|
|
261
|
+
createdAt: timestamps.createdAt,
|
|
262
|
+
lastAccessed: timestamps.lastAccessed,
|
|
263
|
+
agents: {},
|
|
264
|
+
defaultAgent: '',
|
|
265
|
+
skills: {},
|
|
266
|
+
tags: [],
|
|
267
|
+
metadata: {}
|
|
268
|
+
};
|
|
269
|
+
// Save to store
|
|
270
|
+
allMetadata[projectPath] = metadata;
|
|
271
|
+
this.saveMetadata(allMetadata);
|
|
272
|
+
return metadata;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get project timestamps from filesystem
|
|
276
|
+
*/
|
|
277
|
+
getProjectTimestamps(projectPath) {
|
|
278
|
+
const now = new Date().toISOString();
|
|
279
|
+
let createdAt = now;
|
|
280
|
+
let lastAccessed = now;
|
|
281
|
+
try {
|
|
282
|
+
// Strategy 1: Try to get last accessed time from Claude sessions directory FIRST
|
|
283
|
+
// This is the most accurate for when the project was actually used
|
|
284
|
+
const sessionDirPath = this.findClaudeSessionDir(projectPath);
|
|
285
|
+
if (sessionDirPath && fs.existsSync(sessionDirPath)) {
|
|
286
|
+
const sessionStats = fs.statSync(sessionDirPath);
|
|
287
|
+
lastAccessed = sessionStats.mtime.toISOString();
|
|
288
|
+
}
|
|
289
|
+
// Strategy 2: Try to get creation time from real project directory
|
|
290
|
+
if (fs.existsSync(projectPath)) {
|
|
291
|
+
const stats = fs.statSync(projectPath);
|
|
292
|
+
createdAt = stats.birthtime.toISOString();
|
|
293
|
+
// Only use project directory mtime if we don't have session time
|
|
294
|
+
if (lastAccessed === now) {
|
|
295
|
+
lastAccessed = stats.mtime.toISOString();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// Strategy 3: If project directory doesn't exist, try parent directory
|
|
300
|
+
// This helps for projects that were deleted but still exist in ~/.claude.json
|
|
301
|
+
const parentDir = path.dirname(projectPath);
|
|
302
|
+
if (fs.existsSync(parentDir)) {
|
|
303
|
+
const parentStats = fs.statSync(parentDir);
|
|
304
|
+
createdAt = parentStats.birthtime.toISOString();
|
|
305
|
+
// Only use parent directory mtime if we don't have session time
|
|
306
|
+
if (lastAccessed === now) {
|
|
307
|
+
lastAccessed = parentStats.mtime.toISOString();
|
|
308
|
+
}
|
|
309
|
+
console.log(`📁 Using parent directory timestamps for missing project: ${projectPath}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
console.warn(`Failed to get timestamps for ${projectPath}:`, error);
|
|
315
|
+
}
|
|
316
|
+
return { createdAt, lastAccessed };
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Find the Claude session directory for a project path
|
|
320
|
+
*/
|
|
321
|
+
findClaudeSessionDir(projectPath) {
|
|
322
|
+
try {
|
|
323
|
+
// The session directory name is the encoded project path
|
|
324
|
+
// For example: /Users/kongjie/projects -> -Users-kongjie-projects
|
|
325
|
+
const encoded = projectPath.replace(/\//g, '-');
|
|
326
|
+
const sessionDir = path.join(this.projectsDir, encoded);
|
|
327
|
+
if (fs.existsSync(sessionDir)) {
|
|
328
|
+
return sessionDir;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
// Ignore errors
|
|
333
|
+
}
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get all projects by reading from both ~/.claude.json and AgentStudio metadata
|
|
338
|
+
*/
|
|
339
|
+
getAllProjects() {
|
|
340
|
+
const claudeProjectPaths = this.getClaudeProjects();
|
|
341
|
+
const allMetadata = this.loadMetadata();
|
|
342
|
+
const projects = [];
|
|
343
|
+
const processedPaths = new Set();
|
|
344
|
+
// First, process projects from Claude config (active projects)
|
|
345
|
+
for (const projectPath of claudeProjectPaths) {
|
|
346
|
+
try {
|
|
347
|
+
// Get or create metadata for this project
|
|
348
|
+
const metadata = this.getOrCreateMetadataForPath(projectPath);
|
|
349
|
+
// Enrich with agent info
|
|
350
|
+
const enriched = this.enrichProjectWithAgentInfo(metadata);
|
|
351
|
+
projects.push(enriched);
|
|
352
|
+
processedPaths.add(projectPath);
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error(`Failed to process project ${projectPath}:`, error);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Then, process projects that only exist in AgentStudio metadata (created but not yet used)
|
|
359
|
+
for (const projectPath of Object.keys(allMetadata)) {
|
|
360
|
+
if (!processedPaths.has(projectPath)) {
|
|
361
|
+
try {
|
|
362
|
+
const metadata = allMetadata[projectPath];
|
|
363
|
+
// Only include if the project has agents associated (active projects)
|
|
364
|
+
if (Object.keys(metadata.agents).length > 0) {
|
|
365
|
+
const enriched = this.enrichProjectWithAgentInfo(metadata);
|
|
366
|
+
projects.push(enriched);
|
|
367
|
+
console.log(`📋 Added AgentStudio-only project: ${metadata.name}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
console.error(`Failed to process AgentStudio project ${projectPath}:`, error);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return projects.sort((a, b) => new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime());
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Get project metadata by path
|
|
379
|
+
*/
|
|
380
|
+
getProjectMetadata(projectPath) {
|
|
381
|
+
const allMetadata = this.loadMetadata();
|
|
382
|
+
return allMetadata[projectPath] || null;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Save project metadata for a specific path
|
|
386
|
+
*/
|
|
387
|
+
saveProjectMetadata(projectPath, metadata) {
|
|
388
|
+
const allMetadata = this.loadMetadata();
|
|
389
|
+
allMetadata[projectPath] = metadata;
|
|
390
|
+
this.saveMetadata(allMetadata);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Get project directory last modified time from filesystem by path
|
|
394
|
+
*/
|
|
395
|
+
getProjectLastModifiedByPath(projectPath, metadata) {
|
|
396
|
+
try {
|
|
397
|
+
// Priority 1: Use session directory time (most accurate for last activity)
|
|
398
|
+
const sessionDirPath = this.findClaudeSessionDir(projectPath);
|
|
399
|
+
if (sessionDirPath && fs.existsSync(sessionDirPath)) {
|
|
400
|
+
const sessionStats = fs.statSync(sessionDirPath);
|
|
401
|
+
return sessionStats.mtime.toISOString();
|
|
402
|
+
}
|
|
403
|
+
// Priority 2: Use project directory time
|
|
404
|
+
if (fs.existsSync(projectPath)) {
|
|
405
|
+
const stats = fs.statSync(projectPath);
|
|
406
|
+
return stats.mtime.toISOString();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
console.warn(`Failed to get filesystem time for project ${projectPath}:`, error);
|
|
411
|
+
}
|
|
412
|
+
// Fallback to metadata lastAccessed if filesystem time is unavailable
|
|
413
|
+
return metadata.lastAccessed;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Enrich project metadata with agent information
|
|
417
|
+
*/
|
|
418
|
+
enrichProjectWithAgentInfo(metadata) {
|
|
419
|
+
const enabledAgents = Object.keys(metadata.agents).filter(agentId => metadata.agents[agentId].enabled);
|
|
420
|
+
// Get default agent info
|
|
421
|
+
let defaultAgent = metadata.defaultAgent;
|
|
422
|
+
let defaultAgentName = '';
|
|
423
|
+
let defaultAgentIcon = '';
|
|
424
|
+
if (defaultAgent && metadata.agents[defaultAgent]?.enabled) {
|
|
425
|
+
const agent = this.agentStorage.getAgent(defaultAgent);
|
|
426
|
+
if (agent) {
|
|
427
|
+
defaultAgentName = agent.name;
|
|
428
|
+
defaultAgentIcon = agent.ui.icon;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else if (enabledAgents.length > 0) {
|
|
432
|
+
// Use the most recently used agent as default
|
|
433
|
+
defaultAgent = enabledAgents.reduce((latest, agentId) => {
|
|
434
|
+
const latestTime = metadata.agents[latest]?.lastUsed || '';
|
|
435
|
+
const currentTime = metadata.agents[agentId]?.lastUsed || '';
|
|
436
|
+
return currentTime > latestTime ? agentId : latest;
|
|
437
|
+
}, enabledAgents[0]);
|
|
438
|
+
const agent = this.agentStorage.getAgent(defaultAgent);
|
|
439
|
+
if (agent) {
|
|
440
|
+
defaultAgentName = agent.name;
|
|
441
|
+
defaultAgentIcon = agent.ui.icon;
|
|
442
|
+
// Update metadata with new default
|
|
443
|
+
metadata.defaultAgent = defaultAgent;
|
|
444
|
+
const allMetadata = this.loadMetadata();
|
|
445
|
+
allMetadata[metadata.path] = metadata;
|
|
446
|
+
this.saveMetadata(allMetadata);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
// No agents assigned, use claude-code as default fallback
|
|
451
|
+
const fallbackAgent = this.agentStorage.getAgent('claude-code');
|
|
452
|
+
if (fallbackAgent && fallbackAgent.enabled) {
|
|
453
|
+
defaultAgent = 'claude-code';
|
|
454
|
+
defaultAgentName = fallbackAgent.name;
|
|
455
|
+
defaultAgentIcon = fallbackAgent.ui.icon;
|
|
456
|
+
console.log(`📋 Using fallback agent (claude-code) for project: ${metadata.name}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// Use the path from metadata (which is the real project path)
|
|
460
|
+
const projectPath = metadata.path;
|
|
461
|
+
// Get actual last modified time from filesystem
|
|
462
|
+
const lastAccessed = this.getProjectLastModifiedByPath(projectPath, metadata);
|
|
463
|
+
// Extract directory name from path for compatibility
|
|
464
|
+
const dirName = path.basename(projectPath);
|
|
465
|
+
return {
|
|
466
|
+
id: metadata.id,
|
|
467
|
+
name: metadata.name,
|
|
468
|
+
dirName,
|
|
469
|
+
path: projectPath,
|
|
470
|
+
realPath: projectPath,
|
|
471
|
+
description: metadata.description,
|
|
472
|
+
createdAt: metadata.createdAt,
|
|
473
|
+
lastAccessed: lastAccessed,
|
|
474
|
+
agents: enabledAgents,
|
|
475
|
+
defaultAgent,
|
|
476
|
+
defaultAgentName,
|
|
477
|
+
defaultAgentIcon,
|
|
478
|
+
tags: metadata.tags,
|
|
479
|
+
metadata: metadata.metadata
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Add an agent to a project
|
|
484
|
+
*/
|
|
485
|
+
addAgentToProject(projectPath, agentId) {
|
|
486
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
487
|
+
if (!metadata)
|
|
488
|
+
return;
|
|
489
|
+
const now = new Date().toISOString();
|
|
490
|
+
if (!metadata.agents[agentId]) {
|
|
491
|
+
metadata.agents[agentId] = {
|
|
492
|
+
enabled: true,
|
|
493
|
+
lastUsed: now,
|
|
494
|
+
sessionCount: 0,
|
|
495
|
+
customConfig: {}
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
metadata.agents[agentId].enabled = true;
|
|
500
|
+
metadata.agents[agentId].lastUsed = now;
|
|
501
|
+
}
|
|
502
|
+
// Set as default if no default agent exists
|
|
503
|
+
if (!metadata.defaultAgent) {
|
|
504
|
+
metadata.defaultAgent = agentId;
|
|
505
|
+
}
|
|
506
|
+
metadata.lastAccessed = now;
|
|
507
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Remove an agent from a project
|
|
511
|
+
*/
|
|
512
|
+
removeAgentFromProject(projectPath, agentId) {
|
|
513
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
514
|
+
if (!metadata)
|
|
515
|
+
return;
|
|
516
|
+
if (metadata.agents[agentId]) {
|
|
517
|
+
metadata.agents[agentId].enabled = false;
|
|
518
|
+
// If this was the default agent, find a new default
|
|
519
|
+
if (metadata.defaultAgent === agentId) {
|
|
520
|
+
const enabledAgents = Object.keys(metadata.agents).filter(id => id !== agentId && metadata.agents[id].enabled);
|
|
521
|
+
metadata.defaultAgent = enabledAgents.length > 0 ? enabledAgents[0] : '';
|
|
522
|
+
}
|
|
523
|
+
metadata.lastAccessed = new Date().toISOString();
|
|
524
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Set default agent for a project
|
|
529
|
+
*/
|
|
530
|
+
setDefaultAgent(projectPath, agentId) {
|
|
531
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
532
|
+
if (!metadata)
|
|
533
|
+
return;
|
|
534
|
+
// Ensure the agent is enabled for this project
|
|
535
|
+
if (!metadata.agents[agentId]) {
|
|
536
|
+
this.addAgentToProject(projectPath, agentId);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
if (metadata.agents[agentId].enabled) {
|
|
540
|
+
metadata.defaultAgent = agentId;
|
|
541
|
+
metadata.lastAccessed = new Date().toISOString();
|
|
542
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Update project tags
|
|
547
|
+
*/
|
|
548
|
+
updateProjectTags(projectPath, tags) {
|
|
549
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
550
|
+
if (!metadata)
|
|
551
|
+
return;
|
|
552
|
+
metadata.tags = tags;
|
|
553
|
+
metadata.lastAccessed = new Date().toISOString();
|
|
554
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Update project custom metadata
|
|
558
|
+
*/
|
|
559
|
+
updateProjectMetadata(projectPath, customMetadata) {
|
|
560
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
561
|
+
if (!metadata)
|
|
562
|
+
return;
|
|
563
|
+
metadata.metadata = { ...metadata.metadata, ...customMetadata };
|
|
564
|
+
metadata.lastAccessed = new Date().toISOString();
|
|
565
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Update project basic info
|
|
569
|
+
*/
|
|
570
|
+
updateProjectInfo(projectPath, updates) {
|
|
571
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
572
|
+
if (!metadata)
|
|
573
|
+
return;
|
|
574
|
+
if (updates.name !== undefined) {
|
|
575
|
+
metadata.name = updates.name;
|
|
576
|
+
}
|
|
577
|
+
if (updates.description !== undefined) {
|
|
578
|
+
metadata.description = updates.description;
|
|
579
|
+
}
|
|
580
|
+
metadata.lastAccessed = new Date().toISOString();
|
|
581
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Record agent usage for a project
|
|
585
|
+
*/
|
|
586
|
+
recordAgentUsage(projectPath, agentId) {
|
|
587
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
588
|
+
if (!metadata)
|
|
589
|
+
return;
|
|
590
|
+
const now = new Date().toISOString();
|
|
591
|
+
if (!metadata.agents[agentId]) {
|
|
592
|
+
metadata.agents[agentId] = {
|
|
593
|
+
enabled: true,
|
|
594
|
+
lastUsed: now,
|
|
595
|
+
sessionCount: 1,
|
|
596
|
+
customConfig: {}
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
metadata.agents[agentId].lastUsed = now;
|
|
601
|
+
metadata.agents[agentId].sessionCount += 1;
|
|
602
|
+
metadata.agents[agentId].enabled = true;
|
|
603
|
+
}
|
|
604
|
+
// Update default agent to the most recently used
|
|
605
|
+
metadata.defaultAgent = agentId;
|
|
606
|
+
metadata.lastAccessed = now;
|
|
607
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Create a new project metadata entry
|
|
611
|
+
* @param projectPath The real project path (can be anywhere on the filesystem)
|
|
612
|
+
* @param initialData Initial project data including name, description, agentId, etc.
|
|
613
|
+
*/
|
|
614
|
+
createProject(projectPath, initialData) {
|
|
615
|
+
const now = new Date().toISOString();
|
|
616
|
+
// Generate a unique metadata ID
|
|
617
|
+
const metadataId = `project_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
618
|
+
const metadata = {
|
|
619
|
+
id: metadataId,
|
|
620
|
+
name: initialData.name || path.basename(projectPath),
|
|
621
|
+
description: initialData.description || '',
|
|
622
|
+
path: projectPath, // Store the real project path
|
|
623
|
+
createdAt: now,
|
|
624
|
+
lastAccessed: now,
|
|
625
|
+
agents: {},
|
|
626
|
+
defaultAgent: '',
|
|
627
|
+
skills: {},
|
|
628
|
+
tags: initialData.tags || [],
|
|
629
|
+
metadata: initialData.metadata || {}
|
|
630
|
+
};
|
|
631
|
+
// Add initial agent if specified
|
|
632
|
+
if (initialData.agentId) {
|
|
633
|
+
metadata.agents[initialData.agentId] = {
|
|
634
|
+
enabled: true,
|
|
635
|
+
lastUsed: now,
|
|
636
|
+
sessionCount: 0,
|
|
637
|
+
customConfig: {}
|
|
638
|
+
};
|
|
639
|
+
metadata.defaultAgent = initialData.agentId;
|
|
640
|
+
}
|
|
641
|
+
// Save metadata
|
|
642
|
+
this.saveProjectMetadata(projectPath, metadata);
|
|
643
|
+
return metadata;
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Delete a project (remove metadata, claude config entry, and session directory)
|
|
647
|
+
*/
|
|
648
|
+
deleteProject(projectPath) {
|
|
649
|
+
try {
|
|
650
|
+
let deletedSomething = false;
|
|
651
|
+
// 1. Delete from AgentStudio metadata
|
|
652
|
+
const allMetadata = this.loadMetadata();
|
|
653
|
+
if (allMetadata[projectPath]) {
|
|
654
|
+
delete allMetadata[projectPath];
|
|
655
|
+
this.saveMetadata(allMetadata);
|
|
656
|
+
deletedSomething = true;
|
|
657
|
+
console.log(`🗑️ Removed project metadata: ${projectPath}`);
|
|
658
|
+
}
|
|
659
|
+
// 2. Remove from Claude's config file (~/.claude.json)
|
|
660
|
+
try {
|
|
661
|
+
if (fs.existsSync(this.claudeConfigPath)) {
|
|
662
|
+
const content = fs.readFileSync(this.claudeConfigPath, 'utf-8');
|
|
663
|
+
const config = JSON.parse(content);
|
|
664
|
+
if (config.projects && config.projects[projectPath]) {
|
|
665
|
+
delete config.projects[projectPath];
|
|
666
|
+
fs.writeFileSync(this.claudeConfigPath, JSON.stringify(config, null, 2));
|
|
667
|
+
deletedSomething = true;
|
|
668
|
+
console.log(`🗑️ Removed from Claude config: ${projectPath}`);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
catch (error) {
|
|
673
|
+
console.warn(`Failed to remove from Claude config:`, error);
|
|
674
|
+
}
|
|
675
|
+
// 3. Remove Claude session directory
|
|
676
|
+
try {
|
|
677
|
+
const sessionDirPath = this.findClaudeSessionDir(projectPath);
|
|
678
|
+
if (sessionDirPath && fs.existsSync(sessionDirPath)) {
|
|
679
|
+
fs.rmSync(sessionDirPath, { recursive: true, force: true });
|
|
680
|
+
deletedSomething = true;
|
|
681
|
+
console.log(`🗑️ Removed session directory: ${sessionDirPath}`);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
catch (error) {
|
|
685
|
+
console.warn(`Failed to remove session directory:`, error);
|
|
686
|
+
}
|
|
687
|
+
return deletedSomething;
|
|
688
|
+
}
|
|
689
|
+
catch (error) {
|
|
690
|
+
console.error(`Failed to delete project ${projectPath}:`, error);
|
|
691
|
+
return false;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Get project by path
|
|
696
|
+
*/
|
|
697
|
+
getProject(projectPath) {
|
|
698
|
+
try {
|
|
699
|
+
const metadata = this.getProjectMetadata(projectPath);
|
|
700
|
+
if (!metadata)
|
|
701
|
+
return null;
|
|
702
|
+
return this.enrichProjectWithAgentInfo(metadata);
|
|
703
|
+
}
|
|
704
|
+
catch (error) {
|
|
705
|
+
console.error(`Failed to get project ${projectPath}:`, error);
|
|
706
|
+
return null;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
exports.ProjectMetadataStorage = ProjectMetadataStorage;
|
|
711
|
+
//# sourceMappingURL=projectMetadataStorage.js.map
|