@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,260 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect, useCallback, useRef } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { RefreshCw, Loader2, CheckCircle, XCircle, ChevronDown, ChevronUp } from 'lucide-react'
7
+
8
+ import { PageHeader } from '@octo-cyber/ui/components/shared/page-header'
9
+ import { Button } from '@octo-cyber/ui/components/ui/button'
10
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
11
+ import { Textarea } from '@octo-cyber/ui/components/ui/textarea'
12
+ import {
13
+ Table,
14
+ TableBody,
15
+ TableCell,
16
+ TableHead,
17
+ TableHeader,
18
+ TableRow,
19
+ } from '@octo-cyber/ui/components/ui/table'
20
+
21
+ import { agentApprovalService } from '../services/agent-approval.service'
22
+ import type { AgentApproval, ApprovalStatus } from '../services/agent-approval.service'
23
+
24
+ function StatusBadge({ status }: { status: ApprovalStatus }) {
25
+ const t = useTranslations('aiTools.approvals')
26
+ const variants: Record<ApprovalStatus, string> = {
27
+ pending: 'bg-yellow-500 hover:bg-yellow-500/80 text-white border-transparent',
28
+ approved: 'bg-green-500 hover:bg-green-500/80 text-white border-transparent',
29
+ rejected: 'bg-red-500 hover:bg-red-500/80 text-white border-transparent',
30
+ }
31
+ return (
32
+ <Badge variant="outline" className={variants[status]}>
33
+ {t(status)}
34
+ </Badge>
35
+ )
36
+ }
37
+
38
+ function ApprovalDetailPanel({
39
+ approval,
40
+ onApprove,
41
+ onReject,
42
+ }: {
43
+ approval: AgentApproval
44
+ onApprove: (id: string, response?: string) => Promise<void>
45
+ onReject: (id: string, response?: string) => Promise<void>
46
+ }) {
47
+ const t = useTranslations('aiTools.approvals')
48
+ const tc = useTranslations('common')
49
+ const [response, setResponse] = useState('')
50
+ const [submitting, setSubmitting] = useState(false)
51
+
52
+ const handleApprove = async () => {
53
+ setSubmitting(true)
54
+ await onApprove(approval.id, response || undefined)
55
+ setSubmitting(false)
56
+ }
57
+
58
+ const handleReject = async () => {
59
+ setSubmitting(true)
60
+ await onReject(approval.id, response || undefined)
61
+ setSubmitting(false)
62
+ }
63
+
64
+ return (
65
+ <div className="space-y-4 rounded-lg border dark:border-zinc-700 bg-muted/30 dark:bg-zinc-800/30 p-4">
66
+ <div>
67
+ <p className="text-sm font-medium text-muted-foreground mb-1">{t('question')}</p>
68
+ <p className="text-sm whitespace-pre-wrap">{approval.question}</p>
69
+ </div>
70
+ {approval.context && (
71
+ <div>
72
+ <p className="text-sm font-medium text-muted-foreground mb-1">Context</p>
73
+ <pre className="text-xs bg-muted dark:bg-zinc-900 rounded p-2 overflow-auto max-h-40">
74
+ {approval.context}
75
+ </pre>
76
+ </div>
77
+ )}
78
+ {approval.status === 'pending' && (
79
+ <div className="space-y-2">
80
+ <Textarea
81
+ placeholder={t('responsePlaceholder')}
82
+ value={response}
83
+ onChange={(e) => setResponse(e.target.value)}
84
+ rows={3}
85
+ disabled={submitting}
86
+ className="resize-none dark:bg-zinc-800 dark:border-zinc-700"
87
+ />
88
+ <div className="flex gap-2">
89
+ <Button
90
+ size="sm"
91
+ onClick={handleApprove}
92
+ disabled={submitting}
93
+ className="bg-green-600 hover:bg-green-700 text-white"
94
+ >
95
+ {submitting ? <Loader2 className="mr-1 h-3.5 w-3.5 animate-spin" /> : <CheckCircle className="mr-1 h-3.5 w-3.5" />}
96
+ {t('approve')}
97
+ </Button>
98
+ <Button
99
+ size="sm"
100
+ variant="destructive"
101
+ onClick={handleReject}
102
+ disabled={submitting}
103
+ >
104
+ {submitting ? <Loader2 className="mr-1 h-3.5 w-3.5 animate-spin" /> : <XCircle className="mr-1 h-3.5 w-3.5" />}
105
+ {t('reject')}
106
+ </Button>
107
+ </div>
108
+ </div>
109
+ )}
110
+ {approval.response && (
111
+ <div>
112
+ <p className="text-sm font-medium text-muted-foreground mb-1">{t('response')}</p>
113
+ <p className="text-sm">{approval.response}</p>
114
+ </div>
115
+ )}
116
+ </div>
117
+ )
118
+ }
119
+
120
+ export default function ApprovalsPage() {
121
+ const t = useTranslations('aiTools.approvals')
122
+ const tc = useTranslations('common')
123
+
124
+ const [approvals, setApprovals] = useState<AgentApproval[]>([])
125
+ const [loading, setLoading] = useState(true)
126
+ const [expandedId, setExpandedId] = useState<string | null>(null)
127
+ const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)
128
+
129
+ const loadApprovals = useCallback(async () => {
130
+ try {
131
+ const data = await agentApprovalService.listPending()
132
+ setApprovals(data)
133
+ } catch {
134
+ toast.error(tc('loadDataFailed'))
135
+ } finally {
136
+ setLoading(false)
137
+ }
138
+ }, [tc])
139
+
140
+ useEffect(() => {
141
+ loadApprovals()
142
+ intervalRef.current = setInterval(loadApprovals, 10000)
143
+ return () => {
144
+ if (intervalRef.current) clearInterval(intervalRef.current)
145
+ }
146
+ }, [loadApprovals])
147
+
148
+ const handleApprove = async (id: string, response?: string) => {
149
+ try {
150
+ await agentApprovalService.approve(id, response)
151
+ toast.success(t('approveSuccess'))
152
+ setExpandedId(null)
153
+ await loadApprovals()
154
+ } catch {
155
+ toast.error(tc('operationFailed'))
156
+ }
157
+ }
158
+
159
+ const handleReject = async (id: string, response?: string) => {
160
+ try {
161
+ await agentApprovalService.reject(id, response)
162
+ toast.success(t('rejectSuccess'))
163
+ setExpandedId(null)
164
+ await loadApprovals()
165
+ } catch {
166
+ toast.error(tc('operationFailed'))
167
+ }
168
+ }
169
+
170
+ const toggleExpand = (id: string) => {
171
+ setExpandedId((prev) => (prev === id ? null : id))
172
+ }
173
+
174
+ return (
175
+ <div className="space-y-6">
176
+ <PageHeader title={t('title')} description={t('description')}>
177
+ <Button variant="outline" onClick={loadApprovals} disabled={loading}>
178
+ {loading ? (
179
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
180
+ ) : (
181
+ <RefreshCw className="mr-2 h-4 w-4" />
182
+ )}
183
+ {tc('refresh')}
184
+ </Button>
185
+ </PageHeader>
186
+
187
+ <div className="rounded-lg border dark:border-zinc-800">
188
+ <Table>
189
+ <TableHeader>
190
+ <TableRow>
191
+ <TableHead className="w-[40%]">{t('question')}</TableHead>
192
+ <TableHead>{t('runId')}</TableHead>
193
+ <TableHead>{t('createdAt')}</TableHead>
194
+ <TableHead>{t('status')}</TableHead>
195
+ <TableHead className="w-10" />
196
+ </TableRow>
197
+ </TableHeader>
198
+ <TableBody>
199
+ {loading ? (
200
+ <TableRow>
201
+ <TableCell colSpan={5} className="h-32 text-center text-muted-foreground">
202
+ {tc('loading')}
203
+ </TableCell>
204
+ </TableRow>
205
+ ) : approvals.length === 0 ? (
206
+ <TableRow>
207
+ <TableCell colSpan={5} className="h-32 text-center text-muted-foreground">
208
+ {t('noPending')}
209
+ </TableCell>
210
+ </TableRow>
211
+ ) : (
212
+ approvals.map((approval) => (
213
+ <>
214
+ <TableRow
215
+ key={approval.id}
216
+ className="cursor-pointer hover:bg-muted/50 dark:hover:bg-zinc-800/50"
217
+ onClick={() => toggleExpand(approval.id)}
218
+ >
219
+ <TableCell className="text-sm">
220
+ {approval.question.length > 100
221
+ ? `${approval.question.slice(0, 100)}...`
222
+ : approval.question}
223
+ </TableCell>
224
+ <TableCell className="font-mono text-xs text-muted-foreground">
225
+ {approval.runId.slice(0, 8)}...
226
+ </TableCell>
227
+ <TableCell className="text-sm">
228
+ {new Date(approval.createdAt).toLocaleString()}
229
+ </TableCell>
230
+ <TableCell>
231
+ <StatusBadge status={approval.status} />
232
+ </TableCell>
233
+ <TableCell>
234
+ {expandedId === approval.id ? (
235
+ <ChevronUp className="h-4 w-4 text-muted-foreground" />
236
+ ) : (
237
+ <ChevronDown className="h-4 w-4 text-muted-foreground" />
238
+ )}
239
+ </TableCell>
240
+ </TableRow>
241
+ {expandedId === approval.id && (
242
+ <TableRow key={`${approval.id}-detail`}>
243
+ <TableCell colSpan={5} className="bg-muted/20 dark:bg-zinc-900/40 p-4">
244
+ <ApprovalDetailPanel
245
+ approval={approval}
246
+ onApprove={handleApprove}
247
+ onReject={handleReject}
248
+ />
249
+ </TableCell>
250
+ </TableRow>
251
+ )}
252
+ </>
253
+ ))
254
+ )}
255
+ </TableBody>
256
+ </Table>
257
+ </div>
258
+ </div>
259
+ )
260
+ }
@@ -0,0 +1,384 @@
1
+ 'use client'
2
+
3
+ import { useState, useEffect, useCallback, useRef } from 'react'
4
+ import { useTranslations } from 'next-intl'
5
+ import { toast } from 'sonner'
6
+ import { Loader2, Star, ChevronDown, ChevronUp, Play, Sparkles } from 'lucide-react'
7
+
8
+ import { PageHeader } from '@octo-cyber/ui/components/shared/page-header'
9
+ import { Button } from '@octo-cyber/ui/components/ui/button'
10
+ import { Badge } from '@octo-cyber/ui/components/ui/badge'
11
+ import { Textarea } from '@octo-cyber/ui/components/ui/textarea'
12
+ import {
13
+ Table,
14
+ TableBody,
15
+ TableCell,
16
+ TableHead,
17
+ TableHeader,
18
+ TableRow,
19
+ } from '@octo-cyber/ui/components/ui/table'
20
+
21
+ import { orchestratorService } from '../services/orchestrator.service'
22
+ import type { OrchestratorPlan, OrchestratorStep, OrchestratorPlanStatus, OrchestratorStepStatus } from '../services/orchestrator.service'
23
+
24
+ // ── PlanStepList ──────────────────────────────────────────────────────────────
25
+
26
+ function StepStatusBadge({ status }: { status: OrchestratorStepStatus }) {
27
+ const t = useTranslations('aiTools.orchestrator')
28
+ const cls: Record<OrchestratorStepStatus, string> = {
29
+ pending: 'bg-zinc-500 hover:bg-zinc-500/80 text-white border-transparent',
30
+ running: 'bg-blue-500 hover:bg-blue-500/80 text-white border-transparent',
31
+ completed: 'bg-green-500 hover:bg-green-500/80 text-white border-transparent',
32
+ failed: 'bg-red-500 hover:bg-red-500/80 text-white border-transparent',
33
+ }
34
+ return (
35
+ <Badge variant="outline" className={cls[status]}>
36
+ {t(status)}
37
+ </Badge>
38
+ )
39
+ }
40
+
41
+ function PlanStepList({ steps }: { steps: OrchestratorStep[] }) {
42
+ const t = useTranslations('aiTools.orchestrator')
43
+ return (
44
+ <div className="space-y-2">
45
+ <p className="text-sm font-medium text-muted-foreground">{t('steps')}</p>
46
+ <div className="space-y-2">
47
+ {steps.map((step) => (
48
+ <div
49
+ key={step.stepId}
50
+ className="rounded-lg border dark:border-zinc-700 bg-muted/20 dark:bg-zinc-800/30 p-3 space-y-1"
51
+ >
52
+ <div className="flex items-center gap-2 flex-wrap">
53
+ <Badge variant="outline" className="font-mono text-xs dark:border-zinc-600">
54
+ {step.stepId}
55
+ </Badge>
56
+ <Badge variant="secondary" className="text-xs dark:bg-zinc-700">
57
+ {step.agentType}
58
+ </Badge>
59
+ <StepStatusBadge status={step.status} />
60
+ </div>
61
+ <p className="text-sm text-foreground/80">{step.prompt}</p>
62
+ {step.output && (
63
+ <pre className="text-xs bg-muted dark:bg-zinc-900 rounded p-2 overflow-auto max-h-32 mt-1">
64
+ {step.output}
65
+ </pre>
66
+ )}
67
+ </div>
68
+ ))}
69
+ </div>
70
+ </div>
71
+ )
72
+ }
73
+
74
+ // ── FeedbackForm ──────────────────────────────────────────────────────────────
75
+
76
+ function FeedbackForm({
77
+ planId,
78
+ onSubmitted,
79
+ }: {
80
+ planId: string
81
+ onSubmitted: () => void
82
+ }) {
83
+ const t = useTranslations('aiTools.orchestrator')
84
+ const [rating, setRating] = useState(0)
85
+ const [hovered, setHovered] = useState(0)
86
+ const [comment, setComment] = useState('')
87
+ const [submitting, setSubmitting] = useState(false)
88
+
89
+ const handleSubmit = async () => {
90
+ if (rating === 0) return
91
+ setSubmitting(true)
92
+ try {
93
+ await orchestratorService.submitFeedback(planId, rating, comment || undefined)
94
+ toast.success(t('feedbackThanks'))
95
+ onSubmitted()
96
+ } catch {
97
+ toast.error(t('submitFeedback'))
98
+ } finally {
99
+ setSubmitting(false)
100
+ }
101
+ }
102
+
103
+ return (
104
+ <div className="space-y-3 rounded-lg border dark:border-zinc-700 bg-muted/20 dark:bg-zinc-800/30 p-4">
105
+ <p className="text-sm font-medium">{t('feedback')}</p>
106
+ <div className="flex gap-1">
107
+ {[1, 2, 3, 4, 5].map((star) => (
108
+ <button
109
+ key={star}
110
+ type="button"
111
+ onClick={() => setRating(star)}
112
+ onMouseEnter={() => setHovered(star)}
113
+ onMouseLeave={() => setHovered(0)}
114
+ className="focus:outline-none"
115
+ >
116
+ <Star
117
+ className={`h-6 w-6 transition-colors ${
118
+ star <= (hovered || rating)
119
+ ? 'fill-yellow-400 text-yellow-400'
120
+ : 'text-muted-foreground'
121
+ }`}
122
+ />
123
+ </button>
124
+ ))}
125
+ </div>
126
+ <Textarea
127
+ placeholder={t('commentPlaceholder')}
128
+ value={comment}
129
+ onChange={(e) => setComment(e.target.value)}
130
+ rows={2}
131
+ disabled={submitting}
132
+ className="resize-none dark:bg-zinc-800 dark:border-zinc-700"
133
+ />
134
+ <Button size="sm" onClick={handleSubmit} disabled={submitting || rating === 0}>
135
+ {submitting && <Loader2 className="mr-1 h-3.5 w-3.5 animate-spin" />}
136
+ {t('submitFeedback')}
137
+ </Button>
138
+ </div>
139
+ )
140
+ }
141
+
142
+ // ── PlanStatusBadge ───────────────────────────────────────────────────────────
143
+
144
+ function PlanStatusBadge({ status }: { status: OrchestratorPlanStatus }) {
145
+ const t = useTranslations('aiTools.orchestrator')
146
+ const cls: Record<OrchestratorPlanStatus, string> = {
147
+ draft: 'bg-zinc-500 hover:bg-zinc-500/80 text-white border-transparent',
148
+ running: 'bg-blue-500 hover:bg-blue-500/80 text-white border-transparent',
149
+ completed: 'bg-green-500 hover:bg-green-500/80 text-white border-transparent',
150
+ failed: 'bg-red-500 hover:bg-red-500/80 text-white border-transparent',
151
+ }
152
+ return (
153
+ <Badge variant="outline" className={cls[status]}>
154
+ {t(status)}
155
+ </Badge>
156
+ )
157
+ }
158
+
159
+ // ── OrchestratorPage ──────────────────────────────────────────────────────────
160
+
161
+ export default function OrchestratorPage() {
162
+ const t = useTranslations('aiTools.orchestrator')
163
+ const tc = useTranslations('common')
164
+
165
+ const [goal, setGoal] = useState('')
166
+ const [generating, setGenerating] = useState(false)
167
+ const [executing, setExecuting] = useState(false)
168
+ const [currentPlan, setCurrentPlan] = useState<OrchestratorPlan | null>(null)
169
+ const [feedbackDone, setFeedbackDone] = useState(false)
170
+
171
+ const [plans, setPlans] = useState<OrchestratorPlan[]>([])
172
+ const [loadingPlans, setLoadingPlans] = useState(true)
173
+ const [expandedId, setExpandedId] = useState<string | null>(null)
174
+
175
+ const pollRef = useRef<ReturnType<typeof setInterval> | null>(null)
176
+
177
+ const stopPolling = () => {
178
+ if (pollRef.current) {
179
+ clearInterval(pollRef.current)
180
+ pollRef.current = null
181
+ }
182
+ }
183
+
184
+ const loadPlans = useCallback(async () => {
185
+ try {
186
+ const data = await orchestratorService.listPlans()
187
+ setPlans(data)
188
+ } catch {
189
+ toast.error(tc('loadDataFailed'))
190
+ } finally {
191
+ setLoadingPlans(false)
192
+ }
193
+ }, [tc])
194
+
195
+ useEffect(() => {
196
+ loadPlans()
197
+ }, [loadPlans])
198
+
199
+ useEffect(() => {
200
+ return () => stopPolling()
201
+ }, [])
202
+
203
+ const handleGenerate = async () => {
204
+ if (!goal.trim()) return
205
+ setGenerating(true)
206
+ setCurrentPlan(null)
207
+ setFeedbackDone(false)
208
+ try {
209
+ const plan = await orchestratorService.createPlan(goal.trim())
210
+ setCurrentPlan(plan)
211
+ toast.success(t('planCreated'))
212
+ await loadPlans()
213
+ } catch {
214
+ toast.error(tc('operationFailed'))
215
+ } finally {
216
+ setGenerating(false)
217
+ }
218
+ }
219
+
220
+ const handleExecute = async () => {
221
+ if (!currentPlan) return
222
+ setExecuting(true)
223
+ setFeedbackDone(false)
224
+ try {
225
+ const started = await orchestratorService.executePlan(currentPlan.id)
226
+ setCurrentPlan(started)
227
+ pollRef.current = setInterval(async () => {
228
+ try {
229
+ const updated = await orchestratorService.getPlan(currentPlan.id)
230
+ setCurrentPlan(updated)
231
+ if (updated.status === 'completed' || updated.status === 'failed') {
232
+ stopPolling()
233
+ setExecuting(false)
234
+ if (updated.status === 'completed') {
235
+ toast.success(t('planCompleted'))
236
+ } else {
237
+ toast.error(t('planFailed'))
238
+ }
239
+ await loadPlans()
240
+ }
241
+ } catch {
242
+ stopPolling()
243
+ setExecuting(false)
244
+ }
245
+ }, 3000)
246
+ } catch {
247
+ toast.error(tc('operationFailed'))
248
+ setExecuting(false)
249
+ }
250
+ }
251
+
252
+ const toggleExpand = (id: string) => {
253
+ setExpandedId((prev) => (prev === id ? null : id))
254
+ }
255
+
256
+ return (
257
+ <div className="space-y-6">
258
+ <PageHeader title={t('title')} description={t('description')} />
259
+
260
+ {/* New Plan Form */}
261
+ <div className="rounded-lg border dark:border-zinc-800 p-4 space-y-4 bg-card dark:bg-zinc-900/40">
262
+ <Textarea
263
+ placeholder={t('goalPlaceholder')}
264
+ value={goal}
265
+ onChange={(e) => setGoal(e.target.value)}
266
+ rows={4}
267
+ disabled={generating || executing}
268
+ className="resize-none dark:bg-zinc-800 dark:border-zinc-700"
269
+ />
270
+ <div className="flex gap-2">
271
+ <Button onClick={handleGenerate} disabled={generating || executing || !goal.trim()}>
272
+ {generating
273
+ ? <Loader2 className="mr-2 h-4 w-4 animate-spin" />
274
+ : <Sparkles className="mr-2 h-4 w-4" />}
275
+ {generating ? t('generating') : t('generatePlan')}
276
+ </Button>
277
+ {currentPlan && currentPlan.status === 'draft' && (
278
+ <Button variant="secondary" onClick={handleExecute} disabled={executing}>
279
+ {executing
280
+ ? <Loader2 className="mr-2 h-4 w-4 animate-spin" />
281
+ : <Play className="mr-2 h-4 w-4" />}
282
+ {executing ? t('executing') : t('executePlan')}
283
+ </Button>
284
+ )}
285
+ </div>
286
+
287
+ {currentPlan && (
288
+ <div className="space-y-4 pt-2">
289
+ <PlanStepList steps={currentPlan.plan} />
290
+ {currentPlan.result && (
291
+ <div className="space-y-1">
292
+ <p className="text-sm font-medium text-muted-foreground">{t('result')}</p>
293
+ <pre className="text-xs bg-muted dark:bg-zinc-900 rounded p-3 overflow-auto max-h-48 whitespace-pre-wrap">
294
+ {currentPlan.result}
295
+ </pre>
296
+ </div>
297
+ )}
298
+ {currentPlan.status === 'completed' && !feedbackDone && (
299
+ <FeedbackForm planId={currentPlan.id} onSubmitted={() => setFeedbackDone(true)} />
300
+ )}
301
+ </div>
302
+ )}
303
+ </div>
304
+
305
+ {/* Recent Plans Table */}
306
+ <div className="space-y-2">
307
+ <p className="text-sm font-semibold">{t('recentPlans')}</p>
308
+ <div className="rounded-lg border dark:border-zinc-800">
309
+ <Table>
310
+ <TableHeader>
311
+ <TableRow>
312
+ <TableHead className="w-[40%]">{t('goal')}</TableHead>
313
+ <TableHead>{t('status')}</TableHead>
314
+ <TableHead>{t('stepsProgress')}</TableHead>
315
+ <TableHead>{tc('createdAt')}</TableHead>
316
+ <TableHead className="w-10" />
317
+ </TableRow>
318
+ </TableHeader>
319
+ <TableBody>
320
+ {loadingPlans ? (
321
+ <TableRow>
322
+ <TableCell colSpan={5} className="h-32 text-center text-muted-foreground">
323
+ {tc('loading')}
324
+ </TableCell>
325
+ </TableRow>
326
+ ) : plans.length === 0 ? (
327
+ <TableRow>
328
+ <TableCell colSpan={5} className="h-32 text-center text-muted-foreground">
329
+ {t('noPlans')}
330
+ </TableCell>
331
+ </TableRow>
332
+ ) : (
333
+ plans.map((plan) => (
334
+ <>
335
+ <TableRow
336
+ key={plan.id}
337
+ className="cursor-pointer hover:bg-muted/50 dark:hover:bg-zinc-800/50"
338
+ onClick={() => toggleExpand(plan.id)}
339
+ >
340
+ <TableCell className="text-sm">
341
+ {plan.goal.length > 80 ? `${plan.goal.slice(0, 80)}...` : plan.goal}
342
+ </TableCell>
343
+ <TableCell>
344
+ <PlanStatusBadge status={plan.status} />
345
+ </TableCell>
346
+ <TableCell className="text-sm text-muted-foreground">
347
+ {plan.stepsDone}/{plan.stepsTotal}
348
+ </TableCell>
349
+ <TableCell className="text-sm">
350
+ {new Date(plan.createdAt).toLocaleString()}
351
+ </TableCell>
352
+ <TableCell>
353
+ {expandedId === plan.id
354
+ ? <ChevronUp className="h-4 w-4 text-muted-foreground" />
355
+ : <ChevronDown className="h-4 w-4 text-muted-foreground" />}
356
+ </TableCell>
357
+ </TableRow>
358
+ {expandedId === plan.id && (
359
+ <TableRow key={`${plan.id}-detail`}>
360
+ <TableCell colSpan={5} className="bg-muted/20 dark:bg-zinc-900/40 p-4">
361
+ <div className="space-y-4">
362
+ <PlanStepList steps={plan.plan} />
363
+ {plan.result && (
364
+ <div className="space-y-1">
365
+ <p className="text-sm font-medium text-muted-foreground">{t('result')}</p>
366
+ <pre className="text-xs bg-muted dark:bg-zinc-900 rounded p-3 overflow-auto max-h-48 whitespace-pre-wrap">
367
+ {plan.result}
368
+ </pre>
369
+ </div>
370
+ )}
371
+ </div>
372
+ </TableCell>
373
+ </TableRow>
374
+ )}
375
+ </>
376
+ ))
377
+ )}
378
+ </TableBody>
379
+ </Table>
380
+ </div>
381
+ </div>
382
+ </div>
383
+ )
384
+ }