@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.
Files changed (329) hide show
  1. package/dist/shared/IClaudeCodeSessionManager.d.ts +151 -0
  2. package/dist/shared/IClaudeCodeSessionManager.d.ts.map +1 -0
  3. package/dist/shared/IClaudeCodeSessionManager.js +6 -0
  4. package/dist/shared/IClaudeCodeSessionManager.js.map +1 -0
  5. package/dist/src/BranchDecisionEngine.d.ts +73 -0
  6. package/dist/src/BranchDecisionEngine.d.ts.map +1 -0
  7. package/dist/src/BranchDecisionEngine.js +195 -0
  8. package/dist/src/BranchDecisionEngine.js.map +1 -0
  9. package/dist/src/agent/agent-approval.controller.d.ts +20 -0
  10. package/dist/src/agent/agent-approval.controller.d.ts.map +1 -0
  11. package/dist/src/agent/agent-approval.controller.js +101 -0
  12. package/dist/src/agent/agent-approval.controller.js.map +1 -0
  13. package/dist/src/agent/agent-approval.entity.d.ts +15 -0
  14. package/dist/src/agent/agent-approval.entity.d.ts.map +1 -0
  15. package/dist/src/agent/agent-approval.entity.js +63 -0
  16. package/dist/src/agent/agent-approval.entity.js.map +1 -0
  17. package/dist/src/agent/agent-approval.service.d.ts +35 -0
  18. package/dist/src/agent/agent-approval.service.d.ts.map +1 -0
  19. package/dist/src/agent/agent-approval.service.js +109 -0
  20. package/dist/src/agent/agent-approval.service.js.map +1 -0
  21. package/dist/src/agent/agent-gateway.controller.d.ts +30 -0
  22. package/dist/src/agent/agent-gateway.controller.d.ts.map +1 -0
  23. package/dist/src/agent/agent-gateway.controller.js +112 -0
  24. package/dist/src/agent/agent-gateway.controller.js.map +1 -0
  25. package/dist/src/agent/agent-gateway.service.d.ts +33 -0
  26. package/dist/src/agent/agent-gateway.service.d.ts.map +1 -0
  27. package/dist/src/agent/agent-gateway.service.js +84 -0
  28. package/dist/src/agent/agent-gateway.service.js.map +1 -0
  29. package/dist/src/agent/agent-registry.service.d.ts +30 -0
  30. package/dist/src/agent/agent-registry.service.d.ts.map +1 -0
  31. package/dist/src/agent/agent-registry.service.js +45 -0
  32. package/dist/src/agent/agent-registry.service.js.map +1 -0
  33. package/dist/src/agent/agent-run.controller.d.ts +42 -0
  34. package/dist/src/agent/agent-run.controller.d.ts.map +1 -0
  35. package/dist/src/agent/agent-run.controller.js +195 -0
  36. package/dist/src/agent/agent-run.controller.js.map +1 -0
  37. package/dist/src/agent/agent-run.entity.d.ts +35 -0
  38. package/dist/src/agent/agent-run.entity.d.ts.map +1 -0
  39. package/dist/src/agent/agent-run.entity.js +98 -0
  40. package/dist/src/agent/agent-run.entity.js.map +1 -0
  41. package/dist/src/agent/agent-run.service.d.ts +48 -0
  42. package/dist/src/agent/agent-run.service.d.ts.map +1 -0
  43. package/dist/src/agent/agent-run.service.js +155 -0
  44. package/dist/src/agent/agent-run.service.js.map +1 -0
  45. package/dist/src/agent/agent-session.controller.d.ts +20 -0
  46. package/dist/src/agent/agent-session.controller.d.ts.map +1 -0
  47. package/dist/src/agent/agent-session.controller.js +97 -0
  48. package/dist/src/agent/agent-session.controller.js.map +1 -0
  49. package/dist/src/agent/agent-session.entity.d.ts +13 -0
  50. package/dist/src/agent/agent-session.entity.d.ts.map +1 -0
  51. package/dist/src/agent/agent-session.entity.js +57 -0
  52. package/dist/src/agent/agent-session.entity.js.map +1 -0
  53. package/dist/src/agent/agent-session.service.d.ts +38 -0
  54. package/dist/src/agent/agent-session.service.d.ts.map +1 -0
  55. package/dist/src/agent/agent-session.service.js +112 -0
  56. package/dist/src/agent/agent-session.service.js.map +1 -0
  57. package/dist/src/agent/coding-tools.d.ts +7 -0
  58. package/dist/src/agent/coding-tools.d.ts.map +1 -0
  59. package/dist/src/agent/coding-tools.js +181 -0
  60. package/dist/src/agent/coding-tools.js.map +1 -0
  61. package/dist/src/agent/computer-use-tools.d.ts +15 -0
  62. package/dist/src/agent/computer-use-tools.d.ts.map +1 -0
  63. package/dist/src/agent/computer-use-tools.js +256 -0
  64. package/dist/src/agent/computer-use-tools.js.map +1 -0
  65. package/dist/src/agent/external-agent.controller.d.ts +41 -0
  66. package/dist/src/agent/external-agent.controller.d.ts.map +1 -0
  67. package/dist/src/agent/external-agent.controller.js +129 -0
  68. package/dist/src/agent/external-agent.controller.js.map +1 -0
  69. package/dist/src/agent/external-agent.entity.d.ts +22 -0
  70. package/dist/src/agent/external-agent.entity.d.ts.map +1 -0
  71. package/dist/src/agent/external-agent.entity.js +75 -0
  72. package/dist/src/agent/external-agent.entity.js.map +1 -0
  73. package/dist/src/agent/external-agent.service.d.ts +60 -0
  74. package/dist/src/agent/external-agent.service.d.ts.map +1 -0
  75. package/dist/src/agent/external-agent.service.js +143 -0
  76. package/dist/src/agent/external-agent.service.js.map +1 -0
  77. package/dist/src/ai.module.d.ts +22 -0
  78. package/dist/src/ai.module.d.ts.map +1 -0
  79. package/dist/src/ai.module.js +178 -0
  80. package/dist/src/ai.module.js.map +1 -0
  81. package/dist/{cli → src/cli}/adapters/antigravity.adapter.d.ts +2 -0
  82. package/dist/src/cli/adapters/antigravity.adapter.d.ts.map +1 -0
  83. package/dist/{cli → src/cli}/adapters/antigravity.adapter.js +78 -0
  84. package/dist/src/cli/adapters/antigravity.adapter.js.map +1 -0
  85. package/dist/src/cli/adapters/claude-cli.adapter.d.ts.map +1 -0
  86. package/dist/{cli → src/cli}/adapters/claude-cli.adapter.js +2 -0
  87. package/dist/src/cli/adapters/claude-cli.adapter.js.map +1 -0
  88. package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts +32 -0
  89. package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts.map +1 -0
  90. package/dist/src/cli/adapters/cli-proxy-api.adapter.js +239 -0
  91. package/dist/src/cli/adapters/cli-proxy-api.adapter.js.map +1 -0
  92. package/dist/src/cli/adapters/codex-cli.adapter.d.ts.map +1 -0
  93. package/dist/src/cli/adapters/codex-cli.adapter.js.map +1 -0
  94. package/dist/src/cli/adapters/detect-cli.d.ts.map +1 -0
  95. package/dist/src/cli/adapters/detect-cli.js.map +1 -0
  96. package/dist/src/cli/adapters/gemini-cli.adapter.d.ts.map +1 -0
  97. package/dist/src/cli/adapters/gemini-cli.adapter.js.map +1 -0
  98. package/dist/src/cli/adapters/index.d.ts.map +1 -0
  99. package/dist/src/cli/adapters/index.js.map +1 -0
  100. package/dist/{cli → src/cli}/cli-executor.service.d.ts +2 -0
  101. package/dist/src/cli/cli-executor.service.d.ts.map +1 -0
  102. package/dist/{cli → src/cli}/cli-executor.service.js +21 -1
  103. package/dist/src/cli/cli-executor.service.js.map +1 -0
  104. package/dist/src/cli/cli-registry.service.d.ts.map +1 -0
  105. package/dist/{cli → src/cli}/cli-registry.service.js +3 -1
  106. package/dist/src/cli/cli-registry.service.js.map +1 -0
  107. package/dist/{cli → src/cli}/controllers/ai-cli.controller.d.ts +4 -0
  108. package/dist/src/cli/controllers/ai-cli.controller.d.ts.map +1 -0
  109. package/dist/{cli → src/cli}/controllers/ai-cli.controller.js +33 -4
  110. package/dist/src/cli/controllers/ai-cli.controller.js.map +1 -0
  111. package/dist/{cli → src/cli}/index.d.ts +1 -1
  112. package/dist/src/cli/index.d.ts.map +1 -0
  113. package/dist/src/cli/index.js.map +1 -0
  114. package/dist/{cli → src/cli}/types.d.ts +23 -1
  115. package/dist/src/cli/types.d.ts.map +1 -0
  116. package/dist/{skill → src/cli}/types.js.map +1 -1
  117. package/dist/{cli → src/cli}/workspace.service.d.ts +11 -3
  118. package/dist/src/cli/workspace.service.d.ts.map +1 -0
  119. package/dist/{cli → src/cli}/workspace.service.js +61 -6
  120. package/dist/src/cli/workspace.service.js.map +1 -0
  121. package/dist/src/computer-use/computer-use.controller.d.ts +23 -0
  122. package/dist/src/computer-use/computer-use.controller.d.ts.map +1 -0
  123. package/dist/src/computer-use/computer-use.controller.js +87 -0
  124. package/dist/src/computer-use/computer-use.controller.js.map +1 -0
  125. package/dist/src/index.d.ts +12 -0
  126. package/dist/src/index.d.ts.map +1 -0
  127. package/dist/src/index.js +51 -0
  128. package/dist/src/index.js.map +1 -0
  129. package/dist/src/orchestrator/orchestrator-plan.entity.d.ts +31 -0
  130. package/dist/src/orchestrator/orchestrator-plan.entity.d.ts.map +1 -0
  131. package/dist/src/orchestrator/orchestrator-plan.entity.js +69 -0
  132. package/dist/src/orchestrator/orchestrator-plan.entity.js.map +1 -0
  133. package/dist/src/orchestrator/orchestrator-plan.service.d.ts +27 -0
  134. package/dist/src/orchestrator/orchestrator-plan.service.d.ts.map +1 -0
  135. package/dist/src/orchestrator/orchestrator-plan.service.js +201 -0
  136. package/dist/src/orchestrator/orchestrator-plan.service.js.map +1 -0
  137. package/dist/src/orchestrator/orchestrator.controller.d.ts +29 -0
  138. package/dist/src/orchestrator/orchestrator.controller.d.ts.map +1 -0
  139. package/dist/src/orchestrator/orchestrator.controller.js +144 -0
  140. package/dist/src/orchestrator/orchestrator.controller.js.map +1 -0
  141. package/dist/src/orchestrator/workflow-feedback.entity.d.ts +12 -0
  142. package/dist/src/orchestrator/workflow-feedback.entity.d.ts.map +1 -0
  143. package/dist/src/orchestrator/workflow-feedback.entity.js +49 -0
  144. package/dist/src/orchestrator/workflow-feedback.entity.js.map +1 -0
  145. package/dist/src/orchestrator/workflow-feedback.service.d.ts +14 -0
  146. package/dist/src/orchestrator/workflow-feedback.service.d.ts.map +1 -0
  147. package/dist/src/orchestrator/workflow-feedback.service.js +51 -0
  148. package/dist/src/orchestrator/workflow-feedback.service.js.map +1 -0
  149. package/dist/src/session/claude-code-session-manager.service.d.ts +28 -0
  150. package/dist/src/session/claude-code-session-manager.service.d.ts.map +1 -0
  151. package/dist/src/session/claude-code-session-manager.service.js +177 -0
  152. package/dist/src/session/claude-code-session-manager.service.js.map +1 -0
  153. package/dist/src/skill/controllers/skill-market.controller.d.ts +18 -0
  154. package/dist/src/skill/controllers/skill-market.controller.d.ts.map +1 -0
  155. package/dist/src/skill/controllers/skill-market.controller.js +128 -0
  156. package/dist/src/skill/controllers/skill-market.controller.js.map +1 -0
  157. package/dist/{skill → src/skill}/controllers/skill.controller.d.ts +4 -0
  158. package/dist/src/skill/controllers/skill.controller.d.ts.map +1 -0
  159. package/dist/{skill → src/skill}/controllers/skill.controller.js +31 -0
  160. package/dist/src/skill/controllers/skill.controller.js.map +1 -0
  161. package/dist/src/skill/entities/octo-skill.entity.d.ts.map +1 -0
  162. package/dist/src/skill/entities/octo-skill.entity.js.map +1 -0
  163. package/dist/{skill → src/skill}/index.d.ts +3 -1
  164. package/dist/src/skill/index.d.ts.map +1 -0
  165. package/dist/{skill → src/skill}/index.js +5 -1
  166. package/dist/src/skill/index.js.map +1 -0
  167. package/dist/src/skill/services/skill-generator.service.d.ts.map +1 -0
  168. package/dist/src/skill/services/skill-generator.service.js.map +1 -0
  169. package/dist/{skill → src/skill}/services/skill-installer.service.d.ts +27 -0
  170. package/dist/src/skill/services/skill-installer.service.d.ts.map +1 -0
  171. package/dist/{skill → src/skill}/services/skill-installer.service.js +108 -0
  172. package/dist/src/skill/services/skill-installer.service.js.map +1 -0
  173. package/dist/src/skill/services/skill-market-helpers.d.ts +25 -0
  174. package/dist/src/skill/services/skill-market-helpers.d.ts.map +1 -0
  175. package/dist/src/skill/services/skill-market-helpers.js +22 -0
  176. package/dist/src/skill/services/skill-market-helpers.js.map +1 -0
  177. package/dist/src/skill/services/skill-market.service.d.ts +60 -0
  178. package/dist/src/skill/services/skill-market.service.d.ts.map +1 -0
  179. package/dist/src/skill/services/skill-market.service.js +228 -0
  180. package/dist/src/skill/services/skill-market.service.js.map +1 -0
  181. package/dist/{skill → src/skill}/services/skill-registry.service.d.ts +1 -0
  182. package/dist/src/skill/services/skill-registry.service.d.ts.map +1 -0
  183. package/dist/{skill → src/skill}/services/skill-registry.service.js +18 -6
  184. package/dist/src/skill/services/skill-registry.service.js.map +1 -0
  185. package/dist/{skill → src/skill}/types.d.ts +32 -1
  186. package/dist/src/skill/types.d.ts.map +1 -0
  187. package/dist/{cli → src/skill}/types.js.map +1 -1
  188. package/dist/src/workflow-design/DocumentExtractorAgent.d.ts +47 -0
  189. package/dist/src/workflow-design/DocumentExtractorAgent.d.ts.map +1 -0
  190. package/dist/src/workflow-design/DocumentExtractorAgent.js +118 -0
  191. package/dist/src/workflow-design/DocumentExtractorAgent.js.map +1 -0
  192. package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts +26 -0
  193. package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts.map +1 -0
  194. package/dist/src/workflow-design/N8nNodeKnowledgeBase.js +362 -0
  195. package/dist/src/workflow-design/N8nNodeKnowledgeBase.js.map +1 -0
  196. package/dist/src/workflow-design/OctoAgentClient.d.ts +42 -0
  197. package/dist/src/workflow-design/OctoAgentClient.d.ts.map +1 -0
  198. package/dist/src/workflow-design/OctoAgentClient.js +191 -0
  199. package/dist/src/workflow-design/OctoAgentClient.js.map +1 -0
  200. package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts +45 -0
  201. package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts.map +1 -0
  202. package/dist/src/workflow-design/WorkflowDesignOrchestrator.js +265 -0
  203. package/dist/src/workflow-design/WorkflowDesignOrchestrator.js.map +1 -0
  204. package/dist/src/workflow-design/agents/ActionChainAgent.d.ts +9 -0
  205. package/dist/src/workflow-design/agents/ActionChainAgent.d.ts.map +1 -0
  206. package/dist/src/workflow-design/agents/ActionChainAgent.js +79 -0
  207. package/dist/src/workflow-design/agents/ActionChainAgent.js.map +1 -0
  208. package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts +15 -0
  209. package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts.map +1 -0
  210. package/dist/src/workflow-design/agents/CodeScriptAgent.js +96 -0
  211. package/dist/src/workflow-design/agents/CodeScriptAgent.js.map +1 -0
  212. package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts +9 -0
  213. package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts.map +1 -0
  214. package/dist/src/workflow-design/agents/LogicFlowAgent.js +78 -0
  215. package/dist/src/workflow-design/agents/LogicFlowAgent.js.map +1 -0
  216. package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts +9 -0
  217. package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts.map +1 -0
  218. package/dist/src/workflow-design/agents/TriggerAnalystAgent.js +65 -0
  219. package/dist/src/workflow-design/agents/TriggerAnalystAgent.js.map +1 -0
  220. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts +9 -0
  221. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts.map +1 -0
  222. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js +117 -0
  223. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js.map +1 -0
  224. package/dist/src/workflow-design/index.d.ts +12 -0
  225. package/dist/src/workflow-design/index.d.ts.map +1 -0
  226. package/dist/src/workflow-design/index.js +23 -0
  227. package/dist/src/workflow-design/index.js.map +1 -0
  228. package/dist/src/workflow-design/types.d.ts +155 -0
  229. package/dist/src/workflow-design/types.d.ts.map +1 -0
  230. package/dist/src/workflow-design/types.js +6 -0
  231. package/dist/src/workflow-design/types.js.map +1 -0
  232. package/package.json +21 -15
  233. package/web/components/CreateWorkspaceDialog.tsx +157 -0
  234. package/web/components/DirBrowser.tsx +85 -0
  235. package/web/components/GithubTokenDialog.tsx +152 -0
  236. package/web/components/LocalPathSection.tsx +91 -0
  237. package/web/components/MarketInstallDialog.tsx +196 -0
  238. package/web/components/MarketSkillCard.tsx +74 -0
  239. package/web/components/RepoList.tsx +97 -0
  240. package/web/components/SearchResultsGrid.tsx +55 -0
  241. package/web/components/SkillCard.tsx +4 -1
  242. package/web/components/ToolCard.tsx +88 -0
  243. package/web/components/WorkspaceCard.tsx +146 -0
  244. package/web/components/WorkspaceItem.tsx +65 -0
  245. package/web/components/WorkspaceSelect.tsx +94 -0
  246. package/web/index.ts +18 -1
  247. package/web/manifest.ts +7 -0
  248. package/web/messages/en-US.json +231 -7
  249. package/web/messages/zh-CN.json +234 -7
  250. package/web/pages/AgentMarketPage.tsx +318 -0
  251. package/web/pages/AgentRunsPage.tsx +162 -0
  252. package/web/pages/AgentsPage.tsx +239 -0
  253. package/web/pages/AiCliToolsPage.tsx +17 -128
  254. package/web/pages/ApprovalsPage.tsx +260 -0
  255. package/web/pages/OrchestratorPage.tsx +384 -0
  256. package/web/pages/SessionsPage.tsx +248 -0
  257. package/web/pages/SkillMarketPage.tsx +25 -0
  258. package/web/pages/WorkspaceSection.tsx +13 -113
  259. package/web/pages/WorkspacesPage.tsx +29 -254
  260. package/web/services/agent-approval.service.ts +35 -0
  261. package/web/services/agent-gateway.service.ts +41 -0
  262. package/web/services/agent-run.service.ts +48 -0
  263. package/web/services/agent-session.service.ts +30 -0
  264. package/web/services/ai-cli-service.ts +33 -0
  265. package/web/services/external-agent.service.ts +38 -0
  266. package/web/services/orchestrator.service.ts +52 -0
  267. package/web/services/skill-market-service.ts +88 -0
  268. package/web/services/skill-service.ts +12 -0
  269. package/dist/ai.module.d.ts +0 -4
  270. package/dist/ai.module.d.ts.map +0 -1
  271. package/dist/ai.module.js +0 -59
  272. package/dist/ai.module.js.map +0 -1
  273. package/dist/cli/adapters/antigravity.adapter.d.ts.map +0 -1
  274. package/dist/cli/adapters/antigravity.adapter.js.map +0 -1
  275. package/dist/cli/adapters/claude-cli.adapter.d.ts.map +0 -1
  276. package/dist/cli/adapters/claude-cli.adapter.js.map +0 -1
  277. package/dist/cli/adapters/codex-cli.adapter.d.ts.map +0 -1
  278. package/dist/cli/adapters/codex-cli.adapter.js.map +0 -1
  279. package/dist/cli/adapters/detect-cli.d.ts.map +0 -1
  280. package/dist/cli/adapters/detect-cli.js.map +0 -1
  281. package/dist/cli/adapters/gemini-cli.adapter.d.ts.map +0 -1
  282. package/dist/cli/adapters/gemini-cli.adapter.js.map +0 -1
  283. package/dist/cli/adapters/index.d.ts.map +0 -1
  284. package/dist/cli/adapters/index.js.map +0 -1
  285. package/dist/cli/cli-executor.service.d.ts.map +0 -1
  286. package/dist/cli/cli-executor.service.js.map +0 -1
  287. package/dist/cli/cli-registry.service.d.ts.map +0 -1
  288. package/dist/cli/cli-registry.service.js.map +0 -1
  289. package/dist/cli/controllers/ai-cli.controller.d.ts.map +0 -1
  290. package/dist/cli/controllers/ai-cli.controller.js.map +0 -1
  291. package/dist/cli/index.d.ts.map +0 -1
  292. package/dist/cli/index.js.map +0 -1
  293. package/dist/cli/types.d.ts.map +0 -1
  294. package/dist/cli/workspace.service.d.ts.map +0 -1
  295. package/dist/cli/workspace.service.js.map +0 -1
  296. package/dist/index.d.ts +0 -5
  297. package/dist/index.d.ts.map +0 -1
  298. package/dist/index.js +0 -23
  299. package/dist/index.js.map +0 -1
  300. package/dist/skill/controllers/skill.controller.d.ts.map +0 -1
  301. package/dist/skill/controllers/skill.controller.js.map +0 -1
  302. package/dist/skill/entities/octo-skill.entity.d.ts.map +0 -1
  303. package/dist/skill/entities/octo-skill.entity.js.map +0 -1
  304. package/dist/skill/index.d.ts.map +0 -1
  305. package/dist/skill/index.js.map +0 -1
  306. package/dist/skill/services/skill-generator.service.d.ts.map +0 -1
  307. package/dist/skill/services/skill-generator.service.js.map +0 -1
  308. package/dist/skill/services/skill-installer.service.d.ts.map +0 -1
  309. package/dist/skill/services/skill-installer.service.js.map +0 -1
  310. package/dist/skill/services/skill-registry.service.d.ts.map +0 -1
  311. package/dist/skill/services/skill-registry.service.js.map +0 -1
  312. package/dist/skill/types.d.ts.map +0 -1
  313. /package/dist/{cli → src/cli}/adapters/claude-cli.adapter.d.ts +0 -0
  314. /package/dist/{cli → src/cli}/adapters/codex-cli.adapter.d.ts +0 -0
  315. /package/dist/{cli → src/cli}/adapters/codex-cli.adapter.js +0 -0
  316. /package/dist/{cli → src/cli}/adapters/detect-cli.d.ts +0 -0
  317. /package/dist/{cli → src/cli}/adapters/detect-cli.js +0 -0
  318. /package/dist/{cli → src/cli}/adapters/gemini-cli.adapter.d.ts +0 -0
  319. /package/dist/{cli → src/cli}/adapters/gemini-cli.adapter.js +0 -0
  320. /package/dist/{cli → src/cli}/adapters/index.d.ts +0 -0
  321. /package/dist/{cli → src/cli}/adapters/index.js +0 -0
  322. /package/dist/{cli → src/cli}/cli-registry.service.d.ts +0 -0
  323. /package/dist/{cli → src/cli}/index.js +0 -0
  324. /package/dist/{cli → src/cli}/types.js +0 -0
  325. /package/dist/{skill → src/skill}/entities/octo-skill.entity.d.ts +0 -0
  326. /package/dist/{skill → src/skill}/entities/octo-skill.entity.js +0 -0
  327. /package/dist/{skill → src/skill}/services/skill-generator.service.d.ts +0 -0
  328. /package/dist/{skill → src/skill}/services/skill-generator.service.js +0 -0
  329. /package/dist/{skill → src/skill}/types.js +0 -0
@@ -1,24 +1,160 @@
1
1
  {
2
+ "aiTools": {
3
+ "title": "AI 工具",
4
+ "description": "本地 AI CLI 工具管理",
5
+ "pages": {
6
+ "tools": "工具集管理",
7
+ "workspaces": "工作空间",
8
+ "skills": "技能管理",
9
+ "skillMarket": "Skill 市场",
10
+ "agentRuns": "执行历史",
11
+ "agents": "Agent 能力",
12
+ "approvals": "审批中心",
13
+ "sessions": "会话管理",
14
+ "agentMarket": "Agent 市场",
15
+ "orchestrator": "自动编排"
16
+ },
17
+ "agentGateway": {
18
+ "title": "Agent 能力",
19
+ "description": "管理和测试已注册的 Agent 能力",
20
+ "loadError": "加载 Agent 列表失败",
21
+ "noAgents": "暂无 Agent",
22
+ "available": "可用",
23
+ "unavailable": "不可用",
24
+ "testAgent": "测试",
25
+ "prompt": "提示词",
26
+ "promptPlaceholder": "输入任务描述,例如:截图并分析当前页面内容",
27
+ "running": "执行中...",
28
+ "run": "执行",
29
+ "runId": "运行 ID",
30
+ "viewRun": "查看执行"
31
+ },
32
+ "approvals": {
33
+ "title": "审批中心",
34
+ "description": "查看并处理 Agent 执行中的人工确认请求",
35
+ "question": "审批问题",
36
+ "runId": "关联执行",
37
+ "createdAt": "提交时间",
38
+ "status": "状态",
39
+ "pending": "待审批",
40
+ "approved": "已批准",
41
+ "rejected": "已拒绝",
42
+ "noPending": "暂无审批请求",
43
+ "responsePlaceholder": "填写审批意见(可选)",
44
+ "response": "审批意见",
45
+ "approve": "批准",
46
+ "reject": "拒绝",
47
+ "approveSuccess": "已批准",
48
+ "rejectSuccess": "已拒绝"
49
+ },
50
+ "sessions": {
51
+ "title": "会话管理",
52
+ "description": "管理 Agent 执行会话,共享上下文",
53
+ "context": "共享上下文",
54
+ "active": "活跃",
55
+ "completed": "已完成",
56
+ "paused": "已暂停",
57
+ "name": "名称",
58
+ "status": "状态",
59
+ "runs": "执行数",
60
+ "createdAt": "创建时间",
61
+ "noSessions": "暂无会话",
62
+ "unnamed": "未命名",
63
+ "close": "关闭",
64
+ "newSession": "新建会话",
65
+ "sessionName": "为新会话命名(可选)",
66
+ "namePlaceholder": "例如:项目自动化任务",
67
+ "createSuccess": "会话已创建",
68
+ "closeSuccess": "会话已关闭"
69
+ },
70
+ "agentMarket": {
71
+ "title": "Agent 市场",
72
+ "description": "管理已注册的远端 Agent,支持局域网多机协作",
73
+ "online": "在线",
74
+ "offline": "离线",
75
+ "loadError": "加载 Agent 列表失败",
76
+ "noAgents": "暂无已注册的 Agent",
77
+ "name": "名称",
78
+ "agentId": "Agent ID",
79
+ "endpoint": "接入地址",
80
+ "capabilities": "能力标签",
81
+ "status": "状态",
82
+ "lastHeartbeat": "最近心跳",
83
+ "never": "从未",
84
+ "registerAgent": "注册 Agent",
85
+ "agentIdPlaceholder": "例如:machine01/computer-use",
86
+ "namePlaceholder": "例如:桌面控制 Agent",
87
+ "endpointPlaceholder": "例如:http://192.168.1.100:8080/invoke",
88
+ "capabilitiesPlaceholder": "例如:screenshot, click, type",
89
+ "capabilitiesHint": "多个能力用英文逗号分隔",
90
+ "register": "注册",
91
+ "registerSuccess": "Agent 注册成功",
92
+ "unregister": "注销",
93
+ "unregisterSuccess": "Agent 已注销"
94
+ },
95
+ "orchestrator": {
96
+ "title": "自动编排",
97
+ "description": "用自然语言描述目标,AI 自动规划并执行多 Agent 工作流",
98
+ "goalPlaceholder": "描述你想完成的目标,例如:每天自动整理销售数据并生成周报发给团队",
99
+ "generatePlan": "生成计划",
100
+ "generating": "生成中...",
101
+ "executePlan": "执行计划",
102
+ "executing": "执行中...",
103
+ "planCreated": "计划已生成",
104
+ "planCompleted": "计划执行完成",
105
+ "planFailed": "计划执行失败",
106
+ "recentPlans": "历史计划",
107
+ "goal": "目标描述",
108
+ "status": "状态",
109
+ "stepsProgress": "步骤进度",
110
+ "steps": "执行步骤",
111
+ "result": "执行结果",
112
+ "noPlans": "暂无计划",
113
+ "feedback": "执行反馈",
114
+ "commentPlaceholder": "填写反馈意见(可选)",
115
+ "submitFeedback": "提交反馈",
116
+ "feedbackThanks": "感谢反馈!",
117
+ "draft": "草稿",
118
+ "running": "执行中",
119
+ "completed": "已完成",
120
+ "failed": "失败",
121
+ "pending": "待执行",
122
+ "steps-running": "执行中",
123
+ "steps-completed": "已完成",
124
+ "steps-failed": "失败"
125
+ }
126
+ },
2
127
  "nav": {
3
128
  "aiTools": {
4
129
  "title": "AI 工具",
5
130
  "description": "本地 AI CLI 工具管理",
6
131
  "pages": {
7
- "tools": "CLI 工具",
132
+ "tools": "工具集管理",
8
133
  "workspaces": "工作空间",
9
- "skills": "技能管理"
134
+ "skills": "技能管理",
135
+ "skillMarket": "Skill 市场",
136
+ "agentRuns": "执行历史",
137
+ "agents": "Agent 能力",
138
+ "approvals": "审批中心",
139
+ "sessions": "会话管理",
140
+ "agentMarket": "Agent 市场",
141
+ "orchestrator": "自动编排"
10
142
  }
11
143
  }
12
144
  },
13
145
  "aiCli": {
14
- "title": "AI CLI 工具",
15
- "description": "管理本地 AI 工具(Claude、Gemini、Codex、Antigravity)的状态和测试",
146
+ "title": "工具集管理",
147
+ "description": "管理本地 AI 工具(CLI 工具与 API 工具)的状态和测试",
16
148
  "summary": "{available}/{total} 个工具可用",
17
- "noTools": "未检测到任何 CLI 工具",
149
+ "noTools": "未检测到任何工具",
18
150
  "status": {
19
151
  "available": "可用",
20
152
  "unavailable": "不可用"
21
153
  },
154
+ "toolType": {
155
+ "cli": "CLI",
156
+ "api": "API"
157
+ },
22
158
  "actions": {
23
159
  "healthCheck": "检测",
24
160
  "testRun": "测试"
@@ -37,6 +173,9 @@
37
173
  "noOutput": "无输出"
38
174
  },
39
175
  "modelCount": "{count} 个模型",
176
+ "installedSkills": "已安装 Skills",
177
+ "noInstalledSkills": "暂无已安装的 Skills",
178
+ "skillCount": "{count} 个 Skill",
40
179
  "toast": {
41
180
  "loadFailed": "加载工具列表失败",
42
181
  "healthOk": "{name} 检测通过",
@@ -68,13 +207,24 @@
68
207
  "typeGithubDesc": "从 GitHub 仓库克隆代码作为工作空间",
69
208
  "nameLabel": "名称",
70
209
  "namePlaceholder": "例如:my-project",
210
+ "descriptionLabel": "描述",
211
+ "descriptionPlaceholder": "简要描述工作空间用途,方便 Skill 快速定位",
71
212
  "localPathLabel": "本地目录路径",
72
213
  "localPathPlaceholder": "例如:/Users/user/projects/my-project",
214
+ "browse": "浏览",
215
+ "parentDir": "上级目录",
216
+ "selectThisDir": "选择此目录",
217
+ "emptyDir": "此目录为空",
218
+ "gitDetected": "检测到 Git 仓库",
219
+ "gitNotDetected": "未检测到 Git 仓库",
220
+ "detecting": "检测中...",
73
221
  "repoUrlLabel": "仓库地址",
74
222
  "repoUrlPlaceholder": "例如:https://github.com/user/repo.git",
75
223
  "branchLabel": "分支",
76
224
  "branchPlaceholder": "例如:main"
77
225
  },
226
+ "installedSkills": "已安装 Skills",
227
+ "noInstalledSkills": "暂无",
78
228
  "deleteConfirm": "确定要删除工作空间「{name}」吗?",
79
229
  "deleteConfirmLocal": "仅移除工作空间记录,不会删除原目录。",
80
230
  "deleteConfirmGithub": "将删除克隆的仓库目录。",
@@ -86,7 +236,10 @@
86
236
  "deleteFailed": "删除失败",
87
237
  "pulled": "已拉取最新代码",
88
238
  "pullFailed": "拉取失败"
89
- }
239
+ },
240
+ "selectPlaceholder": "选择工作空间",
241
+ "noWorkspace": "不绑定工作空间",
242
+ "loading": "加载工作空间..."
90
243
  }
91
244
  },
92
245
  "aiSkills": {
@@ -140,6 +293,80 @@
140
293
  },
141
294
  "pages": {
142
295
  "skills": "AI Skills"
296
+ },
297
+ "market": {
298
+ "title": "Skill 市场",
299
+ "description": "浏览和安装 Skill 到 AI 工具",
300
+ "comingSoon": "敬请期待"
301
+ }
302
+ },
303
+ "aiSkillMarket": {
304
+ "title": "Skill 市场",
305
+ "description": "搜索和安装社区 Agent Skills",
306
+ "searchPlaceholder": "搜索 Skills,例如 excel, react, testing...",
307
+ "search": "搜索",
308
+ "searching": "搜索中...",
309
+ "featuredRepos": "精选仓库",
310
+ "searchResults": "搜索结果",
311
+ "noResults": "未找到相关 Skills",
312
+ "installTitle": "安装 Skill",
313
+ "installDesc": "选择要安装到的 AI 工具",
314
+ "install": "安装",
315
+ "installing": "安装中...",
316
+ "installed": "已安装",
317
+ "installSuccess": "Skill 安装成功",
318
+ "installFailed": "安装失败",
319
+ "from": "来自",
320
+ "skills": "个 Skills",
321
+ "stars": "Star",
322
+ "category": "分类",
323
+ "browseSkills": "浏览 Skills",
324
+ "loading": "加载中...",
325
+ "selectTargets": "选择安装目标",
326
+ "installScopeLabel": "安装范围",
327
+ "userLevel": "用户级",
328
+ "userLevelDesc": "安装到用户级 skills 目录(所有项目可用)",
329
+ "workspaceLevel": "工作空间",
330
+ "workspaceLevelDesc": "安装到指定工作空间目录(仅该项目可用)",
331
+ "selectWorkspace": "选择工作空间",
332
+ "tokenConfig": {
333
+ "title": "GitHub Token",
334
+ "description": "配置 GitHub Token 以提升 API 速率限制(未配置时限制 60 次/小时,配置后 5000 次/小时)",
335
+ "inputLabel": "GitHub Personal Access Token",
336
+ "inputPlaceholder": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
337
+ "currentToken": "当前 Token",
338
+ "source": "来源",
339
+ "sourceConfig": "手动配置",
340
+ "sourceEnv": "环境变量",
341
+ "noToken": "未配置 Token",
342
+ "noTokenHint": "未配置 GitHub Token,API 请求限制为 60 次/小时,可能导致搜索失败",
343
+ "save": "保存",
344
+ "clear": "清除",
345
+ "saved": "Token 已保存",
346
+ "cleared": "Token 已清除",
347
+ "saveFailed": "保存失败",
348
+ "settings": "设置"
349
+ }
350
+ },
351
+ "agentRuns": {
352
+ "title": "执行历史",
353
+ "description": "查看所有 Agent 异步执行记录及状态",
354
+ "columns": {
355
+ "status": "状态",
356
+ "agentType": "Agent 类型",
357
+ "prompt": "任务描述",
358
+ "createdAt": "创建时间",
359
+ "duration": "耗时"
360
+ },
361
+ "status": {
362
+ "pending": "等待中",
363
+ "running": "执行中",
364
+ "completed": "已完成",
365
+ "failed": "失败",
366
+ "cancelled": "已取消"
367
+ },
368
+ "toast": {
369
+ "loadFailed": "加载执行记录失败"
143
370
  }
144
371
  }
145
- }
372
+ }
@@ -0,0 +1,318 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect, useCallback } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { RefreshCw, Loader2, Plus, Trash2 } from 'lucide-react'
7
+
8
+ import { PageHeader } from '@octo-cyber/ui/components/shared/page-header'
9
+ import { Button } from '@octo-cyber/ui/components/ui/button'
10
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
11
+ import { Input } from '@octo-cyber/ui/components/ui/input'
12
+ import { Label } from '@octo-cyber/ui/components/ui/label'
13
+ import { Textarea } from '@octo-cyber/ui/components/ui/textarea'
14
+ import {
15
+ Table,
16
+ TableBody,
17
+ TableCell,
18
+ TableHead,
19
+ TableHeader,
20
+ TableRow,
21
+ } from '@octo-cyber/ui/components/ui/table'
22
+ import {
23
+ Dialog,
24
+ DialogContent,
25
+ DialogDescription,
26
+ DialogFooter,
27
+ DialogHeader,
28
+ DialogTitle,
29
+ } from '@octo-cyber/ui/components/ui/dialog'
30
+
31
+ import { externalAgentService } from '../services/external-agent.service'
32
+ import type { ExternalAgent } from '../services/external-agent.service'
33
+
34
+ const REFRESH_INTERVAL_MS = 15_000
35
+
36
+ function StatusBadge({ status }: { status: ExternalAgent['status'] }) {
37
+ const t = useTranslations('aiTools.agentMarket')
38
+ return (
39
+ <Badge
40
+ variant="outline"
41
+ className={
42
+ status === 'online'
43
+ ? 'bg-green-500 hover:bg-green-500/80 text-white border-transparent'
44
+ : 'text-muted-foreground'
45
+ }
46
+ >
47
+ {t(status)}
48
+ </Badge>
49
+ )
50
+ }
51
+
52
+ function CapabilitiesList({ capabilities }: { capabilities: string[] | null }) {
53
+ if (!capabilities || capabilities.length === 0) return <span className="text-muted-foreground">—</span>
54
+ return (
55
+ <div className="flex flex-wrap gap-1">
56
+ {capabilities.map((cap) => (
57
+ <Badge key={cap} variant="secondary" className="text-xs">
58
+ {cap}
59
+ </Badge>
60
+ ))}
61
+ </div>
62
+ )
63
+ }
64
+
65
+ interface RegisterFormState {
66
+ agentId: string
67
+ name: string
68
+ description: string
69
+ endpoint: string
70
+ capabilities: string
71
+ }
72
+
73
+ const EMPTY_FORM: RegisterFormState = {
74
+ agentId: '',
75
+ name: '',
76
+ description: '',
77
+ endpoint: '',
78
+ capabilities: '',
79
+ }
80
+
81
+ export default function AgentMarketPage() {
82
+ const t = useTranslations('aiTools.agentMarket')
83
+ const tc = useTranslations('common')
84
+
85
+ const [agents, setAgents] = useState<ExternalAgent[]>([])
86
+ const [loading, setLoading] = useState(true)
87
+ const [dialogOpen, setDialogOpen] = useState(false)
88
+ const [form, setForm] = useState<RegisterFormState>(EMPTY_FORM)
89
+ const [registering, setRegistering] = useState(false)
90
+ const [unregisteringId, setUnregisteringId] = useState<string | null>(null)
91
+
92
+ const loadAgents = useCallback(async () => {
93
+ try {
94
+ const data = await externalAgentService.listAgents()
95
+ setAgents(data)
96
+ } catch {
97
+ toast.error(t('loadError'))
98
+ } finally {
99
+ setLoading(false)
100
+ }
101
+ }, [t])
102
+
103
+ useEffect(() => {
104
+ loadAgents()
105
+ const timer = setInterval(loadAgents, REFRESH_INTERVAL_MS)
106
+ return () => clearInterval(timer)
107
+ }, [loadAgents])
108
+
109
+ const handleRegister = async () => {
110
+ setRegistering(true)
111
+ try {
112
+ const capabilities = form.capabilities
113
+ .split(',')
114
+ .map((s) => s.trim())
115
+ .filter(Boolean)
116
+ await externalAgentService.registerAgent({
117
+ agentId: form.agentId.trim(),
118
+ name: form.name.trim(),
119
+ description: form.description.trim() || undefined,
120
+ endpoint: form.endpoint.trim(),
121
+ capabilities: capabilities.length > 0 ? capabilities : undefined,
122
+ })
123
+ toast.success(t('registerSuccess'))
124
+ setDialogOpen(false)
125
+ setForm(EMPTY_FORM)
126
+ await loadAgents()
127
+ } catch {
128
+ toast.error(tc('operationFailed'))
129
+ } finally {
130
+ setRegistering(false)
131
+ }
132
+ }
133
+
134
+ const handleUnregister = async (agentId: string) => {
135
+ setUnregisteringId(agentId)
136
+ try {
137
+ await externalAgentService.unregisterAgent(agentId)
138
+ toast.success(t('unregisterSuccess'))
139
+ await loadAgents()
140
+ } catch {
141
+ toast.error(tc('operationFailed'))
142
+ } finally {
143
+ setUnregisteringId(null)
144
+ }
145
+ }
146
+
147
+ const isFormValid = form.agentId.trim() && form.name.trim() && form.endpoint.trim()
148
+
149
+ return (
150
+ <div className="space-y-6">
151
+ <PageHeader title={t('title')} description={t('description')}>
152
+ <div className="flex gap-2">
153
+ <Button variant="outline" onClick={loadAgents} disabled={loading}>
154
+ {loading ? (
155
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
156
+ ) : (
157
+ <RefreshCw className="mr-2 h-4 w-4" />
158
+ )}
159
+ {tc('refresh')}
160
+ </Button>
161
+ <Button onClick={() => setDialogOpen(true)}>
162
+ <Plus className="mr-2 h-4 w-4" />
163
+ {t('registerAgent')}
164
+ </Button>
165
+ </div>
166
+ </PageHeader>
167
+
168
+ <div className="rounded-lg border dark:border-zinc-800">
169
+ <Table>
170
+ <TableHeader>
171
+ <TableRow>
172
+ <TableHead className="w-[18%]">{t('name')}</TableHead>
173
+ <TableHead className="w-[14%]">{t('agentId')}</TableHead>
174
+ <TableHead className="w-[20%]">{t('endpoint')}</TableHead>
175
+ <TableHead>{t('capabilities')}</TableHead>
176
+ <TableHead className="w-[10%]">{t('status')}</TableHead>
177
+ <TableHead className="w-[14%]">{t('lastHeartbeat')}</TableHead>
178
+ <TableHead className="text-right w-[10%]">{tc('actions')}</TableHead>
179
+ </TableRow>
180
+ </TableHeader>
181
+ <TableBody>
182
+ {loading ? (
183
+ <TableRow>
184
+ <TableCell colSpan={7} className="h-32 text-center text-muted-foreground">
185
+ {tc('loading')}
186
+ </TableCell>
187
+ </TableRow>
188
+ ) : agents.length === 0 ? (
189
+ <TableRow>
190
+ <TableCell colSpan={7} className="h-32 text-center text-muted-foreground">
191
+ {t('noAgents')}
192
+ </TableCell>
193
+ </TableRow>
194
+ ) : (
195
+ agents.map((agent) => (
196
+ <TableRow key={agent.id}>
197
+ <TableCell className="font-medium text-sm">{agent.name}</TableCell>
198
+ <TableCell>
199
+ <code className="text-xs font-mono bg-muted dark:bg-zinc-800 px-1.5 py-0.5 rounded">
200
+ {agent.agentId}
201
+ </code>
202
+ </TableCell>
203
+ <TableCell className="text-sm text-muted-foreground max-w-[160px] truncate" title={agent.endpoint}>
204
+ {agent.endpoint}
205
+ </TableCell>
206
+ <TableCell>
207
+ <CapabilitiesList capabilities={agent.capabilities} />
208
+ </TableCell>
209
+ <TableCell>
210
+ <StatusBadge status={agent.status} />
211
+ </TableCell>
212
+ <TableCell className="text-sm text-muted-foreground">
213
+ {agent.lastHeartbeatAt
214
+ ? new Date(agent.lastHeartbeatAt).toLocaleString()
215
+ : t('never')}
216
+ </TableCell>
217
+ <TableCell className="text-right">
218
+ <Button
219
+ size="sm"
220
+ variant="outline"
221
+ onClick={() => handleUnregister(agent.agentId)}
222
+ disabled={unregisteringId === agent.agentId}
223
+ className="h-7 px-2 text-xs text-destructive hover:text-destructive"
224
+ >
225
+ {unregisteringId === agent.agentId ? (
226
+ <Loader2 className="h-3 w-3 animate-spin" />
227
+ ) : (
228
+ <Trash2 className="h-3 w-3" />
229
+ )}
230
+ <span className="ml-1">{t('unregister')}</span>
231
+ </Button>
232
+ </TableCell>
233
+ </TableRow>
234
+ ))
235
+ )}
236
+ </TableBody>
237
+ </Table>
238
+ </div>
239
+
240
+ <Dialog open={dialogOpen} onOpenChange={(open) => { if (!registering) setDialogOpen(open) }}>
241
+ <DialogContent className="sm:max-w-lg dark:bg-zinc-900 dark:border-zinc-700">
242
+ <DialogHeader>
243
+ <DialogTitle>{t('registerAgent')}</DialogTitle>
244
+ <DialogDescription>{t('description')}</DialogDescription>
245
+ </DialogHeader>
246
+ <div className="space-y-4 py-2">
247
+ <div className="space-y-2">
248
+ <Label htmlFor="agent-id">{t('agentId')} *</Label>
249
+ <Input
250
+ id="agent-id"
251
+ placeholder={t('agentIdPlaceholder')}
252
+ value={form.agentId}
253
+ onChange={(e) => setForm((f) => ({ ...f, agentId: e.target.value }))}
254
+ disabled={registering}
255
+ className="dark:bg-zinc-800 dark:border-zinc-700 font-mono"
256
+ />
257
+ </div>
258
+ <div className="space-y-2">
259
+ <Label htmlFor="agent-name">{t('name')} *</Label>
260
+ <Input
261
+ id="agent-name"
262
+ placeholder={t('namePlaceholder')}
263
+ value={form.name}
264
+ onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}
265
+ disabled={registering}
266
+ className="dark:bg-zinc-800 dark:border-zinc-700"
267
+ />
268
+ </div>
269
+ <div className="space-y-2">
270
+ <Label htmlFor="agent-desc">{tc('description')}</Label>
271
+ <Textarea
272
+ id="agent-desc"
273
+ placeholder={tc('noDescription')}
274
+ value={form.description}
275
+ onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}
276
+ disabled={registering}
277
+ rows={2}
278
+ className="dark:bg-zinc-800 dark:border-zinc-700 resize-none"
279
+ />
280
+ </div>
281
+ <div className="space-y-2">
282
+ <Label htmlFor="agent-endpoint">{t('endpoint')} *</Label>
283
+ <Input
284
+ id="agent-endpoint"
285
+ placeholder={t('endpointPlaceholder')}
286
+ value={form.endpoint}
287
+ onChange={(e) => setForm((f) => ({ ...f, endpoint: e.target.value }))}
288
+ disabled={registering}
289
+ className="dark:bg-zinc-800 dark:border-zinc-700"
290
+ />
291
+ </div>
292
+ <div className="space-y-2">
293
+ <Label htmlFor="agent-capabilities">{t('capabilities')}</Label>
294
+ <Input
295
+ id="agent-capabilities"
296
+ placeholder={t('capabilitiesPlaceholder')}
297
+ value={form.capabilities}
298
+ onChange={(e) => setForm((f) => ({ ...f, capabilities: e.target.value }))}
299
+ disabled={registering}
300
+ className="dark:bg-zinc-800 dark:border-zinc-700"
301
+ />
302
+ <p className="text-xs text-muted-foreground">{t('capabilitiesHint')}</p>
303
+ </div>
304
+ </div>
305
+ <DialogFooter>
306
+ <Button variant="outline" onClick={() => setDialogOpen(false)} disabled={registering}>
307
+ {tc('cancel')}
308
+ </Button>
309
+ <Button onClick={handleRegister} disabled={registering || !isFormValid}>
310
+ {registering && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
311
+ {t('register')}
312
+ </Button>
313
+ </DialogFooter>
314
+ </DialogContent>
315
+ </Dialog>
316
+ </div>
317
+ )
318
+ }