@ohos-cpf/3rdloop 0.0.1

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 (389) hide show
  1. package/README.md +425 -0
  2. package/bin/3rdloop.mjs +48 -0
  3. package/lib/cli.js +741 -0
  4. package/lib/config.js +318 -0
  5. package/lib/doctor.js +114 -0
  6. package/lib/exit-codes.js +31 -0
  7. package/lib/opencode.js +156 -0
  8. package/lib/orch.js +427 -0
  9. package/lib/queries.js +264 -0
  10. package/lib/runner.js +979 -0
  11. package/lib/step.js +326 -0
  12. package/lib/ui.js +223 -0
  13. package/lib/workflow.js +291 -0
  14. package/lib/workflows.js +132 -0
  15. package/package.json +50 -0
  16. package/vendor/Server/Agent/SkillSelector/README.md +344 -0
  17. package/vendor/Server/Agent/SkillSelector/core/Agent.js +207 -0
  18. package/vendor/Server/Agent/SkillSelector/index.js +14 -0
  19. package/vendor/Server/Agent/SkillSelector/llm/llmClient.js +313 -0
  20. package/vendor/Server/Agent/SkillSelector/llm/prompts.js +161 -0
  21. package/vendor/Server/Agent/SkillSelector/llm/reactSteps.js +144 -0
  22. package/vendor/Server/Agent/SkillSelector/matcher/fuzzyMatcher.js +433 -0
  23. package/vendor/Server/Agent/SkillSelector/scanner/skillScanner.js +382 -0
  24. package/vendor/Server/Agent/SkillSelector/types.js +63 -0
  25. package/vendor/Server/Agent/SkillSelector/utils/actionWords.js +60 -0
  26. package/vendor/Server/Brain/AnalysisStrategies.js +422 -0
  27. package/vendor/Server/Brain/Brain.js +686 -0
  28. package/vendor/Server/Brain/DecompositionStrategies.js +621 -0
  29. package/vendor/Server/Brain/PlanPersistence.js +196 -0
  30. package/vendor/Server/Brain/SkillExecutor.js +251 -0
  31. package/vendor/Server/Brain/index.js +11 -0
  32. package/vendor/Server/CLI/cli.js +243 -0
  33. package/vendor/Server/CLI/opencode/index.js +804 -0
  34. package/vendor/Server/CLI/opencode.js +5 -0
  35. package/vendor/Server/DbUse/MessageArchive.js +61 -0
  36. package/vendor/Server/DbUse/StorageManager.js +107 -0
  37. package/vendor/Server/DbUse/adapters/BaseAdapter.js +94 -0
  38. package/vendor/Server/DbUse/adapters/FileAdapter.js +138 -0
  39. package/vendor/Server/DbUse/adapters/JsonAdapter.js +138 -0
  40. package/vendor/Server/DbUse/adapters/JsonlAdapter.js +114 -0
  41. package/vendor/Server/DbUse/adapters/SqliteAdapter.js +157 -0
  42. package/vendor/Server/DbUse/index.js +160 -0
  43. package/vendor/Server/DbUse/stores/SessionStore.js +279 -0
  44. package/vendor/Server/DbUse/stores/TaskExecutionStore.js +133 -0
  45. package/vendor/Server/DbUse/stores/TaskRegistryStore.js +262 -0
  46. package/vendor/Server/DbUse/stores/TaskStepStore.js +279 -0
  47. package/vendor/Server/FlexRunner/FlexRunner.js +1759 -0
  48. package/vendor/Server/FlexRunner/index.js +12 -0
  49. package/vendor/Server/Knowledge/KnowledgeImporter.js +523 -0
  50. package/vendor/Server/Knowledge/KnowledgeManager.js +341 -0
  51. package/vendor/Server/Knowledge/index.js +33 -0
  52. package/vendor/Server/LoopEngine/LoopEngine.js +1133 -0
  53. package/vendor/Server/LoopEngine/index.js +11 -0
  54. package/vendor/Server/Orchestrator/Orchestrator.js +1425 -0
  55. package/vendor/Server/Orchestrator/StepNode.js +312 -0
  56. package/vendor/Server/Orchestrator/index.js +13 -0
  57. package/vendor/Server/Routes/controllers/BrainController.js +241 -0
  58. package/vendor/Server/Routes/controllers/FlexRunnerController.js +1125 -0
  59. package/vendor/Server/Routes/controllers/HealthController.js +44 -0
  60. package/vendor/Server/Routes/controllers/KnowledgeImportController.js +355 -0
  61. package/vendor/Server/Routes/controllers/LoopEngineController.js +788 -0
  62. package/vendor/Server/Routes/controllers/OrchestratorController.js +911 -0
  63. package/vendor/Server/Routes/controllers/StatsController.js +57 -0
  64. package/vendor/Server/Routes/controllers/StreamController.js +67 -0
  65. package/vendor/Server/Routes/library/logger.js +179 -0
  66. package/vendor/Server/Routes/library/zipArchive.js +172 -0
  67. package/vendor/Server/Routes/router/Router.js +204 -0
  68. package/vendor/Server/Routes/routes/brain.js +47 -0
  69. package/vendor/Server/Routes/routes/flexrunner.js +72 -0
  70. package/vendor/Server/Routes/routes/health.js +28 -0
  71. package/vendor/Server/Routes/routes/index.js +57 -0
  72. package/vendor/Server/Routes/routes/knowledge.js +55 -0
  73. package/vendor/Server/Routes/routes/loopengine.js +58 -0
  74. package/vendor/Server/Routes/routes/orchestrator.js +61 -0
  75. package/vendor/Server/Routes/routes/registry.js +98 -0
  76. package/vendor/Server/Routes/routes/stats.js +23 -0
  77. package/vendor/Server/Routes/routes/stream.js +30 -0
  78. package/vendor/Server/Routes/server.js +202 -0
  79. package/vendor/Server/Routes/sse/SseHub.js +308 -0
  80. package/vendor/Server/Skills/acceptance-check/SKILL.md +174 -0
  81. package/vendor/Server/Skills/acceptance-check/references/PHASE1_ARTIFACT_COLLECTION.md +52 -0
  82. package/vendor/Server/Skills/acceptance-check/references/PHASE2_CRITERIA_EVALUATION.md +77 -0
  83. package/vendor/Server/Skills/arkts-code-check/SKILL.md +314 -0
  84. package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +160 -0
  85. package/vendor/Server/Skills/arkts-code-check/references/FILE_TYPE_GUIDE.md +29 -0
  86. package/vendor/Server/Skills/arkts-code-check/references/PHASE1_INFO_COLLECTION.md +222 -0
  87. package/vendor/Server/Skills/arkts-code-check/references/REPORT_TEMPLATE.md +220 -0
  88. package/vendor/Server/Skills/arkts-library-compile-validate/SKILL.md +329 -0
  89. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/build.ps1 +93 -0
  90. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/code-linter.cjs +433 -0
  91. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/migrate.cjs +851 -0
  92. package/vendor/Server/Skills/arkts-library-compile-validate/scripts/ohpm-switch.cjs +789 -0
  93. package/vendor/Server/Skills/arkts-library-demo-code/SKILL.md +291 -0
  94. package/vendor/Server/Skills/arkts-library-demo-code/references/API_SIGNATURE_CHECKS.md +68 -0
  95. package/vendor/Server/Skills/arkts-library-demo-code/references/BUILD_VALIDATION.md +184 -0
  96. package/vendor/Server/Skills/arkts-library-demo-code/references/CODE_STANDARDS.md +337 -0
  97. package/vendor/Server/Skills/arkts-library-demo-code/references/EXAMPLES.md +400 -0
  98. package/vendor/Server/Skills/arkts-library-demo-code/references/SYSTEM_API_LOOKUP.md +99 -0
  99. package/vendor/Server/Skills/arkts-library-demo-code/references/TEMPLATE.md +544 -0
  100. package/vendor/Server/Skills/arkts-library-demo-code/scripts/build.ps1 +93 -0
  101. package/vendor/Server/Skills/arkts-library-demo-code/scripts/code-linter.cjs +433 -0
  102. package/vendor/Server/Skills/arkts-library-demo-code/scripts/migrate.cjs +851 -0
  103. package/vendor/Server/Skills/arkts-library-demo-code/scripts/ohpm-switch.cjs +789 -0
  104. package/vendor/Server/Skills/arkts-library-demo-coverage/SKILL.md +174 -0
  105. package/vendor/Server/Skills/arkts-library-demo-scenario/SKILL.md +321 -0
  106. package/vendor/Server/Skills/arkts-library-demo-scenario/references/EXAMPLES.md +100 -0
  107. package/vendor/Server/Skills/arkts-library-demo-scenario/references/TEMPLATE.md +185 -0
  108. package/vendor/Server/Skills/arkts-library-documentation-quality-check/SKILL.md +234 -0
  109. package/vendor/Server/Skills/arkts-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +103 -0
  110. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/CHECK_DIMENSIONS.md +89 -0
  111. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/COMPLIANCE_CHECKLIST.md +62 -0
  112. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/KB_QUERY_GUIDE.md +108 -0
  113. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/MCP_TOOL_DISCOVERY.md +124 -0
  114. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/REPORT_TEMPLATE.md +90 -0
  115. package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/SCORING_FORMULA.md +57 -0
  116. package/vendor/Server/Skills/arkts-library-documentation-quality-check/scripts/validate-skill.cjs +259 -0
  117. package/vendor/Server/Skills/arkts-library-interface-spec/SKILL.md +97 -0
  118. package/vendor/Server/Skills/arkts-library-memory-leak-check/SKILL.md +392 -0
  119. package/vendor/Server/Skills/arkts-library-source-clone/SKILL.md +113 -0
  120. package/vendor/Server/Skills/arkts-library-stability-check/SKILL.md +313 -0
  121. package/vendor/Server/Skills/arkts-library-stability-check/assets/REPORT_TEMPLATE.md +154 -0
  122. package/vendor/Server/Skills/arkts-library-stability-check/references/CHECKLIST.md +166 -0
  123. package/vendor/Server/Skills/arkts-library-stability-check/references/CODE_EXAMPLES.md +309 -0
  124. package/vendor/Server/Skills/arkts-library-stability-check/references/SCORING_RULES.md +90 -0
  125. package/vendor/Server/Skills/arkts-library-stability-check/scripts/validate-skill.cjs +282 -0
  126. package/vendor/Server/Skills/arkts-library-test-coverage-check/SKILL.md +361 -0
  127. package/vendor/Server/Skills/arkts-library-test-coverage-check/assets/REPORT_TEMPLATE.md +146 -0
  128. package/vendor/Server/Skills/arkts-library-test-coverage-check/references/CHECKLIST.md +253 -0
  129. package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +115 -0
  130. package/vendor/Server/Skills/arkts-library-test-coverage-check/scripts/validate-skill.cjs +263 -0
  131. package/vendor/Server/Skills/arkts-library-xts-code/SKILL.md +455 -0
  132. package/vendor/Server/Skills/arkts-library-xts-code/assets/report-template.md +60 -0
  133. package/vendor/Server/Skills/arkts-library-xts-code/references/ACCESS_MODIFIER_PRECHECK.md +76 -0
  134. package/vendor/Server/Skills/arkts-library-xts-code/references/BUILD_VERIFICATION.md +200 -0
  135. package/vendor/Server/Skills/arkts-library-xts-code/references/CODE_STANDARDS.md +519 -0
  136. package/vendor/Server/Skills/arkts-library-xts-code/references/SUBAGENT_PROMPT_TEMPLATE.md +276 -0
  137. package/vendor/Server/Skills/arkts-library-xts-code/references/SYSTEM_API_LOOKUP.md +93 -0
  138. package/vendor/Server/Skills/arkts-library-xts-code/references/XTS_TEMPLATE.md +767 -0
  139. package/vendor/Server/Skills/arkts-library-xts-code/scripts/build.ps1 +93 -0
  140. package/vendor/Server/Skills/arkts-library-xts-code/scripts/code-linter.cjs +433 -0
  141. package/vendor/Server/Skills/arkts-library-xts-code/scripts/migrate.cjs +851 -0
  142. package/vendor/Server/Skills/arkts-library-xts-code/scripts/ohpm-switch.cjs +789 -0
  143. package/vendor/Server/Skills/arkts-library-xts-code/scripts/precheck-access-modifiers.cjs +221 -0
  144. package/vendor/Server/Skills/arkts-library-xts-code-fix/SKILL.md +229 -0
  145. package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +97 -0
  146. package/vendor/Server/Skills/arkts-library-xts-doc/SKILL.md +194 -0
  147. package/vendor/Server/Skills/arkts-library-xts-doc/references/EXAMPLES.md +576 -0
  148. package/vendor/Server/Skills/arkts-library-xts-doc/references/TEMPLATE.md +575 -0
  149. package/vendor/Server/Skills/arkts-library-xts-doc/references/TESTABILITY_GUIDE.md +182 -0
  150. package/vendor/Server/Skills/arkts-library-xts-execution/SKILL.md +491 -0
  151. package/vendor/Server/Skills/arkts-library-xts-execution/references/error-fixing-examples.md +217 -0
  152. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/build.ps1 +93 -0
  153. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/code-linter.cjs +433 -0
  154. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/migrate.cjs +851 -0
  155. package/vendor/Server/Skills/arkts-library-xts-execution/scripts/ohpm-switch.cjs +789 -0
  156. package/vendor/Server/Skills/flutter-code-check/SKILL.md +299 -0
  157. package/vendor/Server/Skills/flutter-code-check/assets/OUTPUT_TEMPLATE.md +312 -0
  158. package/vendor/Server/Skills/flutter-code-check/references/CHECKLIST.md +190 -0
  159. package/vendor/Server/Skills/flutter-code-check/references/PLATFORMS.md +134 -0
  160. package/vendor/Server/Skills/flutter-code-check/scripts/validate-skill.cjs +259 -0
  161. package/vendor/Server/Skills/flutter-interface/README.md +75 -0
  162. package/vendor/Server/Skills/flutter-interface/SKILL.md +291 -0
  163. package/vendor/Server/Skills/flutter-interface/references/EXAMPLES.md +336 -0
  164. package/vendor/Server/Skills/flutter-interface/references/GIT_CLONE_GUIDE.md +190 -0
  165. package/vendor/Server/Skills/flutter-interface/references/SCRIPT_REFERENCE.md +258 -0
  166. package/vendor/Server/Skills/flutter-interface/references/TEMPLATE.md +254 -0
  167. package/vendor/Server/Skills/flutter-library-consistency-check/SKILL.md +518 -0
  168. package/vendor/Server/Skills/flutter-library-consistency-check/references/CHECKLIST.md +382 -0
  169. package/vendor/Server/Skills/flutter-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +342 -0
  170. package/vendor/Server/Skills/flutter-library-consistency-check/references/PLATFORM_LIMITATION_GUIDE.md +71 -0
  171. package/vendor/Server/Skills/flutter-library-documentation-quality-check/SKILL.md +519 -0
  172. package/vendor/Server/Skills/flutter-library-documentation-quality-check/references/CHECKLIST.md +407 -0
  173. package/vendor/Server/Skills/flutter-library-memory-leak-check/SKILL.md +653 -0
  174. package/vendor/Server/Skills/flutter-library-memory-leak-check/references/CHECKLIST.md +397 -0
  175. package/vendor/Server/Skills/flutter-library-stability-check/SKILL.md +745 -0
  176. package/vendor/Server/Skills/flutter-library-stability-check/references/CHECKLIST.md +721 -0
  177. package/vendor/Server/Skills/flutter-library-test-coverage-check/SKILL.md +414 -0
  178. package/vendor/Server/Skills/flutter-library-test-coverage-check/assets/REPORT_TEMPLATE.md +150 -0
  179. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/CHECKLIST.md +304 -0
  180. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCORING_RULES.md +265 -0
  181. package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCRIPT_USAGE.md +286 -0
  182. package/vendor/Server/Skills/knowledge-import/SKILL.md +383 -0
  183. package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +165 -0
  184. package/vendor/Server/Skills/knowledge-import/references/SKILL_LOCATOR_GUIDE.md +91 -0
  185. package/vendor/Server/Skills/knowledge-import/references/SKILL_OPTIMIZATION_GUIDE.md +127 -0
  186. package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +301 -0
  187. package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_ISSUE_TEMPLATE.md +105 -0
  188. package/vendor/Server/Skills/ohos-lib-pr-push/references/GITCODE_API.md +127 -0
  189. package/vendor/Server/Skills/ohos-lib-pr-push/scripts/gitcode-api.cjs +208 -0
  190. package/vendor/Server/Skills/rn-code-check/SKILL.md +321 -0
  191. package/vendor/Server/Skills/rn-code-check/references/API-GUIDE.md +235 -0
  192. package/vendor/Server/Skills/rn-code-check/references/CHECKLIST.md +189 -0
  193. package/vendor/Server/Skills/rn-code-check/references/REPORT-TEMPLATE.md +247 -0
  194. package/vendor/Server/Skills/rn-lib-add-example/SKILL.md +198 -0
  195. package/vendor/Server/Skills/rn-lib-add-example/references/APP_RENAME_GUIDE.md +40 -0
  196. package/vendor/Server/Skills/rn-lib-add-example/references/SHELL_ADAPTATION_CHECKLIST.md +78 -0
  197. package/vendor/Server/Skills/rn-lib-add-example/references/TEMPLATE_REPO_GUIDE.md +70 -0
  198. package/vendor/Server/Skills/rn-lib-add-example/references/VERIFICATION_GUIDE.md +47 -0
  199. package/vendor/Server/Skills/rn-lib-add-example/scripts/create-example.cjs +252 -0
  200. package/vendor/Server/Skills/rn-lib-update-doc/SKILL.md +176 -0
  201. package/vendor/Server/Skills/rn-lib-update-doc/config.json +5 -0
  202. package/vendor/Server/Skills/rn-lib-update-doc/references/changelog-template.md +35 -0
  203. package/vendor/Server/Skills/rn-lib-update-doc/references/format-diff.md +137 -0
  204. package/vendor/Server/Skills/rn-lib-update-doc/references/link-registry.json +33 -0
  205. package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2-overview.md +40 -0
  206. package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2.md +429 -0
  207. package/vendor/Server/Skills/rn-lib-update-doc/scripts/detect-readme-format.cjs +105 -0
  208. package/vendor/Server/Skills/rn-lib-update-doc/scripts/find-usage-doc.cjs +90 -0
  209. package/vendor/Server/Skills/rn-lib-update-doc/scripts/link-verify.cjs +213 -0
  210. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-changelog.cjs +73 -0
  211. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-package-meta.cjs +258 -0
  212. package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-readme-links.cjs +341 -0
  213. package/vendor/Server/Skills/rn-lib-update-doc/scripts/resolve-usage-docs.cjs +67 -0
  214. package/vendor/Server/Skills/rn-library-consistency-check/SKILL.md +299 -0
  215. package/vendor/Server/Skills/rn-library-consistency-check/assets/REPORT_TEMPLATE.md +293 -0
  216. package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_COMPONENT_CHECK_GUIDE.md +857 -0
  217. package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_TURBOMODULE_CHECK_GUIDE.md +856 -0
  218. package/vendor/Server/Skills/rn-library-consistency-check/references/CHECKLIST.md +157 -0
  219. package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_COMPONENT_CHECK_GUIDE.md +801 -0
  220. package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_TURBOMODULE_CHECK_GUIDE.md +684 -0
  221. package/vendor/Server/Skills/rn-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +233 -0
  222. package/vendor/Server/Skills/rn-library-consistency-check/references/NATIVE_COMPONENT_IDENTIFICATION.md +1373 -0
  223. package/vendor/Server/Skills/rn-library-consistency-check/references/SCORING_STANDARD.md +220 -0
  224. package/vendor/Server/Skills/rn-library-consistency-check/scripts/validate-skill.py +245 -0
  225. package/vendor/Server/Skills/rn-library-documentation-quality-check/SKILL.md +263 -0
  226. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL.md +414 -0
  227. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL_en.md +413 -0
  228. package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +311 -0
  229. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CHECK_CHECKLIST.md +355 -0
  230. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CROSS_VALIDATION_GUIDE.md +115 -0
  231. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/DOC_COLLECTION_GUIDE.md +139 -0
  232. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/EXAMPLES.md +586 -0
  233. package/vendor/Server/Skills/rn-library-documentation-quality-check/references/GOTCHAS.md +57 -0
  234. package/vendor/Server/Skills/rn-library-documentation-quality-check/scripts/validate-skill.py +259 -0
  235. package/vendor/Server/Skills/rn-library-interface-analyzer/SKILL.md +301 -0
  236. package/vendor/Server/Skills/rn-library-interface-analyzer/assets/REPORT_TEMPLATE.md +148 -0
  237. package/vendor/Server/Skills/rn-library-interface-analyzer/references/DOC_ANNOTATION_GUIDE.md +118 -0
  238. package/vendor/Server/Skills/rn-library-interface-analyzer/references/SCRIPT_USAGE_GUIDE.md +168 -0
  239. package/vendor/Server/Skills/rn-library-interface-analyzer/references/URL_PARSING_RULES.md +176 -0
  240. package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +274 -0
  241. package/vendor/Server/Skills/rn-library-issue-generalizer/assets/case-template.md +45 -0
  242. package/vendor/Server/Skills/rn-library-issue-generalizer/assets/rule-template.md +25 -0
  243. package/vendor/Server/Skills/rn-library-issue-generalizer/references/PR_FETCH_GUIDE.md +61 -0
  244. package/vendor/Server/Skills/rn-library-issue-generalizer/references/RULE_TEMPLATE_GUIDE.md +165 -0
  245. package/vendor/Server/Skills/rn-library-issue-generalizer/scripts/fetch-pr-info.py +239 -0
  246. package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +263 -0
  247. package/vendor/Server/Skills/rn-library-known-issue-check/assets/REPORT_TEMPLATE.md +96 -0
  248. package/vendor/Server/Skills/rn-library-known-issue-check/references/COMPLIANCE_CHECKLIST.md +58 -0
  249. package/vendor/Server/Skills/rn-library-known-issue-check/references/INSPECTION_GUIDE.md +99 -0
  250. package/vendor/Server/Skills/rn-library-known-issue-check/references/PRESCREEN_GUIDE.md +64 -0
  251. package/vendor/Server/Skills/rn-library-known-issue-check/references/SOURCE_PREP_GUIDE.md +75 -0
  252. package/vendor/Server/Skills/rn-library-known-issue-check/scripts/validate-known-issue-report.py +164 -0
  253. package/vendor/Server/Skills/rn-library-memory-leak-check/SKILL.md +339 -0
  254. package/vendor/Server/Skills/rn-library-memory-leak-check/assets/REPORT_TEMPLATE.md +83 -0
  255. package/vendor/Server/Skills/rn-library-memory-leak-check/references/CHECKLIST.md +859 -0
  256. package/vendor/Server/Skills/rn-library-memory-leak-check/references/HARMONY_CODE_PATTERNS.md +122 -0
  257. package/vendor/Server/Skills/rn-library-memory-leak-check/scripts/scan_harmony_code.py +279 -0
  258. package/vendor/Server/Skills/rn-library-stability-check/SKILL.md +273 -0
  259. package/vendor/Server/Skills/rn-library-stability-check/assets/REPORT_TEMPLATE.md +129 -0
  260. package/vendor/Server/Skills/rn-library-stability-check/references/CHECKLIST.md +581 -0
  261. package/vendor/Server/Skills/rn-library-stability-check/references/SCORING_RULES.md +138 -0
  262. package/vendor/Server/Skills/rn-library-stability-check/scripts/scan-harmony-code.py +168 -0
  263. package/vendor/Server/Skills/rn-library-test-coverage-check/SKILL.md +506 -0
  264. package/vendor/Server/Skills/rn-library-test-coverage-check/references/CHECKLIST.md +280 -0
  265. package/vendor/Server/Skills/rn-library-test-coverage-check/references/DEMO_LOCATION.md +221 -0
  266. package/vendor/Server/Skills/rn-library-test-coverage-check/references/REPORT_TEMPLATE.md +209 -0
  267. package/vendor/Server/Skills/rn-library-test-coverage-check/references/SCRIPT_USAGE.md +325 -0
  268. package/vendor/Server/Skills/rn-ohos-xts-generator/SKILL.md +279 -0
  269. package/vendor/Server/Skills/rn-ohos-xts-generator/assets/TEST_FILE_TEMPLATES.md +404 -0
  270. package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_TROUBLESHOOTING.md +185 -0
  271. package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_WORKFLOW.md +265 -0
  272. package/vendor/Server/Skills/rn-ohos-xts-generator/references/COMMON_CONFIG.md +189 -0
  273. package/vendor/Server/Skills/rn-ohos-xts-generator/references/CONFIG_GUIDE.md +203 -0
  274. package/vendor/Server/Skills/rn-ohos-xts-generator/references/COVERAGE_ANALYZER.md +147 -0
  275. package/vendor/Server/Skills/rn-ohos-xts-generator/references/DESIGN_DOC_GUIDE.md +148 -0
  276. package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_FLOW.md +165 -0
  277. package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_STRATEGY.md +195 -0
  278. package/vendor/Server/Skills/rn-ohos-xts-generator/references/HARMONY_SCANNER.md +249 -0
  279. package/vendor/Server/Skills/rn-ohos-xts-generator/references/JEST_FRAMEWORK.md +235 -0
  280. package/vendor/Server/Skills/rn-ohos-xts-generator/references/PLATFORM_COMPAT.md +161 -0
  281. package/vendor/Server/Skills/rn-ohos-xts-generator/references/RN_TEST_PATTERNS.md +413 -0
  282. package/vendor/Server/Skills/rn-ohos-xts-generator/references/SOURCE_PARSER.md +235 -0
  283. package/vendor/Server/Skills/rn-ohos-xts-generator/references/TEST_CONVENTIONS.md +245 -0
  284. package/vendor/Server/Skills/rn-ohos-xts-generator/references/TROUBLESHOOTING.md +282 -0
  285. package/vendor/Server/Skills/rn-ohos-xts-generator/references/USAGE_GUIDE.md +251 -0
  286. package/vendor/Server/Skills/rnoh-cptf-api-test/SKILL.md +469 -0
  287. package/vendor/Server/Skills/rnoh-cptf-api-test/assets/CPTF_TEST_TEMPLATE.md +310 -0
  288. package/vendor/Server/Skills/rnoh-cptf-api-test/assets/DEMO_PAGE_TEMPLATE.md +303 -0
  289. package/vendor/Server/Skills/rnoh-cptf-api-test/references/CPTF_TEST_GENERATION_GUIDE.md +421 -0
  290. package/vendor/Server/Skills/rnoh-cptf-api-test/references/DEMO_GENERATION_GUIDE.md +358 -0
  291. package/vendor/Server/Skills/rnoh-cptf-api-test/references/QUALITY_CHECKLIST.md +114 -0
  292. package/vendor/Server/Skills/rnoh-cptf-api-test/references/SPEC_PARSING_GUIDE.md +274 -0
  293. package/vendor/Server/Skills/rnoh-cptf-api-test/scripts/validate-rnoh-cptf-api-test.sh +185 -0
  294. package/vendor/Server/Skills/rnoh-cptf-demo-test/SKILL.md +191 -0
  295. package/vendor/Server/Skills/rnoh-cptf-demo-test/assets/TEST_TEMPLATE.md +216 -0
  296. package/vendor/Server/Skills/rnoh-cptf-demo-test/references/CPTF_SETUP.md +107 -0
  297. package/vendor/Server/Skills/rnoh-cptf-demo-test/references/DEMO_ANALYSIS.md +120 -0
  298. package/vendor/Server/Skills/rnoh-cptf-demo-test/scripts/validate-rnoh-cptf-test.sh +108 -0
  299. package/vendor/Server/Skills/rnoh-cptf-test-run/SKILL.md +237 -0
  300. package/vendor/Server/Skills/rnoh-cptf-test-run/references/DEBUG_PLAYBOOK.md +261 -0
  301. package/vendor/Server/Skills/rnoh-cptf-test-run/scripts/validate-run-env.sh +112 -0
  302. package/vendor/Server/Skills/rnoh-lib-code-adapt/SKILL.md +498 -0
  303. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/adapt-checklist.md +270 -0
  304. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/api-migration-checklist.md +164 -0
  305. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/common-compile-errors.md +556 -0
  306. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/deveco-cli-tools.md +459 -0
  307. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/edge-cases.md +65 -0
  308. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/har-tgz-build.md +512 -0
  309. package/vendor/Server/Skills/rnoh-lib-code-adapt/references/version-compat-matrix.md +132 -0
  310. package/vendor/Server/Skills/rnoh-lib-code-adapt/scripts/auto-integrate.sh +424 -0
  311. package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +137 -0
  312. package/vendor/Server/Skills/rnoh-lib-demo-create/SKILL.md +306 -0
  313. package/vendor/Server/Skills/rnoh-lib-demo-create/assets/DEMO_PAGE_TEMPLATE.md +485 -0
  314. package/vendor/Server/Skills/rnoh-lib-demo-create/assets/INDEX_TEMPLATE.md +172 -0
  315. package/vendor/Server/Skills/rnoh-lib-demo-create/references/DEMO_CODE_RULES.md +422 -0
  316. package/vendor/Server/Skills/rnoh-lib-demo-create/references/QUALITY_CHECKLIST.md +95 -0
  317. package/vendor/Server/Skills/rnoh-lib-demo-create/references/SOURCE_EXPLORATION.md +169 -0
  318. package/vendor/Server/Skills/rnoh-lib-demo-doc/SKILL.md +554 -0
  319. package/vendor/Server/Skills/rnoh-lib-demo-doc/assets/DEMO_DOC_TEMPLATE.md +106 -0
  320. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/COVERAGE_INCREMENTAL.md +216 -0
  321. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/DEMO_DESIGN_RULES.md +413 -0
  322. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/OUTPUT_FORMAT.md +269 -0
  323. package/vendor/Server/Skills/rnoh-lib-demo-doc/references/QUALITY_CHECKLIST.md +98 -0
  324. package/vendor/Server/Skills/rnoh-lib-func-test/SKILL.md +337 -0
  325. package/vendor/Server/Skills/rnoh-lib-rnt-search/SKILL.md +722 -0
  326. package/vendor/Server/Skills/rnoh-lib-rnt-search/assets/PORT_REPORT_TEMPLATE.md +219 -0
  327. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/DEMO_PORTING_GUIDE.md +345 -0
  328. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/PORT_VERIFICATION.md +269 -0
  329. package/vendor/Server/Skills/rnoh-lib-rnt-search/references/RNT_PROJECT_STRUCTURE.md +173 -0
  330. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/analyze-demo-deps.cjs +267 -0
  331. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/detect-rnoh-version.cjs +174 -0
  332. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/find-rnt-demo.sh +111 -0
  333. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/port-demo.sh +186 -0
  334. package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/read-lib-meta.cjs +150 -0
  335. package/vendor/Server/Skills/rnoh-lib-test-align/SKILL.md +296 -0
  336. package/vendor/Server/Skills/rnoh-lib-test-align/references/jest-troubleshooting.md +371 -0
  337. package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +212 -0
  338. package/vendor/Server/Skills/rnoh-lib-test-align/references/runtime-troubleshooting.md +345 -0
  339. package/vendor/Server/Skills/rnoh-lib-test-align/references/unit-test-template.md +223 -0
  340. package/vendor/Server/Skills/rnoh-lib-test-align/scripts/port-test-demo.sh +1053 -0
  341. package/vendor/Server/Skills/rnoh-lib-version-diff/SKILL.md +255 -0
  342. package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_ADAPTATION.md +77 -0
  343. package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_API_LOOKUP.md +224 -0
  344. package/vendor/Server/Skills/rnoh-lib-version-diff/references/script-reference.md +174 -0
  345. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/detect-upstream-version.js +967 -0
  346. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/generate-diff.js +1798 -0
  347. package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/package.json +5 -0
  348. package/vendor/Server/Skills/rnoh-lib-version-diff/templates/report-template.md +137 -0
  349. package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +145 -0
  350. package/vendor/Server/Skills/skill-generator/SKILL.md +365 -0
  351. package/vendor/Server/Skills/skill-generator/assets/SKILL_TEMPLATE.md +183 -0
  352. package/vendor/Server/Skills/skill-generator/references/COMPLIANCE_CHECKLIST.md +82 -0
  353. package/vendor/Server/Skills/skill-generator/references/KB_QUERY_GUIDE.md +110 -0
  354. package/vendor/Server/Skills/skill-generator/references/MCP_TOOL_DISCOVERY.md +122 -0
  355. package/vendor/Server/Skills/skill-generator/references/SKILL_SPEC.md +121 -0
  356. package/vendor/Server/Skills/skill-generator/scripts/validate-skill.cjs +259 -0
  357. package/vendor/Server/Skills/task-analysis/SKILL.md +234 -0
  358. package/vendor/Server/Skills/task-analysis/assets/OUTPUT_EXAMPLES.md +160 -0
  359. package/vendor/Server/Skills/task-analysis/references/ACCEPTANCE_CRITERIA_GUIDE.md +190 -0
  360. package/vendor/Server/Skills/task-analysis/references/ANALYSIS_SCHEMA.md +224 -0
  361. package/vendor/Server/Skills/task-analysis/references/INTEGRATION_CONTEXT.md +162 -0
  362. package/vendor/Server/Skills/task-analysis/references/LESSONS_LEARNED.md +55 -0
  363. package/vendor/Server/Skills/task-analysis/references/REPLAN_CONTEXT_GUIDE.md +126 -0
  364. package/vendor/Server/Skills/task-analysis/scripts/validate-analysis-output.sh +256 -0
  365. package/vendor/Server/Skills/task-decomposition/SKILL.md +529 -0
  366. package/vendor/Server/Skills/task-decomposition/assets/OUTPUT_EXAMPLES.md +451 -0
  367. package/vendor/Server/Skills/task-decomposition/references/ACCEPTANCE_CRITERIA_GUIDE.md +179 -0
  368. package/vendor/Server/Skills/task-decomposition/references/DEPENDENCY_GRAPH_GUIDE.md +152 -0
  369. package/vendor/Server/Skills/task-decomposition/references/INTEGRATION_CONTEXT.md +175 -0
  370. package/vendor/Server/Skills/task-decomposition/references/REPLAN_CONTEXT_GUIDE.md +195 -0
  371. package/vendor/Server/Skills/task-decomposition/references/TASK_DECOMPOSITION_TEMPLATES.md +226 -0
  372. package/vendor/Server/Skills/task-decomposition/scripts/list-available-skills.cjs +263 -0
  373. package/vendor/Server/Skills/task-decomposition/scripts/skill-blacklist.json +29 -0
  374. package/vendor/Server/Skills/task-decomposition/scripts/validate-decomposition-output.cjs +376 -0
  375. package/vendor/Server/Skills/task-decomposition/scripts/validate-param-consistency.cjs +259 -0
  376. package/vendor/Server/Skills/task-decomposition/scripts/validate-specified-skills.cjs +216 -0
  377. package/vendor/Server/Skills/task-decomposition/scripts/validate-step-graph.cjs +425 -0
  378. package/vendor/Server/Skills/tpc-cpp-check/SKILL.md +427 -0
  379. package/vendor/Server/Skills/tpc-cpp-check/references/CHECKLIST.md +214 -0
  380. package/vendor/Server/Skills/tpc-cpp-check/references/HPKBUILD_GUIDE.md +235 -0
  381. package/vendor/Server/Skills/tpc-cpp-check/references/REPORT_TEMPLATE.md +250 -0
  382. package/vendor/Server/TestCheck/TestCheck.js +775 -0
  383. package/vendor/Server/TestCheck/index.js +11 -0
  384. package/vendor/Server/library/McpToolGuide.js +280 -0
  385. package/vendor/Server/library/StatsService.js +127 -0
  386. package/vendor/Server/library/cstTime.js +16 -0
  387. package/vendor/Server/package.json +17 -0
  388. package/vendor/VERSION +3 -0
  389. package/workflows/pr-check.mjs +106 -0
@@ -0,0 +1,788 @@
1
+ /**
2
+ * LoopEngineController —— 大循环协调引擎 HTTP 接口控制器
3
+ *
4
+ * 职责:封装 LoopEngine 的 HTTP 接口,供前端启动大循环、查询进度、终止循环。
5
+ * 不感知 HTTP 层细节,只接收 RequestContext / ResponseContext。
6
+ *
7
+ * 管理多个 LoopEngine 实例(按 taskId 区分),支持:
8
+ * - 启动大循环(Brain → Orchestrator → TestCheck 完整闭环)
9
+ * - 查询循环进度
10
+ * - 终止大循环
11
+ * - 恢复循环状态
12
+ *
13
+ * 架构位置:
14
+ * HTTP 请求 → LoopEngineController → LoopEngine → { Brain, Orchestrator, TestCheck }
15
+ */
16
+
17
+ import { promises as fs } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { LoopEngine, LoopStatus } from '../../LoopEngine/index.js';
20
+
21
+ /**
22
+ * LoopEngineController
23
+ */
24
+ class LoopEngineController {
25
+ /**
26
+ * @param {object} [deps] - 共享依赖
27
+ * @param {object} [deps.sseHub] - SseHub 实例
28
+ * @param {object} [deps.storage] - 存储门面
29
+ * @param {object} [deps.brainController] - BrainController 实例(必须)
30
+ * @param {object} [deps.orchestratorController]- OrchestratorController 实例(必须)
31
+ * @param {object} [deps.testCheck] - TestCheck 实例(可选)
32
+ * @param {string} [deps.skillDirectory] - SKILL 目录路径
33
+ */
34
+ constructor(deps = {}) {
35
+ this.sseHub = deps.sseHub || null;
36
+ this.storage = deps.storage || null;
37
+ this.brainController = deps.brainController || null;
38
+ this.orchestratorController = deps.orchestratorController || null;
39
+ this.testCheck = deps.testCheck || null;
40
+ this.skillDirectory = deps.skillDirectory || null;
41
+
42
+ /** @type {Map<string, LoopEngine>} key = taskId */
43
+ this._engines = new Map();
44
+
45
+ /** @type {Map<string, Promise>} key = taskId,跟踪正在运行的循环 */
46
+ this._running = new Map();
47
+ }
48
+
49
+ // ─── 辅助方法 ──────────────────────────────────────────────────────
50
+
51
+ /**
52
+ * 获取任务注册表(懒初始化)。
53
+ * 用于历史任务列表的高性能分页查询(SQLite),避免逐个扫描 JSON 文件。
54
+ * @returns {import('../../DbUse/stores/TaskRegistryStore.js').default|null}
55
+ * @private
56
+ */
57
+ _getRegistry() {
58
+ if (!this.storage) return null;
59
+ try {
60
+ return this.storage.taskRegistryStore();
61
+ } catch {
62
+ return null;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * 注册任务摘要到注册表(幂等 upsert)。
68
+ * @param {object} entry - { taskId, taskType, status, title, description, createdAt, metadata }
69
+ * @returns {Promise<void>}
70
+ * @private
71
+ */
72
+ async _registerTask(entry) {
73
+ const registry = this._getRegistry();
74
+ if (!registry) return;
75
+ try {
76
+ await registry.upsert(entry);
77
+ } catch (err) {
78
+ console.warn(`[LoopEngineController] 注册任务摘要失败: taskId=${entry.taskId}, error=${err.message}`);
79
+ }
80
+ }
81
+
82
+ /**
83
+ * 获取已有实例,不存在则报错。
84
+ * @param {string} taskId
85
+ * @returns {LoopEngine}
86
+ */
87
+ _getEngine(taskId) {
88
+ const engine = this._engines.get(taskId);
89
+ if (!engine) {
90
+ throw new Error(`未找到大循环任务: taskId=${taskId},请先启动循环`);
91
+ }
92
+ return engine;
93
+ }
94
+
95
+ /**
96
+ * 创建新的 LoopEngine 实例。
97
+ * @returns {LoopEngine}
98
+ */
99
+ _createEngine() {
100
+ return new LoopEngine({
101
+ sseHub: this.sseHub,
102
+ storage: this.storage,
103
+ brainController: this.brainController,
104
+ orchestratorController: this.orchestratorController,
105
+ testCheck: this.testCheck,
106
+ skillDirectory: this.skillDirectory
107
+ });
108
+ }
109
+
110
+ /**
111
+ * 获取存储门面。优先用注入的 storage,否则从 LoopEngine 创建。
112
+ * @returns {object}
113
+ * @private
114
+ */
115
+ _getStorage() {
116
+ if (this.storage) return this.storage;
117
+ // fallback:创建一个临时 LoopEngine 仅为获取 storage
118
+ const tmp = this._createEngine();
119
+ this.storage = tmp.storage;
120
+ return this.storage;
121
+ }
122
+
123
+ // ─── HTTP Handlers ─────────────────────────────────────────────────
124
+
125
+ /**
126
+ * POST /api/loopengine/start
127
+ * 启动大循环 — 从自然语言任务描述开始,执行完整的拆解→编排→审核闭环。
128
+ *
129
+ * Body: {
130
+ * taskDescription: string, // 必填,自然语言任务描述
131
+ * taskId?: string, // 可选,指定 taskId
132
+ * taskDir?: string, // 可选,指定工作目录
133
+ * skillDirectory?: string, // 可选,覆盖 SKILL 目录
134
+ * acceptanceCriteria?: string, // 可选,用户提供的验收标准
135
+ * maxLoops?: number // 可选,最大循环次数(默认 3)
136
+ * }
137
+ *
138
+ * 响应:异步启动,立即返回 taskId 和初始状态。
139
+ * 前端通过 SSE 或 GET /progress 轮询进度。
140
+ */
141
+ async start(req, res) {
142
+ const body = req.body || {};
143
+ const { taskDescription } = body;
144
+
145
+ if (!taskDescription) {
146
+ return res.error(400, 'taskDescription 为必填项');
147
+ }
148
+ if (!this.brainController) {
149
+ return res.error(500, 'brainController 未初始化');
150
+ }
151
+ if (!this.orchestratorController) {
152
+ return res.error(500, 'orchestratorController 未初始化');
153
+ }
154
+
155
+ const maxLoops = typeof body.maxLoops === 'number' && body.maxLoops > 0
156
+ ? body.maxLoops
157
+ : 3;
158
+
159
+ try {
160
+ // 生成 taskId(如果未指定)
161
+ const taskId = body.taskId || `task_${Date.now().toString(36)}${Math.random().toString(36).substring(2, 6)}`;
162
+
163
+ // 幂等保护:同一 taskId 若已有循环在运行中,直接返回,避免并发/重复启动
164
+ const running = this._running.get(taskId);
165
+ if (running) {
166
+ return res.json({
167
+ status: 'ok',
168
+ message: `大循环已在运行中: taskId=${taskId}`,
169
+ taskId,
170
+ maxLoops,
171
+ progress: this._engines.has(taskId) ? this._engines.get(taskId).getProgress(taskId) : null
172
+ });
173
+ }
174
+
175
+ // 若已存在同 taskId 的循环,先终止旧的(仅针对已结束/空闲的旧实例)
176
+ if (this._engines.has(taskId)) {
177
+ const oldEngine = this._engines.get(taskId);
178
+ await oldEngine.abortLoop(taskId).catch(() => {});
179
+ }
180
+
181
+ const engine = this._createEngine();
182
+ this._engines.set(taskId, engine);
183
+
184
+ // 注册任务摘要到注册表(SQLite),供历史列表分页查询
185
+ this._registerTask({
186
+ taskId,
187
+ taskType: 'loop',
188
+ status: 'running',
189
+ title: taskDescription.slice(0, 200),
190
+ description: taskDescription,
191
+ createdAt: new Date().toISOString(),
192
+ metadata: { maxLoops, currentLoop: 0 }
193
+ });
194
+
195
+ // 异步启动大循环,不阻塞 HTTP 响应
196
+ const loopPromise = engine.startLoop({
197
+ taskDescription,
198
+ taskId,
199
+ taskDir: body.taskDir,
200
+ skillDirectory: body.skillDirectory,
201
+ acceptanceCriteria: body.acceptanceCriteria,
202
+ maxLoops
203
+ }).catch(err => {
204
+ console.error(`[LoopEngineController] taskId=${taskId} 大循环异常:`, err.message);
205
+ }).finally(async () => {
206
+ // 循环结束后清理运行标记,允许同一 taskId 后续重新启动
207
+ this._running.delete(taskId);
208
+
209
+ // 更新注册表中的任务状态为终态
210
+ const engine = this._engines.get(taskId);
211
+ if (engine) {
212
+ const ctx = engine.getLoop(taskId);
213
+ if (ctx) {
214
+ const terminalStates = [
215
+ LoopStatus.PASSED, LoopStatus.FAILED,
216
+ LoopStatus.ABORTED, LoopStatus.ABORTING, LoopStatus.ERROR
217
+ ];
218
+ if (terminalStates.includes(ctx.status)) {
219
+ await this._registerTask({
220
+ taskId,
221
+ taskType: 'loop',
222
+ status: ctx.status,
223
+ title: (ctx.taskDescription || '').slice(0, 200),
224
+ description: ctx.taskDescription || '',
225
+ createdAt: ctx.startTime || new Date().toISOString(),
226
+ metadata: {
227
+ maxLoops: ctx.maxLoops,
228
+ currentLoop: ctx.currentLoop,
229
+ totalRounds: ctx.rounds.length,
230
+ passed: ctx.status === LoopStatus.PASSED
231
+ }
232
+ });
233
+ }
234
+ }
235
+ }
236
+
237
+ // 释放该任务对应的 Orchestrator 重型引用(FlexRunner/LLM/CLI 等),防止内存泄露。
238
+ // 保留 Orchestrator 轻量元信息与磁盘持久化,前端历史查看不受影响。
239
+ if (this.orchestratorController) {
240
+ try {
241
+ this.orchestratorController.disposeOrchestrator(taskId);
242
+ } catch (err) {
243
+ console.warn(`[LoopEngineController] 释放 Orchestrator 失败: taskId=${taskId}, error=${err.message}`);
244
+ }
245
+ }
246
+
247
+ // 从内存移除已进入终态的大循环实例(PASSED/FAILED/ABORTED/ERROR)。
248
+ // 历史列表由注册表提供,不依赖内存 _engines。
249
+ if (engine) {
250
+ const terminalStates = [
251
+ LoopStatus.PASSED, LoopStatus.FAILED,
252
+ LoopStatus.ABORTED, LoopStatus.ABORTING, LoopStatus.ERROR
253
+ ];
254
+ const ctx = engine.getLoop(taskId);
255
+ if (ctx && terminalStates.includes(ctx.status)) {
256
+ this._engines.delete(taskId);
257
+ }
258
+ }
259
+ });
260
+
261
+ this._running.set(taskId, loopPromise);
262
+
263
+ res.json({
264
+ status: 'ok',
265
+ message: `大循环已启动: taskId=${taskId}`,
266
+ taskId,
267
+ maxLoops,
268
+ progress: engine.getProgress(taskId)
269
+ });
270
+
271
+ } catch (err) {
272
+ res.error(400, err.message);
273
+ }
274
+ }
275
+
276
+ /**
277
+ * GET /api/loopengine/progress
278
+ * 查询大循环进度。
279
+ *
280
+ * Query: { taskId }
281
+ */
282
+ async progress(req, res) {
283
+ const taskId = req.query?.taskId || req.body?.taskId;
284
+
285
+ if (!taskId) {
286
+ return res.error(400, 'taskId 为必填项');
287
+ }
288
+
289
+ try {
290
+ // ── 1. 优先从内存获取(运行中的任务) ──
291
+ let engine = this._engines.get(taskId);
292
+
293
+ if (engine) {
294
+ const progress = engine.getProgress(taskId);
295
+ if (progress) {
296
+ return res.json({ status: 'ok', progress });
297
+ }
298
+ }
299
+
300
+ // ── 1b. 单次执行任务:检查 OrchestratorController 中是否有活跃编排 ──
301
+ // 单次执行任务由 FlexRunnerController.startSingle 创建,编排器在 OrchestratorController 中。
302
+ // 执行期间内存中没有 LoopEngine 实例,但 Orchestrator 正在运行。
303
+ // 此时需要从 Orchestrator 实时获取进度,而非从磁盘 loop.json(可能已过时)。
304
+ if (this.orchestratorController) {
305
+ let orch;
306
+ try {
307
+ orch = this.orchestratorController._getOrchestrator(taskId);
308
+ } catch { /* 不存在,继续 */ }
309
+
310
+ if (orch) {
311
+ const orchProgress = orch.getProgress();
312
+ // 判断是否为单次执行(步骤数为 1 且 loopCount === 0)
313
+ const isSingle = orchProgress &&
314
+ Array.isArray(orchProgress.steps) && orchProgress.steps.length === 1;
315
+
316
+ if (isSingle) {
317
+ // 构造兼容 LoopEngine.getProgress 的响应格式
318
+ const loopProgress = {
319
+ taskId,
320
+ status: orchProgress.status === 'running' ? 'executing'
321
+ : (orchProgress.status === 'aborting' ? 'aborting'
322
+ : (orchProgress.status === 'completed' ? 'passed'
323
+ : (orchProgress.status === 'aborted' ? 'aborted'
324
+ : (orchProgress.status === 'failed' ? 'failed' : orchProgress.status)))),
325
+ currentLoop: 1,
326
+ maxLoops: 1,
327
+ startTime: orchProgress.startTime,
328
+ endTime: orchProgress.endTime,
329
+ error: orchProgress.error,
330
+ isSingleExecution: true,
331
+ rounds: [{
332
+ loop: 0,
333
+ passed: orchProgress.status === 'completed',
334
+ startTime: orchProgress.startTime,
335
+ endTime: orchProgress.endTime,
336
+ error: orchProgress.error,
337
+ planningPlanId: null,
338
+ planningIsReplan: false,
339
+ planningStepCount: 1,
340
+ planningIntent: null,
341
+ planningDomain: null,
342
+ planningComplexity: null,
343
+ planningFailureAnalysis: null,
344
+ planningAdjustmentStrategy: null,
345
+ orchestratorStatus: orchProgress.status,
346
+ checkSummary: null,
347
+ checkPassed: null,
348
+ checkStatus: null,
349
+ checkId: null,
350
+ checkSessionId: null
351
+ }]
352
+ };
353
+ return res.json({ status: 'ok', progress: loopProgress });
354
+ }
355
+ }
356
+ }
357
+
358
+ // ── 2. 内存没有,从持久化恢复 ──
359
+ if (!engine) {
360
+ engine = this._createEngine();
361
+ const ctx = await engine.restoreLoop(taskId);
362
+ if (ctx) {
363
+ this._engines.set(taskId, engine);
364
+ return res.json({ status: 'ok', progress: engine.getProgress(taskId) });
365
+ }
366
+ }
367
+
368
+ return res.error(404, `未找到大循环任务: taskId=${taskId}`);
369
+ } catch (err) {
370
+ res.error(400, err.message);
371
+ }
372
+ }
373
+
374
+ /**
375
+ * GET /api/loopengine/list
376
+ * 列出所有大循环任务(分页,注册表优先)。
377
+ *
378
+ * 数据来源:
379
+ * 1. SQLite 注册表(db/TaskRegistry/registry.db)— 高性能分页,优先使用
380
+ * 2. 内存中活跃的 LoopEngine 实例 — 合并运行中任务(覆盖注册表状态)
381
+ * 3. 持久化扫描 JSON 文件 — 兜底(注册表不存在时使用)
382
+ *
383
+ * Query 参数:
384
+ * page - 页码,从 1 开始(默认 1)
385
+ * pageSize - 每页条数(默认 20,最大 100)
386
+ * status - 可选,按状态过滤
387
+ *
388
+ * 响应格式:
389
+ * { status, tasks: [...], total, page, pageSize, totalPages }
390
+ */
391
+ async list(req, res) {
392
+ const query = req.query || {};
393
+ const page = Math.max(1, parseInt(query.page, 10) || 1);
394
+ const pageSize = Math.min(100, Math.max(1, parseInt(query.pageSize, 10) || 20));
395
+ const statusFilter = query.status || null;
396
+
397
+ // ── 优先方案:从注册表分页查询 ──
398
+ const registry = this._getRegistry();
399
+ if (registry) {
400
+ try {
401
+ // 从注册表获取分页数据
402
+ const result = await registry.listPage({
403
+ page,
404
+ pageSize,
405
+ status: statusFilter,
406
+ taskType: 'loop'
407
+ });
408
+
409
+ // 合并内存中活跃任务的状态(覆盖注册表中的"running"状态为最新值)
410
+ const mergedTasks = result.tasks.map(t => {
411
+ const memEngine = this._engines.get(t.task_id);
412
+ if (memEngine) {
413
+ const ctx = memEngine.getLoop(t.task_id);
414
+ if (ctx) {
415
+ return {
416
+ ...t,
417
+ taskId: t.task_id,
418
+ status: ctx.status,
419
+ currentLoop: ctx.currentLoop,
420
+ maxLoops: ctx.maxLoops,
421
+ startTime: ctx.startTime,
422
+ endTime: ctx.endTime,
423
+ taskDescription: t.description
424
+ };
425
+ }
426
+ }
427
+ return {
428
+ ...t,
429
+ taskId: t.task_id,
430
+ currentLoop: t.metadata?.currentLoop ?? 0,
431
+ maxLoops: t.metadata?.maxLoops ?? 3,
432
+ startTime: t.created_at,
433
+ taskDescription: t.description
434
+ };
435
+ });
436
+
437
+ // 如果第一页,还要把活跃但不在注册表中的任务加进去(如刚启动注册表写入延迟)
438
+ if (page === 1) {
439
+ const existingIds = new Set(result.tasks.map(t => t.task_id));
440
+ for (const engine of this._engines.values()) {
441
+ for (const ctx of engine.getLoops()) {
442
+ if (!existingIds.has(ctx.taskId)) {
443
+ mergedTasks.unshift({
444
+ task_id: ctx.taskId,
445
+ task_type: 'loop',
446
+ status: ctx.status,
447
+ title: (ctx.taskDescription || '').slice(0, 200),
448
+ description: ctx.taskDescription || '',
449
+ created_at: ctx.startTime || new Date().toISOString(),
450
+ updated_at: null,
451
+ metadata: { currentLoop: ctx.currentLoop, maxLoops: ctx.maxLoops },
452
+ taskId: ctx.taskId,
453
+ currentLoop: ctx.currentLoop,
454
+ maxLoops: ctx.maxLoops,
455
+ startTime: ctx.startTime,
456
+ endTime: ctx.endTime,
457
+ taskDescription: ctx.taskDescription || ''
458
+ });
459
+ }
460
+ }
461
+ }
462
+ }
463
+
464
+ return res.json({
465
+ status: 'ok',
466
+ tasks: mergedTasks,
467
+ loops: mergedTasks, // 向后兼容:前端 loop.js 期望 d.loops
468
+ total: result.total,
469
+ page: result.page,
470
+ pageSize: result.pageSize,
471
+ totalPages: result.totalPages
472
+ });
473
+ } catch (err) {
474
+ console.warn('[LoopEngineController] 注册表查询失败,降级到磁盘扫描:', err.message);
475
+ // 降级到磁盘扫描
476
+ }
477
+ }
478
+
479
+ // ── 降级方案:内存 + 磁盘扫描(向后兼容) ──
480
+ try {
481
+ const memTaskIds = new Set();
482
+ const summaries = [];
483
+
484
+ for (const engine of this._engines.values()) {
485
+ for (const ctx of engine.getLoops()) {
486
+ memTaskIds.add(ctx.taskId);
487
+ summaries.push({
488
+ taskId: ctx.taskId,
489
+ status: ctx.status,
490
+ currentLoop: ctx.currentLoop,
491
+ maxLoops: ctx.maxLoops,
492
+ startTime: ctx.startTime,
493
+ endTime: ctx.endTime,
494
+ passed: ctx.status === LoopStatus.PASSED,
495
+ isSingleExecution: false,
496
+ taskDescription: ctx.taskDescription || ''
497
+ });
498
+ }
499
+ }
500
+
501
+ try {
502
+ const storage = this._getStorage();
503
+ const taskRoot = join(storage.manager.rootDir, 'task');
504
+
505
+ const entries = await fs.readdir(taskRoot, { withFileTypes: true });
506
+ for (const entry of entries) {
507
+ if (!entry.isDirectory()) continue;
508
+ const loopFile = join(taskRoot, entry.name, 'loop.json');
509
+ try {
510
+ const raw = await fs.readFile(loopFile, 'utf8');
511
+ const data = JSON.parse(raw);
512
+ if (!data || !data.taskId) continue;
513
+ if (memTaskIds.has(data.taskId)) continue;
514
+ if (statusFilter && data.status !== statusFilter) continue;
515
+
516
+ summaries.push({
517
+ taskId: data.taskId,
518
+ status: data.status || LoopStatus.IDLE,
519
+ currentLoop: data.currentLoop || 0,
520
+ maxLoops: data.maxLoops || 3,
521
+ startTime: data.startTime || null,
522
+ endTime: data.endTime || null,
523
+ passed: data.status === LoopStatus.PASSED,
524
+ isSingleExecution: data.isSingleExecution || false,
525
+ taskDescription: data.taskDescription || ''
526
+ });
527
+ } catch {
528
+ try {
529
+ const orchFile = join(taskRoot, entry.name, 'orchestration.json');
530
+ const orchRaw = await fs.readFile(orchFile, 'utf8');
531
+ const orchData = JSON.parse(orchRaw);
532
+ if (!orchData || !orchData.taskId) continue;
533
+ if (memTaskIds.has(orchData.taskId)) continue;
534
+ if (statusFilter && orchData.status !== statusFilter) continue;
535
+
536
+ summaries.push({
537
+ taskId: orchData.taskId,
538
+ status: orchData.status || LoopStatus.IDLE,
539
+ currentLoop: orchData.loopCount || 0,
540
+ maxLoops: 3,
541
+ startTime: orchData.startTime || null,
542
+ endTime: orchData.endTime || null,
543
+ passed: orchData.status === 'passed',
544
+ isSingleExecution: false,
545
+ taskDescription: ''
546
+ });
547
+ } catch { /* skip */ }
548
+ }
549
+ }
550
+ } catch (err) {
551
+ console.warn('[LoopEngineController] 扫描持久化任务失败:', err.message);
552
+ }
553
+
554
+ summaries.sort((a, b) => {
555
+ const ta = a.startTime || '';
556
+ const tb = b.startTime || '';
557
+ return tb.localeCompare(ta);
558
+ });
559
+
560
+ // 降级方案也做分页
561
+ const total = summaries.length;
562
+ const totalPages = Math.max(1, Math.ceil(total / pageSize));
563
+ const offset = (page - 1) * pageSize;
564
+ const paged = summaries.slice(offset, offset + pageSize);
565
+
566
+ return res.json({
567
+ status: 'ok',
568
+ tasks: paged,
569
+ loops: paged, // 向后兼容:前端 loop.js 期望 d.loops
570
+ total,
571
+ page,
572
+ pageSize,
573
+ totalPages
574
+ });
575
+ } catch (err) {
576
+ res.error(500, `列举大循环任务失败: ${err.message}`);
577
+ }
578
+ }
579
+
580
+ /**
581
+ * POST /api/loopengine/abort
582
+ * 终止大循环。
583
+ *
584
+ * Body: { taskId }
585
+ */
586
+ async abort(req, res) {
587
+ const body = req.body || {};
588
+ const { taskId } = body;
589
+
590
+ if (!taskId) {
591
+ return res.error(400, 'taskId 为必填项');
592
+ }
593
+
594
+ try {
595
+ const engine = this._engines.get(taskId);
596
+ if (!engine) {
597
+ // ── 单次执行任务:委托 OrchestratorController 终止 ──
598
+ // 单次执行任务由 FlexRunnerController.startSingle 创建,
599
+ // 编排器实例在 OrchestratorController 中管理,不在 LoopEngine 中。
600
+ if (this.orchestratorController) {
601
+ let orch;
602
+ try {
603
+ orch = this.orchestratorController._getOrchestrator(taskId);
604
+ } catch {
605
+ return res.error(404, `未找到大循环任务: taskId=${taskId}`);
606
+ }
607
+ const ok = await orch.abort();
608
+ res.json({
609
+ status: ok ? 'ok' : 'error',
610
+ message: ok
611
+ ? '终止请求已发出,正在终止运行中的会话...'
612
+ : '终止失败(可能已结束)',
613
+ taskId
614
+ });
615
+ return;
616
+ }
617
+ return res.error(404, `未找到大循环任务: taskId=${taskId}`);
618
+ }
619
+
620
+ const ok = await engine.abortLoop(taskId);
621
+
622
+ // 注意:不在此处 disposeOrchestrator —— 终止是异步生效的:
623
+ // Orchestrator._scheduleLoop / FlexRunner 轮询需要继续运行才能感知终止标志
624
+ // 并完成收尾(markFinished + persistState + 远程 abortSession)。
625
+ // Orchestrator 的重型引用由 startLoop 的 finally 收尾统一释放。
626
+
627
+ // 响应只表示"终止请求已受理",真正的终态以 getProgress / SSE loop:aborted 为准
628
+ res.json({
629
+ status: ok ? 'ok' : 'error',
630
+ message: ok ? '终止请求已发出,正在终止运行中的会话...' : '终止失败(可能已结束)',
631
+ taskId
632
+ });
633
+ } catch (err) {
634
+ res.error(400, err.message);
635
+ }
636
+ }
637
+
638
+ /**
639
+ * POST /api/loopengine/restore
640
+ * 从持久化文件恢复大循环状态。
641
+ *
642
+ * Body: { taskId }
643
+ */
644
+ async restore(req, res) {
645
+ const body = req.body || {};
646
+ const { taskId } = body;
647
+
648
+ if (!taskId) {
649
+ return res.error(400, 'taskId 为必填项');
650
+ }
651
+
652
+ try {
653
+ // 如果已有运行中的实例,直接返回
654
+ if (this._engines.has(taskId)) {
655
+ return res.json({
656
+ status: 'ok',
657
+ message: '大循环已在运行中',
658
+ taskId,
659
+ progress: this._engines.get(taskId).getProgress(taskId)
660
+ });
661
+ }
662
+
663
+ const engine = this._createEngine();
664
+ const ctx = await engine.restoreLoop(taskId);
665
+
666
+ if (!ctx) {
667
+ return res.error(404, `未找到持久化的大循环状态: taskId=${taskId}`);
668
+ }
669
+
670
+ this._engines.set(taskId, engine);
671
+ res.json({
672
+ status: 'ok',
673
+ message: '大循环状态已恢复',
674
+ taskId,
675
+ progress: engine.getProgress(taskId)
676
+ });
677
+ } catch (err) {
678
+ res.error(400, err.message);
679
+ }
680
+ }
681
+
682
+ /**
683
+ * GET /api/loopengine/check-session?taskId=xxx&loop=N
684
+ * 获取指定轮次 TestCheck 准出审核的 session 对话归档。
685
+ *
686
+ * Query: { taskId, loop }
687
+ *
688
+ * 数据来源优先级:
689
+ * 1. 内存中运行中的 LoopEngine(round.checkResult.sessionId)
690
+ * 2. 持久化的 loop.json(round.checkSessionId)
691
+ * 3. 持久化的 testcheck_loopN.json(result.sessionId)
692
+ *
693
+ * 获取 sessionId 后通过 SessionStore 读取归档消息。
694
+ */
695
+ async checkSession(req, res) {
696
+ const taskId = req.query?.taskId;
697
+ const loop = req.query?.loop != null ? Number(req.query.loop) : 0;
698
+
699
+ if (!taskId) {
700
+ return res.error(400, 'taskId 为必填项');
701
+ }
702
+
703
+ try {
704
+ let sessionId = null;
705
+
706
+ // ── 1. 优先从内存获取 ──
707
+ const engine = this._engines.get(taskId);
708
+ if (engine) {
709
+ const ctx = engine.getLoop(taskId);
710
+ if (ctx && ctx.rounds[loop]) {
711
+ sessionId = ctx.rounds[loop].checkResult?.sessionId || null;
712
+ }
713
+ }
714
+
715
+ // ── 2. 从持久化 loop.json 获取 ──
716
+ if (!sessionId) {
717
+ const storage = this._getStorage();
718
+ const json = storage.json('task');
719
+ const state = await json.read(`${taskId}/loop`);
720
+ if (state && Array.isArray(state.rounds) && state.rounds[loop]) {
721
+ sessionId = state.rounds[loop].checkSessionId || null;
722
+ }
723
+ }
724
+
725
+ // ── 3. 从 testcheck_loopN.json 获取 ──
726
+ if (!sessionId) {
727
+ const storage = this._getStorage();
728
+ const json = storage.json('task');
729
+ const checkResult = await json.read(`${taskId}/testcheck_loop${loop}`);
730
+ if (checkResult && checkResult.sessionId) {
731
+ sessionId = checkResult.sessionId;
732
+ }
733
+ }
734
+
735
+ if (!sessionId) {
736
+ return res.error(404, `未找到第 ${loop + 1} 轮审核的 sessionId`);
737
+ }
738
+
739
+ // ── 通过 SessionStore 读取归档消息 ──
740
+ const storage = this._getStorage();
741
+ const sessionStore = storage.sessionStore();
742
+
743
+ const [meta, messages] = await Promise.all([
744
+ sessionStore.readMeta(sessionId).catch(() => null),
745
+ sessionStore.readMessages(sessionId).catch(() => [])
746
+ ]);
747
+
748
+ res.json({
749
+ status: 'ok',
750
+ sessionId,
751
+ meta,
752
+ messages
753
+ });
754
+ } catch (err) {
755
+ res.error(400, err.message);
756
+ }
757
+ }
758
+
759
+ /**
760
+ * GET /api/loopengine/status
761
+ * 获取 LoopEngineController 当前状态。
762
+ */
763
+ async status(req, res) {
764
+ const activeLoops = Array.from(this._engines.values()).map(engine => {
765
+ const loops = engine.getLoops();
766
+ return loops.filter(ctx =>
767
+ ctx.status === LoopStatus.PLANNING ||
768
+ ctx.status === LoopStatus.EXECUTING ||
769
+ ctx.status === LoopStatus.CHECKING ||
770
+ ctx.status === LoopStatus.ABORTING
771
+ ).map(ctx => ({
772
+ taskId: ctx.taskId,
773
+ status: ctx.status,
774
+ currentLoop: ctx.currentLoop,
775
+ maxLoops: ctx.maxLoops
776
+ }));
777
+ }).flat();
778
+
779
+ res.json({
780
+ status: 'ok',
781
+ totalEngines: this._engines.size,
782
+ activeLoops,
783
+ runningPromises: this._running.size
784
+ });
785
+ }
786
+ }
787
+
788
+ export default LoopEngineController;