@octo-cyber/ai 0.5.5 → 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/src/skill/services/skill-registry.service.d.ts.map +1 -0
- package/dist/{skill → src/skill}/services/skill-registry.service.js +4 -4
- 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 +20 -14
- 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}/services/skill-registry.service.d.ts +0 -0
- /package/dist/{skill → src/skill}/types.js +0 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SYSTEM_PROMPT_COMPUTER_USE = exports.IMAGE_RESULT_PREFIX = void 0;
|
|
4
|
+
exports.createComputerUseTools = createComputerUseTools;
|
|
5
|
+
// ============================================================
|
|
6
|
+
// Sentinel prefix used to signal an image tool result.
|
|
7
|
+
// OctoAgentClient.run() detects this and wraps it in an
|
|
8
|
+
// Anthropic ImageBlockParam so Claude can see the screenshot.
|
|
9
|
+
// ============================================================
|
|
10
|
+
exports.IMAGE_RESULT_PREFIX = '[IMAGE:png]';
|
|
11
|
+
exports.SYSTEM_PROMPT_COMPUTER_USE = `You are an AI agent that can control the desktop computer.
|
|
12
|
+
You have access to these tools:
|
|
13
|
+
- screenshot: take a screenshot to see the current state of the screen
|
|
14
|
+
- left_click: click at a specific (x, y) coordinate
|
|
15
|
+
- type: type text into the focused element
|
|
16
|
+
- scroll: scroll up or down at a screen position
|
|
17
|
+
- key: press a key or key combination (e.g. "enter", "ctrl+c")
|
|
18
|
+
|
|
19
|
+
To complete a task:
|
|
20
|
+
1. Start by taking a screenshot to understand the current state of the screen.
|
|
21
|
+
2. Identify what needs to be done based on the screenshot.
|
|
22
|
+
3. Use the appropriate tools to interact with the UI.
|
|
23
|
+
4. Take follow-up screenshots to verify your actions had the intended effect.
|
|
24
|
+
5. Repeat until the task is complete, then summarize what you did.
|
|
25
|
+
|
|
26
|
+
Important:
|
|
27
|
+
- Always verify actions with a screenshot after significant interactions.
|
|
28
|
+
- Use the "key" tool for keyboard shortcuts (e.g. "enter" to confirm, "escape" to cancel).
|
|
29
|
+
- Coordinate (0, 0) is the top-left corner of the screen.
|
|
30
|
+
- Be precise with coordinates — click the center of buttons and input fields.`;
|
|
31
|
+
// ============================================================
|
|
32
|
+
// Tool factory
|
|
33
|
+
// ============================================================
|
|
34
|
+
/**
|
|
35
|
+
* Creates the computer-use tool set for agent loops.
|
|
36
|
+
*
|
|
37
|
+
* Screenshot results use the `[IMAGE:png]<base64>` sentinel so
|
|
38
|
+
* OctoAgentClient can pass them as Anthropic ImageBlockParam,
|
|
39
|
+
* enabling Claude to see and reason about the screen content.
|
|
40
|
+
*
|
|
41
|
+
* macOS: grant Accessibility + Screen Recording to Terminal/Node.
|
|
42
|
+
* Windows/Linux: no extra permissions required.
|
|
43
|
+
*/
|
|
44
|
+
function createComputerUseTools() {
|
|
45
|
+
return [
|
|
46
|
+
screenshotTool(),
|
|
47
|
+
leftClickTool(),
|
|
48
|
+
typeTool(),
|
|
49
|
+
scrollTool(),
|
|
50
|
+
keyTool(),
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
// ── screenshot ────────────────────────────────────────────────
|
|
54
|
+
function screenshotTool() {
|
|
55
|
+
return {
|
|
56
|
+
name: 'screenshot',
|
|
57
|
+
description: 'Take a screenshot of the current screen and return it as an image. ' +
|
|
58
|
+
'Use this to observe the current state of the desktop or any application.',
|
|
59
|
+
parameters: {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {},
|
|
62
|
+
required: [],
|
|
63
|
+
},
|
|
64
|
+
async execute(_args) {
|
|
65
|
+
try {
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
67
|
+
const { Monitor } = require('node-screenshots');
|
|
68
|
+
const monitors = Monitor.all();
|
|
69
|
+
if (monitors.length === 0)
|
|
70
|
+
return 'Error: no monitors found';
|
|
71
|
+
const monitor = monitors[0];
|
|
72
|
+
const image = await monitor.captureImage();
|
|
73
|
+
const pngBuffer = await image.toPng();
|
|
74
|
+
const base64 = pngBuffer.toString('base64');
|
|
75
|
+
return `${exports.IMAGE_RESULT_PREFIX}${base64}`;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return `Error taking screenshot: ${err instanceof Error ? err.message : String(err)}`;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// ── left_click ────────────────────────────────────────────────
|
|
84
|
+
function leftClickTool() {
|
|
85
|
+
return {
|
|
86
|
+
name: 'left_click',
|
|
87
|
+
description: 'Move the mouse cursor to screen coordinates (x, y) and perform a left click.',
|
|
88
|
+
parameters: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
x: { type: 'number', description: 'Horizontal pixel coordinate (from left edge of screen).' },
|
|
92
|
+
y: { type: 'number', description: 'Vertical pixel coordinate (from top edge of screen).' },
|
|
93
|
+
},
|
|
94
|
+
required: ['x', 'y'],
|
|
95
|
+
},
|
|
96
|
+
async execute(args) {
|
|
97
|
+
const { x, y } = args;
|
|
98
|
+
try {
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
100
|
+
const { mouse } = require('@nut-tree/nut-js');
|
|
101
|
+
await mouse.setPosition({ x, y });
|
|
102
|
+
await mouse.leftClick();
|
|
103
|
+
return `Clicked at (${x}, ${y})`;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return `Error clicking at (${x}, ${y}): ${err instanceof Error ? err.message : String(err)}`;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// ── type ──────────────────────────────────────────────────────
|
|
112
|
+
function typeTool() {
|
|
113
|
+
return {
|
|
114
|
+
name: 'type',
|
|
115
|
+
description: 'Type text into the currently focused input field or application. ' +
|
|
116
|
+
'Simulates keyboard keystrokes character by character.',
|
|
117
|
+
parameters: {
|
|
118
|
+
type: 'object',
|
|
119
|
+
properties: {
|
|
120
|
+
text: { type: 'string', description: 'Text to type. Supports printable ASCII characters.' },
|
|
121
|
+
},
|
|
122
|
+
required: ['text'],
|
|
123
|
+
},
|
|
124
|
+
async execute(args) {
|
|
125
|
+
const { text } = args;
|
|
126
|
+
try {
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
128
|
+
const { keyboard } = require('@nut-tree/nut-js');
|
|
129
|
+
await keyboard.type(text);
|
|
130
|
+
return `Typed: ${text.slice(0, 50)}${text.length > 50 ? '...' : ''}`;
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
return `Error typing text: ${err instanceof Error ? err.message : String(err)}`;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ── scroll ────────────────────────────────────────────────────
|
|
139
|
+
function scrollTool() {
|
|
140
|
+
return {
|
|
141
|
+
name: 'scroll',
|
|
142
|
+
description: 'Scroll the mouse wheel at the given screen position. ' +
|
|
143
|
+
'Positive dy scrolls up; negative dy scrolls down.',
|
|
144
|
+
parameters: {
|
|
145
|
+
type: 'object',
|
|
146
|
+
properties: {
|
|
147
|
+
x: { type: 'number', description: 'Horizontal coordinate to scroll at.' },
|
|
148
|
+
y: { type: 'number', description: 'Vertical coordinate to scroll at.' },
|
|
149
|
+
dy: { type: 'number', description: 'Scroll amount: positive = up, negative = down (e.g. 3 or -3).' },
|
|
150
|
+
},
|
|
151
|
+
required: ['x', 'y', 'dy'],
|
|
152
|
+
},
|
|
153
|
+
async execute(args) {
|
|
154
|
+
const { x, y, dy } = args;
|
|
155
|
+
try {
|
|
156
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
157
|
+
const { mouse } = require('@nut-tree/nut-js');
|
|
158
|
+
await mouse.setPosition({ x, y });
|
|
159
|
+
const amount = Math.abs(Math.round(dy));
|
|
160
|
+
if (dy > 0) {
|
|
161
|
+
await mouse.scrollUp(amount);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
await mouse.scrollDown(amount);
|
|
165
|
+
}
|
|
166
|
+
return `Scrolled ${dy > 0 ? 'up' : 'down'} ${amount} at (${x}, ${y})`;
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
return `Error scrolling: ${err instanceof Error ? err.message : String(err)}`;
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ── key ───────────────────────────────────────────────────────
|
|
175
|
+
function keyTool() {
|
|
176
|
+
return {
|
|
177
|
+
name: 'key',
|
|
178
|
+
description: 'Press a keyboard key or key combination. ' +
|
|
179
|
+
'Examples: "enter", "escape", "ctrl+c", "cmd+tab", "ctrl+shift+t".',
|
|
180
|
+
parameters: {
|
|
181
|
+
type: 'object',
|
|
182
|
+
properties: {
|
|
183
|
+
keys: {
|
|
184
|
+
type: 'string',
|
|
185
|
+
description: 'Key or key combination to press. ' +
|
|
186
|
+
'Single key: "enter", "escape", "tab", "space", "backspace". ' +
|
|
187
|
+
'Combination: "ctrl+c", "cmd+v", "alt+f4", "ctrl+shift+t".',
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
required: ['keys'],
|
|
191
|
+
},
|
|
192
|
+
async execute(args) {
|
|
193
|
+
const { keys } = args;
|
|
194
|
+
try {
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
196
|
+
const { keyboard, Key } = require('@nut-tree/nut-js');
|
|
197
|
+
const resolved = parseKeys(keys, Key);
|
|
198
|
+
if (resolved.length === 0)
|
|
199
|
+
return `Unknown key: ${keys}`;
|
|
200
|
+
await keyboard.pressKey(...resolved);
|
|
201
|
+
await keyboard.releaseKey(...resolved);
|
|
202
|
+
return `Pressed: ${keys}`;
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
return `Error pressing key "${keys}": ${err instanceof Error ? err.message : String(err)}`;
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function parseKeys(input, Key) {
|
|
211
|
+
const parts = input.toLowerCase().split('+').map((s) => s.trim());
|
|
212
|
+
return parts.map((p) => resolveKey(p, Key)).filter((k) => k !== undefined);
|
|
213
|
+
}
|
|
214
|
+
function resolveKey(name, Key) {
|
|
215
|
+
const map = {
|
|
216
|
+
enter: Key.Enter,
|
|
217
|
+
return: Key.Return,
|
|
218
|
+
escape: Key.Escape,
|
|
219
|
+
esc: Key.Escape,
|
|
220
|
+
tab: Key.Tab,
|
|
221
|
+
space: Key.Space,
|
|
222
|
+
backspace: Key.Backspace,
|
|
223
|
+
delete: Key.Delete,
|
|
224
|
+
del: Key.Delete,
|
|
225
|
+
home: Key.Home,
|
|
226
|
+
end: Key.End,
|
|
227
|
+
pageup: Key.PageUp,
|
|
228
|
+
pagedown: Key.PageDown,
|
|
229
|
+
up: Key.Up,
|
|
230
|
+
down: Key.Down,
|
|
231
|
+
left: Key.Left,
|
|
232
|
+
right: Key.Right,
|
|
233
|
+
ctrl: Key.LeftControl,
|
|
234
|
+
control: Key.LeftControl,
|
|
235
|
+
shift: Key.LeftShift,
|
|
236
|
+
alt: Key.LeftAlt,
|
|
237
|
+
option: Key.LeftAlt,
|
|
238
|
+
cmd: Key.LeftCmd,
|
|
239
|
+
command: Key.LeftCmd,
|
|
240
|
+
win: Key.LeftWin,
|
|
241
|
+
super: Key.LeftWin,
|
|
242
|
+
a: Key.A, b: Key.B, c: Key.C, d: Key.D, e: Key.E, f: Key.F,
|
|
243
|
+
g: Key.G, h: Key.H, i: Key.I, j: Key.J, k: Key.K, l: Key.L,
|
|
244
|
+
m: Key.M, n: Key.N, o: Key.O, p: Key.P, q: Key.Q, r: Key.R,
|
|
245
|
+
s: Key.S, t: Key.T, u: Key.U, v: Key.V, w: Key.W, x: Key.X,
|
|
246
|
+
y: Key.Y, z: Key.Z,
|
|
247
|
+
'0': Key.Num0, '1': Key.Num1, '2': Key.Num2, '3': Key.Num3,
|
|
248
|
+
'4': Key.Num4, '5': Key.Num5, '6': Key.Num6, '7': Key.Num7,
|
|
249
|
+
'8': Key.Num8, '9': Key.Num9,
|
|
250
|
+
f1: Key.F1, f2: Key.F2, f3: Key.F3, f4: Key.F4, f5: Key.F5,
|
|
251
|
+
f6: Key.F6, f7: Key.F7, f8: Key.F8, f9: Key.F9, f10: Key.F10,
|
|
252
|
+
f11: Key.F11, f12: Key.F12,
|
|
253
|
+
};
|
|
254
|
+
return map[name];
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=computer-use-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-use-tools.js","sourceRoot":"","sources":["../../../src/agent/computer-use-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Request, Response } from '@octo-cyber/core';
|
|
2
|
+
/**
|
|
3
|
+
* ExternalAgentController — HTTP API for external agent self-management.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* POST /api/v1/agents/external/register — Register or update an external agent
|
|
7
|
+
* POST /api/v1/agents/external/heartbeat — Send a heartbeat to stay online
|
|
8
|
+
* POST /api/v1/agents/external/unregister — Mark the agent as offline
|
|
9
|
+
* GET /api/v1/agents/external — List all external agents
|
|
10
|
+
*/
|
|
11
|
+
export declare class ExternalAgentController {
|
|
12
|
+
private get service();
|
|
13
|
+
/**
|
|
14
|
+
* Register or update an external agent (upsert by agentId).
|
|
15
|
+
*
|
|
16
|
+
* Body:
|
|
17
|
+
* agentId {string} — Caller-chosen unique identifier
|
|
18
|
+
* name {string} — Human-readable agent name
|
|
19
|
+
* description {string?} — Optional description
|
|
20
|
+
* endpoint {string} — HTTP URL that accepts POST task payloads
|
|
21
|
+
* capabilities {string[]?} — Optional list of capability tags
|
|
22
|
+
*/
|
|
23
|
+
registerAgent(req: Request, res: Response): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Send a heartbeat for the given agentId.
|
|
26
|
+
*
|
|
27
|
+
* Body:
|
|
28
|
+
* agentId {string}
|
|
29
|
+
*/
|
|
30
|
+
heartbeat(req: Request, res: Response): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Unregister (mark offline) the given external agent.
|
|
33
|
+
*
|
|
34
|
+
* Body:
|
|
35
|
+
* agentId {string}
|
|
36
|
+
*/
|
|
37
|
+
unregisterAgent(req: Request, res: Response): Promise<void>;
|
|
38
|
+
/** List all external agents (newest first). */
|
|
39
|
+
listAgents(_req: Request, res: Response): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=external-agent.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-agent.controller.d.ts","sourceRoot":"","sources":["../../../src/agent/external-agent.controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI1D;;;;;;;;GAQG;AACH,qBACa,uBAAuB;IAClC,OAAO,KAAK,OAAO,GAElB;IAED;;;;;;;;;OASG;IAEG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC/D;;;;;OAKG;IAEG,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3D;;;;;OAKG;IAEG,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAejE,+CAA+C;IAEzC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAI9D"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ExternalAgentController = void 0;
|
|
13
|
+
const core_1 = require("@octo-cyber/core");
|
|
14
|
+
const external_agent_service_js_1 = require("./external-agent.service.js");
|
|
15
|
+
/**
|
|
16
|
+
* ExternalAgentController — HTTP API for external agent self-management.
|
|
17
|
+
*
|
|
18
|
+
* Endpoints:
|
|
19
|
+
* POST /api/v1/agents/external/register — Register or update an external agent
|
|
20
|
+
* POST /api/v1/agents/external/heartbeat — Send a heartbeat to stay online
|
|
21
|
+
* POST /api/v1/agents/external/unregister — Mark the agent as offline
|
|
22
|
+
* GET /api/v1/agents/external — List all external agents
|
|
23
|
+
*/
|
|
24
|
+
let ExternalAgentController = class ExternalAgentController {
|
|
25
|
+
get service() {
|
|
26
|
+
return core_1.Container.get(external_agent_service_js_1.ExternalAgentService);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Register or update an external agent (upsert by agentId).
|
|
30
|
+
*
|
|
31
|
+
* Body:
|
|
32
|
+
* agentId {string} — Caller-chosen unique identifier
|
|
33
|
+
* name {string} — Human-readable agent name
|
|
34
|
+
* description {string?} — Optional description
|
|
35
|
+
* endpoint {string} — HTTP URL that accepts POST task payloads
|
|
36
|
+
* capabilities {string[]?} — Optional list of capability tags
|
|
37
|
+
*/
|
|
38
|
+
async registerAgent(req, res) {
|
|
39
|
+
const { agentId, name, description, endpoint, capabilities } = req.body;
|
|
40
|
+
if (!agentId || typeof agentId !== 'string' || agentId.trim().length === 0) {
|
|
41
|
+
throw core_1.AppError.badRequest('Missing or invalid agentId');
|
|
42
|
+
}
|
|
43
|
+
if (!name || typeof name !== 'string' || name.trim().length === 0) {
|
|
44
|
+
throw core_1.AppError.badRequest('Missing or invalid name');
|
|
45
|
+
}
|
|
46
|
+
if (!endpoint || typeof endpoint !== 'string' || endpoint.trim().length === 0) {
|
|
47
|
+
throw core_1.AppError.badRequest('Missing or invalid endpoint');
|
|
48
|
+
}
|
|
49
|
+
const dto = {
|
|
50
|
+
agentId: agentId.trim(),
|
|
51
|
+
name: name.trim(),
|
|
52
|
+
description: typeof description === 'string' ? description.trim() : undefined,
|
|
53
|
+
endpoint: endpoint.trim(),
|
|
54
|
+
capabilities: Array.isArray(capabilities)
|
|
55
|
+
? capabilities.filter((c) => typeof c === 'string')
|
|
56
|
+
: undefined,
|
|
57
|
+
};
|
|
58
|
+
const agent = await this.service.register(dto);
|
|
59
|
+
res.json(core_1.ApiResponse.ok(this.service.toDto(agent)));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Send a heartbeat for the given agentId.
|
|
63
|
+
*
|
|
64
|
+
* Body:
|
|
65
|
+
* agentId {string}
|
|
66
|
+
*/
|
|
67
|
+
async heartbeat(req, res) {
|
|
68
|
+
const { agentId } = req.body;
|
|
69
|
+
if (!agentId || typeof agentId !== 'string' || agentId.trim().length === 0) {
|
|
70
|
+
throw core_1.AppError.badRequest('Missing or invalid agentId');
|
|
71
|
+
}
|
|
72
|
+
const found = await this.service.heartbeat(agentId.trim());
|
|
73
|
+
if (!found) {
|
|
74
|
+
throw core_1.AppError.notFound(`External agent not found: ${agentId}`);
|
|
75
|
+
}
|
|
76
|
+
res.json(core_1.ApiResponse.ok({ ok: true }));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Unregister (mark offline) the given external agent.
|
|
80
|
+
*
|
|
81
|
+
* Body:
|
|
82
|
+
* agentId {string}
|
|
83
|
+
*/
|
|
84
|
+
async unregisterAgent(req, res) {
|
|
85
|
+
const { agentId } = req.body;
|
|
86
|
+
if (!agentId || typeof agentId !== 'string' || agentId.trim().length === 0) {
|
|
87
|
+
throw core_1.AppError.badRequest('Missing or invalid agentId');
|
|
88
|
+
}
|
|
89
|
+
const found = await this.service.unregister(agentId.trim());
|
|
90
|
+
if (!found) {
|
|
91
|
+
throw core_1.AppError.notFound(`External agent not found: ${agentId}`);
|
|
92
|
+
}
|
|
93
|
+
res.json(core_1.ApiResponse.ok({ unregistered: true }));
|
|
94
|
+
}
|
|
95
|
+
/** List all external agents (newest first). */
|
|
96
|
+
async listAgents(_req, res) {
|
|
97
|
+
const agents = await this.service.list();
|
|
98
|
+
res.json(core_1.ApiResponse.ok(agents.map((a) => this.service.toDto(a))));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
exports.ExternalAgentController = ExternalAgentController;
|
|
102
|
+
__decorate([
|
|
103
|
+
(0, core_1.Post)('/register'),
|
|
104
|
+
__metadata("design:type", Function),
|
|
105
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
106
|
+
__metadata("design:returntype", Promise)
|
|
107
|
+
], ExternalAgentController.prototype, "registerAgent", null);
|
|
108
|
+
__decorate([
|
|
109
|
+
(0, core_1.Post)('/heartbeat'),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
112
|
+
__metadata("design:returntype", Promise)
|
|
113
|
+
], ExternalAgentController.prototype, "heartbeat", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
(0, core_1.Post)('/unregister'),
|
|
116
|
+
__metadata("design:type", Function),
|
|
117
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
118
|
+
__metadata("design:returntype", Promise)
|
|
119
|
+
], ExternalAgentController.prototype, "unregisterAgent", null);
|
|
120
|
+
__decorate([
|
|
121
|
+
(0, core_1.Get)('/'),
|
|
122
|
+
__metadata("design:type", Function),
|
|
123
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
124
|
+
__metadata("design:returntype", Promise)
|
|
125
|
+
], ExternalAgentController.prototype, "listAgents", null);
|
|
126
|
+
exports.ExternalAgentController = ExternalAgentController = __decorate([
|
|
127
|
+
(0, core_1.Controller)('/api/v1/agents/external')
|
|
128
|
+
], ExternalAgentController);
|
|
129
|
+
//# sourceMappingURL=external-agent.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-agent.controller.js","sourceRoot":"","sources":["../../../src/agent/external-agent.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExternalAgent — persists remote agents that have registered their capabilities
|
|
3
|
+
* with Octo via the external agent registration API.
|
|
4
|
+
*
|
|
5
|
+
* External agents run on remote machines and expose an HTTP endpoint.
|
|
6
|
+
* Octo routes tasks to them by POSTing to that endpoint.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ExternalAgent {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
/** Caller-chosen unique identifier for this agent. Used for heartbeat and unregister. */
|
|
12
|
+
agentId: string;
|
|
13
|
+
description: string | null;
|
|
14
|
+
/** HTTP endpoint that accepts POST requests with task payloads. */
|
|
15
|
+
endpoint: string;
|
|
16
|
+
status: 'online' | 'offline';
|
|
17
|
+
lastHeartbeatAt: Date | null;
|
|
18
|
+
/** JSON-serialised array of capability strings (e.g. ["code-review", "summarise"]). */
|
|
19
|
+
capabilities: string | null;
|
|
20
|
+
createdAt: Date;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=external-agent.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-agent.entity.d.ts","sourceRoot":"","sources":["../../../src/agent/external-agent.entity.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,qBACa,aAAa;IAExB,EAAE,EAAG,MAAM,CAAC;IAGZ,IAAI,EAAG,MAAM,CAAC;IAEd,yFAAyF;IAEzF,OAAO,EAAG,MAAM,CAAC;IAGjB,WAAW,EAAG,MAAM,GAAG,IAAI,CAAC;IAE5B,mEAAmE;IAEnE,QAAQ,EAAG,MAAM,CAAC;IAGlB,MAAM,EAAG,QAAQ,GAAG,SAAS,CAAC;IAG9B,eAAe,EAAG,IAAI,GAAG,IAAI,CAAC;IAE9B,uFAAuF;IAEvF,YAAY,EAAG,MAAM,GAAG,IAAI,CAAC;IAG7B,SAAS,EAAG,IAAI,CAAC;CAClB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ExternalAgent = void 0;
|
|
13
|
+
const core_1 = require("@octo-cyber/core");
|
|
14
|
+
/**
|
|
15
|
+
* ExternalAgent — persists remote agents that have registered their capabilities
|
|
16
|
+
* with Octo via the external agent registration API.
|
|
17
|
+
*
|
|
18
|
+
* External agents run on remote machines and expose an HTTP endpoint.
|
|
19
|
+
* Octo routes tasks to them by POSTing to that endpoint.
|
|
20
|
+
*/
|
|
21
|
+
let ExternalAgent = class ExternalAgent {
|
|
22
|
+
id;
|
|
23
|
+
name;
|
|
24
|
+
/** Caller-chosen unique identifier for this agent. Used for heartbeat and unregister. */
|
|
25
|
+
agentId;
|
|
26
|
+
description;
|
|
27
|
+
/** HTTP endpoint that accepts POST requests with task payloads. */
|
|
28
|
+
endpoint;
|
|
29
|
+
status;
|
|
30
|
+
lastHeartbeatAt;
|
|
31
|
+
/** JSON-serialised array of capability strings (e.g. ["code-review", "summarise"]). */
|
|
32
|
+
capabilities;
|
|
33
|
+
createdAt;
|
|
34
|
+
};
|
|
35
|
+
exports.ExternalAgent = ExternalAgent;
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, core_1.PrimaryGeneratedColumn)('uuid'),
|
|
38
|
+
__metadata("design:type", String)
|
|
39
|
+
], ExternalAgent.prototype, "id", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, core_1.Column)({ type: 'varchar', length: 128 }),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], ExternalAgent.prototype, "name", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, core_1.Column)({ type: 'varchar', length: 64, unique: true }),
|
|
46
|
+
__metadata("design:type", String)
|
|
47
|
+
], ExternalAgent.prototype, "agentId", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, core_1.Column)({ type: 'text', nullable: true }),
|
|
50
|
+
__metadata("design:type", Object)
|
|
51
|
+
], ExternalAgent.prototype, "description", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
(0, core_1.Column)({ type: 'varchar', length: 512 }),
|
|
54
|
+
__metadata("design:type", String)
|
|
55
|
+
], ExternalAgent.prototype, "endpoint", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
(0, core_1.Column)({ type: 'varchar', length: 32, default: 'online' }),
|
|
58
|
+
__metadata("design:type", String)
|
|
59
|
+
], ExternalAgent.prototype, "status", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, core_1.Column)({ type: 'datetime', nullable: true, name: 'last_heartbeat_at' }),
|
|
62
|
+
__metadata("design:type", Object)
|
|
63
|
+
], ExternalAgent.prototype, "lastHeartbeatAt", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, core_1.Column)({ type: 'text', nullable: true }),
|
|
66
|
+
__metadata("design:type", Object)
|
|
67
|
+
], ExternalAgent.prototype, "capabilities", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, core_1.CreateDateColumn)({ name: 'created_at' }),
|
|
70
|
+
__metadata("design:type", Date)
|
|
71
|
+
], ExternalAgent.prototype, "createdAt", void 0);
|
|
72
|
+
exports.ExternalAgent = ExternalAgent = __decorate([
|
|
73
|
+
(0, core_1.Entity)('external_agent')
|
|
74
|
+
], ExternalAgent);
|
|
75
|
+
//# sourceMappingURL=external-agent.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-agent.entity.js","sourceRoot":"","sources":["../../../src/agent/external-agent.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAK0B;AAE1B;;;;;;GAMG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAExB,EAAE,CAAU;IAGZ,IAAI,CAAU;IAEd,yFAAyF;IAEzF,OAAO,CAAU;IAGjB,WAAW,CAAiB;IAE5B,mEAAmE;IAEnE,QAAQ,CAAU;IAGlB,MAAM,CAAwB;IAG9B,eAAe,CAAe;IAE9B,uFAAuF;IAEvF,YAAY,CAAiB;IAG7B,SAAS,CAAQ;CAClB,CAAA;AA9BY,sCAAa;AAExB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;yCACnB;AAGZ;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC3B;AAId;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;8CACrC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACb;AAI5B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;+CACvB;AAGlB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;;6CAC7B;AAG9B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;sDAC1C;AAI9B;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACZ;AAG7B;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;gDAAC;wBA7BN,aAAa;IADzB,IAAA,aAAM,EAAC,gBAAgB,CAAC;GACZ,aAAa,CA8BzB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Repository } from '@octo-cyber/core';
|
|
2
|
+
import { ExternalAgent } from './external-agent.entity.js';
|
|
3
|
+
export interface RegisterExternalAgentDto {
|
|
4
|
+
agentId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
endpoint: string;
|
|
8
|
+
capabilities?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ExternalAgentDto {
|
|
11
|
+
id: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string | null;
|
|
15
|
+
endpoint: string;
|
|
16
|
+
status: 'online' | 'offline';
|
|
17
|
+
lastHeartbeatAt: string | null;
|
|
18
|
+
capabilities: string[];
|
|
19
|
+
createdAt: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* ExternalAgentService — manages external (remote) agent registrations.
|
|
23
|
+
*
|
|
24
|
+
* External agents self-register, periodically heartbeat, and self-unregister.
|
|
25
|
+
* On register the agent is also synced into the in-memory AgentRegistryService
|
|
26
|
+
* so it appears in the unified capability list.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ExternalAgentService {
|
|
29
|
+
private readonly logger;
|
|
30
|
+
private repo;
|
|
31
|
+
setRepository(repo: Repository<ExternalAgent>): void;
|
|
32
|
+
private getRepo;
|
|
33
|
+
/**
|
|
34
|
+
* Register or update an external agent (upsert by agentId).
|
|
35
|
+
* Sets status='online' and updates lastHeartbeatAt.
|
|
36
|
+
*/
|
|
37
|
+
register(dto: RegisterExternalAgentDto): Promise<ExternalAgent>;
|
|
38
|
+
/**
|
|
39
|
+
* Update lastHeartbeatAt and set status='online'.
|
|
40
|
+
* Returns false if the agent is not found.
|
|
41
|
+
*/
|
|
42
|
+
heartbeat(agentId: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Set the agent's status to 'offline'.
|
|
45
|
+
* Returns false if the agent is not found.
|
|
46
|
+
*/
|
|
47
|
+
unregister(agentId: string): Promise<boolean>;
|
|
48
|
+
/** List all external agents, newest first. */
|
|
49
|
+
list(): Promise<ExternalAgent[]>;
|
|
50
|
+
getById(id: string): Promise<ExternalAgent | null>;
|
|
51
|
+
getByAgentId(agentId: string): Promise<ExternalAgent | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Mark agents whose lastHeartbeatAt is older than maxAgeMs as 'offline'.
|
|
54
|
+
* Returns the number of agents updated.
|
|
55
|
+
*/
|
|
56
|
+
markStaleOffline(maxAgeMs?: number): Promise<number>;
|
|
57
|
+
toDto(agent: ExternalAgent): ExternalAgentDto;
|
|
58
|
+
private syncToRegistry;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=external-agent.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-agent.service.d.ts","sourceRoot":"","sources":["../../../src/agent/external-agent.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAM3D,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBACa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;IACrF,OAAO,CAAC,IAAI,CAA0C;IAEtD,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI;IAIpD,OAAO,CAAC,OAAO;IAKf;;;OAGG;IACG,QAAQ,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+BrE;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlD;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnD,8CAA8C;IACxC,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIhC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIlD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIlE;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,SAA+B,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBhF,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB;IAgB7C,OAAO,CAAC,cAAc;CAUvB"}
|