@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,157 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { FolderOpen, Github, Loader2 } from 'lucide-react'
7
+
8
+ import { Button } from '@octo-cyber/ui/components/ui/button'
9
+ import { Input } from '@octo-cyber/ui/components/ui/input'
10
+ import { Label } from '@octo-cyber/ui/components/ui/label'
11
+ import { Textarea } from '@octo-cyber/ui/components/ui/textarea'
12
+ import {
13
+ Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter,
14
+ } from '@octo-cyber/ui/components/ui/dialog'
15
+ import { Tabs, TabsList, TabsTrigger } from '@octo-cyber/ui/components/ui/tabs'
16
+ import { aiCliService } from '../services/ai-cli-service'
17
+ import type { DetectedGitInfo } from '../services/ai-cli-service'
18
+ import { LocalPathSection } from './LocalPathSection'
19
+
20
+ type WorkspaceType = 'local' | 'github'
21
+
22
+ export function CreateWorkspaceDialog({
23
+ open,
24
+ onOpenChange,
25
+ onCreated,
26
+ }: {
27
+ open: boolean
28
+ onOpenChange: (open: boolean) => void
29
+ onCreated: () => void
30
+ }) {
31
+ const t = useTranslations('aiCli.workspaces')
32
+ const tc = useTranslations('common')
33
+
34
+ const [createType, setCreateType] = useState<WorkspaceType>('local')
35
+ const [createName, setCreateName] = useState('')
36
+ const [createDescription, setCreateDescription] = useState('')
37
+ const [createLocalPath, setCreateLocalPath] = useState('')
38
+ const [createRepoUrl, setCreateRepoUrl] = useState('')
39
+ const [createBranch, setCreateBranch] = useState('')
40
+ const [detectedGitInfo, setDetectedGitInfo] = useState<DetectedGitInfo | null>(null)
41
+ const [isCreating, setIsCreating] = useState(false)
42
+
43
+ const resetForm = () => {
44
+ setCreateType('local')
45
+ setCreateName('')
46
+ setCreateDescription('')
47
+ setCreateLocalPath('')
48
+ setCreateRepoUrl('')
49
+ setCreateBranch('')
50
+ setDetectedGitInfo(null)
51
+ }
52
+
53
+ const handleDirSelected = (path: string, suggestedName: string, gitInfo: DetectedGitInfo | null) => {
54
+ if (!createName.trim()) setCreateName(suggestedName)
55
+ setDetectedGitInfo(gitInfo)
56
+ if (gitInfo?.isGitRepo && gitInfo.remoteUrl) setCreateRepoUrl(gitInfo.remoteUrl)
57
+ if (gitInfo?.isGitRepo && gitInfo.branch) setCreateBranch(gitInfo.branch)
58
+ }
59
+
60
+ const handleCreate = async () => {
61
+ if (!createName.trim()) return
62
+ setIsCreating(true)
63
+ try {
64
+ if (createType === 'local') {
65
+ if (!createLocalPath.trim()) return
66
+ await aiCliService.createWorkspace({
67
+ type: 'local', name: createName.trim(),
68
+ description: createDescription.trim() || undefined,
69
+ localPath: createLocalPath.trim(),
70
+ repoUrl: detectedGitInfo?.remoteUrl || undefined,
71
+ branch: detectedGitInfo?.branch || undefined,
72
+ })
73
+ } else {
74
+ if (!createRepoUrl.trim() || !createBranch.trim()) return
75
+ await aiCliService.createWorkspace({
76
+ type: 'github', name: createName.trim(),
77
+ description: createDescription.trim() || undefined,
78
+ repoUrl: createRepoUrl.trim(),
79
+ branch: createBranch.trim(),
80
+ })
81
+ }
82
+ onOpenChange(false)
83
+ resetForm()
84
+ onCreated()
85
+ } catch {
86
+ toast.error(t('toast.createFailed'))
87
+ } finally {
88
+ setIsCreating(false)
89
+ }
90
+ }
91
+
92
+ const isValid = createName.trim() !== '' && (
93
+ createType === 'local'
94
+ ? createLocalPath.trim() !== ''
95
+ : createRepoUrl.trim() !== '' && createBranch.trim() !== ''
96
+ )
97
+
98
+ const handleOpenChange = (nextOpen: boolean) => {
99
+ if (!nextOpen) resetForm()
100
+ onOpenChange(nextOpen)
101
+ }
102
+
103
+ return (
104
+ <Dialog open={open} onOpenChange={handleOpenChange}>
105
+ <DialogContent className="sm:max-w-lg">
106
+ <DialogHeader>
107
+ <DialogTitle>{t('createDialog.title')}</DialogTitle>
108
+ <DialogDescription>{t('createDialog.description')}</DialogDescription>
109
+ </DialogHeader>
110
+ <div className="space-y-4">
111
+ <Tabs value={createType} onValueChange={(v) => setCreateType(v as WorkspaceType)}>
112
+ <TabsList className="grid w-full grid-cols-2">
113
+ <TabsTrigger value="local"><FolderOpen className="mr-1 h-3 w-3" />{t('createDialog.typeLocal')}</TabsTrigger>
114
+ <TabsTrigger value="github"><Github className="mr-1 h-3 w-3" />{t('createDialog.typeGithub')}</TabsTrigger>
115
+ </TabsList>
116
+ </Tabs>
117
+
118
+ {createType === 'local' ? (
119
+ <LocalPathSection
120
+ localPath={createLocalPath}
121
+ onLocalPathChange={setCreateLocalPath}
122
+ onDirSelected={handleDirSelected}
123
+ t={t}
124
+ />
125
+ ) : (
126
+ <>
127
+ <div className="space-y-2">
128
+ <Label>{t('createDialog.repoUrlLabel')}</Label>
129
+ <Input placeholder={t('createDialog.repoUrlPlaceholder')} value={createRepoUrl} onChange={(e) => setCreateRepoUrl(e.target.value)} />
130
+ </div>
131
+ <div className="space-y-2">
132
+ <Label>{t('createDialog.branchLabel')}</Label>
133
+ <Input placeholder={t('createDialog.branchPlaceholder')} value={createBranch} onChange={(e) => setCreateBranch(e.target.value)} />
134
+ </div>
135
+ </>
136
+ )}
137
+
138
+ <div className="space-y-2">
139
+ <Label>{t('createDialog.nameLabel')}</Label>
140
+ <Input placeholder={t('createDialog.namePlaceholder')} value={createName} onChange={(e) => setCreateName(e.target.value)} />
141
+ </div>
142
+ <div className="space-y-2">
143
+ <Label>{t('createDialog.descriptionLabel')}</Label>
144
+ <Textarea placeholder={t('createDialog.descriptionPlaceholder')} value={createDescription} onChange={(e) => setCreateDescription(e.target.value)} rows={2} />
145
+ </div>
146
+ </div>
147
+ <DialogFooter>
148
+ <Button variant="outline" onClick={() => handleOpenChange(false)}>{tc('cancel')}</Button>
149
+ <Button onClick={handleCreate} disabled={isCreating || !isValid}>
150
+ {isCreating && <Loader2 className="mr-1 h-3 w-3 animate-spin" />}
151
+ {tc('create')}
152
+ </Button>
153
+ </DialogFooter>
154
+ </DialogContent>
155
+ </Dialog>
156
+ )
157
+ }
@@ -0,0 +1,85 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect, useCallback } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { FolderOpen, ChevronUp, Check, Loader2 } from 'lucide-react'
6
+
7
+ import { Button } from '@octo-cyber/ui/components/ui/button'
8
+ import { aiCliService } from '../services/ai-cli-service'
9
+ import type { DirEntry } from '../services/ai-cli-service'
10
+
11
+ export function DirBrowser({
12
+ onSelect,
13
+ initialPath = '/',
14
+ }: {
15
+ onSelect: (path: string) => void
16
+ initialPath?: string
17
+ }) {
18
+ const t = useTranslations('aiCli.workspaces.createDialog')
19
+ const [currentPath, setCurrentPath] = useState(initialPath)
20
+ const [entries, setEntries] = useState<DirEntry[]>([])
21
+ const [loading, setLoading] = useState(false)
22
+
23
+ const loadDir = useCallback(async (dirPath: string) => {
24
+ setLoading(true)
25
+ try {
26
+ const data = await aiCliService.browseDir(dirPath)
27
+ setEntries(data)
28
+ setCurrentPath(dirPath)
29
+ } catch {
30
+ setEntries([])
31
+ } finally {
32
+ setLoading(false)
33
+ }
34
+ }, [])
35
+
36
+ useEffect(() => {
37
+ loadDir(initialPath)
38
+ }, [initialPath, loadDir])
39
+
40
+ const goUp = () => {
41
+ const parent = currentPath.replace(/\/[^/]+\/?$/, '') || '/'
42
+ loadDir(parent)
43
+ }
44
+
45
+ return (
46
+ <div className="border rounded-md">
47
+ <div className="flex items-center gap-1 p-2 border-b bg-muted/50">
48
+ <Button variant="ghost" size="sm" className="h-7 px-2" onClick={goUp}>
49
+ <ChevronUp className="h-3 w-3 mr-1" />
50
+ {t('parentDir')}
51
+ </Button>
52
+ <span className="text-xs text-muted-foreground truncate flex-1" title={currentPath}>
53
+ {currentPath}
54
+ </span>
55
+ <Button size="sm" className="h-7" onClick={() => onSelect(currentPath)}>
56
+ <Check className="h-3 w-3 mr-1" />
57
+ {t('selectThisDir')}
58
+ </Button>
59
+ </div>
60
+ <div className="max-h-48 overflow-y-auto">
61
+ {loading ? (
62
+ <div className="flex items-center justify-center py-6">
63
+ <Loader2 className="h-4 w-4 animate-spin text-muted-foreground" />
64
+ </div>
65
+ ) : entries.length === 0 ? (
66
+ <div className="flex items-center justify-center py-6">
67
+ <p className="text-xs text-muted-foreground">{t('emptyDir')}</p>
68
+ </div>
69
+ ) : (
70
+ entries.map((entry) => (
71
+ <button
72
+ key={entry.path}
73
+ type="button"
74
+ className="flex items-center gap-2 w-full px-3 py-1.5 text-left text-sm hover:bg-accent transition-colors"
75
+ onClick={() => loadDir(entry.path)}
76
+ >
77
+ <FolderOpen className="h-3.5 w-3.5 text-muted-foreground shrink-0" />
78
+ <span className="truncate">{entry.name}</span>
79
+ </button>
80
+ ))
81
+ )}
82
+ </div>
83
+ </div>
84
+ )
85
+ }
@@ -0,0 +1,152 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { Loader2, AlertTriangle, CheckCircle2 } from 'lucide-react'
7
+
8
+ import { Button } from '@octo-cyber/ui/components/ui/button'
9
+ import { Input } from '@octo-cyber/ui/components/ui/input'
10
+ import { Label } from '@octo-cyber/ui/components/ui/label'
11
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
12
+ import {
13
+ Dialog,
14
+ DialogContent,
15
+ DialogHeader,
16
+ DialogTitle,
17
+ DialogDescription,
18
+ DialogFooter,
19
+ } from '@octo-cyber/ui/components/ui/dialog'
20
+ import { skillMarketService } from '../services/skill-market-service'
21
+ import type { GithubTokenStatus } from '../services/skill-market-service'
22
+
23
+ export function GithubTokenDialog({
24
+ open,
25
+ onOpenChange,
26
+ }: {
27
+ open: boolean
28
+ onOpenChange: (open: boolean) => void
29
+ }) {
30
+ const t = useTranslations('aiSkillMarket.tokenConfig')
31
+ const tc = useTranslations('common')
32
+
33
+ const [status, setStatus] = useState<GithubTokenStatus | null>(null)
34
+ const [tokenInput, setTokenInput] = useState('')
35
+ const [loading, setLoading] = useState(false)
36
+ const [saving, setSaving] = useState(false)
37
+
38
+ useEffect(() => {
39
+ if (!open) return
40
+ setLoading(true)
41
+ skillMarketService.getTokenStatus()
42
+ .then(setStatus)
43
+ .catch(() => setStatus(null))
44
+ .finally(() => setLoading(false))
45
+ }, [open])
46
+
47
+ const handleSave = async () => {
48
+ if (!tokenInput.trim()) return
49
+ setSaving(true)
50
+ try {
51
+ const newStatus = await skillMarketService.setToken(tokenInput.trim())
52
+ setStatus(newStatus)
53
+ setTokenInput('')
54
+ toast.success(t('saved'))
55
+ } catch {
56
+ toast.error(t('saveFailed'))
57
+ } finally {
58
+ setSaving(false)
59
+ }
60
+ }
61
+
62
+ const handleClear = async () => {
63
+ setSaving(true)
64
+ try {
65
+ const newStatus = await skillMarketService.clearToken()
66
+ setStatus(newStatus)
67
+ setTokenInput('')
68
+ toast.success(t('cleared'))
69
+ } catch {
70
+ toast.error(t('saveFailed'))
71
+ } finally {
72
+ setSaving(false)
73
+ }
74
+ }
75
+
76
+ return (
77
+ <Dialog open={open} onOpenChange={onOpenChange}>
78
+ <DialogContent className="sm:max-w-md">
79
+ <DialogHeader>
80
+ <DialogTitle>{t('title')}</DialogTitle>
81
+ <DialogDescription>{t('description')}</DialogDescription>
82
+ </DialogHeader>
83
+
84
+ {loading ? (
85
+ <div className="flex items-center justify-center py-6">
86
+ <Loader2 className="h-5 w-5 animate-spin text-muted-foreground" />
87
+ </div>
88
+ ) : (
89
+ <div className="space-y-4">
90
+ {/* Current status */}
91
+ {status?.hasToken ? (
92
+ <div className="flex items-center gap-2 rounded-md border p-3 bg-muted/30">
93
+ <CheckCircle2 className="h-4 w-4 text-green-500 shrink-0" />
94
+ <div className="flex-1 min-w-0">
95
+ <p className="text-sm font-medium">{t('currentToken')}</p>
96
+ <p className="text-xs text-muted-foreground font-mono truncate">
97
+ {status.maskedToken}
98
+ </p>
99
+ </div>
100
+ <Badge variant="outline" className="text-xs shrink-0">
101
+ {status.source === 'env' ? t('sourceEnv') : t('sourceConfig')}
102
+ </Badge>
103
+ </div>
104
+ ) : (
105
+ <div className="flex items-start gap-2 rounded-md border border-yellow-500/30 p-3 bg-yellow-500/5">
106
+ <AlertTriangle className="h-4 w-4 text-yellow-500 shrink-0 mt-0.5" />
107
+ <div>
108
+ <p className="text-sm font-medium">{t('noToken')}</p>
109
+ <p className="text-xs text-muted-foreground">{t('noTokenHint')}</p>
110
+ </div>
111
+ </div>
112
+ )}
113
+
114
+ {/* Token input */}
115
+ <div className="space-y-2">
116
+ <Label>{t('inputLabel')}</Label>
117
+ <Input
118
+ type="password"
119
+ placeholder={t('inputPlaceholder')}
120
+ value={tokenInput}
121
+ onChange={(e) => setTokenInput(e.target.value)}
122
+ />
123
+ </div>
124
+ </div>
125
+ )}
126
+
127
+ <DialogFooter className="gap-2">
128
+ {status?.hasToken && status.source === 'config' && (
129
+ <Button
130
+ variant="outline"
131
+ onClick={handleClear}
132
+ disabled={saving}
133
+ className="text-destructive hover:text-destructive"
134
+ >
135
+ {t('clear')}
136
+ </Button>
137
+ )}
138
+ <Button variant="outline" onClick={() => onOpenChange(false)}>
139
+ {tc('cancel')}
140
+ </Button>
141
+ <Button
142
+ onClick={handleSave}
143
+ disabled={saving || !tokenInput.trim()}
144
+ >
145
+ {saving && <Loader2 className="mr-1 h-3 w-3 animate-spin" />}
146
+ {t('save')}
147
+ </Button>
148
+ </DialogFooter>
149
+ </DialogContent>
150
+ </Dialog>
151
+ )
152
+ }
@@ -0,0 +1,91 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { Search, Loader2, GitBranch } from 'lucide-react'
5
+ import { useTranslations } from 'next-intl'
6
+ import { Button } from '@octo-cyber/ui/components/ui/button'
7
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
8
+ import { Input } from '@octo-cyber/ui/components/ui/input'
9
+ import { Label } from '@octo-cyber/ui/components/ui/label'
10
+ import { aiCliService } from '../services/ai-cli-service'
11
+ import type { DetectedGitInfo } from '../services/ai-cli-service'
12
+ import { DirBrowser } from './DirBrowser'
13
+
14
+ interface LocalPathSectionProps {
15
+ localPath: string
16
+ onLocalPathChange: (path: string) => void
17
+ onDirSelected: (path: string, suggestedName: string, gitInfo: DetectedGitInfo | null) => void
18
+ t: ReturnType<typeof useTranslations>
19
+ }
20
+
21
+ export function LocalPathSection({ localPath, onLocalPathChange, onDirSelected, t }: LocalPathSectionProps) {
22
+ const [showBrowser, setShowBrowser] = useState(false)
23
+ const [gitInfo, setGitInfo] = useState<DetectedGitInfo | null>(null)
24
+ const [isDetectingGit, setIsDetectingGit] = useState(false)
25
+
26
+ const handleDirSelect = async (dirPath: string) => {
27
+ onLocalPathChange(dirPath)
28
+ setShowBrowser(false)
29
+ const suggestedName = dirPath.split('/').filter(Boolean).pop() || ''
30
+ setIsDetectingGit(true)
31
+ setGitInfo(null)
32
+ let detected: DetectedGitInfo | null = null
33
+ try {
34
+ detected = await aiCliService.detectGit(dirPath)
35
+ setGitInfo(detected)
36
+ } catch {
37
+ detected = null
38
+ } finally {
39
+ setIsDetectingGit(false)
40
+ }
41
+ onDirSelected(dirPath, suggestedName, detected)
42
+ }
43
+
44
+ return (
45
+ <>
46
+ <div className="space-y-2">
47
+ <Label>{t('createDialog.localPathLabel')}</Label>
48
+ <div className="flex gap-2">
49
+ <Input
50
+ className="flex-1"
51
+ placeholder={t('createDialog.localPathPlaceholder')}
52
+ value={localPath}
53
+ onChange={(e) => onLocalPathChange(e.target.value)}
54
+ />
55
+ <Button type="button" variant="outline" size="sm" onClick={() => setShowBrowser(!showBrowser)}>
56
+ <Search className="h-3 w-3 mr-1" />
57
+ {t('createDialog.browse')}
58
+ </Button>
59
+ </div>
60
+ {showBrowser && (
61
+ <DirBrowser initialPath={localPath || '/'} onSelect={handleDirSelect} />
62
+ )}
63
+ </div>
64
+ {(isDetectingGit || gitInfo) && (
65
+ <div className="flex items-center gap-2 text-xs">
66
+ {isDetectingGit ? (
67
+ <>
68
+ <Loader2 className="h-3 w-3 animate-spin text-muted-foreground" />
69
+ <span className="text-muted-foreground">{t('createDialog.detecting')}</span>
70
+ </>
71
+ ) : gitInfo?.isGitRepo ? (
72
+ <>
73
+ <GitBranch className="h-3 w-3 text-green-500" />
74
+ <span className="text-green-600 dark:text-green-400">{t('createDialog.gitDetected')}</span>
75
+ {gitInfo.remoteUrl && (
76
+ <span className="text-muted-foreground truncate" title={gitInfo.remoteUrl}>
77
+ {gitInfo.remoteUrl}
78
+ </span>
79
+ )}
80
+ {gitInfo.branch && (
81
+ <Badge variant="outline" className="text-xs">{gitInfo.branch}</Badge>
82
+ )}
83
+ </>
84
+ ) : (
85
+ <span className="text-muted-foreground">{t('createDialog.gitNotDetected')}</span>
86
+ )}
87
+ </div>
88
+ )}
89
+ </>
90
+ )
91
+ }
@@ -0,0 +1,196 @@
1
+ 'use client'
2
+
3
+ import { useState, useCallback, useEffect } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { Loader2, FolderOpen } from 'lucide-react'
7
+
8
+ import { Button } from '@octo-cyber/ui/components/ui/button'
9
+ import { Checkbox } from '@octo-cyber/ui/components/ui/checkbox'
10
+ import {
11
+ Dialog,
12
+ DialogContent,
13
+ DialogDescription,
14
+ DialogFooter,
15
+ DialogHeader,
16
+ DialogTitle,
17
+ } from '@octo-cyber/ui/components/ui/dialog'
18
+ import { Label } from '@octo-cyber/ui/components/ui/label'
19
+ import {
20
+ Select,
21
+ SelectContent,
22
+ SelectItem,
23
+ SelectTrigger,
24
+ SelectValue,
25
+ } from '@octo-cyber/ui/components/ui/select'
26
+
27
+ import { skillMarketService } from '../services/skill-market-service'
28
+ import { aiCliService } from '../services/ai-cli-service'
29
+ import type { MarketSkillInfo, SkillTarget } from '../services/skill-market-service'
30
+
31
+ const AVAILABLE_TARGETS: { id: SkillTarget; label: string }[] = [
32
+ { id: 'claude', label: 'Claude Code' },
33
+ { id: 'cursor', label: 'Cursor' },
34
+ { id: 'codex', label: 'Codex' },
35
+ { id: 'gemini', label: 'Gemini CLI' },
36
+ ]
37
+
38
+ interface WorkspaceOption {
39
+ id: string
40
+ name: string
41
+ path: string
42
+ }
43
+
44
+ interface MarketInstallDialogProps {
45
+ skill: MarketSkillInfo | null
46
+ open: boolean
47
+ onOpenChange: (open: boolean) => void
48
+ onDone: () => void
49
+ }
50
+
51
+ export default function MarketInstallDialog({
52
+ skill,
53
+ open,
54
+ onOpenChange,
55
+ onDone,
56
+ }: MarketInstallDialogProps) {
57
+ const t = useTranslations('aiSkillMarket')
58
+ const tc = useTranslations('common')
59
+
60
+ const [selected, setSelected] = useState<SkillTarget[]>([])
61
+ const [installing, setInstalling] = useState(false)
62
+ const [installScope, setInstallScope] = useState<'user' | 'workspace'>('user')
63
+ const [workspaces, setWorkspaces] = useState<WorkspaceOption[]>([])
64
+ const [selectedWorkspace, setSelectedWorkspace] = useState<string>('')
65
+
66
+ useEffect(() => {
67
+ if (open && installScope === 'workspace' && workspaces.length === 0) {
68
+ aiCliService.getWorkspaces().then((list) => {
69
+ setWorkspaces(list.map((w) => ({ id: w.id, name: w.name, path: w.path })))
70
+ }).catch(() => { /* ignore */ })
71
+ }
72
+ }, [open, installScope, workspaces.length])
73
+
74
+ const toggleTarget = useCallback((id: SkillTarget) => {
75
+ setSelected((prev) =>
76
+ prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id],
77
+ )
78
+ }, [])
79
+
80
+ const handleInstall = useCallback(async () => {
81
+ if (!skill || selected.length === 0) return
82
+ if (installScope === 'workspace' && !selectedWorkspace) {
83
+ toast.error(t('selectWorkspace'))
84
+ return
85
+ }
86
+ setInstalling(true)
87
+ try {
88
+ const params: Parameters<typeof skillMarketService.install>[0] = {
89
+ downloadUrl: skill.downloadUrl,
90
+ name: skill.name,
91
+ targets: selected,
92
+ }
93
+ if (installScope === 'workspace') {
94
+ params.workspacePath = selectedWorkspace
95
+ }
96
+ const result = await skillMarketService.install(params)
97
+ if (result.failed.length > 0) {
98
+ const failedNames = result.failed.map((f) => f.target).join(', ')
99
+ toast.error(`${t('installFailed')}: ${failedNames}`)
100
+ } else {
101
+ toast.success(t('installSuccess'))
102
+ }
103
+ onDone()
104
+ } catch {
105
+ toast.error(t('installFailed'))
106
+ } finally {
107
+ setInstalling(false)
108
+ }
109
+ }, [skill, selected, installScope, selectedWorkspace, t, onDone])
110
+
111
+ return (
112
+ <Dialog open={open} onOpenChange={onOpenChange}>
113
+ <DialogContent className="sm:max-w-md">
114
+ <DialogHeader>
115
+ <DialogTitle>{t('installTitle')}</DialogTitle>
116
+ <DialogDescription>
117
+ {t('installDesc')}
118
+ </DialogDescription>
119
+ </DialogHeader>
120
+
121
+ <div className="space-y-3 py-4">
122
+ <p className="text-sm font-medium">{t('selectTargets')}</p>
123
+ {AVAILABLE_TARGETS.map((tgt) => (
124
+ <div key={tgt.id} className="flex items-center space-x-3">
125
+ <Checkbox
126
+ id={`market-target-${tgt.id}`}
127
+ checked={selected.includes(tgt.id)}
128
+ onCheckedChange={() => toggleTarget(tgt.id)}
129
+ />
130
+ <Label htmlFor={`market-target-${tgt.id}`} className="text-sm">
131
+ {tgt.label}
132
+ </Label>
133
+ </div>
134
+ ))}
135
+ </div>
136
+
137
+ {/* Install scope: user-level or workspace-level */}
138
+ <div className="space-y-2">
139
+ <p className="text-sm font-medium">{t('installScopeLabel')}</p>
140
+ <div className="flex gap-2">
141
+ <Button
142
+ variant={installScope === 'user' ? 'default' : 'outline'}
143
+ size="sm"
144
+ onClick={() => setInstallScope('user')}
145
+ >
146
+ {t('userLevel')}
147
+ </Button>
148
+ <Button
149
+ variant={installScope === 'workspace' ? 'default' : 'outline'}
150
+ size="sm"
151
+ onClick={() => setInstallScope('workspace')}
152
+ >
153
+ <FolderOpen className="mr-1 h-3.5 w-3.5" />
154
+ {t('workspaceLevel')}
155
+ </Button>
156
+ </div>
157
+
158
+ {installScope === 'user' && (
159
+ <p className="text-xs text-muted-foreground">{t('userLevelDesc')}</p>
160
+ )}
161
+
162
+ {installScope === 'workspace' && (
163
+ <div className="space-y-2">
164
+ <p className="text-xs text-muted-foreground">{t('workspaceLevelDesc')}</p>
165
+ <Select value={selectedWorkspace} onValueChange={setSelectedWorkspace}>
166
+ <SelectTrigger className="w-full">
167
+ <SelectValue placeholder={t('selectWorkspace')} />
168
+ </SelectTrigger>
169
+ <SelectContent>
170
+ {workspaces.map((ws) => (
171
+ <SelectItem key={ws.id} value={ws.path}>
172
+ {ws.name} — {ws.path}
173
+ </SelectItem>
174
+ ))}
175
+ </SelectContent>
176
+ </Select>
177
+ </div>
178
+ )}
179
+ </div>
180
+
181
+ <DialogFooter>
182
+ <Button variant="outline" onClick={() => onOpenChange(false)}>
183
+ {tc('cancel')}
184
+ </Button>
185
+ <Button
186
+ onClick={handleInstall}
187
+ disabled={installing || selected.length === 0}
188
+ >
189
+ {installing && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
190
+ {installing ? t('installing') : t('install')}
191
+ </Button>
192
+ </DialogFooter>
193
+ </DialogContent>
194
+ </Dialog>
195
+ )
196
+ }