@octo-cyber/ai 0.5.4 → 0.5.6
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/dist/shared/IClaudeCodeSessionManager.d.ts +151 -0
- package/dist/shared/IClaudeCodeSessionManager.d.ts.map +1 -0
- package/dist/shared/IClaudeCodeSessionManager.js +6 -0
- package/dist/shared/IClaudeCodeSessionManager.js.map +1 -0
- package/dist/src/BranchDecisionEngine.d.ts +73 -0
- package/dist/src/BranchDecisionEngine.d.ts.map +1 -0
- package/dist/src/BranchDecisionEngine.js +195 -0
- package/dist/src/BranchDecisionEngine.js.map +1 -0
- package/dist/src/agent/agent-approval.controller.d.ts +20 -0
- package/dist/src/agent/agent-approval.controller.d.ts.map +1 -0
- package/dist/src/agent/agent-approval.controller.js +101 -0
- package/dist/src/agent/agent-approval.controller.js.map +1 -0
- package/dist/src/agent/agent-approval.entity.d.ts +15 -0
- package/dist/src/agent/agent-approval.entity.d.ts.map +1 -0
- package/dist/src/agent/agent-approval.entity.js +63 -0
- package/dist/src/agent/agent-approval.entity.js.map +1 -0
- package/dist/src/agent/agent-approval.service.d.ts +35 -0
- package/dist/src/agent/agent-approval.service.d.ts.map +1 -0
- package/dist/src/agent/agent-approval.service.js +109 -0
- package/dist/src/agent/agent-approval.service.js.map +1 -0
- package/dist/src/agent/agent-gateway.controller.d.ts +30 -0
- package/dist/src/agent/agent-gateway.controller.d.ts.map +1 -0
- package/dist/src/agent/agent-gateway.controller.js +112 -0
- package/dist/src/agent/agent-gateway.controller.js.map +1 -0
- package/dist/src/agent/agent-gateway.service.d.ts +33 -0
- package/dist/src/agent/agent-gateway.service.d.ts.map +1 -0
- package/dist/src/agent/agent-gateway.service.js +84 -0
- package/dist/src/agent/agent-gateway.service.js.map +1 -0
- package/dist/src/agent/agent-registry.service.d.ts +30 -0
- package/dist/src/agent/agent-registry.service.d.ts.map +1 -0
- package/dist/src/agent/agent-registry.service.js +45 -0
- package/dist/src/agent/agent-registry.service.js.map +1 -0
- package/dist/src/agent/agent-run.controller.d.ts +42 -0
- package/dist/src/agent/agent-run.controller.d.ts.map +1 -0
- package/dist/src/agent/agent-run.controller.js +195 -0
- package/dist/src/agent/agent-run.controller.js.map +1 -0
- package/dist/src/agent/agent-run.entity.d.ts +35 -0
- package/dist/src/agent/agent-run.entity.d.ts.map +1 -0
- package/dist/src/agent/agent-run.entity.js +98 -0
- package/dist/src/agent/agent-run.entity.js.map +1 -0
- package/dist/src/agent/agent-run.service.d.ts +48 -0
- package/dist/src/agent/agent-run.service.d.ts.map +1 -0
- package/dist/src/agent/agent-run.service.js +155 -0
- package/dist/src/agent/agent-run.service.js.map +1 -0
- package/dist/src/agent/agent-session.controller.d.ts +20 -0
- package/dist/src/agent/agent-session.controller.d.ts.map +1 -0
- package/dist/src/agent/agent-session.controller.js +97 -0
- package/dist/src/agent/agent-session.controller.js.map +1 -0
- package/dist/src/agent/agent-session.entity.d.ts +13 -0
- package/dist/src/agent/agent-session.entity.d.ts.map +1 -0
- package/dist/src/agent/agent-session.entity.js +57 -0
- package/dist/src/agent/agent-session.entity.js.map +1 -0
- package/dist/src/agent/agent-session.service.d.ts +38 -0
- package/dist/src/agent/agent-session.service.d.ts.map +1 -0
- package/dist/src/agent/agent-session.service.js +112 -0
- package/dist/src/agent/agent-session.service.js.map +1 -0
- package/dist/src/agent/coding-tools.d.ts +7 -0
- package/dist/src/agent/coding-tools.d.ts.map +1 -0
- package/dist/src/agent/coding-tools.js +181 -0
- package/dist/src/agent/coding-tools.js.map +1 -0
- package/dist/src/agent/computer-use-tools.d.ts +15 -0
- package/dist/src/agent/computer-use-tools.d.ts.map +1 -0
- package/dist/src/agent/computer-use-tools.js +256 -0
- package/dist/src/agent/computer-use-tools.js.map +1 -0
- package/dist/src/agent/external-agent.controller.d.ts +41 -0
- package/dist/src/agent/external-agent.controller.d.ts.map +1 -0
- package/dist/src/agent/external-agent.controller.js +129 -0
- package/dist/src/agent/external-agent.controller.js.map +1 -0
- package/dist/src/agent/external-agent.entity.d.ts +22 -0
- package/dist/src/agent/external-agent.entity.d.ts.map +1 -0
- package/dist/src/agent/external-agent.entity.js +75 -0
- package/dist/src/agent/external-agent.entity.js.map +1 -0
- package/dist/src/agent/external-agent.service.d.ts +60 -0
- package/dist/src/agent/external-agent.service.d.ts.map +1 -0
- package/dist/src/agent/external-agent.service.js +143 -0
- package/dist/src/agent/external-agent.service.js.map +1 -0
- package/dist/src/ai.module.d.ts +22 -0
- package/dist/src/ai.module.d.ts.map +1 -0
- package/dist/src/ai.module.js +178 -0
- package/dist/src/ai.module.js.map +1 -0
- package/dist/{cli → src/cli}/adapters/antigravity.adapter.d.ts +2 -0
- package/dist/src/cli/adapters/antigravity.adapter.d.ts.map +1 -0
- package/dist/{cli → src/cli}/adapters/antigravity.adapter.js +78 -0
- package/dist/src/cli/adapters/antigravity.adapter.js.map +1 -0
- package/dist/src/cli/adapters/claude-cli.adapter.d.ts.map +1 -0
- package/dist/{cli → src/cli}/adapters/claude-cli.adapter.js +2 -0
- package/dist/src/cli/adapters/claude-cli.adapter.js.map +1 -0
- package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts +32 -0
- package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts.map +1 -0
- package/dist/src/cli/adapters/cli-proxy-api.adapter.js +239 -0
- package/dist/src/cli/adapters/cli-proxy-api.adapter.js.map +1 -0
- package/dist/src/cli/adapters/codex-cli.adapter.d.ts.map +1 -0
- package/dist/src/cli/adapters/codex-cli.adapter.js.map +1 -0
- package/dist/src/cli/adapters/detect-cli.d.ts.map +1 -0
- package/dist/src/cli/adapters/detect-cli.js.map +1 -0
- package/dist/src/cli/adapters/gemini-cli.adapter.d.ts.map +1 -0
- package/dist/src/cli/adapters/gemini-cli.adapter.js.map +1 -0
- package/dist/src/cli/adapters/index.d.ts.map +1 -0
- package/dist/src/cli/adapters/index.js.map +1 -0
- package/dist/{cli → src/cli}/cli-executor.service.d.ts +2 -0
- package/dist/src/cli/cli-executor.service.d.ts.map +1 -0
- package/dist/{cli → src/cli}/cli-executor.service.js +21 -1
- package/dist/src/cli/cli-executor.service.js.map +1 -0
- package/dist/src/cli/cli-registry.service.d.ts.map +1 -0
- package/dist/{cli → src/cli}/cli-registry.service.js +3 -1
- package/dist/src/cli/cli-registry.service.js.map +1 -0
- package/dist/{cli → src/cli}/controllers/ai-cli.controller.d.ts +4 -0
- package/dist/src/cli/controllers/ai-cli.controller.d.ts.map +1 -0
- package/dist/{cli → src/cli}/controllers/ai-cli.controller.js +33 -4
- package/dist/src/cli/controllers/ai-cli.controller.js.map +1 -0
- package/dist/{cli → src/cli}/index.d.ts +1 -1
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/{cli → src/cli}/types.d.ts +23 -1
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/{skill → src/cli}/types.js.map +1 -1
- package/dist/{cli → src/cli}/workspace.service.d.ts +11 -3
- package/dist/src/cli/workspace.service.d.ts.map +1 -0
- package/dist/{cli → src/cli}/workspace.service.js +61 -6
- package/dist/src/cli/workspace.service.js.map +1 -0
- package/dist/src/computer-use/computer-use.controller.d.ts +23 -0
- package/dist/src/computer-use/computer-use.controller.d.ts.map +1 -0
- package/dist/src/computer-use/computer-use.controller.js +87 -0
- package/dist/src/computer-use/computer-use.controller.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +51 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/orchestrator/orchestrator-plan.entity.d.ts +31 -0
- package/dist/src/orchestrator/orchestrator-plan.entity.d.ts.map +1 -0
- package/dist/src/orchestrator/orchestrator-plan.entity.js +69 -0
- package/dist/src/orchestrator/orchestrator-plan.entity.js.map +1 -0
- package/dist/src/orchestrator/orchestrator-plan.service.d.ts +27 -0
- package/dist/src/orchestrator/orchestrator-plan.service.d.ts.map +1 -0
- package/dist/src/orchestrator/orchestrator-plan.service.js +201 -0
- package/dist/src/orchestrator/orchestrator-plan.service.js.map +1 -0
- package/dist/src/orchestrator/orchestrator.controller.d.ts +29 -0
- package/dist/src/orchestrator/orchestrator.controller.d.ts.map +1 -0
- package/dist/src/orchestrator/orchestrator.controller.js +144 -0
- package/dist/src/orchestrator/orchestrator.controller.js.map +1 -0
- package/dist/src/orchestrator/workflow-feedback.entity.d.ts +12 -0
- package/dist/src/orchestrator/workflow-feedback.entity.d.ts.map +1 -0
- package/dist/src/orchestrator/workflow-feedback.entity.js +49 -0
- package/dist/src/orchestrator/workflow-feedback.entity.js.map +1 -0
- package/dist/src/orchestrator/workflow-feedback.service.d.ts +14 -0
- package/dist/src/orchestrator/workflow-feedback.service.d.ts.map +1 -0
- package/dist/src/orchestrator/workflow-feedback.service.js +51 -0
- package/dist/src/orchestrator/workflow-feedback.service.js.map +1 -0
- package/dist/src/session/claude-code-session-manager.service.d.ts +28 -0
- package/dist/src/session/claude-code-session-manager.service.d.ts.map +1 -0
- package/dist/src/session/claude-code-session-manager.service.js +177 -0
- package/dist/src/session/claude-code-session-manager.service.js.map +1 -0
- package/dist/src/skill/controllers/skill-market.controller.d.ts +18 -0
- package/dist/src/skill/controllers/skill-market.controller.d.ts.map +1 -0
- package/dist/src/skill/controllers/skill-market.controller.js +128 -0
- package/dist/src/skill/controllers/skill-market.controller.js.map +1 -0
- package/dist/{skill → src/skill}/controllers/skill.controller.d.ts +4 -0
- package/dist/src/skill/controllers/skill.controller.d.ts.map +1 -0
- package/dist/{skill → src/skill}/controllers/skill.controller.js +31 -0
- package/dist/src/skill/controllers/skill.controller.js.map +1 -0
- package/dist/src/skill/entities/octo-skill.entity.d.ts.map +1 -0
- package/dist/src/skill/entities/octo-skill.entity.js.map +1 -0
- package/dist/{skill → src/skill}/index.d.ts +3 -1
- package/dist/src/skill/index.d.ts.map +1 -0
- package/dist/{skill → src/skill}/index.js +5 -1
- package/dist/src/skill/index.js.map +1 -0
- package/dist/src/skill/services/skill-generator.service.d.ts.map +1 -0
- package/dist/src/skill/services/skill-generator.service.js.map +1 -0
- package/dist/{skill → src/skill}/services/skill-installer.service.d.ts +27 -0
- package/dist/src/skill/services/skill-installer.service.d.ts.map +1 -0
- package/dist/{skill → src/skill}/services/skill-installer.service.js +108 -0
- package/dist/src/skill/services/skill-installer.service.js.map +1 -0
- package/dist/src/skill/services/skill-market-helpers.d.ts +25 -0
- package/dist/src/skill/services/skill-market-helpers.d.ts.map +1 -0
- package/dist/src/skill/services/skill-market-helpers.js +22 -0
- package/dist/src/skill/services/skill-market-helpers.js.map +1 -0
- package/dist/src/skill/services/skill-market.service.d.ts +60 -0
- package/dist/src/skill/services/skill-market.service.d.ts.map +1 -0
- package/dist/src/skill/services/skill-market.service.js +228 -0
- package/dist/src/skill/services/skill-market.service.js.map +1 -0
- package/dist/{skill → src/skill}/services/skill-registry.service.d.ts +1 -0
- package/dist/src/skill/services/skill-registry.service.d.ts.map +1 -0
- package/dist/{skill → src/skill}/services/skill-registry.service.js +18 -6
- package/dist/src/skill/services/skill-registry.service.js.map +1 -0
- package/dist/{skill → src/skill}/types.d.ts +32 -1
- package/dist/src/skill/types.d.ts.map +1 -0
- package/dist/{cli → src/skill}/types.js.map +1 -1
- package/dist/src/workflow-design/DocumentExtractorAgent.d.ts +47 -0
- package/dist/src/workflow-design/DocumentExtractorAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/DocumentExtractorAgent.js +118 -0
- package/dist/src/workflow-design/DocumentExtractorAgent.js.map +1 -0
- package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts +26 -0
- package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts.map +1 -0
- package/dist/src/workflow-design/N8nNodeKnowledgeBase.js +362 -0
- package/dist/src/workflow-design/N8nNodeKnowledgeBase.js.map +1 -0
- package/dist/src/workflow-design/OctoAgentClient.d.ts +42 -0
- package/dist/src/workflow-design/OctoAgentClient.d.ts.map +1 -0
- package/dist/src/workflow-design/OctoAgentClient.js +191 -0
- package/dist/src/workflow-design/OctoAgentClient.js.map +1 -0
- package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts +45 -0
- package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts.map +1 -0
- package/dist/src/workflow-design/WorkflowDesignOrchestrator.js +265 -0
- package/dist/src/workflow-design/WorkflowDesignOrchestrator.js.map +1 -0
- package/dist/src/workflow-design/agents/ActionChainAgent.d.ts +9 -0
- package/dist/src/workflow-design/agents/ActionChainAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/agents/ActionChainAgent.js +79 -0
- package/dist/src/workflow-design/agents/ActionChainAgent.js.map +1 -0
- package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts +15 -0
- package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/agents/CodeScriptAgent.js +96 -0
- package/dist/src/workflow-design/agents/CodeScriptAgent.js.map +1 -0
- package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts +9 -0
- package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/agents/LogicFlowAgent.js +78 -0
- package/dist/src/workflow-design/agents/LogicFlowAgent.js.map +1 -0
- package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts +9 -0
- package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/agents/TriggerAnalystAgent.js +65 -0
- package/dist/src/workflow-design/agents/TriggerAnalystAgent.js.map +1 -0
- package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts +9 -0
- package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts.map +1 -0
- package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js +117 -0
- package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js.map +1 -0
- package/dist/src/workflow-design/index.d.ts +12 -0
- package/dist/src/workflow-design/index.d.ts.map +1 -0
- package/dist/src/workflow-design/index.js +23 -0
- package/dist/src/workflow-design/index.js.map +1 -0
- package/dist/src/workflow-design/types.d.ts +155 -0
- package/dist/src/workflow-design/types.d.ts.map +1 -0
- package/dist/src/workflow-design/types.js +6 -0
- package/dist/src/workflow-design/types.js.map +1 -0
- package/package.json +21 -15
- package/web/components/CreateWorkspaceDialog.tsx +157 -0
- package/web/components/DirBrowser.tsx +85 -0
- package/web/components/GithubTokenDialog.tsx +152 -0
- package/web/components/LocalPathSection.tsx +91 -0
- package/web/components/MarketInstallDialog.tsx +196 -0
- package/web/components/MarketSkillCard.tsx +74 -0
- package/web/components/RepoList.tsx +97 -0
- package/web/components/SearchResultsGrid.tsx +55 -0
- package/web/components/SkillCard.tsx +4 -1
- package/web/components/ToolCard.tsx +88 -0
- package/web/components/WorkspaceCard.tsx +146 -0
- package/web/components/WorkspaceItem.tsx +65 -0
- package/web/components/WorkspaceSelect.tsx +94 -0
- package/web/index.ts +18 -1
- package/web/manifest.ts +7 -0
- package/web/messages/en-US.json +231 -7
- package/web/messages/zh-CN.json +234 -7
- package/web/pages/AgentMarketPage.tsx +318 -0
- package/web/pages/AgentRunsPage.tsx +162 -0
- package/web/pages/AgentsPage.tsx +239 -0
- package/web/pages/AiCliToolsPage.tsx +17 -128
- package/web/pages/ApprovalsPage.tsx +260 -0
- package/web/pages/OrchestratorPage.tsx +384 -0
- package/web/pages/SessionsPage.tsx +248 -0
- package/web/pages/SkillMarketPage.tsx +25 -0
- package/web/pages/WorkspaceSection.tsx +13 -113
- package/web/pages/WorkspacesPage.tsx +29 -254
- package/web/services/agent-approval.service.ts +35 -0
- package/web/services/agent-gateway.service.ts +41 -0
- package/web/services/agent-run.service.ts +48 -0
- package/web/services/agent-session.service.ts +30 -0
- package/web/services/ai-cli-service.ts +33 -0
- package/web/services/external-agent.service.ts +38 -0
- package/web/services/orchestrator.service.ts +52 -0
- package/web/services/skill-market-service.ts +88 -0
- package/web/services/skill-service.ts +12 -0
- package/dist/ai.module.d.ts +0 -4
- package/dist/ai.module.d.ts.map +0 -1
- package/dist/ai.module.js +0 -59
- package/dist/ai.module.js.map +0 -1
- package/dist/cli/adapters/antigravity.adapter.d.ts.map +0 -1
- package/dist/cli/adapters/antigravity.adapter.js.map +0 -1
- package/dist/cli/adapters/claude-cli.adapter.d.ts.map +0 -1
- package/dist/cli/adapters/claude-cli.adapter.js.map +0 -1
- package/dist/cli/adapters/codex-cli.adapter.d.ts.map +0 -1
- package/dist/cli/adapters/codex-cli.adapter.js.map +0 -1
- package/dist/cli/adapters/detect-cli.d.ts.map +0 -1
- package/dist/cli/adapters/detect-cli.js.map +0 -1
- package/dist/cli/adapters/gemini-cli.adapter.d.ts.map +0 -1
- package/dist/cli/adapters/gemini-cli.adapter.js.map +0 -1
- package/dist/cli/adapters/index.d.ts.map +0 -1
- package/dist/cli/adapters/index.js.map +0 -1
- package/dist/cli/cli-executor.service.d.ts.map +0 -1
- package/dist/cli/cli-executor.service.js.map +0 -1
- package/dist/cli/cli-registry.service.d.ts.map +0 -1
- package/dist/cli/cli-registry.service.js.map +0 -1
- package/dist/cli/controllers/ai-cli.controller.d.ts.map +0 -1
- package/dist/cli/controllers/ai-cli.controller.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/cli/workspace.service.d.ts.map +0 -1
- package/dist/cli/workspace.service.js.map +0 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -23
- package/dist/index.js.map +0 -1
- package/dist/skill/controllers/skill.controller.d.ts.map +0 -1
- package/dist/skill/controllers/skill.controller.js.map +0 -1
- package/dist/skill/entities/octo-skill.entity.d.ts.map +0 -1
- package/dist/skill/entities/octo-skill.entity.js.map +0 -1
- package/dist/skill/index.d.ts.map +0 -1
- package/dist/skill/index.js.map +0 -1
- package/dist/skill/services/skill-generator.service.d.ts.map +0 -1
- package/dist/skill/services/skill-generator.service.js.map +0 -1
- package/dist/skill/services/skill-installer.service.d.ts.map +0 -1
- package/dist/skill/services/skill-installer.service.js.map +0 -1
- package/dist/skill/services/skill-registry.service.d.ts.map +0 -1
- package/dist/skill/services/skill-registry.service.js.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- /package/dist/{cli → src/cli}/adapters/claude-cli.adapter.d.ts +0 -0
- /package/dist/{cli → src/cli}/adapters/codex-cli.adapter.d.ts +0 -0
- /package/dist/{cli → src/cli}/adapters/codex-cli.adapter.js +0 -0
- /package/dist/{cli → src/cli}/adapters/detect-cli.d.ts +0 -0
- /package/dist/{cli → src/cli}/adapters/detect-cli.js +0 -0
- /package/dist/{cli → src/cli}/adapters/gemini-cli.adapter.d.ts +0 -0
- /package/dist/{cli → src/cli}/adapters/gemini-cli.adapter.js +0 -0
- /package/dist/{cli → src/cli}/adapters/index.d.ts +0 -0
- /package/dist/{cli → src/cli}/adapters/index.js +0 -0
- /package/dist/{cli → src/cli}/cli-registry.service.d.ts +0 -0
- /package/dist/{cli → src/cli}/index.js +0 -0
- /package/dist/{cli → src/cli}/types.js +0 -0
- /package/dist/{skill → src/skill}/entities/octo-skill.entity.d.ts +0 -0
- /package/dist/{skill → src/skill}/entities/octo-skill.entity.js +0 -0
- /package/dist/{skill → src/skill}/services/skill-generator.service.d.ts +0 -0
- /package/dist/{skill → src/skill}/services/skill-generator.service.js +0 -0
- /package/dist/{skill → src/skill}/types.js +0 -0
|
@@ -3,134 +3,20 @@
|
|
|
3
3
|
import { useState, useEffect, useCallback } from 'react'
|
|
4
4
|
import { useTranslations } from 'next-intl'
|
|
5
5
|
import { toast } from 'sonner'
|
|
6
|
-
import {
|
|
7
|
-
RefreshCw,
|
|
8
|
-
Trash2,
|
|
9
|
-
Plus,
|
|
10
|
-
FolderOpen,
|
|
11
|
-
Github,
|
|
12
|
-
Loader2,
|
|
13
|
-
GitPullRequest,
|
|
14
|
-
} from 'lucide-react'
|
|
6
|
+
import { RefreshCw, Plus, Loader2 } from 'lucide-react'
|
|
15
7
|
|
|
16
8
|
import { PageHeader } from '@octo-cyber/ui/components/shared/page-header'
|
|
17
9
|
import { ConfirmDialog } from '@octo-cyber/ui/components/shared/confirm-dialog'
|
|
18
10
|
import { Button } from '@octo-cyber/ui/components/ui/button'
|
|
19
|
-
import { Badge } from '@octo-cyber/ui/components/ui/badge'
|
|
20
|
-
import { Input } from '@octo-cyber/ui/components/ui/input'
|
|
21
|
-
import { Label } from '@octo-cyber/ui/components/ui/label'
|
|
22
|
-
import {
|
|
23
|
-
Card,
|
|
24
|
-
CardContent,
|
|
25
|
-
CardHeader,
|
|
26
|
-
CardTitle,
|
|
27
|
-
} from '@octo-cyber/ui/components/ui/card'
|
|
28
|
-
import {
|
|
29
|
-
Dialog,
|
|
30
|
-
DialogContent,
|
|
31
|
-
DialogHeader,
|
|
32
|
-
DialogTitle,
|
|
33
|
-
DialogDescription,
|
|
34
|
-
DialogFooter,
|
|
35
|
-
} from '@octo-cyber/ui/components/ui/dialog'
|
|
36
|
-
import {
|
|
37
|
-
Tabs,
|
|
38
|
-
TabsList,
|
|
39
|
-
TabsTrigger,
|
|
40
|
-
} from '@octo-cyber/ui/components/ui/tabs'
|
|
41
11
|
import { aiCliService } from '../services/ai-cli-service'
|
|
42
12
|
import type { WorkspaceInfo } from '../services/ai-cli-service'
|
|
13
|
+
import { skillService } from '../services/skill-service'
|
|
14
|
+
import { WorkspaceCard } from '../components/WorkspaceCard'
|
|
15
|
+
import { CreateWorkspaceDialog } from '../components/CreateWorkspaceDialog'
|
|
43
16
|
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
return new Date(dateStr).toLocaleString()
|
|
47
|
-
} catch {
|
|
48
|
-
return dateStr
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function WorkspaceCard({
|
|
53
|
-
ws,
|
|
54
|
-
onDelete,
|
|
55
|
-
onPull,
|
|
56
|
-
isPulling,
|
|
57
|
-
}: {
|
|
58
|
-
ws: WorkspaceInfo
|
|
59
|
-
onDelete: (ws: WorkspaceInfo) => void
|
|
60
|
-
onPull: (id: string) => void
|
|
61
|
-
isPulling: boolean
|
|
62
|
-
}) {
|
|
63
|
-
const t = useTranslations('aiCli.workspaces')
|
|
64
|
-
const tc = useTranslations('common')
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<Card>
|
|
68
|
-
<CardHeader className="pb-2">
|
|
69
|
-
<div className="flex items-center justify-between">
|
|
70
|
-
<div className="flex items-center gap-2">
|
|
71
|
-
{ws.type === 'github' ? (
|
|
72
|
-
<Github className="h-4 w-4 text-muted-foreground" />
|
|
73
|
-
) : (
|
|
74
|
-
<FolderOpen className="h-4 w-4 text-muted-foreground" />
|
|
75
|
-
)}
|
|
76
|
-
<CardTitle className="text-sm">
|
|
77
|
-
{ws.name || ws.id.slice(0, 8)}
|
|
78
|
-
</CardTitle>
|
|
79
|
-
</div>
|
|
80
|
-
<Badge variant={ws.type === 'github' ? 'default' : 'secondary'}>
|
|
81
|
-
{t(`type.${ws.type}`)}
|
|
82
|
-
</Badge>
|
|
83
|
-
</div>
|
|
84
|
-
</CardHeader>
|
|
85
|
-
<CardContent className="space-y-2">
|
|
86
|
-
<p className="text-xs text-muted-foreground truncate" title={ws.path}>
|
|
87
|
-
{ws.path}
|
|
88
|
-
</p>
|
|
89
|
-
{ws.type === 'github' && ws.repoUrl && (
|
|
90
|
-
<p className="text-xs text-muted-foreground truncate" title={ws.repoUrl}>
|
|
91
|
-
{ws.repoUrl}
|
|
92
|
-
</p>
|
|
93
|
-
)}
|
|
94
|
-
{ws.type === 'github' && ws.branch && (
|
|
95
|
-
<p className="text-xs text-muted-foreground">
|
|
96
|
-
{t('branch', { branch: ws.branch })}
|
|
97
|
-
</p>
|
|
98
|
-
)}
|
|
99
|
-
<div className="flex items-center justify-between text-xs text-muted-foreground">
|
|
100
|
-
<span>{formatDate(ws.createdAt)}</span>
|
|
101
|
-
</div>
|
|
102
|
-
<div className="flex justify-end gap-2 pt-1">
|
|
103
|
-
{ws.type === 'github' && (
|
|
104
|
-
<Button
|
|
105
|
-
variant="outline"
|
|
106
|
-
size="sm"
|
|
107
|
-
onClick={() => onPull(ws.id)}
|
|
108
|
-
disabled={isPulling}
|
|
109
|
-
>
|
|
110
|
-
{isPulling ? (
|
|
111
|
-
<Loader2 className="mr-1 h-3 w-3 animate-spin" />
|
|
112
|
-
) : (
|
|
113
|
-
<GitPullRequest className="mr-1 h-3 w-3" />
|
|
114
|
-
)}
|
|
115
|
-
{isPulling ? t('pulling') : t('actions.pull')}
|
|
116
|
-
</Button>
|
|
117
|
-
)}
|
|
118
|
-
<Button
|
|
119
|
-
variant="ghost"
|
|
120
|
-
size="sm"
|
|
121
|
-
className="text-destructive hover:text-destructive"
|
|
122
|
-
onClick={() => onDelete(ws)}
|
|
123
|
-
>
|
|
124
|
-
<Trash2 className="mr-1 h-3 w-3" />
|
|
125
|
-
{tc('delete')}
|
|
126
|
-
</Button>
|
|
127
|
-
</div>
|
|
128
|
-
</CardContent>
|
|
129
|
-
</Card>
|
|
130
|
-
)
|
|
131
|
-
}
|
|
17
|
+
type InstalledSkillsMap = Record<string, Array<{ name: string; skillDir: string }>>
|
|
132
18
|
|
|
133
|
-
|
|
19
|
+
const EMPTY_SKILLS_MAP: InstalledSkillsMap = {}
|
|
134
20
|
|
|
135
21
|
export default function WorkspacesPage() {
|
|
136
22
|
const t = useTranslations('aiCli.workspaces')
|
|
@@ -138,23 +24,27 @@ export default function WorkspacesPage() {
|
|
|
138
24
|
|
|
139
25
|
const [workspaces, setWorkspaces] = useState<WorkspaceInfo[]>([])
|
|
140
26
|
const [loading, setLoading] = useState(true)
|
|
27
|
+
const [wsSkillsMap, setWsSkillsMap] = useState<Record<string, InstalledSkillsMap>>({})
|
|
141
28
|
const [createDialogOpen, setCreateDialogOpen] = useState(false)
|
|
142
|
-
const [isCreating, setIsCreating] = useState(false)
|
|
143
29
|
const [deleteTarget, setDeleteTarget] = useState<WorkspaceInfo | null>(null)
|
|
144
30
|
const [pullingId, setPullingId] = useState<string | null>(null)
|
|
145
31
|
|
|
146
|
-
// Create form state
|
|
147
|
-
const [createType, setCreateType] = useState<WorkspaceType>('local')
|
|
148
|
-
const [createName, setCreateName] = useState('')
|
|
149
|
-
const [createLocalPath, setCreateLocalPath] = useState('')
|
|
150
|
-
const [createRepoUrl, setCreateRepoUrl] = useState('')
|
|
151
|
-
const [createBranch, setCreateBranch] = useState('')
|
|
152
|
-
|
|
153
32
|
const loadWorkspaces = useCallback(async () => {
|
|
154
33
|
setLoading(true)
|
|
155
34
|
try {
|
|
156
35
|
const data = await aiCliService.getWorkspaces()
|
|
157
36
|
setWorkspaces(data)
|
|
37
|
+
const skillsEntries = await Promise.all(
|
|
38
|
+
data.map(async (ws) => {
|
|
39
|
+
try {
|
|
40
|
+
const skills = await skillService.listWorkspaceInstalled(ws.path)
|
|
41
|
+
return [ws.id, skills] as const
|
|
42
|
+
} catch {
|
|
43
|
+
return [ws.id, {} as InstalledSkillsMap] as const
|
|
44
|
+
}
|
|
45
|
+
}),
|
|
46
|
+
)
|
|
47
|
+
setWsSkillsMap(Object.fromEntries(skillsEntries))
|
|
158
48
|
} catch {
|
|
159
49
|
toast.error(t('toast.loadFailed'))
|
|
160
50
|
} finally {
|
|
@@ -166,45 +56,6 @@ export default function WorkspacesPage() {
|
|
|
166
56
|
loadWorkspaces()
|
|
167
57
|
}, [loadWorkspaces])
|
|
168
58
|
|
|
169
|
-
const resetCreateForm = () => {
|
|
170
|
-
setCreateType('local')
|
|
171
|
-
setCreateName('')
|
|
172
|
-
setCreateLocalPath('')
|
|
173
|
-
setCreateRepoUrl('')
|
|
174
|
-
setCreateBranch('')
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const handleCreate = async () => {
|
|
178
|
-
if (!createName.trim()) return
|
|
179
|
-
setIsCreating(true)
|
|
180
|
-
try {
|
|
181
|
-
if (createType === 'local') {
|
|
182
|
-
if (!createLocalPath.trim()) return
|
|
183
|
-
await aiCliService.createWorkspace({
|
|
184
|
-
type: 'local',
|
|
185
|
-
name: createName.trim(),
|
|
186
|
-
localPath: createLocalPath.trim(),
|
|
187
|
-
})
|
|
188
|
-
} else {
|
|
189
|
-
if (!createRepoUrl.trim() || !createBranch.trim()) return
|
|
190
|
-
await aiCliService.createWorkspace({
|
|
191
|
-
type: 'github',
|
|
192
|
-
name: createName.trim(),
|
|
193
|
-
repoUrl: createRepoUrl.trim(),
|
|
194
|
-
branch: createBranch.trim(),
|
|
195
|
-
})
|
|
196
|
-
}
|
|
197
|
-
setCreateDialogOpen(false)
|
|
198
|
-
resetCreateForm()
|
|
199
|
-
await loadWorkspaces()
|
|
200
|
-
toast.success(t('toast.created'))
|
|
201
|
-
} catch {
|
|
202
|
-
toast.error(t('toast.createFailed'))
|
|
203
|
-
} finally {
|
|
204
|
-
setIsCreating(false)
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
59
|
const handleDelete = async () => {
|
|
209
60
|
if (!deleteTarget) return
|
|
210
61
|
try {
|
|
@@ -229,11 +80,10 @@ export default function WorkspacesPage() {
|
|
|
229
80
|
}
|
|
230
81
|
}
|
|
231
82
|
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
(
|
|
235
|
-
|
|
236
|
-
: createRepoUrl.trim() !== '' && createBranch.trim() !== '')
|
|
83
|
+
const handleCreated = async () => {
|
|
84
|
+
await loadWorkspaces()
|
|
85
|
+
toast.success(t('toast.created'))
|
|
86
|
+
}
|
|
237
87
|
|
|
238
88
|
const localCount = workspaces.filter((w) => w.type === 'local').length
|
|
239
89
|
const githubCount = workspaces.filter((w) => w.type === 'github').length
|
|
@@ -253,10 +103,7 @@ export default function WorkspacesPage() {
|
|
|
253
103
|
<Button
|
|
254
104
|
variant="outline"
|
|
255
105
|
size="sm"
|
|
256
|
-
onClick={() =>
|
|
257
|
-
resetCreateForm()
|
|
258
|
-
setCreateDialogOpen(true)
|
|
259
|
-
}}
|
|
106
|
+
onClick={() => setCreateDialogOpen(true)}
|
|
260
107
|
>
|
|
261
108
|
<Plus className="mr-1 h-4 w-4" />
|
|
262
109
|
{t('actions.create')}
|
|
@@ -297,6 +144,7 @@ export default function WorkspacesPage() {
|
|
|
297
144
|
onDelete={setDeleteTarget}
|
|
298
145
|
onPull={handlePull}
|
|
299
146
|
isPulling={pullingId === ws.id}
|
|
147
|
+
wsSkills={wsSkillsMap[ws.id] || EMPTY_SKILLS_MAP}
|
|
300
148
|
/>
|
|
301
149
|
))}
|
|
302
150
|
</div>
|
|
@@ -304,85 +152,12 @@ export default function WorkspacesPage() {
|
|
|
304
152
|
</>
|
|
305
153
|
)}
|
|
306
154
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
<DialogDescription>{t('createDialog.description')}</DialogDescription>
|
|
313
|
-
</DialogHeader>
|
|
314
|
-
<div className="space-y-4">
|
|
315
|
-
<Tabs
|
|
316
|
-
value={createType}
|
|
317
|
-
onValueChange={(v) => setCreateType(v as WorkspaceType)}
|
|
318
|
-
>
|
|
319
|
-
<TabsList className="grid w-full grid-cols-2">
|
|
320
|
-
<TabsTrigger value="local">
|
|
321
|
-
<FolderOpen className="mr-1 h-3 w-3" />
|
|
322
|
-
{t('createDialog.typeLocal')}
|
|
323
|
-
</TabsTrigger>
|
|
324
|
-
<TabsTrigger value="github">
|
|
325
|
-
<Github className="mr-1 h-3 w-3" />
|
|
326
|
-
{t('createDialog.typeGithub')}
|
|
327
|
-
</TabsTrigger>
|
|
328
|
-
</TabsList>
|
|
329
|
-
</Tabs>
|
|
330
|
-
|
|
331
|
-
<div className="space-y-2">
|
|
332
|
-
<Label>{t('createDialog.nameLabel')}</Label>
|
|
333
|
-
<Input
|
|
334
|
-
placeholder={t('createDialog.namePlaceholder')}
|
|
335
|
-
value={createName}
|
|
336
|
-
onChange={(e) => setCreateName(e.target.value)}
|
|
337
|
-
/>
|
|
338
|
-
</div>
|
|
339
|
-
|
|
340
|
-
{createType === 'local' ? (
|
|
341
|
-
<div className="space-y-2">
|
|
342
|
-
<Label>{t('createDialog.localPathLabel')}</Label>
|
|
343
|
-
<Input
|
|
344
|
-
placeholder={t('createDialog.localPathPlaceholder')}
|
|
345
|
-
value={createLocalPath}
|
|
346
|
-
onChange={(e) => setCreateLocalPath(e.target.value)}
|
|
347
|
-
/>
|
|
348
|
-
</div>
|
|
349
|
-
) : (
|
|
350
|
-
<>
|
|
351
|
-
<div className="space-y-2">
|
|
352
|
-
<Label>{t('createDialog.repoUrlLabel')}</Label>
|
|
353
|
-
<Input
|
|
354
|
-
placeholder={t('createDialog.repoUrlPlaceholder')}
|
|
355
|
-
value={createRepoUrl}
|
|
356
|
-
onChange={(e) => setCreateRepoUrl(e.target.value)}
|
|
357
|
-
/>
|
|
358
|
-
</div>
|
|
359
|
-
<div className="space-y-2">
|
|
360
|
-
<Label>{t('createDialog.branchLabel')}</Label>
|
|
361
|
-
<Input
|
|
362
|
-
placeholder={t('createDialog.branchPlaceholder')}
|
|
363
|
-
value={createBranch}
|
|
364
|
-
onChange={(e) => setCreateBranch(e.target.value)}
|
|
365
|
-
/>
|
|
366
|
-
</div>
|
|
367
|
-
</>
|
|
368
|
-
)}
|
|
369
|
-
</div>
|
|
370
|
-
<DialogFooter>
|
|
371
|
-
<Button variant="outline" onClick={() => setCreateDialogOpen(false)}>
|
|
372
|
-
{tc('cancel')}
|
|
373
|
-
</Button>
|
|
374
|
-
<Button
|
|
375
|
-
onClick={handleCreate}
|
|
376
|
-
disabled={isCreating || !isCreateValid}
|
|
377
|
-
>
|
|
378
|
-
{isCreating && <Loader2 className="mr-1 h-3 w-3 animate-spin" />}
|
|
379
|
-
{tc('create')}
|
|
380
|
-
</Button>
|
|
381
|
-
</DialogFooter>
|
|
382
|
-
</DialogContent>
|
|
383
|
-
</Dialog>
|
|
155
|
+
<CreateWorkspaceDialog
|
|
156
|
+
open={createDialogOpen}
|
|
157
|
+
onOpenChange={setCreateDialogOpen}
|
|
158
|
+
onCreated={handleCreated}
|
|
159
|
+
/>
|
|
384
160
|
|
|
385
|
-
{/* Delete Confirm */}
|
|
386
161
|
<ConfirmDialog
|
|
387
162
|
open={!!deleteTarget}
|
|
388
163
|
onOpenChange={(open) => { if (!open) setDeleteTarget(null) }}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export type ApprovalStatus = 'pending' | 'approved' | 'rejected'
|
|
5
|
+
|
|
6
|
+
export interface AgentApproval {
|
|
7
|
+
id: string
|
|
8
|
+
runId: string
|
|
9
|
+
question: string
|
|
10
|
+
context: string | null
|
|
11
|
+
status: ApprovalStatus
|
|
12
|
+
response: string | null
|
|
13
|
+
respondedAt: string | null
|
|
14
|
+
createdAt: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const agentApprovalService = {
|
|
18
|
+
async listPending(): Promise<AgentApproval[]> {
|
|
19
|
+
const res = await api.get<ApiResponse<AgentApproval[]>>('/api/v1/ai/agent/approval/pending')
|
|
20
|
+
return res.data
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
async getApproval(id: string): Promise<AgentApproval> {
|
|
24
|
+
const res = await api.get<ApiResponse<AgentApproval>>(`/api/v1/ai/agent/approval/${id}`)
|
|
25
|
+
return res.data
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
async approve(id: string, response?: string): Promise<void> {
|
|
29
|
+
await api.post<ApiResponse<null>>(`/api/v1/ai/agent/approval/${id}/approve`, { response })
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
async reject(id: string, response?: string): Promise<void> {
|
|
33
|
+
await api.post<ApiResponse<null>>(`/api/v1/ai/agent/approval/${id}/reject`, { response })
|
|
34
|
+
},
|
|
35
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export interface AgentCapability {
|
|
5
|
+
type: string
|
|
6
|
+
name: string
|
|
7
|
+
description: string
|
|
8
|
+
isAvailable: boolean
|
|
9
|
+
metadata?: Record<string, unknown>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ExecuteResult {
|
|
13
|
+
runId?: string
|
|
14
|
+
output?: string
|
|
15
|
+
status: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ExecuteAgentOpts {
|
|
19
|
+
agentType: string
|
|
20
|
+
prompt: string
|
|
21
|
+
async?: boolean
|
|
22
|
+
maxRounds?: number
|
|
23
|
+
timeoutMs?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const agentGatewayService = {
|
|
27
|
+
async listAgents(): Promise<AgentCapability[]> {
|
|
28
|
+
const res = await api.get<ApiResponse<AgentCapability[]>>('/api/v1/agents')
|
|
29
|
+
return res.data
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
async getAgent(type: string): Promise<AgentCapability> {
|
|
33
|
+
const res = await api.get<ApiResponse<AgentCapability>>(`/api/v1/agents/${type}`)
|
|
34
|
+
return res.data
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
async executeAgent(opts: ExecuteAgentOpts): Promise<ExecuteResult> {
|
|
38
|
+
const res = await api.post<ApiResponse<ExecuteResult>>('/api/v1/agents/execute', opts)
|
|
39
|
+
return res.data
|
|
40
|
+
},
|
|
41
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export type AgentRunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'
|
|
5
|
+
|
|
6
|
+
export interface AgentRunRecord {
|
|
7
|
+
id: string
|
|
8
|
+
agentType: string
|
|
9
|
+
prompt: string
|
|
10
|
+
status: AgentRunStatus
|
|
11
|
+
output?: string
|
|
12
|
+
error?: string
|
|
13
|
+
rounds?: number
|
|
14
|
+
startedAt?: string
|
|
15
|
+
endedAt?: string
|
|
16
|
+
durationMs?: number
|
|
17
|
+
createdAt: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AgentRunEvent {
|
|
21
|
+
type: 'status' | 'output' | 'error' | 'done'
|
|
22
|
+
data: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const agentRunService = {
|
|
26
|
+
async listRuns(): Promise<AgentRunRecord[]> {
|
|
27
|
+
const res = await api.get<ApiResponse<AgentRunRecord[]>>('/api/v1/ai/agent/run')
|
|
28
|
+
return res.data
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
async getRun(id: string): Promise<AgentRunRecord> {
|
|
32
|
+
const res = await api.get<ApiResponse<AgentRunRecord>>(`/api/v1/ai/agent/run/${id}`)
|
|
33
|
+
return res.data
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
async cancelRun(id: string): Promise<void> {
|
|
37
|
+
await api.post<ApiResponse<null>>(`/api/v1/ai/agent/run/${id}/cancel`)
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
getEventsUrl(id: string): string {
|
|
41
|
+
const base = typeof window !== 'undefined' &&
|
|
42
|
+
(window.location.origin === 'http://tauri.localhost' ||
|
|
43
|
+
window.location.origin === 'tauri://localhost')
|
|
44
|
+
? 'http://127.0.0.1:9988'
|
|
45
|
+
: ''
|
|
46
|
+
return `${base}/api/v1/ai/agent/run/${id}/events`
|
|
47
|
+
},
|
|
48
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export type SessionStatus = 'active' | 'closed'
|
|
5
|
+
|
|
6
|
+
export interface AgentSession {
|
|
7
|
+
id: string
|
|
8
|
+
name: string | null
|
|
9
|
+
context: Record<string, unknown>
|
|
10
|
+
runIds: string[]
|
|
11
|
+
status: SessionStatus
|
|
12
|
+
createdAt: string
|
|
13
|
+
updatedAt: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const agentSessionService = {
|
|
17
|
+
async listSessions(): Promise<AgentSession[]> {
|
|
18
|
+
const res = await api.get<ApiResponse<AgentSession[]>>('/api/v1/ai/agent/session')
|
|
19
|
+
return res.data
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async createSession(name?: string): Promise<AgentSession> {
|
|
23
|
+
const res = await api.post<ApiResponse<AgentSession>>('/api/v1/ai/agent/session', { name })
|
|
24
|
+
return res.data
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
async closeSession(id: string): Promise<void> {
|
|
28
|
+
await api.post<ApiResponse<null>>(`/api/v1/ai/agent/session/${id}/close`)
|
|
29
|
+
},
|
|
30
|
+
}
|
|
@@ -5,6 +5,8 @@ export interface CliToolInfo {
|
|
|
5
5
|
name: string
|
|
6
6
|
displayName: string
|
|
7
7
|
available: boolean
|
|
8
|
+
/** cli = spawns a local process; api = calls an HTTP API */
|
|
9
|
+
toolType: 'cli' | 'api'
|
|
8
10
|
version?: string
|
|
9
11
|
path?: string
|
|
10
12
|
models?: string[]
|
|
@@ -24,6 +26,7 @@ function mapToolInfo(raw: Record<string, unknown>): CliToolInfo {
|
|
|
24
26
|
name: raw.name as string,
|
|
25
27
|
displayName: raw.displayName as string,
|
|
26
28
|
available: (raw.isAvailable ?? raw.available) as boolean,
|
|
29
|
+
toolType: (raw.toolType as 'cli' | 'api') ?? 'cli',
|
|
27
30
|
version: raw.version as string | undefined,
|
|
28
31
|
path: (raw.executablePath ?? raw.path) as string | undefined,
|
|
29
32
|
models: raw.models as string[] | undefined,
|
|
@@ -51,6 +54,7 @@ export interface WorkspaceInfo {
|
|
|
51
54
|
id: string
|
|
52
55
|
type: 'local' | 'github'
|
|
53
56
|
name: string
|
|
57
|
+
description?: string
|
|
54
58
|
path: string
|
|
55
59
|
createdAt: string
|
|
56
60
|
localPath?: string
|
|
@@ -61,11 +65,24 @@ export interface WorkspaceInfo {
|
|
|
61
65
|
export interface CreateWorkspaceRequest {
|
|
62
66
|
type: 'local' | 'github'
|
|
63
67
|
name: string
|
|
68
|
+
description?: string
|
|
64
69
|
localPath?: string
|
|
65
70
|
repoUrl?: string
|
|
66
71
|
branch?: string
|
|
67
72
|
}
|
|
68
73
|
|
|
74
|
+
export interface DetectedGitInfo {
|
|
75
|
+
isGitRepo: boolean
|
|
76
|
+
remoteUrl?: string
|
|
77
|
+
branch?: string
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface DirEntry {
|
|
81
|
+
name: string
|
|
82
|
+
path: string
|
|
83
|
+
isDirectory: boolean
|
|
84
|
+
}
|
|
85
|
+
|
|
69
86
|
export const aiCliService = {
|
|
70
87
|
async getTools(): Promise<CliToolInfo[]> {
|
|
71
88
|
const res = await api.get<ApiResponse<Record<string, unknown>[]>>('/api/v1/ai-cli/tools')
|
|
@@ -126,4 +143,20 @@ export const aiCliService = {
|
|
|
126
143
|
`/api/v1/ai-cli/workspaces/${id}/delete`,
|
|
127
144
|
)
|
|
128
145
|
},
|
|
146
|
+
|
|
147
|
+
async browseDir(dirPath: string): Promise<DirEntry[]> {
|
|
148
|
+
const res = await api.get<ApiResponse<DirEntry[]>>(
|
|
149
|
+
'/api/v1/ai-cli/browse-dir',
|
|
150
|
+
{ params: { path: dirPath } },
|
|
151
|
+
)
|
|
152
|
+
return res.data
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
async detectGit(dirPath: string): Promise<DetectedGitInfo> {
|
|
156
|
+
const res = await api.post<ApiResponse<DetectedGitInfo>>(
|
|
157
|
+
'/api/v1/ai-cli/detect-git',
|
|
158
|
+
{ path: dirPath },
|
|
159
|
+
)
|
|
160
|
+
return res.data
|
|
161
|
+
},
|
|
129
162
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export interface ExternalAgent {
|
|
5
|
+
id: string
|
|
6
|
+
agentId: string
|
|
7
|
+
name: string
|
|
8
|
+
description: string | null
|
|
9
|
+
endpoint: string
|
|
10
|
+
status: 'online' | 'offline'
|
|
11
|
+
lastHeartbeatAt: string | null
|
|
12
|
+
capabilities: string[] | null
|
|
13
|
+
createdAt: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface RegisterAgentDto {
|
|
17
|
+
agentId: string
|
|
18
|
+
name: string
|
|
19
|
+
description?: string
|
|
20
|
+
endpoint: string
|
|
21
|
+
capabilities?: string[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const externalAgentService = {
|
|
25
|
+
async listAgents(): Promise<ExternalAgent[]> {
|
|
26
|
+
const res = await api.get<ApiResponse<ExternalAgent[]>>('/api/v1/agents/external')
|
|
27
|
+
return res.data
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
async registerAgent(dto: RegisterAgentDto): Promise<ExternalAgent> {
|
|
31
|
+
const res = await api.post<ApiResponse<ExternalAgent>>('/api/v1/agents/external/register', dto)
|
|
32
|
+
return res.data
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async unregisterAgent(agentId: string): Promise<void> {
|
|
36
|
+
await api.post<ApiResponse<null>>('/api/v1/agents/external/unregister', { agentId })
|
|
37
|
+
},
|
|
38
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
import type { ApiResponse } from '@octo-cyber/ui/types/common'
|
|
3
|
+
|
|
4
|
+
export type OrchestratorStepStatus = 'pending' | 'running' | 'completed' | 'failed'
|
|
5
|
+
export type OrchestratorPlanStatus = 'draft' | 'running' | 'completed' | 'failed'
|
|
6
|
+
|
|
7
|
+
export interface OrchestratorStep {
|
|
8
|
+
stepId: string
|
|
9
|
+
agentType: string
|
|
10
|
+
prompt: string
|
|
11
|
+
dependsOn?: string[]
|
|
12
|
+
status: OrchestratorStepStatus
|
|
13
|
+
runId?: string
|
|
14
|
+
output?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface OrchestratorPlan {
|
|
18
|
+
id: string
|
|
19
|
+
goal: string
|
|
20
|
+
plan: OrchestratorStep[]
|
|
21
|
+
status: OrchestratorPlanStatus
|
|
22
|
+
result: string | null
|
|
23
|
+
stepsTotal: number
|
|
24
|
+
stepsDone: number
|
|
25
|
+
createdAt: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const orchestratorService = {
|
|
29
|
+
async createPlan(goal: string): Promise<OrchestratorPlan> {
|
|
30
|
+
const res = await api.post<ApiResponse<OrchestratorPlan>>('/api/v1/ai/orchestrator/plan', { goal })
|
|
31
|
+
return res.data
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
async executePlan(id: string): Promise<OrchestratorPlan> {
|
|
35
|
+
const res = await api.post<ApiResponse<OrchestratorPlan>>(`/api/v1/ai/orchestrator/plan/${id}/run`, {})
|
|
36
|
+
return res.data
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
async listPlans(): Promise<OrchestratorPlan[]> {
|
|
40
|
+
const res = await api.get<ApiResponse<OrchestratorPlan[]>>('/api/v1/ai/orchestrator/plan')
|
|
41
|
+
return res.data
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
async getPlan(id: string): Promise<OrchestratorPlan> {
|
|
45
|
+
const res = await api.get<ApiResponse<OrchestratorPlan>>(`/api/v1/ai/orchestrator/plan/${id}`)
|
|
46
|
+
return res.data
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
async submitFeedback(id: string, rating: number, comment?: string): Promise<void> {
|
|
50
|
+
await api.post<ApiResponse<null>>(`/api/v1/ai/orchestrator/plan/${id}/feedback`, { rating, comment })
|
|
51
|
+
},
|
|
52
|
+
}
|