@octo-cyber/ai 0.5.5 → 0.5.7

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 (426) hide show
  1. package/dist/BranchDecisionEngine.d.ts +73 -0
  2. package/dist/BranchDecisionEngine.d.ts.map +1 -0
  3. package/dist/BranchDecisionEngine.js +195 -0
  4. package/dist/BranchDecisionEngine.js.map +1 -0
  5. package/dist/agent/coding-tools.d.ts +7 -0
  6. package/dist/agent/coding-tools.d.ts.map +1 -0
  7. package/dist/agent/coding-tools.js +181 -0
  8. package/dist/agent/coding-tools.js.map +1 -0
  9. package/dist/ai.module.d.ts +14 -2
  10. package/dist/ai.module.d.ts.map +1 -1
  11. package/dist/ai.module.js +61 -14
  12. package/dist/ai.module.js.map +1 -1
  13. package/dist/cli/adapters/antigravity.adapter.d.ts +2 -0
  14. package/dist/cli/adapters/antigravity.adapter.d.ts.map +1 -1
  15. package/dist/cli/adapters/antigravity.adapter.js +78 -0
  16. package/dist/cli/adapters/antigravity.adapter.js.map +1 -1
  17. package/dist/cli/adapters/claude-cli.adapter.d.ts.map +1 -1
  18. package/dist/cli/adapters/claude-cli.adapter.js +2 -0
  19. package/dist/cli/adapters/claude-cli.adapter.js.map +1 -1
  20. package/dist/cli/adapters/cli-proxy-api.adapter.d.ts +32 -0
  21. package/dist/cli/adapters/cli-proxy-api.adapter.d.ts.map +1 -0
  22. package/dist/cli/adapters/cli-proxy-api.adapter.js +239 -0
  23. package/dist/cli/adapters/cli-proxy-api.adapter.js.map +1 -0
  24. package/dist/cli/cli-executor.service.d.ts +2 -0
  25. package/dist/cli/cli-executor.service.d.ts.map +1 -1
  26. package/dist/cli/cli-executor.service.js +21 -1
  27. package/dist/cli/cli-executor.service.js.map +1 -1
  28. package/dist/cli/cli-registry.service.d.ts.map +1 -1
  29. package/dist/cli/cli-registry.service.js +3 -1
  30. package/dist/cli/cli-registry.service.js.map +1 -1
  31. package/dist/cli/controllers/ai-cli.controller.d.ts +4 -0
  32. package/dist/cli/controllers/ai-cli.controller.d.ts.map +1 -1
  33. package/dist/cli/controllers/ai-cli.controller.js +33 -4
  34. package/dist/cli/controllers/ai-cli.controller.js.map +1 -1
  35. package/dist/cli/index.d.ts +1 -1
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/types.d.ts +23 -1
  39. package/dist/cli/types.d.ts.map +1 -1
  40. package/dist/cli/workspace.service.d.ts +11 -3
  41. package/dist/cli/workspace.service.d.ts.map +1 -1
  42. package/dist/cli/workspace.service.js +61 -6
  43. package/dist/cli/workspace.service.js.map +1 -1
  44. package/dist/index.d.ts +5 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +22 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/session/claude-code-session-manager.service.d.ts +28 -0
  49. package/dist/session/claude-code-session-manager.service.d.ts.map +1 -0
  50. package/dist/session/claude-code-session-manager.service.js +177 -0
  51. package/dist/session/claude-code-session-manager.service.js.map +1 -0
  52. package/dist/shared/IClaudeCodeSessionManager.d.ts +151 -0
  53. package/dist/shared/IClaudeCodeSessionManager.d.ts.map +1 -0
  54. package/dist/shared/IClaudeCodeSessionManager.js +6 -0
  55. package/dist/shared/IClaudeCodeSessionManager.js.map +1 -0
  56. package/dist/skill/controllers/skill-market.controller.d.ts +18 -0
  57. package/dist/skill/controllers/skill-market.controller.d.ts.map +1 -0
  58. package/dist/skill/controllers/skill-market.controller.js +128 -0
  59. package/dist/skill/controllers/skill-market.controller.js.map +1 -0
  60. package/dist/skill/controllers/skill.controller.d.ts +4 -0
  61. package/dist/skill/controllers/skill.controller.d.ts.map +1 -1
  62. package/dist/skill/controllers/skill.controller.js +31 -0
  63. package/dist/skill/controllers/skill.controller.js.map +1 -1
  64. package/dist/skill/index.d.ts +3 -1
  65. package/dist/skill/index.d.ts.map +1 -1
  66. package/dist/skill/index.js +5 -1
  67. package/dist/skill/index.js.map +1 -1
  68. package/dist/skill/services/skill-installer.service.d.ts +27 -0
  69. package/dist/skill/services/skill-installer.service.d.ts.map +1 -1
  70. package/dist/skill/services/skill-installer.service.js +108 -0
  71. package/dist/skill/services/skill-installer.service.js.map +1 -1
  72. package/dist/skill/services/skill-market.service.d.ts +60 -0
  73. package/dist/skill/services/skill-market.service.d.ts.map +1 -0
  74. package/dist/skill/services/skill-market.service.js +244 -0
  75. package/dist/skill/services/skill-market.service.js.map +1 -0
  76. package/dist/skill/services/skill-registry.service.js +4 -4
  77. package/dist/skill/services/skill-registry.service.js.map +1 -1
  78. package/dist/skill/types.d.ts +32 -1
  79. package/dist/skill/types.d.ts.map +1 -1
  80. package/dist/src/BranchDecisionEngine.d.ts +73 -0
  81. package/dist/src/BranchDecisionEngine.d.ts.map +1 -0
  82. package/dist/src/BranchDecisionEngine.js +195 -0
  83. package/dist/src/BranchDecisionEngine.js.map +1 -0
  84. package/dist/src/agent/agent-approval.controller.d.ts +20 -0
  85. package/dist/src/agent/agent-approval.controller.d.ts.map +1 -0
  86. package/dist/src/agent/agent-approval.controller.js +101 -0
  87. package/dist/src/agent/agent-approval.controller.js.map +1 -0
  88. package/dist/src/agent/agent-approval.entity.d.ts +15 -0
  89. package/dist/src/agent/agent-approval.entity.d.ts.map +1 -0
  90. package/dist/src/agent/agent-approval.entity.js +63 -0
  91. package/dist/src/agent/agent-approval.entity.js.map +1 -0
  92. package/dist/src/agent/agent-approval.service.d.ts +35 -0
  93. package/dist/src/agent/agent-approval.service.d.ts.map +1 -0
  94. package/dist/src/agent/agent-approval.service.js +109 -0
  95. package/dist/src/agent/agent-approval.service.js.map +1 -0
  96. package/dist/src/agent/agent-gateway.controller.d.ts +30 -0
  97. package/dist/src/agent/agent-gateway.controller.d.ts.map +1 -0
  98. package/dist/src/agent/agent-gateway.controller.js +112 -0
  99. package/dist/src/agent/agent-gateway.controller.js.map +1 -0
  100. package/dist/src/agent/agent-gateway.service.d.ts +33 -0
  101. package/dist/src/agent/agent-gateway.service.d.ts.map +1 -0
  102. package/dist/src/agent/agent-gateway.service.js +84 -0
  103. package/dist/src/agent/agent-gateway.service.js.map +1 -0
  104. package/dist/src/agent/agent-registry.service.d.ts +30 -0
  105. package/dist/src/agent/agent-registry.service.d.ts.map +1 -0
  106. package/dist/src/agent/agent-registry.service.js +45 -0
  107. package/dist/src/agent/agent-registry.service.js.map +1 -0
  108. package/dist/src/agent/agent-run-persistence.service.d.ts +82 -0
  109. package/dist/src/agent/agent-run-persistence.service.d.ts.map +1 -0
  110. package/dist/src/agent/agent-run-persistence.service.js +171 -0
  111. package/dist/src/agent/agent-run-persistence.service.js.map +1 -0
  112. package/dist/src/agent/agent-run-step.entity.d.ts +23 -0
  113. package/dist/src/agent/agent-run-step.entity.d.ts.map +1 -0
  114. package/dist/src/agent/agent-run-step.entity.js +76 -0
  115. package/dist/src/agent/agent-run-step.entity.js.map +1 -0
  116. package/dist/src/agent/agent-run.controller.d.ts +42 -0
  117. package/dist/src/agent/agent-run.controller.d.ts.map +1 -0
  118. package/dist/src/agent/agent-run.controller.js +195 -0
  119. package/dist/src/agent/agent-run.controller.js.map +1 -0
  120. package/dist/src/agent/agent-run.entity.d.ts +35 -0
  121. package/dist/src/agent/agent-run.entity.d.ts.map +1 -0
  122. package/dist/src/agent/agent-run.entity.js +98 -0
  123. package/dist/src/agent/agent-run.entity.js.map +1 -0
  124. package/dist/src/agent/agent-run.service.d.ts +48 -0
  125. package/dist/src/agent/agent-run.service.d.ts.map +1 -0
  126. package/dist/src/agent/agent-run.service.js +155 -0
  127. package/dist/src/agent/agent-run.service.js.map +1 -0
  128. package/dist/src/agent/agent-session.controller.d.ts +20 -0
  129. package/dist/src/agent/agent-session.controller.d.ts.map +1 -0
  130. package/dist/src/agent/agent-session.controller.js +97 -0
  131. package/dist/src/agent/agent-session.controller.js.map +1 -0
  132. package/dist/src/agent/agent-session.entity.d.ts +13 -0
  133. package/dist/src/agent/agent-session.entity.d.ts.map +1 -0
  134. package/dist/src/agent/agent-session.entity.js +57 -0
  135. package/dist/src/agent/agent-session.entity.js.map +1 -0
  136. package/dist/src/agent/agent-session.service.d.ts +38 -0
  137. package/dist/src/agent/agent-session.service.d.ts.map +1 -0
  138. package/dist/src/agent/agent-session.service.js +112 -0
  139. package/dist/src/agent/agent-session.service.js.map +1 -0
  140. package/dist/src/agent/coding-tools.d.ts +7 -0
  141. package/dist/src/agent/coding-tools.d.ts.map +1 -0
  142. package/dist/src/agent/coding-tools.js +181 -0
  143. package/dist/src/agent/coding-tools.js.map +1 -0
  144. package/dist/src/agent/computer-use-tools.d.ts +15 -0
  145. package/dist/src/agent/computer-use-tools.d.ts.map +1 -0
  146. package/dist/src/agent/computer-use-tools.js +256 -0
  147. package/dist/src/agent/computer-use-tools.js.map +1 -0
  148. package/dist/src/agent/external-agent.controller.d.ts +41 -0
  149. package/dist/src/agent/external-agent.controller.d.ts.map +1 -0
  150. package/dist/src/agent/external-agent.controller.js +129 -0
  151. package/dist/src/agent/external-agent.controller.js.map +1 -0
  152. package/dist/src/agent/external-agent.entity.d.ts +22 -0
  153. package/dist/src/agent/external-agent.entity.d.ts.map +1 -0
  154. package/dist/src/agent/external-agent.entity.js +75 -0
  155. package/dist/src/agent/external-agent.entity.js.map +1 -0
  156. package/dist/src/agent/external-agent.service.d.ts +60 -0
  157. package/dist/src/agent/external-agent.service.d.ts.map +1 -0
  158. package/dist/src/agent/external-agent.service.js +143 -0
  159. package/dist/src/agent/external-agent.service.js.map +1 -0
  160. package/dist/src/ai.module.d.ts +22 -0
  161. package/dist/src/ai.module.d.ts.map +1 -0
  162. package/dist/src/ai.module.js +178 -0
  163. package/dist/src/ai.module.js.map +1 -0
  164. package/dist/src/cli/adapters/antigravity.adapter.d.ts +31 -0
  165. package/dist/src/cli/adapters/antigravity.adapter.d.ts.map +1 -0
  166. package/dist/src/cli/adapters/antigravity.adapter.js +248 -0
  167. package/dist/src/cli/adapters/antigravity.adapter.js.map +1 -0
  168. package/dist/src/cli/adapters/claude-cli.adapter.d.ts +23 -0
  169. package/dist/src/cli/adapters/claude-cli.adapter.d.ts.map +1 -0
  170. package/dist/src/cli/adapters/claude-cli.adapter.js +81 -0
  171. package/dist/src/cli/adapters/claude-cli.adapter.js.map +1 -0
  172. package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts +32 -0
  173. package/dist/src/cli/adapters/cli-proxy-api.adapter.d.ts.map +1 -0
  174. package/dist/src/cli/adapters/cli-proxy-api.adapter.js +239 -0
  175. package/dist/src/cli/adapters/cli-proxy-api.adapter.js.map +1 -0
  176. package/dist/src/cli/adapters/codex-cli.adapter.d.ts +22 -0
  177. package/dist/src/cli/adapters/codex-cli.adapter.d.ts.map +1 -0
  178. package/dist/src/cli/adapters/codex-cli.adapter.js +76 -0
  179. package/dist/src/cli/adapters/codex-cli.adapter.js.map +1 -0
  180. package/dist/src/cli/adapters/detect-cli.d.ts +11 -0
  181. package/dist/src/cli/adapters/detect-cli.d.ts.map +1 -0
  182. package/dist/src/cli/adapters/detect-cli.js +40 -0
  183. package/dist/src/cli/adapters/detect-cli.js.map +1 -0
  184. package/dist/src/cli/adapters/gemini-cli.adapter.d.ts +21 -0
  185. package/dist/src/cli/adapters/gemini-cli.adapter.d.ts.map +1 -0
  186. package/dist/src/cli/adapters/gemini-cli.adapter.js +72 -0
  187. package/dist/src/cli/adapters/gemini-cli.adapter.js.map +1 -0
  188. package/dist/src/cli/adapters/index.d.ts +4 -0
  189. package/dist/src/cli/adapters/index.d.ts.map +1 -0
  190. package/dist/src/cli/adapters/index.js +10 -0
  191. package/dist/src/cli/adapters/index.js.map +1 -0
  192. package/dist/src/cli/cli-executor.service.d.ts +25 -0
  193. package/dist/src/cli/cli-executor.service.d.ts.map +1 -0
  194. package/dist/src/cli/cli-executor.service.js +170 -0
  195. package/dist/src/cli/cli-executor.service.js.map +1 -0
  196. package/dist/src/cli/cli-registry.service.d.ts +38 -0
  197. package/dist/src/cli/cli-registry.service.d.ts.map +1 -0
  198. package/dist/src/cli/cli-registry.service.js +114 -0
  199. package/dist/src/cli/cli-registry.service.js.map +1 -0
  200. package/dist/src/cli/controllers/ai-cli.controller.d.ts +40 -0
  201. package/dist/src/cli/controllers/ai-cli.controller.d.ts.map +1 -0
  202. package/dist/src/cli/controllers/ai-cli.controller.js +208 -0
  203. package/dist/src/cli/controllers/ai-cli.controller.js.map +1 -0
  204. package/dist/src/cli/index.d.ts +8 -0
  205. package/dist/src/cli/index.d.ts.map +1 -0
  206. package/dist/src/cli/index.js +17 -0
  207. package/dist/src/cli/index.js.map +1 -0
  208. package/dist/src/cli/types.d.ts +153 -0
  209. package/dist/src/cli/types.d.ts.map +1 -0
  210. package/dist/src/cli/types.js +9 -0
  211. package/dist/src/cli/types.js.map +1 -0
  212. package/dist/src/cli/workspace.service.d.ts +42 -0
  213. package/dist/src/cli/workspace.service.d.ts.map +1 -0
  214. package/dist/src/cli/workspace.service.js +249 -0
  215. package/dist/src/cli/workspace.service.js.map +1 -0
  216. package/dist/src/computer-use/computer-use.controller.d.ts +23 -0
  217. package/dist/src/computer-use/computer-use.controller.d.ts.map +1 -0
  218. package/dist/src/computer-use/computer-use.controller.js +87 -0
  219. package/dist/src/computer-use/computer-use.controller.js.map +1 -0
  220. package/dist/src/index.d.ts +12 -0
  221. package/dist/src/index.d.ts.map +1 -0
  222. package/dist/src/index.js +51 -0
  223. package/dist/src/index.js.map +1 -0
  224. package/dist/src/orchestrator/orchestrator-plan.entity.d.ts +31 -0
  225. package/dist/src/orchestrator/orchestrator-plan.entity.d.ts.map +1 -0
  226. package/dist/src/orchestrator/orchestrator-plan.entity.js +69 -0
  227. package/dist/src/orchestrator/orchestrator-plan.entity.js.map +1 -0
  228. package/dist/src/orchestrator/orchestrator-plan.service.d.ts +27 -0
  229. package/dist/src/orchestrator/orchestrator-plan.service.d.ts.map +1 -0
  230. package/dist/src/orchestrator/orchestrator-plan.service.js +201 -0
  231. package/dist/src/orchestrator/orchestrator-plan.service.js.map +1 -0
  232. package/dist/src/orchestrator/orchestrator.controller.d.ts +29 -0
  233. package/dist/src/orchestrator/orchestrator.controller.d.ts.map +1 -0
  234. package/dist/src/orchestrator/orchestrator.controller.js +144 -0
  235. package/dist/src/orchestrator/orchestrator.controller.js.map +1 -0
  236. package/dist/src/orchestrator/workflow-feedback.entity.d.ts +12 -0
  237. package/dist/src/orchestrator/workflow-feedback.entity.d.ts.map +1 -0
  238. package/dist/src/orchestrator/workflow-feedback.entity.js +49 -0
  239. package/dist/src/orchestrator/workflow-feedback.entity.js.map +1 -0
  240. package/dist/src/orchestrator/workflow-feedback.service.d.ts +14 -0
  241. package/dist/src/orchestrator/workflow-feedback.service.d.ts.map +1 -0
  242. package/dist/src/orchestrator/workflow-feedback.service.js +51 -0
  243. package/dist/src/orchestrator/workflow-feedback.service.js.map +1 -0
  244. package/dist/src/session/claude-code-session-manager.service.d.ts +28 -0
  245. package/dist/src/session/claude-code-session-manager.service.d.ts.map +1 -0
  246. package/dist/src/session/claude-code-session-manager.service.js +177 -0
  247. package/dist/src/session/claude-code-session-manager.service.js.map +1 -0
  248. package/dist/src/skill/controllers/skill-market.controller.d.ts +18 -0
  249. package/dist/src/skill/controllers/skill-market.controller.d.ts.map +1 -0
  250. package/dist/src/skill/controllers/skill-market.controller.js +128 -0
  251. package/dist/src/skill/controllers/skill-market.controller.js.map +1 -0
  252. package/dist/src/skill/controllers/skill.controller.d.ts +37 -0
  253. package/dist/src/skill/controllers/skill.controller.d.ts.map +1 -0
  254. package/dist/src/skill/controllers/skill.controller.js +295 -0
  255. package/dist/src/skill/controllers/skill.controller.js.map +1 -0
  256. package/dist/src/skill/entities/octo-skill.entity.d.ts +22 -0
  257. package/dist/src/skill/entities/octo-skill.entity.d.ts.map +1 -0
  258. package/dist/src/skill/entities/octo-skill.entity.js +91 -0
  259. package/dist/src/skill/entities/octo-skill.entity.js.map +1 -0
  260. package/dist/src/skill/index.d.ts +9 -0
  261. package/dist/src/skill/index.d.ts.map +1 -0
  262. package/dist/src/skill/index.js +21 -0
  263. package/dist/src/skill/index.js.map +1 -0
  264. package/dist/src/skill/services/skill-generator.service.d.ts +47 -0
  265. package/dist/src/skill/services/skill-generator.service.d.ts.map +1 -0
  266. package/dist/src/skill/services/skill-generator.service.js +232 -0
  267. package/dist/src/skill/services/skill-generator.service.js.map +1 -0
  268. package/dist/src/skill/services/skill-installer.service.d.ts +65 -0
  269. package/dist/src/skill/services/skill-installer.service.d.ts.map +1 -0
  270. package/dist/src/skill/services/skill-installer.service.js +258 -0
  271. package/dist/src/skill/services/skill-installer.service.js.map +1 -0
  272. package/dist/src/skill/services/skill-market-helpers.d.ts +25 -0
  273. package/dist/src/skill/services/skill-market-helpers.d.ts.map +1 -0
  274. package/dist/src/skill/services/skill-market-helpers.js +22 -0
  275. package/dist/src/skill/services/skill-market-helpers.js.map +1 -0
  276. package/dist/src/skill/services/skill-market-utils.d.ts +25 -0
  277. package/dist/src/skill/services/skill-market-utils.d.ts.map +1 -0
  278. package/dist/src/skill/services/skill-market-utils.js +22 -0
  279. package/dist/src/skill/services/skill-market-utils.js.map +1 -0
  280. package/dist/src/skill/services/skill-market.service.d.ts +60 -0
  281. package/dist/src/skill/services/skill-market.service.d.ts.map +1 -0
  282. package/dist/src/skill/services/skill-market.service.js +228 -0
  283. package/dist/src/skill/services/skill-market.service.js.map +1 -0
  284. package/dist/src/skill/services/skill-registry.service.d.ts +61 -0
  285. package/dist/src/skill/services/skill-registry.service.d.ts.map +1 -0
  286. package/dist/src/skill/services/skill-registry.service.js +159 -0
  287. package/dist/src/skill/services/skill-registry.service.js.map +1 -0
  288. package/dist/src/skill/types.d.ts +76 -0
  289. package/dist/src/skill/types.d.ts.map +1 -0
  290. package/dist/src/skill/types.js +6 -0
  291. package/dist/src/skill/types.js.map +1 -0
  292. package/dist/src/workflow-design/DocumentExtractorAgent.d.ts +47 -0
  293. package/dist/src/workflow-design/DocumentExtractorAgent.d.ts.map +1 -0
  294. package/dist/src/workflow-design/DocumentExtractorAgent.js +118 -0
  295. package/dist/src/workflow-design/DocumentExtractorAgent.js.map +1 -0
  296. package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts +26 -0
  297. package/dist/src/workflow-design/N8nNodeKnowledgeBase.d.ts.map +1 -0
  298. package/dist/src/workflow-design/N8nNodeKnowledgeBase.js +362 -0
  299. package/dist/src/workflow-design/N8nNodeKnowledgeBase.js.map +1 -0
  300. package/dist/src/workflow-design/OctoAgentClient.d.ts +42 -0
  301. package/dist/src/workflow-design/OctoAgentClient.d.ts.map +1 -0
  302. package/dist/src/workflow-design/OctoAgentClient.js +191 -0
  303. package/dist/src/workflow-design/OctoAgentClient.js.map +1 -0
  304. package/dist/src/workflow-design/WorkflowAssembler.d.ts +10 -0
  305. package/dist/src/workflow-design/WorkflowAssembler.d.ts.map +1 -0
  306. package/dist/src/workflow-design/WorkflowAssembler.js +81 -0
  307. package/dist/src/workflow-design/WorkflowAssembler.js.map +1 -0
  308. package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts +45 -0
  309. package/dist/src/workflow-design/WorkflowDesignOrchestrator.d.ts.map +1 -0
  310. package/dist/src/workflow-design/WorkflowDesignOrchestrator.js +265 -0
  311. package/dist/src/workflow-design/WorkflowDesignOrchestrator.js.map +1 -0
  312. package/dist/src/workflow-design/agents/ActionChainAgent.d.ts +9 -0
  313. package/dist/src/workflow-design/agents/ActionChainAgent.d.ts.map +1 -0
  314. package/dist/src/workflow-design/agents/ActionChainAgent.js +79 -0
  315. package/dist/src/workflow-design/agents/ActionChainAgent.js.map +1 -0
  316. package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts +15 -0
  317. package/dist/src/workflow-design/agents/CodeScriptAgent.d.ts.map +1 -0
  318. package/dist/src/workflow-design/agents/CodeScriptAgent.js +96 -0
  319. package/dist/src/workflow-design/agents/CodeScriptAgent.js.map +1 -0
  320. package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts +9 -0
  321. package/dist/src/workflow-design/agents/LogicFlowAgent.d.ts.map +1 -0
  322. package/dist/src/workflow-design/agents/LogicFlowAgent.js +78 -0
  323. package/dist/src/workflow-design/agents/LogicFlowAgent.js.map +1 -0
  324. package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts +9 -0
  325. package/dist/src/workflow-design/agents/TriggerAnalystAgent.d.ts.map +1 -0
  326. package/dist/src/workflow-design/agents/TriggerAnalystAgent.js +65 -0
  327. package/dist/src/workflow-design/agents/TriggerAnalystAgent.js.map +1 -0
  328. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts +9 -0
  329. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.d.ts.map +1 -0
  330. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js +117 -0
  331. package/dist/src/workflow-design/agents/WorkflowValidatorAgent.js.map +1 -0
  332. package/dist/src/workflow-design/index.d.ts +12 -0
  333. package/dist/src/workflow-design/index.d.ts.map +1 -0
  334. package/dist/src/workflow-design/index.js +23 -0
  335. package/dist/src/workflow-design/index.js.map +1 -0
  336. package/dist/src/workflow-design/n8n-node-templates-data.d.ts +4 -0
  337. package/dist/src/workflow-design/n8n-node-templates-data.d.ts.map +1 -0
  338. package/dist/src/workflow-design/n8n-node-templates-data.js +290 -0
  339. package/dist/src/workflow-design/n8n-node-templates-data.js.map +1 -0
  340. package/dist/src/workflow-design/types.d.ts +155 -0
  341. package/dist/src/workflow-design/types.d.ts.map +1 -0
  342. package/dist/src/workflow-design/types.js +6 -0
  343. package/dist/src/workflow-design/types.js.map +1 -0
  344. package/dist/workflow-design/DocumentExtractorAgent.d.ts +47 -0
  345. package/dist/workflow-design/DocumentExtractorAgent.d.ts.map +1 -0
  346. package/dist/workflow-design/DocumentExtractorAgent.js +118 -0
  347. package/dist/workflow-design/DocumentExtractorAgent.js.map +1 -0
  348. package/dist/workflow-design/N8nNodeKnowledgeBase.d.ts +26 -0
  349. package/dist/workflow-design/N8nNodeKnowledgeBase.d.ts.map +1 -0
  350. package/dist/workflow-design/N8nNodeKnowledgeBase.js +320 -0
  351. package/dist/workflow-design/N8nNodeKnowledgeBase.js.map +1 -0
  352. package/dist/workflow-design/OctoAgentClient.d.ts +42 -0
  353. package/dist/workflow-design/OctoAgentClient.d.ts.map +1 -0
  354. package/dist/workflow-design/OctoAgentClient.js +166 -0
  355. package/dist/workflow-design/OctoAgentClient.js.map +1 -0
  356. package/dist/workflow-design/WorkflowDesignOrchestrator.d.ts +45 -0
  357. package/dist/workflow-design/WorkflowDesignOrchestrator.d.ts.map +1 -0
  358. package/dist/workflow-design/WorkflowDesignOrchestrator.js +265 -0
  359. package/dist/workflow-design/WorkflowDesignOrchestrator.js.map +1 -0
  360. package/dist/workflow-design/agents/ActionChainAgent.d.ts +9 -0
  361. package/dist/workflow-design/agents/ActionChainAgent.d.ts.map +1 -0
  362. package/dist/workflow-design/agents/ActionChainAgent.js +79 -0
  363. package/dist/workflow-design/agents/ActionChainAgent.js.map +1 -0
  364. package/dist/workflow-design/agents/CodeScriptAgent.d.ts +15 -0
  365. package/dist/workflow-design/agents/CodeScriptAgent.d.ts.map +1 -0
  366. package/dist/workflow-design/agents/CodeScriptAgent.js +96 -0
  367. package/dist/workflow-design/agents/CodeScriptAgent.js.map +1 -0
  368. package/dist/workflow-design/agents/LogicFlowAgent.d.ts +9 -0
  369. package/dist/workflow-design/agents/LogicFlowAgent.d.ts.map +1 -0
  370. package/dist/workflow-design/agents/LogicFlowAgent.js +78 -0
  371. package/dist/workflow-design/agents/LogicFlowAgent.js.map +1 -0
  372. package/dist/workflow-design/agents/TriggerAnalystAgent.d.ts +9 -0
  373. package/dist/workflow-design/agents/TriggerAnalystAgent.d.ts.map +1 -0
  374. package/dist/workflow-design/agents/TriggerAnalystAgent.js +65 -0
  375. package/dist/workflow-design/agents/TriggerAnalystAgent.js.map +1 -0
  376. package/dist/workflow-design/agents/WorkflowValidatorAgent.d.ts +9 -0
  377. package/dist/workflow-design/agents/WorkflowValidatorAgent.d.ts.map +1 -0
  378. package/dist/workflow-design/agents/WorkflowValidatorAgent.js +117 -0
  379. package/dist/workflow-design/agents/WorkflowValidatorAgent.js.map +1 -0
  380. package/dist/workflow-design/index.d.ts +12 -0
  381. package/dist/workflow-design/index.d.ts.map +1 -0
  382. package/dist/workflow-design/index.js +23 -0
  383. package/dist/workflow-design/index.js.map +1 -0
  384. package/dist/workflow-design/types.d.ts +155 -0
  385. package/dist/workflow-design/types.d.ts.map +1 -0
  386. package/dist/workflow-design/types.js +6 -0
  387. package/dist/workflow-design/types.js.map +1 -0
  388. package/package.json +21 -14
  389. package/web/components/CreateWorkspaceDialog.tsx +157 -0
  390. package/web/components/DirBrowser.tsx +85 -0
  391. package/web/components/GithubTokenDialog.tsx +152 -0
  392. package/web/components/LocalPathSection.tsx +91 -0
  393. package/web/components/MarketInstallDialog.tsx +196 -0
  394. package/web/components/MarketSkillCard.tsx +74 -0
  395. package/web/components/RepoList.tsx +97 -0
  396. package/web/components/SearchResultsGrid.tsx +55 -0
  397. package/web/components/SkillCard.tsx +4 -1
  398. package/web/components/ToolCard.tsx +88 -0
  399. package/web/components/WorkspaceCard.tsx +146 -0
  400. package/web/components/WorkspaceItem.tsx +65 -0
  401. package/web/components/WorkspaceSelect.tsx +94 -0
  402. package/web/dist/module.iife.js +254 -0
  403. package/web/dynamic-entry.tsx +94 -0
  404. package/web/index.ts +18 -1
  405. package/web/manifest.ts +7 -0
  406. package/web/messages/en-US.json +231 -7
  407. package/web/messages/zh-CN.json +234 -7
  408. package/web/pages/AgentMarketPage.tsx +318 -0
  409. package/web/pages/AgentRunsPage.tsx +162 -0
  410. package/web/pages/AgentsPage.tsx +239 -0
  411. package/web/pages/AiCliToolsPage.tsx +17 -128
  412. package/web/pages/ApprovalsPage.tsx +260 -0
  413. package/web/pages/OrchestratorPage.tsx +384 -0
  414. package/web/pages/SessionsPage.tsx +248 -0
  415. package/web/pages/SkillMarketPage.tsx +25 -0
  416. package/web/pages/WorkspaceSection.tsx +13 -113
  417. package/web/pages/WorkspacesPage.tsx +29 -254
  418. package/web/services/agent-approval.service.ts +35 -0
  419. package/web/services/agent-gateway.service.ts +41 -0
  420. package/web/services/agent-run.service.ts +48 -0
  421. package/web/services/agent-session.service.ts +30 -0
  422. package/web/services/ai-cli-service.ts +33 -0
  423. package/web/services/external-agent.service.ts +38 -0
  424. package/web/services/orchestrator.service.ts +52 -0
  425. package/web/services/skill-market-service.ts +88 -0
  426. package/web/services/skill-service.ts +12 -0
@@ -0,0 +1,74 @@
1
+ 'use client'
2
+
3
+ import { memo } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { Download, Star, ExternalLink } from 'lucide-react'
6
+
7
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
8
+ import { Button } from '@octo-cyber/ui/components/ui/button'
9
+ import {
10
+ Card,
11
+ CardContent,
12
+ CardDescription,
13
+ CardHeader,
14
+ CardTitle,
15
+ } from '@octo-cyber/ui/components/ui/card'
16
+
17
+ import type { MarketSkillInfo } from '../services/skill-market-service'
18
+
19
+ interface MarketSkillCardProps {
20
+ skill: MarketSkillInfo
21
+ onInstall: () => void
22
+ className?: string
23
+ }
24
+
25
+ function MarketSkillCard({
26
+ skill,
27
+ onInstall,
28
+ className,
29
+ }: MarketSkillCardProps) {
30
+ const t = useTranslations('aiSkillMarket')
31
+
32
+ return (
33
+ <Card className={`flex flex-col ${className ?? ''}`}>
34
+ <CardHeader className="pb-2">
35
+ <CardTitle className="text-base font-semibold">{skill.name}</CardTitle>
36
+ <CardDescription className="line-clamp-2 text-sm">
37
+ {skill.description}
38
+ </CardDescription>
39
+ </CardHeader>
40
+
41
+ <CardContent className="flex flex-1 flex-col justify-between gap-3">
42
+ <div className="flex flex-wrap items-center gap-2 text-xs text-muted-foreground">
43
+ <span className="flex items-center gap-1">
44
+ <ExternalLink className="h-3 w-3" />
45
+ {t('from')} {skill.repo}
46
+ </span>
47
+ {skill.stars != null && (
48
+ <span className="flex items-center gap-1">
49
+ <Star className="h-3 w-3" />
50
+ {skill.stars}
51
+ </span>
52
+ )}
53
+ {skill.category && (
54
+ <Badge variant="outline" className="text-xs">
55
+ {skill.category}
56
+ </Badge>
57
+ )}
58
+ </div>
59
+
60
+ <Button
61
+ variant="outline"
62
+ size="sm"
63
+ className="w-full"
64
+ onClick={onInstall}
65
+ >
66
+ <Download className="mr-2 h-4 w-4" />
67
+ {t('install')}
68
+ </Button>
69
+ </CardContent>
70
+ </Card>
71
+ )
72
+ }
73
+
74
+ export default memo(MarketSkillCard)
@@ -0,0 +1,97 @@
1
+ 'use client'
2
+
3
+ import {
4
+ Loader2, Package, Star, ChevronDown, ChevronRight,
5
+ } from 'lucide-react'
6
+ import type { MarketSkillInfo, SkillRepo } from '../services/skill-market-service'
7
+ import MarketSkillCard from './MarketSkillCard'
8
+
9
+ interface RepoListProps {
10
+ repos: SkillRepo[]
11
+ loading: boolean
12
+ expandedRepo: string | null
13
+ repoSkills: Record<string, MarketSkillInfo[]>
14
+ loadingRepo: string | null
15
+ onToggleRepo: (owner: string, repo: string) => void
16
+ onInstall: (skill: MarketSkillInfo) => void
17
+ t: (key: string) => string
18
+ }
19
+
20
+ export function RepoList({
21
+ repos, loading, expandedRepo, repoSkills, loadingRepo,
22
+ onToggleRepo, onInstall, t,
23
+ }: RepoListProps) {
24
+ if (loading) {
25
+ return (
26
+ <div className="flex items-center justify-center py-12">
27
+ <Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
28
+ </div>
29
+ )
30
+ }
31
+
32
+ if (repos.length === 0) {
33
+ return (
34
+ <div className="flex flex-col items-center justify-center py-12 text-muted-foreground">
35
+ <Package className="mb-2 h-8 w-8" />
36
+ <p>{t('noResults')}</p>
37
+ </div>
38
+ )
39
+ }
40
+
41
+ return (
42
+ <div className="space-y-2">
43
+ {repos.map((repo) => {
44
+ const key = `${repo.owner}/${repo.repo}`
45
+ const isExpanded = expandedRepo === key
46
+ const skills = repoSkills[key]
47
+ const isLoading = loadingRepo === key
48
+
49
+ return (
50
+ <div key={key} className="rounded-lg border border-border">
51
+ <button
52
+ type="button"
53
+ className="flex w-full items-center justify-between p-4 text-left hover:bg-muted/50"
54
+ onClick={() => onToggleRepo(repo.owner, repo.repo)}
55
+ >
56
+ <div className="flex flex-col gap-1">
57
+ <span className="font-medium">{key}</span>
58
+ <span className="text-sm text-muted-foreground">{repo.description}</span>
59
+ </div>
60
+ <div className="flex items-center gap-3 text-sm text-muted-foreground">
61
+ <span className="flex items-center gap-1">
62
+ <Star className="h-3.5 w-3.5" />{repo.stars}
63
+ </span>
64
+ {repo.skillCount != null && (
65
+ <span>{repo.skillCount} {t('skills')}</span>
66
+ )}
67
+ {isExpanded ? <ChevronDown className="h-4 w-4" /> : <ChevronRight className="h-4 w-4" />}
68
+ </div>
69
+ </button>
70
+
71
+ {isExpanded && (
72
+ <div className="border-t border-border p-4">
73
+ {isLoading ? (
74
+ <div className="flex items-center justify-center py-6">
75
+ <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" />
76
+ </div>
77
+ ) : skills && skills.length > 0 ? (
78
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
79
+ {skills.map((skill) => (
80
+ <MarketSkillCard
81
+ key={`${skill.repo}/${skill.path}`}
82
+ skill={skill}
83
+ onInstall={() => onInstall(skill)}
84
+ />
85
+ ))}
86
+ </div>
87
+ ) : skills ? (
88
+ <p className="py-4 text-center text-sm text-muted-foreground">{t('noResults')}</p>
89
+ ) : null}
90
+ </div>
91
+ )}
92
+ </div>
93
+ )
94
+ })}
95
+ </div>
96
+ )
97
+ }
@@ -0,0 +1,55 @@
1
+ 'use client'
2
+
3
+ import { Loader2, Search, Package } from 'lucide-react'
4
+ import type { MarketSkillInfo } from '../services/skill-market-service'
5
+ import MarketSkillCard from './MarketSkillCard'
6
+
7
+ interface SearchResultsGridProps {
8
+ results: MarketSkillInfo[]
9
+ hasSearched: boolean
10
+ searching: boolean
11
+ onInstall: (skill: MarketSkillInfo) => void
12
+ t: (key: string) => string
13
+ }
14
+
15
+ export function SearchResultsGrid({
16
+ results, hasSearched, searching, onInstall, t,
17
+ }: SearchResultsGridProps) {
18
+ if (searching) {
19
+ return (
20
+ <div className="flex items-center justify-center py-12">
21
+ <Loader2 className="h-6 w-6 animate-spin text-muted-foreground" />
22
+ </div>
23
+ )
24
+ }
25
+
26
+ if (!hasSearched) {
27
+ return (
28
+ <div className="flex flex-col items-center justify-center py-12 text-muted-foreground">
29
+ <Search className="mb-2 h-8 w-8" />
30
+ <p>{t('searchPlaceholder')}</p>
31
+ </div>
32
+ )
33
+ }
34
+
35
+ if (results.length === 0) {
36
+ return (
37
+ <div className="flex flex-col items-center justify-center py-12 text-muted-foreground">
38
+ <Package className="mb-2 h-8 w-8" />
39
+ <p>{t('noResults')}</p>
40
+ </div>
41
+ )
42
+ }
43
+
44
+ return (
45
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
46
+ {results.map((skill) => (
47
+ <MarketSkillCard
48
+ key={`${skill.repo}/${skill.path}`}
49
+ skill={skill}
50
+ onInstall={() => onInstall(skill)}
51
+ />
52
+ ))}
53
+ </div>
54
+ )
55
+ }
@@ -1,5 +1,6 @@
1
1
  'use client'
2
2
 
3
+ import { memo } from 'react'
3
4
  import { useTranslations } from 'next-intl'
4
5
  import {
5
6
  Download,
@@ -39,7 +40,7 @@ interface SkillCardProps {
39
40
  onDelete: () => void
40
41
  }
41
42
 
42
- export default function SkillCard({
43
+ function SkillCard({
43
44
  skill,
44
45
  targets,
45
46
  onInstall,
@@ -137,3 +138,5 @@ export default function SkillCard({
137
138
  </Card>
138
139
  )
139
140
  }
141
+
142
+ export default memo(SkillCard)
@@ -0,0 +1,88 @@
1
+ 'use client'
2
+
3
+ import { Loader2, RefreshCw, Play, CheckCircle2, XCircle, Terminal, Globe } from 'lucide-react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { Button } from '@octo-cyber/ui/components/ui/button'
6
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
7
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@octo-cyber/ui/components/ui/card'
8
+ import type { CliToolInfo } from '../services/ai-cli-service'
9
+
10
+ function ToolStatusIcon({ isAvailable }: { isAvailable: boolean }) {
11
+ if (isAvailable) return <CheckCircle2 className="h-5 w-5 text-green-500" />
12
+ return <XCircle className="h-5 w-5 text-muted-foreground" />
13
+ }
14
+
15
+ export function ToolCard({
16
+ tool,
17
+ onTest,
18
+ onHealthCheck,
19
+ isChecking,
20
+ installedSkills,
21
+ }: {
22
+ tool: CliToolInfo
23
+ onTest: (tool: CliToolInfo) => void
24
+ onHealthCheck: (toolName: string) => void
25
+ isChecking: boolean
26
+ installedSkills: Array<{ name: string; skillDir: string }>
27
+ }) {
28
+ const t = useTranslations('aiCli')
29
+ const ToolIcon = tool.toolType === 'api' ? Globe : Terminal
30
+
31
+ return (
32
+ <Card>
33
+ <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
34
+ <div className="flex items-center gap-3">
35
+ <ToolIcon className="h-5 w-5 text-muted-foreground" />
36
+ <div>
37
+ <CardTitle className="text-base">{tool.displayName}</CardTitle>
38
+ <CardDescription className="text-xs">{tool.name}</CardDescription>
39
+ </div>
40
+ </div>
41
+ <ToolStatusIcon isAvailable={tool.available} />
42
+ </CardHeader>
43
+ <CardContent>
44
+ <div className="space-y-3">
45
+ <div className="flex items-center gap-2 text-sm">
46
+ <Badge variant={tool.available ? 'default' : 'secondary'}>
47
+ {tool.available ? t('status.available') : t('status.unavailable')}
48
+ </Badge>
49
+ <Badge variant="outline" className="text-xs">{t(`toolType.${tool.toolType}`)}</Badge>
50
+ {tool.version && <span className="text-muted-foreground">v{tool.version}</span>}
51
+ {tool.models && tool.models.length > 0 && (
52
+ <span className="text-muted-foreground text-xs">
53
+ {t('modelCount', { count: tool.models.length })}
54
+ </span>
55
+ )}
56
+ </div>
57
+ {tool.path && (
58
+ <p className="text-xs text-muted-foreground truncate" title={tool.path}>{tool.path}</p>
59
+ )}
60
+ {installedSkills.length > 0 && (
61
+ <div className="space-y-1.5 pt-1 border-t">
62
+ <p className="text-xs font-medium text-muted-foreground pt-1">
63
+ {t('installedSkills')} ({installedSkills.length})
64
+ </p>
65
+ <div className="flex flex-wrap gap-1">
66
+ {installedSkills.map((skill) => (
67
+ <Badge key={skill.name} variant="outline" className="text-xs">{skill.name}</Badge>
68
+ ))}
69
+ </div>
70
+ </div>
71
+ )}
72
+ <div className="flex gap-2 pt-1">
73
+ <Button variant="outline" size="sm" onClick={() => onHealthCheck(tool.name)} disabled={isChecking}>
74
+ {isChecking ? <Loader2 className="mr-1 h-3 w-3 animate-spin" /> : <RefreshCw className="mr-1 h-3 w-3" />}
75
+ {t('actions.healthCheck')}
76
+ </Button>
77
+ {tool.available && (
78
+ <Button variant="outline" size="sm" onClick={() => onTest(tool)}>
79
+ <Play className="mr-1 h-3 w-3" />
80
+ {t('actions.testRun')}
81
+ </Button>
82
+ )}
83
+ </div>
84
+ </div>
85
+ </CardContent>
86
+ </Card>
87
+ )
88
+ }
@@ -0,0 +1,146 @@
1
+ 'use client'
2
+
3
+ import { memo } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import {
6
+ Trash2,
7
+ FolderOpen,
8
+ Github,
9
+ Loader2,
10
+ GitPullRequest,
11
+ GitBranch,
12
+ } from 'lucide-react'
13
+
14
+ import { Button } from '@octo-cyber/ui/components/ui/button'
15
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
16
+ import {
17
+ Card,
18
+ CardContent,
19
+ CardHeader,
20
+ CardTitle,
21
+ } from '@octo-cyber/ui/components/ui/card'
22
+ import type { WorkspaceInfo } from '../services/ai-cli-service'
23
+
24
+ type InstalledSkillsMap = Record<string, Array<{ name: string; skillDir: string }>>
25
+
26
+ function formatDate(dateStr: string): string {
27
+ try {
28
+ return new Date(dateStr).toLocaleString()
29
+ } catch {
30
+ return dateStr
31
+ }
32
+ }
33
+
34
+ export const WorkspaceCard = memo(function WorkspaceCard({
35
+ ws,
36
+ onDelete,
37
+ onPull,
38
+ isPulling,
39
+ wsSkills,
40
+ }: {
41
+ ws: WorkspaceInfo
42
+ onDelete: (ws: WorkspaceInfo) => void
43
+ onPull: (id: string) => void
44
+ isPulling: boolean
45
+ wsSkills: InstalledSkillsMap
46
+ }) {
47
+ const t = useTranslations('aiCli.workspaces')
48
+ const tc = useTranslations('common')
49
+
50
+ const allSkills = Object.entries(wsSkills).flatMap(([target, skills]) =>
51
+ skills.map((s) => ({ ...s, target })),
52
+ )
53
+
54
+ return (
55
+ <Card>
56
+ <CardHeader className="pb-2">
57
+ <div className="flex items-center justify-between">
58
+ <div className="flex items-center gap-2">
59
+ {ws.type === 'github' ? (
60
+ <Github className="h-4 w-4 text-muted-foreground" />
61
+ ) : (
62
+ <FolderOpen className="h-4 w-4 text-muted-foreground" />
63
+ )}
64
+ <CardTitle className="text-sm">
65
+ {ws.name || ws.id.slice(0, 8)}
66
+ </CardTitle>
67
+ </div>
68
+ <Badge variant={ws.type === 'github' ? 'default' : 'secondary'}>
69
+ {t(`type.${ws.type}`)}
70
+ </Badge>
71
+ </div>
72
+ </CardHeader>
73
+ <CardContent className="space-y-2">
74
+ {ws.description && (
75
+ <p className="text-xs text-muted-foreground line-clamp-2">
76
+ {ws.description}
77
+ </p>
78
+ )}
79
+ <p className="text-xs text-muted-foreground truncate" title={ws.path}>
80
+ {ws.path}
81
+ </p>
82
+ {ws.type === 'local' && ws.repoUrl && (
83
+ <p className="text-xs text-muted-foreground truncate" title={ws.repoUrl}>
84
+ <GitBranch className="inline h-3 w-3 mr-1" />
85
+ {ws.repoUrl}
86
+ {ws.branch && ` (${ws.branch})`}
87
+ </p>
88
+ )}
89
+ {ws.type === 'github' && ws.repoUrl && (
90
+ <p className="text-xs text-muted-foreground truncate" title={ws.repoUrl}>
91
+ {ws.repoUrl}
92
+ </p>
93
+ )}
94
+ {ws.type === 'github' && ws.branch && (
95
+ <p className="text-xs text-muted-foreground">
96
+ {t('branch', { branch: ws.branch })}
97
+ </p>
98
+ )}
99
+ <div className="flex items-center justify-between text-xs text-muted-foreground">
100
+ <span>{formatDate(ws.createdAt)}</span>
101
+ </div>
102
+ {allSkills.length > 0 && (
103
+ <div className="space-y-1.5 pt-1 border-t">
104
+ <p className="text-xs font-medium text-muted-foreground pt-1">
105
+ {t('installedSkills')} ({allSkills.length})
106
+ </p>
107
+ <div className="flex flex-wrap gap-1">
108
+ {allSkills.map((skill) => (
109
+ <Badge key={`${skill.target}-${skill.name}`} variant="outline" className="text-xs">
110
+ {skill.name}
111
+ <span className="ml-1 text-muted-foreground">({skill.target})</span>
112
+ </Badge>
113
+ ))}
114
+ </div>
115
+ </div>
116
+ )}
117
+ <div className="flex justify-end gap-2 pt-1">
118
+ {ws.type === 'github' && (
119
+ <Button
120
+ variant="outline"
121
+ size="sm"
122
+ onClick={() => onPull(ws.id)}
123
+ disabled={isPulling}
124
+ >
125
+ {isPulling ? (
126
+ <Loader2 className="mr-1 h-3 w-3 animate-spin" />
127
+ ) : (
128
+ <GitPullRequest className="mr-1 h-3 w-3" />
129
+ )}
130
+ {isPulling ? t('pulling') : t('actions.pull')}
131
+ </Button>
132
+ )}
133
+ <Button
134
+ variant="ghost"
135
+ size="sm"
136
+ className="text-destructive hover:text-destructive"
137
+ onClick={() => onDelete(ws)}
138
+ >
139
+ <Trash2 className="mr-1 h-3 w-3" />
140
+ {tc('delete')}
141
+ </Button>
142
+ </div>
143
+ </CardContent>
144
+ </Card>
145
+ )
146
+ })
@@ -0,0 +1,65 @@
1
+ 'use client'
2
+
3
+ import { memo } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { Trash2, FolderOpen, HardDrive } from 'lucide-react'
6
+ import { Button } from '@octo-cyber/ui/components/ui/button'
7
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
8
+ import {
9
+ Card, CardContent, CardHeader, CardTitle,
10
+ } from '@octo-cyber/ui/components/ui/card'
11
+ import type { WorkspaceInfo } from '../services/ai-cli-service'
12
+
13
+ function formatDate(dateStr: string): string {
14
+ try {
15
+ return new Date(dateStr).toLocaleString()
16
+ } catch {
17
+ return dateStr
18
+ }
19
+ }
20
+
21
+ export const WorkspaceItem = memo(function WorkspaceItem({
22
+ ws,
23
+ onDelete,
24
+ }: {
25
+ ws: WorkspaceInfo
26
+ onDelete: (ws: WorkspaceInfo) => void
27
+ }) {
28
+ const t = useTranslations('aiCli.workspaces')
29
+ const tc = useTranslations('common')
30
+
31
+ return (
32
+ <Card>
33
+ <CardHeader className="pb-2">
34
+ <div className="flex items-center justify-between">
35
+ <div className="flex items-center gap-2">
36
+ {ws.type === 'persistent' ? (
37
+ <HardDrive className="h-4 w-4 text-muted-foreground" />
38
+ ) : (
39
+ <FolderOpen className="h-4 w-4 text-muted-foreground" />
40
+ )}
41
+ <CardTitle className="text-sm">{ws.name || ws.id.slice(0, 8)}</CardTitle>
42
+ </div>
43
+ <Badge variant={ws.type === 'persistent' ? 'default' : 'secondary'}>
44
+ {ws.type === 'persistent' ? t('type.persistent') : t('type.temp')}
45
+ </Badge>
46
+ </div>
47
+ </CardHeader>
48
+ <CardContent className="space-y-2">
49
+ <p className="text-xs text-muted-foreground truncate" title={ws.path}>{ws.path}</p>
50
+ <div className="flex items-center justify-between text-xs text-muted-foreground">
51
+ <span>{formatDate(ws.createdAt)}</span>
52
+ {ws.expiresAt && (
53
+ <span className="text-orange-500">{t('expiresAt', { time: formatDate(ws.expiresAt) })}</span>
54
+ )}
55
+ </div>
56
+ <div className="flex justify-end pt-1">
57
+ <Button variant="ghost" size="sm" className="text-destructive hover:text-destructive" onClick={() => onDelete(ws)}>
58
+ <Trash2 className="mr-1 h-3 w-3" />
59
+ {tc('delete')}
60
+ </Button>
61
+ </div>
62
+ </CardContent>
63
+ </Card>
64
+ )
65
+ })
@@ -0,0 +1,94 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { FolderOpen, GitBranch, Loader2 } from 'lucide-react'
6
+ import {
7
+ Select,
8
+ SelectContent,
9
+ SelectItem,
10
+ SelectTrigger,
11
+ SelectValue,
12
+ } from '@octo-cyber/ui/components/ui/select'
13
+ import { aiCliService, type WorkspaceInfo } from '../services/ai-cli-service'
14
+
15
+ export interface WorkspaceSelectProps {
16
+ value?: string
17
+ onChange?: (value: string) => void
18
+ disabled?: boolean
19
+ placeholder?: string
20
+ className?: string
21
+ /** Show a "None" option to allow unselecting */
22
+ allowEmpty?: boolean
23
+ }
24
+
25
+ const EMPTY_VALUE = '__none__'
26
+
27
+ export function WorkspaceSelect({
28
+ value,
29
+ onChange,
30
+ disabled,
31
+ placeholder,
32
+ className,
33
+ allowEmpty = false,
34
+ }: WorkspaceSelectProps) {
35
+ const t = useTranslations('aiCli.workspaces')
36
+ const [workspaces, setWorkspaces] = useState<WorkspaceInfo[]>([])
37
+ const [isLoading, setIsLoading] = useState(true)
38
+
39
+ useEffect(() => {
40
+ setIsLoading(true)
41
+ aiCliService
42
+ .getWorkspaces()
43
+ .then(setWorkspaces)
44
+ .catch(() => setWorkspaces([]))
45
+ .finally(() => setIsLoading(false))
46
+ }, [])
47
+
48
+ function handleChange(val: string) {
49
+ onChange?.(val === EMPTY_VALUE ? '' : val)
50
+ }
51
+
52
+ if (isLoading) {
53
+ return (
54
+ <div className={`flex h-9 items-center gap-2 text-sm text-muted-foreground ${className ?? ''}`}>
55
+ <Loader2 className="h-3.5 w-3.5 animate-spin" />
56
+ <span>{t('loading')}</span>
57
+ </div>
58
+ )
59
+ }
60
+
61
+ return (
62
+ <Select
63
+ value={value || (allowEmpty ? EMPTY_VALUE : undefined)}
64
+ onValueChange={handleChange}
65
+ disabled={disabled || workspaces.length === 0}
66
+ >
67
+ <SelectTrigger className={className}>
68
+ <SelectValue placeholder={placeholder ?? t('selectPlaceholder')} />
69
+ </SelectTrigger>
70
+ <SelectContent>
71
+ {allowEmpty && (
72
+ <SelectItem value={EMPTY_VALUE}>
73
+ <span className="text-muted-foreground">{t('noWorkspace')}</span>
74
+ </SelectItem>
75
+ )}
76
+ {workspaces.map((ws) => (
77
+ <SelectItem key={ws.id} value={ws.id}>
78
+ <div className="flex items-center gap-2">
79
+ {ws.type === 'github' ? (
80
+ <GitBranch className="h-3.5 w-3.5 shrink-0 text-green-500" />
81
+ ) : (
82
+ <FolderOpen className="h-3.5 w-3.5 shrink-0 text-blue-500" />
83
+ )}
84
+ <span className="truncate">{ws.name}</span>
85
+ <span className="truncate text-xs text-muted-foreground">
86
+ {ws.path}
87
+ </span>
88
+ </div>
89
+ </SelectItem>
90
+ ))}
91
+ </SelectContent>
92
+ </Select>
93
+ )
94
+ }