@specpow/framework 0.2.0

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 (362) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/LICENSE +21 -0
  3. package/README.md +557 -0
  4. package/agents/controller/sdd-controller.md +55 -0
  5. package/agents/execution/java-codegen-agent.md +39 -0
  6. package/agents/execution/ui-codegen-agent.md +32 -0
  7. package/agents/ops/deploy-agent.md +181 -0
  8. package/agents/planning/db-designer-agent.md +30 -0
  9. package/agents/planning/prd-agent.md +31 -0
  10. package/agents/quality/review-agent.md +36 -0
  11. package/agents/quality/test-agent.md +33 -0
  12. package/bin/specpow.js +10 -0
  13. package/dist/cli/index.d.ts +7 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +444 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/commands/apply.d.ts +14 -0
  18. package/dist/commands/apply.d.ts.map +1 -0
  19. package/dist/commands/apply.js +195 -0
  20. package/dist/commands/apply.js.map +1 -0
  21. package/dist/commands/archive.d.ts +30 -0
  22. package/dist/commands/archive.d.ts.map +1 -0
  23. package/dist/commands/archive.js +141 -0
  24. package/dist/commands/archive.js.map +1 -0
  25. package/dist/commands/channel.d.ts +61 -0
  26. package/dist/commands/channel.d.ts.map +1 -0
  27. package/dist/commands/channel.js +613 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/config.d.ts +40 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +130 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/debug.d.ts +45 -0
  34. package/dist/commands/debug.d.ts.map +1 -0
  35. package/dist/commands/debug.js +167 -0
  36. package/dist/commands/debug.js.map +1 -0
  37. package/dist/commands/doctor.d.ts +20 -0
  38. package/dist/commands/doctor.d.ts.map +1 -0
  39. package/dist/commands/doctor.js +121 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/execute.d.ts +25 -0
  42. package/dist/commands/execute.d.ts.map +1 -0
  43. package/dist/commands/execute.js +120 -0
  44. package/dist/commands/execute.js.map +1 -0
  45. package/dist/commands/explore.d.ts +71 -0
  46. package/dist/commands/explore.d.ts.map +1 -0
  47. package/dist/commands/explore.js +481 -0
  48. package/dist/commands/explore.js.map +1 -0
  49. package/dist/commands/init.d.ts +20 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +146 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/memory.d.ts +32 -0
  54. package/dist/commands/memory.d.ts.map +1 -0
  55. package/dist/commands/memory.js +455 -0
  56. package/dist/commands/memory.js.map +1 -0
  57. package/dist/commands/propose.d.ts +13 -0
  58. package/dist/commands/propose.d.ts.map +1 -0
  59. package/dist/commands/propose.js +193 -0
  60. package/dist/commands/propose.js.map +1 -0
  61. package/dist/commands/review.d.ts +50 -0
  62. package/dist/commands/review.d.ts.map +1 -0
  63. package/dist/commands/review.js +198 -0
  64. package/dist/commands/review.js.map +1 -0
  65. package/dist/commands/schema.d.ts +22 -0
  66. package/dist/commands/schema.d.ts.map +1 -0
  67. package/dist/commands/schema.js +79 -0
  68. package/dist/commands/schema.js.map +1 -0
  69. package/dist/commands/status.d.ts +11 -0
  70. package/dist/commands/status.d.ts.map +1 -0
  71. package/dist/commands/status.js +130 -0
  72. package/dist/commands/status.js.map +1 -0
  73. package/dist/commands/store.d.ts +31 -0
  74. package/dist/commands/store.d.ts.map +1 -0
  75. package/dist/commands/store.js +109 -0
  76. package/dist/commands/store.js.map +1 -0
  77. package/dist/commands/update.d.ts +42 -0
  78. package/dist/commands/update.d.ts.map +1 -0
  79. package/dist/commands/update.js +239 -0
  80. package/dist/commands/update.js.map +1 -0
  81. package/dist/commands/verify.d.ts +39 -0
  82. package/dist/commands/verify.d.ts.map +1 -0
  83. package/dist/commands/verify.js +386 -0
  84. package/dist/commands/verify.js.map +1 -0
  85. package/dist/commands/workflow/index.d.ts +12 -0
  86. package/dist/commands/workflow/index.d.ts.map +1 -0
  87. package/dist/commands/workflow/index.js +435 -0
  88. package/dist/commands/workflow/index.js.map +1 -0
  89. package/dist/core/agent-contract.d.ts +133 -0
  90. package/dist/core/agent-contract.d.ts.map +1 -0
  91. package/dist/core/agent-contract.js +71 -0
  92. package/dist/core/agent-contract.js.map +1 -0
  93. package/dist/core/archive/delta-merger.d.ts +101 -0
  94. package/dist/core/archive/delta-merger.d.ts.map +1 -0
  95. package/dist/core/archive/delta-merger.js +398 -0
  96. package/dist/core/archive/delta-merger.js.map +1 -0
  97. package/dist/core/archive/delta-parser.d.ts +48 -0
  98. package/dist/core/archive/delta-parser.d.ts.map +1 -0
  99. package/dist/core/archive/delta-parser.js +193 -0
  100. package/dist/core/archive/delta-parser.js.map +1 -0
  101. package/dist/core/archive/engine.d.ts +136 -0
  102. package/dist/core/archive/engine.d.ts.map +1 -0
  103. package/dist/core/archive/engine.js +506 -0
  104. package/dist/core/archive/engine.js.map +1 -0
  105. package/dist/core/archive/index.d.ts +11 -0
  106. package/dist/core/archive/index.d.ts.map +1 -0
  107. package/dist/core/archive/index.js +9 -0
  108. package/dist/core/archive/index.js.map +1 -0
  109. package/dist/core/artifact-graph/graph.d.ts +48 -0
  110. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  111. package/dist/core/artifact-graph/graph.js +170 -0
  112. package/dist/core/artifact-graph/graph.js.map +1 -0
  113. package/dist/core/artifact-graph/index.d.ts +13 -0
  114. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  115. package/dist/core/artifact-graph/index.js +12 -0
  116. package/dist/core/artifact-graph/index.js.map +1 -0
  117. package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
  118. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  119. package/dist/core/artifact-graph/instruction-loader.js +166 -0
  120. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  121. package/dist/core/artifact-graph/outputs.d.ts +17 -0
  122. package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
  123. package/dist/core/artifact-graph/outputs.js +27 -0
  124. package/dist/core/artifact-graph/outputs.js.map +1 -0
  125. package/dist/core/artifact-graph/resolver.d.ts +34 -0
  126. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  127. package/dist/core/artifact-graph/resolver.js +99 -0
  128. package/dist/core/artifact-graph/resolver.js.map +1 -0
  129. package/dist/core/artifact-graph/state.d.ts +54 -0
  130. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  131. package/dist/core/artifact-graph/state.js +149 -0
  132. package/dist/core/artifact-graph/state.js.map +1 -0
  133. package/dist/core/artifact-graph/types.d.ts +151 -0
  134. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  135. package/dist/core/artifact-graph/types.js +44 -0
  136. package/dist/core/artifact-graph/types.js.map +1 -0
  137. package/dist/core/channel/channel-event-log.d.ts +81 -0
  138. package/dist/core/channel/channel-event-log.d.ts.map +1 -0
  139. package/dist/core/channel/channel-event-log.js +177 -0
  140. package/dist/core/channel/channel-event-log.js.map +1 -0
  141. package/dist/core/channel/channel-inbox.d.ts +70 -0
  142. package/dist/core/channel/channel-inbox.d.ts.map +1 -0
  143. package/dist/core/channel/channel-inbox.js +122 -0
  144. package/dist/core/channel/channel-inbox.js.map +1 -0
  145. package/dist/core/channel/channel-runtime.d.ts +81 -0
  146. package/dist/core/channel/channel-runtime.d.ts.map +1 -0
  147. package/dist/core/channel/channel-runtime.js +291 -0
  148. package/dist/core/channel/channel-runtime.js.map +1 -0
  149. package/dist/core/channel/channel-supervisor.d.ts +72 -0
  150. package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
  151. package/dist/core/channel/channel-supervisor.js +189 -0
  152. package/dist/core/channel/channel-supervisor.js.map +1 -0
  153. package/dist/core/channel/channel-types.d.ts +169 -0
  154. package/dist/core/channel/channel-types.d.ts.map +1 -0
  155. package/dist/core/channel/channel-types.js +26 -0
  156. package/dist/core/channel/channel-types.js.map +1 -0
  157. package/dist/core/channel/index.d.ts +21 -0
  158. package/dist/core/channel/index.d.ts.map +1 -0
  159. package/dist/core/channel/index.js +23 -0
  160. package/dist/core/channel/index.js.map +1 -0
  161. package/dist/core/command-generation/index.d.ts +225 -0
  162. package/dist/core/command-generation/index.d.ts.map +1 -0
  163. package/dist/core/command-generation/index.js +462 -0
  164. package/dist/core/command-generation/index.js.map +1 -0
  165. package/dist/core/config/config-schema.d.ts +745 -0
  166. package/dist/core/config/config-schema.d.ts.map +1 -0
  167. package/dist/core/config/config-schema.js +108 -0
  168. package/dist/core/config/config-schema.js.map +1 -0
  169. package/dist/core/config/global-config.d.ts +73 -0
  170. package/dist/core/config/global-config.d.ts.map +1 -0
  171. package/dist/core/config/global-config.js +225 -0
  172. package/dist/core/config/global-config.js.map +1 -0
  173. package/dist/core/config/index.d.ts +8 -0
  174. package/dist/core/config/index.d.ts.map +1 -0
  175. package/dist/core/config/index.js +8 -0
  176. package/dist/core/config/index.js.map +1 -0
  177. package/dist/core/hooks/hook-registry.d.ts +55 -0
  178. package/dist/core/hooks/hook-registry.d.ts.map +1 -0
  179. package/dist/core/hooks/hook-registry.js +172 -0
  180. package/dist/core/hooks/hook-registry.js.map +1 -0
  181. package/dist/core/hooks/hook-types.d.ts +87 -0
  182. package/dist/core/hooks/hook-types.d.ts.map +1 -0
  183. package/dist/core/hooks/hook-types.js +11 -0
  184. package/dist/core/hooks/hook-types.js.map +1 -0
  185. package/dist/core/hooks/index.d.ts +28 -0
  186. package/dist/core/hooks/index.d.ts.map +1 -0
  187. package/dist/core/hooks/index.js +28 -0
  188. package/dist/core/hooks/index.js.map +1 -0
  189. package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
  190. package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
  191. package/dist/core/hooks/post-tool-call-hook.js +191 -0
  192. package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
  193. package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
  194. package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
  195. package/dist/core/hooks/pre-tool-call-hook.js +122 -0
  196. package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
  197. package/dist/core/hooks/session-start-hook.d.ts +25 -0
  198. package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
  199. package/dist/core/hooks/session-start-hook.js +226 -0
  200. package/dist/core/hooks/session-start-hook.js.map +1 -0
  201. package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
  202. package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
  203. package/dist/core/hooks/workflow-state-hook.js +181 -0
  204. package/dist/core/hooks/workflow-state-hook.js.map +1 -0
  205. package/dist/core/init/engine.d.ts +69 -0
  206. package/dist/core/init/engine.d.ts.map +1 -0
  207. package/dist/core/init/engine.js +211 -0
  208. package/dist/core/init/engine.js.map +1 -0
  209. package/dist/core/init/template-hash.d.ts +86 -0
  210. package/dist/core/init/template-hash.d.ts.map +1 -0
  211. package/dist/core/init/template-hash.js +228 -0
  212. package/dist/core/init/template-hash.js.map +1 -0
  213. package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
  214. package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
  215. package/dist/core/memory/adapters/json-adapter.js +273 -0
  216. package/dist/core/memory/adapters/json-adapter.js.map +1 -0
  217. package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
  218. package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
  219. package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
  220. package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
  221. package/dist/core/memory/index.d.ts +38 -0
  222. package/dist/core/memory/index.d.ts.map +1 -0
  223. package/dist/core/memory/index.js +40 -0
  224. package/dist/core/memory/index.js.map +1 -0
  225. package/dist/core/memory/memory-indexer.d.ts +39 -0
  226. package/dist/core/memory/memory-indexer.d.ts.map +1 -0
  227. package/dist/core/memory/memory-indexer.js +213 -0
  228. package/dist/core/memory/memory-indexer.js.map +1 -0
  229. package/dist/core/memory/memory-manager.d.ts +59 -0
  230. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  231. package/dist/core/memory/memory-manager.js +194 -0
  232. package/dist/core/memory/memory-manager.js.map +1 -0
  233. package/dist/core/memory/memory-store.d.ts +31 -0
  234. package/dist/core/memory/memory-store.d.ts.map +1 -0
  235. package/dist/core/memory/memory-store.js +148 -0
  236. package/dist/core/memory/memory-store.js.map +1 -0
  237. package/dist/core/memory/memory-types.d.ts +154 -0
  238. package/dist/core/memory/memory-types.d.ts.map +1 -0
  239. package/dist/core/memory/memory-types.js +13 -0
  240. package/dist/core/memory/memory-types.js.map +1 -0
  241. package/dist/core/migration/index.d.ts +80 -0
  242. package/dist/core/migration/index.d.ts.map +1 -0
  243. package/dist/core/migration/index.js +361 -0
  244. package/dist/core/migration/index.js.map +1 -0
  245. package/dist/core/parsers/index.d.ts +95 -0
  246. package/dist/core/parsers/index.d.ts.map +1 -0
  247. package/dist/core/parsers/index.js +367 -0
  248. package/dist/core/parsers/index.js.map +1 -0
  249. package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
  250. package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
  251. package/dist/core/sdd-engine/ai-caller.js +624 -0
  252. package/dist/core/sdd-engine/ai-caller.js.map +1 -0
  253. package/dist/core/sdd-engine/controller.d.ts +107 -0
  254. package/dist/core/sdd-engine/controller.d.ts.map +1 -0
  255. package/dist/core/sdd-engine/controller.js +357 -0
  256. package/dist/core/sdd-engine/controller.js.map +1 -0
  257. package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
  258. package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
  259. package/dist/core/sdd-engine/dispatcher.js +146 -0
  260. package/dist/core/sdd-engine/dispatcher.js.map +1 -0
  261. package/dist/core/sdd-engine/git-ops.d.ts +73 -0
  262. package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
  263. package/dist/core/sdd-engine/git-ops.js +326 -0
  264. package/dist/core/sdd-engine/git-ops.js.map +1 -0
  265. package/dist/core/sdd-engine/index.d.ts +17 -0
  266. package/dist/core/sdd-engine/index.d.ts.map +1 -0
  267. package/dist/core/sdd-engine/index.js +15 -0
  268. package/dist/core/sdd-engine/index.js.map +1 -0
  269. package/dist/core/sdd-engine/ledger.d.ts +92 -0
  270. package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
  271. package/dist/core/sdd-engine/ledger.js +273 -0
  272. package/dist/core/sdd-engine/ledger.js.map +1 -0
  273. package/dist/core/sdd-engine/model-selector.d.ts +49 -0
  274. package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
  275. package/dist/core/sdd-engine/model-selector.js +76 -0
  276. package/dist/core/sdd-engine/model-selector.js.map +1 -0
  277. package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
  278. package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
  279. package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
  280. package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
  281. package/dist/core/sdd-engine/review-loop.d.ts +61 -0
  282. package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
  283. package/dist/core/sdd-engine/review-loop.js +139 -0
  284. package/dist/core/sdd-engine/review-loop.js.map +1 -0
  285. package/dist/core/sdd-engine/types.d.ts +104 -0
  286. package/dist/core/sdd-engine/types.d.ts.map +1 -0
  287. package/dist/core/sdd-engine/types.js +7 -0
  288. package/dist/core/sdd-engine/types.js.map +1 -0
  289. package/dist/core/store/index.d.ts +78 -0
  290. package/dist/core/store/index.d.ts.map +1 -0
  291. package/dist/core/store/index.js +182 -0
  292. package/dist/core/store/index.js.map +1 -0
  293. package/dist/core/templates/index.d.ts +58 -0
  294. package/dist/core/templates/index.d.ts.map +1 -0
  295. package/dist/core/templates/index.js +158 -0
  296. package/dist/core/templates/index.js.map +1 -0
  297. package/dist/core/validation/index.d.ts +34 -0
  298. package/dist/core/validation/index.d.ts.map +1 -0
  299. package/dist/core/validation/index.js +153 -0
  300. package/dist/core/validation/index.js.map +1 -0
  301. package/dist/core/workflow-state.d.ts +96 -0
  302. package/dist/core/workflow-state.d.ts.map +1 -0
  303. package/dist/core/workflow-state.js +284 -0
  304. package/dist/core/workflow-state.js.map +1 -0
  305. package/dist/index.d.ts +18 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +21 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/utils/index.d.ts +48 -0
  310. package/dist/utils/index.d.ts.map +1 -0
  311. package/dist/utils/index.js +119 -0
  312. package/dist/utils/index.js.map +1 -0
  313. package/hooks/hooks.json +30 -0
  314. package/hooks/run-hook.cmd +19 -0
  315. package/hooks/session-start +62 -0
  316. package/hooks/workflow-state +150 -0
  317. package/package.json +122 -0
  318. package/schemas/bug-fix/schema.yaml +64 -0
  319. package/schemas/bug-fix/templates/analysis.md +43 -0
  320. package/schemas/bug-fix/templates/fix-plan.md +19 -0
  321. package/schemas/bug-fix/templates/proposal.md +30 -0
  322. package/schemas/crud-module/schema.yaml +65 -0
  323. package/schemas/crud-module/templates/design.md +36 -0
  324. package/schemas/crud-module/templates/proposal.md +30 -0
  325. package/schemas/crud-module/templates/spec.md +33 -0
  326. package/schemas/crud-module/templates/tasks.md +57 -0
  327. package/schemas/spec-driven/schema.yaml +87 -0
  328. package/schemas/spec-driven/templates/design.md +54 -0
  329. package/schemas/spec-driven/templates/proposal.md +31 -0
  330. package/schemas/spec-driven/templates/spec.md +44 -0
  331. package/schemas/spec-driven/templates/tasks.md +98 -0
  332. package/skills/business-code-review/SKILL.md +78 -0
  333. package/skills/business-db-design/SKILL.md +74 -0
  334. package/skills/business-deploy-check/SKILL.md +72 -0
  335. package/skills/business-doc-sync/SKILL.md +72 -0
  336. package/skills/business-java-codegen/SKILL.md +97 -0
  337. package/skills/business-menu-register/SKILL.md +63 -0
  338. package/skills/business-prd-writer/SKILL.md +80 -0
  339. package/skills/business-test-gen/SKILL.md +82 -0
  340. package/skills/business-ui-codegen/SKILL.md +104 -0
  341. package/skills/execution-finish-branch/SKILL.md +58 -0
  342. package/skills/execution-git-worktrees/SKILL.md +48 -0
  343. package/skills/execution-parallel-agents/SKILL.md +51 -0
  344. package/skills/execution-receiving-review/SKILL.md +47 -0
  345. package/skills/execution-requesting-review/SKILL.md +51 -0
  346. package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
  347. package/skills/execution-systematic-debugging/SKILL.md +95 -0
  348. package/skills/execution-tdd/SKILL.md +74 -0
  349. package/skills/execution-verification-before-completion/SKILL.md +75 -0
  350. package/skills/meta-create-skill/SKILL.md +374 -0
  351. package/skills/meta-using-skills/SKILL.md +97 -0
  352. package/skills/meta-writing-skills/SKILL.md +66 -0
  353. package/skills/planning-apply-change/SKILL.md +199 -0
  354. package/skills/planning-archive-change/SKILL.md +43 -0
  355. package/skills/planning-explore/SKILL.md +108 -0
  356. package/skills/planning-onboard/SKILL.md +60 -0
  357. package/skills/planning-propose/SKILL.md +145 -0
  358. package/skills/planning-update-change/SKILL.md +45 -0
  359. package/skills/planning-verify-change/SKILL.md +58 -0
  360. package/skills/planning-write-design/SKILL.md +59 -0
  361. package/skills/planning-write-plans/SKILL.md +55 -0
  362. package/skills/planning-write-specs/SKILL.md +73 -0
@@ -0,0 +1,624 @@
1
+ /**
2
+ * AI 调用抽象层
3
+ *
4
+ * 统一的子代理分发接口,遵循 Superpowers 的核心原则:
5
+ * 1. 每个子代理使用全新上下文(不继承主会话历史)
6
+ * 2. 产物通过文件传递(不占用上下文窗口)
7
+ * 3. 支持多种 AI 后端:Claude Code、Cursor、自定义 CLI
8
+ *
9
+ * 子代理通信协议:
10
+ * Controller → writes brief file → AI reads brief → AI writes report → Controller reads report
11
+ *
12
+ * 模型选择策略(5级层次):
13
+ * cheap → standard → capable
14
+ * 修复轮次 4-5 自动升级到更强模型
15
+ */
16
+ import { execFileSync, execSync } from 'child_process';
17
+ import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs';
18
+ import { join, dirname } from 'path';
19
+ import { generateReviewPackage } from './git-ops.js';
20
+ // ============================================================
21
+ // Claude Code 后端适配器
22
+ // ============================================================
23
+ class ClaudeBackend {
24
+ name = 'claude';
25
+ async execute(promptFile, model, outputPath, cwd) {
26
+ // 使用 execFileSync + 参数数组,避免 shell 注入
27
+ const args = ['--print', '--file', promptFile];
28
+ if (model) {
29
+ args.push('--model', model);
30
+ }
31
+ return new Promise((resolve, reject) => {
32
+ try {
33
+ const stdout = execFileSync('claude', args, {
34
+ maxBuffer: 10 * 1024 * 1024,
35
+ timeout: 600_000, // 10 分钟超时
36
+ encoding: 'utf-8',
37
+ ...(cwd && { cwd }),
38
+ });
39
+ // 如果指定了输出路径,将结果写入文件
40
+ if (outputPath) {
41
+ writeFileSync(outputPath, stdout, 'utf-8');
42
+ }
43
+ resolve(stdout);
44
+ }
45
+ catch (err) {
46
+ reject(new Error(`Claude execution failed: ${err.message}`));
47
+ }
48
+ });
49
+ }
50
+ isAvailable() {
51
+ try {
52
+ execSync('claude --version', { stdio: 'pipe' });
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ }
60
+ // ============================================================
61
+ // 文件系统后端(用于手动执行场景)
62
+ // ============================================================
63
+ class FileSystemBackend {
64
+ name = 'file';
65
+ timeout;
66
+ constructor(timeout = 600_000) {
67
+ this.timeout = timeout;
68
+ }
69
+ async execute(promptFile, _model, outputPath, _cwd) {
70
+ // 文件系统模式:等待报告文件生成并写入完成
71
+ const reportFile = outputPath || join(dirname(promptFile), 'report.md');
72
+ const startTime = Date.now();
73
+ const pollInterval = 500; // 轮询间隔(毫秒)
74
+ // 阶段 1:等待文件出现
75
+ while (!existsSync(reportFile)) {
76
+ if (Date.now() - startTime > this.timeout) {
77
+ throw new Error(`Timeout waiting for report file: ${reportFile}`);
78
+ }
79
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
80
+ }
81
+ // 阶段 2:等待文件写入完成(文件大小稳定检查)
82
+ // 连续两次读取文件大小相同 → 写入完成
83
+ const { statSync } = await import('fs');
84
+ let prevSize = -1;
85
+ let stableCount = 0;
86
+ const STABLE_THRESHOLD = 2; // 连续 2 次大小不变
87
+ while (stableCount < STABLE_THRESHOLD) {
88
+ if (Date.now() - startTime > this.timeout) {
89
+ throw new Error(`Timeout waiting for report file write to complete: ${reportFile}`);
90
+ }
91
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
92
+ try {
93
+ const currentSize = statSync(reportFile).size;
94
+ if (currentSize === prevSize && currentSize > 0) {
95
+ stableCount++;
96
+ }
97
+ else {
98
+ stableCount = 0;
99
+ prevSize = currentSize;
100
+ }
101
+ }
102
+ catch {
103
+ // 文件可能被临时删除/重建,重置计数
104
+ stableCount = 0;
105
+ prevSize = -1;
106
+ }
107
+ }
108
+ const content = readFileSync(reportFile, 'utf-8');
109
+ if (!content.trim()) {
110
+ throw new Error('Report file is empty');
111
+ }
112
+ return content;
113
+ }
114
+ isAvailable() {
115
+ return true; // 文件系统始终可用
116
+ }
117
+ }
118
+ // ============================================================
119
+ // Shell 命令后端(通用 CLI 工具)
120
+ // ============================================================
121
+ class ShellBackend {
122
+ name = 'shell';
123
+ command;
124
+ constructor(command) {
125
+ this.command = command || process.env.SPECPOW_AI_COMMAND || '';
126
+ }
127
+ async execute(promptFile, _model, outputPath, _cwd) {
128
+ if (!this.command) {
129
+ throw new Error('No AI command configured. Set SPECPOW_AI_COMMAND environment variable.');
130
+ }
131
+ // 将命令模板拆分为参数数组,避免通过 shell 执行
132
+ // {prompt} 占位符会被替换为实际的 promptFile 路径
133
+ const parts = this.command.trim().split(/\s+/).map(part => part.replace(/\{prompt\}/g, promptFile));
134
+ const [file, ...args] = parts;
135
+ if (!file) {
136
+ throw new Error('Empty AI command configured.');
137
+ }
138
+ return new Promise((resolve, reject) => {
139
+ try {
140
+ const stdout = execFileSync(file, args, {
141
+ maxBuffer: 10 * 1024 * 1024,
142
+ timeout: 600_000,
143
+ encoding: 'utf-8',
144
+ });
145
+ if (outputPath) {
146
+ writeFileSync(outputPath, stdout, 'utf-8');
147
+ }
148
+ resolve(stdout);
149
+ }
150
+ catch (err) {
151
+ reject(new Error(`Shell AI execution failed: ${err.message}`));
152
+ }
153
+ });
154
+ }
155
+ isAvailable() {
156
+ return !!this.command;
157
+ }
158
+ }
159
+ // ============================================================
160
+ // AI 调用器
161
+ // ============================================================
162
+ export class AICaller {
163
+ backends = [];
164
+ workspaceDir;
165
+ constructor(workspaceDir, preferredBackend, options) {
166
+ this.workspaceDir = workspaceDir;
167
+ // 注册所有后端
168
+ this.backends.push(new FileSystemBackend(options?.timeout));
169
+ this.backends.push(new ClaudeBackend());
170
+ this.backends.push(new ShellBackend());
171
+ // 如果指定了首选后端,将其移到最前
172
+ if (preferredBackend) {
173
+ const idx = this.backends.findIndex(b => b.name === preferredBackend);
174
+ if (idx > 0) {
175
+ const [backend] = this.backends.splice(idx, 1);
176
+ this.backends.unshift(backend);
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * 获取可用后端
182
+ */
183
+ getAvailableBackend() {
184
+ for (const backend of this.backends) {
185
+ if (backend.isAvailable()) {
186
+ return backend;
187
+ }
188
+ }
189
+ // fallback 到文件系统(始终可用)
190
+ return this.backends[0];
191
+ }
192
+ /**
193
+ * 写入分发 prompt 到文件
194
+ */
195
+ writePromptFile(taskNumber, type, content) {
196
+ const dir = join(this.workspaceDir, 'prompts');
197
+ if (!existsSync(dir)) {
198
+ mkdirSync(dir, { recursive: true });
199
+ }
200
+ const timestamp = Date.now();
201
+ const filePath = join(dir, `task-${taskNumber}-${type}-${timestamp}.md`);
202
+ writeFileSync(filePath, content, 'utf-8');
203
+ return filePath;
204
+ }
205
+ /**
206
+ * 构建实现者 prompt
207
+ *
208
+ * 遵循 Superpowers 的子代理分发设计:
209
+ * - 只告诉代理去哪里读简报(不粘贴任务描述)
210
+ * - 传递全局约束和接口约定
211
+ * - 要求将报告写入指定文件
212
+ */
213
+ buildImplementerPrompt(brief, projectContext, specConstraints) {
214
+ return [
215
+ `# 任务实现`,
216
+ ``,
217
+ `## 上下文`,
218
+ `你正在项目 ${projectContext} 中工作。`,
219
+ ``,
220
+ `## 任务简报`,
221
+ `请阅读完整的任务简报文件: ${brief.briefPath}`,
222
+ ``,
223
+ `## 规范约束`,
224
+ specConstraints || '遵循项目现有代码风格和架构约定',
225
+ ``,
226
+ `## 涉及文件`,
227
+ brief.files.length > 0
228
+ ? brief.files.map(f => `- \`${f}\``).join('\n')
229
+ : '(由你自行判断需要修改的文件)',
230
+ ``,
231
+ `## 铁律:测试驱动开发 (TDD)`,
232
+ ``,
233
+ `\`\`\``,
234
+ `没有失败测试就不写产品代码!`,
235
+ `\`\``,
236
+ ``,
237
+ `## 执行步骤 — RED-GREEN-REFACTOR`,
238
+ ``,
239
+ `### RED — 先写一个失败的测试`,
240
+ `1. 阅读任务简报,理解需求行为`,
241
+ `2. 为下一个要实现的 _行为_ 写一个测试`,
242
+ `3. 运行测试,确认它失败`,
243
+ `4. 失败原因必须是"功能还不存在"`,
244
+ ``,
245
+ `### GREEN — 写最少的代码让测试通过`,
246
+ `1. 写刚好够让测试通过的代码`,
247
+ `2. 不多写。YAGNI。`,
248
+ `3. 运行测试,确认全部通过`,
249
+ ``,
250
+ `### REFACTOR — 在测试保护下清理代码`,
251
+ `1. 消除重复,改善命名`,
252
+ `2. 运行测试,确认仍然全部通过`,
253
+ ``,
254
+ `重复 RED-GREEN-REFACTOR 直到任务完成。`,
255
+ ``,
256
+ `## 报告要求`,
257
+ `将详细的实现报告写入: ${brief.reportPath}`,
258
+ ``,
259
+ `报告格式:`,
260
+ `- 状态: DONE / DONE_WITH_CONCERNS / NEEDS_CONTEXT / BLOCKED`,
261
+ `- 产生的 commit 列表(如果适用)`,
262
+ `- 测试摘要(RED 阶段写了哪些测试,GREEN 阶段全部通过)`,
263
+ `- 任何疑虑或未解决的问题`,
264
+ ].join('\n');
265
+ }
266
+ /**
267
+ * 构建审查者 prompt
268
+ *
269
+ * 两阶段审查门(来自 Superpowers):
270
+ * 1. 规格合规:实现是否覆盖所有需求
271
+ * 2. 代码质量:实现质量评估
272
+ */
273
+ buildReviewerPrompt(brief, reviewPackagePath) {
274
+ return [
275
+ `# 代码审查 — 两阶段裁决`,
276
+ ``,
277
+ `## 任务上下文`,
278
+ `- 任务: ${brief.title}`,
279
+ `- 简报: ${brief.briefPath}`,
280
+ ``,
281
+ `## 审查包`,
282
+ `请阅读完整的审查包: ${reviewPackagePath}`,
283
+ ``,
284
+ `## 审查流程`,
285
+ ``,
286
+ `### 第一阶段: 规格合规裁决`,
287
+ `对照任务简报,逐项检查:`,
288
+ `1. 所有需求项是否已实现`,
289
+ `2. 是否有超出规范的实现(scope creep)`,
290
+ `3. 接口签名是否与设计一致`,
291
+ ``,
292
+ `### 第二阶段: 代码质量裁决`,
293
+ `1. 命名和结构是否清晰`,
294
+ `2. 错误处理是否完整`,
295
+ `3. 是否有安全隐患`,
296
+ `4. 是否有性能问题`,
297
+ ``,
298
+ `### 第三阶段: TDD 合规裁决`,
299
+ `1. 是否有测试覆盖新增/修改的代码`,
300
+ `2. 测试是否断言行为而非实现细节`,
301
+ `3. 测试是否在代码之前编写(检查 commit 顺序或测试结构)`,
302
+ `4. 关键路径和边界条件是否有测试`,
303
+ ``,
304
+ `## 输出格式`,
305
+ `将审查结果写入文件: ${join(dirname(brief.reportPath), 'review-result.json')}`,
306
+ ``,
307
+ `\`\`\`json`,
308
+ `{`,
309
+ ` "specCompliant": true/false,`,
310
+ ` "qualityApproved": true/false,`,
311
+ ` "findings": [`,
312
+ ` {`,
313
+ ` "id": "F-001",`,
314
+ ` "severity": "critical|important|minor",`,
315
+ ` "description": "...",`,
316
+ ` "file": "path/to/file",`,
317
+ ` "line": 42,`,
318
+ ` "isLoadBearing": true/false`,
319
+ ` }`,
320
+ ` ],`,
321
+ ` "cannotVerify": ["从 diff 无法验证的项目"]`,
322
+ `}`,
323
+ `\`\`\``,
324
+ ].join('\n');
325
+ }
326
+ /**
327
+ * 构建重新审查 prompt
328
+ *
329
+ * 范围限定的重新审查——只审查修复 diff
330
+ */
331
+ buildReReviewerPrompt(brief, reviewPackagePath, openFindings) {
332
+ return [
333
+ `# 范围限定重新审查`,
334
+ ``,
335
+ `只审查修复 diff: ${reviewPackagePath}`,
336
+ ``,
337
+ `## 待验证的开放发现`,
338
+ ...openFindings.map((f, i) => ` ${i + 1}. [${f.severity}] ${f.description} (${f.file}${f.line ? `:${f.line}` : ''})`),
339
+ ``,
340
+ `## 要求`,
341
+ `对每个发现做出裁决: ADDRESSED / NOT ADDRESSED`,
342
+ `新问题(仅限修复 diff 内的)标记为 NEW`,
343
+ `超出修复范围的观察 → 忽略(不记录)`,
344
+ ``,
345
+ `将结果写入: ${join(dirname(brief.reportPath), 're-review-result.json')}`,
346
+ ].join('\n');
347
+ }
348
+ /**
349
+ * 分发实现者子代理
350
+ *
351
+ * 1. 写入实现者 prompt 到文件
352
+ * 2. 调用 AI 后端执行
353
+ * 3. 读取报告文件
354
+ * 4. 解析返回 TaskReport
355
+ */
356
+ async dispatchImplementer(brief, projectContext, specConstraints, model) {
357
+ const prompt = this.buildImplementerPrompt(brief, projectContext, specConstraints);
358
+ const promptFile = this.writePromptFile(brief.taskNumber, 'implementer', prompt);
359
+ // 写入简报文件
360
+ const briefDir = dirname(brief.briefPath);
361
+ if (!existsSync(briefDir)) {
362
+ mkdirSync(briefDir, { recursive: true });
363
+ }
364
+ writeFileSync(brief.briefPath, this.formatBriefFile(brief, specConstraints), 'utf-8');
365
+ try {
366
+ const backend = this.getAvailableBackend();
367
+ await backend.execute(promptFile, model, brief.reportPath, brief.worktreePath);
368
+ // 读取报告
369
+ if (existsSync(brief.reportPath)) {
370
+ return this.parseTaskReport(brief.reportPath);
371
+ }
372
+ // 报告不存在,视为阻塞——AI 执行了但未产出报告,需要人工介入
373
+ return {
374
+ status: 'blocked',
375
+ commits: [],
376
+ testSummary: 'Implementer agent did not produce a report file',
377
+ concerns: `Report file not found at ${brief.reportPath}. The agent may have crashed, timed out, or failed to write output. Manual investigation required.`,
378
+ };
379
+ }
380
+ catch (err) {
381
+ return {
382
+ status: 'blocked',
383
+ commits: [],
384
+ testSummary: `AI dispatch failed: ${err.message}`,
385
+ concerns: err.message,
386
+ };
387
+ }
388
+ }
389
+ /**
390
+ * 分发审查者子代理
391
+ */
392
+ async dispatchReviewer(brief, _projectContext, _specConstraints, baseCommit = 'HEAD~1', headCommit = 'HEAD') {
393
+ const cwd = brief.worktreePath;
394
+ const reviewPackagePath = generateReviewPackage(baseCommit, headCommit, brief.briefPath, this.workspaceDir, cwd);
395
+ const prompt = this.buildReviewerPrompt(brief, reviewPackagePath);
396
+ const promptFile = this.writePromptFile(brief.taskNumber, 'reviewer', prompt);
397
+ try {
398
+ const backend = this.getAvailableBackend();
399
+ const resultPath = join(dirname(brief.reportPath), 'review-result.json');
400
+ await backend.execute(promptFile, undefined, resultPath, cwd);
401
+ // 读取审查结果 JSON
402
+ return this.parseReviewResult(resultPath);
403
+ }
404
+ catch (err) {
405
+ return {
406
+ specCompliant: false,
407
+ qualityApproved: false,
408
+ findings: [{
409
+ id: 'F-ERR',
410
+ severity: 'critical',
411
+ description: `Review dispatch failed: ${err.message}`,
412
+ file: '',
413
+ addressed: false,
414
+ isLoadBearing: true,
415
+ }],
416
+ cannotVerify: ['Review process itself failed'],
417
+ };
418
+ }
419
+ }
420
+ /**
421
+ * 分发重新审查者子代理(范围限定)
422
+ */
423
+ async dispatchReReviewer(brief, openFindings, baseCommit = 'HEAD~1', headCommit = 'HEAD') {
424
+ const cwd = brief.worktreePath;
425
+ const reviewPackagePath = generateReviewPackage(baseCommit, headCommit, brief.briefPath, this.workspaceDir, cwd);
426
+ const prompt = this.buildReReviewerPrompt(brief, reviewPackagePath, openFindings);
427
+ const promptFile = this.writePromptFile(brief.taskNumber, 're-reviewer', prompt);
428
+ try {
429
+ const backend = this.getAvailableBackend();
430
+ const resultPath = join(dirname(brief.reportPath), 're-review-result.json');
431
+ await backend.execute(promptFile, undefined, resultPath, cwd);
432
+ return this.parseReviewResult(resultPath);
433
+ }
434
+ catch (err) {
435
+ return {
436
+ specCompliant: false,
437
+ qualityApproved: false,
438
+ findings: [],
439
+ cannotVerify: [`Re-review dispatch failed: ${err.message}`],
440
+ };
441
+ }
442
+ }
443
+ // ============================================================
444
+ // 辅助方法
445
+ // ============================================================
446
+ /**
447
+ * 格式化简报文件内容
448
+ */
449
+ formatBriefFile(brief, specConstraints) {
450
+ return [
451
+ `# 任务简报: ${brief.title}`,
452
+ ``,
453
+ `**任务编号**: ${brief.taskNumber}`,
454
+ `**涉及文件**: ${brief.files.length > 0 ? brief.files.join(', ') : '(自动判断)'}`,
455
+ ``,
456
+ `## 任务描述`,
457
+ brief.description,
458
+ ``,
459
+ `## 规范约束`,
460
+ specConstraints || '遵循项目现有代码风格和架构约定',
461
+ ``,
462
+ `## 输出要求`,
463
+ `将实现报告写入: ${brief.reportPath}`,
464
+ ``,
465
+ `报告格式:`,
466
+ `\`\`\`json`,
467
+ `{`,
468
+ ` "status": "DONE|DONE_WITH_CONCERNS|NEEDS_CONTEXT|BLOCKED",`,
469
+ ` "commits": ["commit-sha"],`,
470
+ ` "testSummary": "测试结果摘要",`,
471
+ ` "concerns": "如果有疑虑的话"`,
472
+ `}`,
473
+ `\`\`\``,
474
+ ].join('\n');
475
+ }
476
+ /**
477
+ * 解析任务报告
478
+ */
479
+ parseTaskReport(reportPath) {
480
+ const content = readFileSync(reportPath, 'utf-8');
481
+ // 尝试解析 JSON 格式
482
+ try {
483
+ // 提取 JSON 块
484
+ const jsonMatch = content.match(/```json\s*([\s\S]*?)\s*```/);
485
+ if (jsonMatch) {
486
+ const data = JSON.parse(jsonMatch[1]);
487
+ return {
488
+ status: this.mapStatus(data.status),
489
+ commits: data.commits || [],
490
+ testSummary: data.testSummary || '',
491
+ concerns: data.concerns,
492
+ fixReport: data.fixReport,
493
+ };
494
+ }
495
+ }
496
+ catch {
497
+ // JSON 解析失败,尝试从文本推断
498
+ }
499
+ // 从文本推断状态
500
+ // 策略:优先匹配显式状态标记,再用否定排除的关键词匹配
501
+ const lc = content.toLowerCase();
502
+ // 辅助:检查关键词是否存在,且不被否定词修饰
503
+ // 否定前缀: not, no, un, without, never, neither, 不, 没, 非
504
+ const hasKeywordWithoutNegation = (keyword) => {
505
+ // 先检查显式状态标记(最高优先级)
506
+ const statusPatterns = [
507
+ new RegExp(`status[:\\s]*.*${keyword}`, 'i'),
508
+ new RegExp(`##\\s+${keyword}`, 'i'),
509
+ new RegExp(`\\bstatus\\b.*\\b${keyword}\\b`, 'i'),
510
+ ];
511
+ if (statusPatterns.some(p => p.test(content)))
512
+ return true;
513
+ // 否定排除:关键词前面不应紧跟否定词
514
+ const negatedPattern = new RegExp(`(?:not|no|un|without|never|neither|不|没|非)\\s*\\w*${keyword}`, 'i');
515
+ const positivePattern = new RegExp(`\\b${keyword}\\w*\\b`, 'i');
516
+ return positivePattern.test(lc) && !negatedPattern.test(lc);
517
+ };
518
+ const inferredStatus = hasKeywordWithoutNegation('blocked')
519
+ ? 'blocked'
520
+ : hasKeywordWithoutNegation('concern') || hasKeywordWithoutNegation('疑虑')
521
+ ? 'done_with_concerns'
522
+ : hasKeywordWithoutNegation('need')
523
+ ? 'needs_context'
524
+ : 'done';
525
+ // 验证推断的状态是否为合法的 TaskStatus
526
+ const validStatuses = ['done', 'done_with_concerns', 'blocked', 'needs_context'];
527
+ const status = validStatuses.includes(inferredStatus)
528
+ ? inferredStatus
529
+ : 'done'; // 安全回退
530
+ return {
531
+ status,
532
+ commits: this.extractCommits(content),
533
+ testSummary: content.substring(0, 200),
534
+ };
535
+ }
536
+ /**
537
+ * 解析审查结果
538
+ */
539
+ parseReviewResult(resultPath) {
540
+ if (!existsSync(resultPath)) {
541
+ return {
542
+ specCompliant: false,
543
+ qualityApproved: false,
544
+ findings: [{
545
+ id: 'F-NO-REVIEW',
546
+ severity: 'critical',
547
+ description: 'Review result file is missing — the reviewer agent did not produce output. This must be investigated before proceeding.',
548
+ file: resultPath,
549
+ addressed: false,
550
+ isLoadBearing: true,
551
+ }],
552
+ cannotVerify: [
553
+ 'Review result file not found — reviewer agent may have crashed or timed out',
554
+ 'Cannot verify spec compliance without review output',
555
+ 'Cannot verify code quality without review output',
556
+ ],
557
+ };
558
+ }
559
+ try {
560
+ const content = readFileSync(resultPath, 'utf-8');
561
+ // 尝试 JSON 解析
562
+ const jsonMatch = content.match(/```json\s*([\s\S]*?)\s*```/);
563
+ const data = jsonMatch ? JSON.parse(jsonMatch[1]) : JSON.parse(content);
564
+ return {
565
+ specCompliant: data.specCompliant === true,
566
+ qualityApproved: data.qualityApproved === true,
567
+ findings: (data.findings || []).map((f) => ({
568
+ id: f.id || `F-${Math.random().toString(36).slice(2, 6)}`,
569
+ severity: f.severity || 'important',
570
+ description: f.description || 'No description',
571
+ file: f.file || '',
572
+ line: f.line,
573
+ addressed: f.addressed === true,
574
+ isLoadBearing: f.isLoadBearing === true,
575
+ })),
576
+ cannotVerify: data.cannotVerify || [],
577
+ };
578
+ }
579
+ catch (err) {
580
+ return {
581
+ specCompliant: false,
582
+ qualityApproved: false,
583
+ findings: [{
584
+ id: 'F-PARSE',
585
+ severity: 'critical',
586
+ description: `Failed to parse review result: ${err.message}`,
587
+ file: resultPath,
588
+ addressed: false,
589
+ isLoadBearing: false,
590
+ }],
591
+ cannotVerify: ['Review result parse failed'],
592
+ };
593
+ }
594
+ }
595
+ /**
596
+ * 状态映射
597
+ */
598
+ mapStatus(raw) {
599
+ const s = raw?.toLowerCase() || '';
600
+ if (s.includes('block'))
601
+ return 'blocked';
602
+ if (s.includes('concern'))
603
+ return 'done_with_concerns';
604
+ if (s.includes('need') || s.includes('context'))
605
+ return 'needs_context';
606
+ if (s.includes('fix'))
607
+ return 'fix_round';
608
+ if (s.includes('progress'))
609
+ return 'in_progress';
610
+ return 'done';
611
+ }
612
+ /**
613
+ * 从文本中提取 commit SHA
614
+ * 使用 word boundary 避免误匹配非 SHA 的十六进制字符串
615
+ */
616
+ extractCommits(text) {
617
+ const matches = text.match(/\b([a-f0-9]{7,40})\b/gi);
618
+ if (!matches)
619
+ return [];
620
+ // 过滤明显非 SHA 的匹配(如纯数字或太短的字符串)
621
+ return [...new Set(matches.filter(m => /[a-f]/i.test(m) || m.length >= 12))];
622
+ }
623
+ }
624
+ //# sourceMappingURL=ai-caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-caller.js","sourceRoot":"","sources":["../../../src/core/sdd-engine/ai-caller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAkCrD,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,aAAa;IACR,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,KAAc,EAAE,UAAmB,EAAE,GAAY;QACjF,qCAAqC;QACrC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE;oBAC1C,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;oBAC3B,OAAO,EAAE,OAAO,EAAE,UAAU;oBAC5B,QAAQ,EAAE,OAAO;oBACjB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;iBACpB,CAAC,CAAC;gBACH,oBAAoB;gBACpB,IAAI,UAAU,EAAE,CAAC;oBACf,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7C,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,CAAC;YACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D,MAAM,iBAAiB;IACZ,IAAI,GAAG,MAAM,CAAC;IACf,OAAO,CAAS;IAExB,YAAY,UAAkB,OAAO;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,MAAe,EAAE,UAAmB,EAAE,IAAa;QACnF,uBAAuB;QACvB,MAAM,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;QAExE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,WAAW;QAErC,cAAc;QACd,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,0BAA0B;QAC1B,sBAAsB;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,gBAAgB,GAAG,CAAC,CAAC,CAAC,aAAa;QAEzC,OAAO,WAAW,GAAG,gBAAgB,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,sDAAsD,UAAU,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YAEhE,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;gBAC9C,IAAI,WAAW,KAAK,QAAQ,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBAChD,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,CAAC,CAAC;oBAChB,QAAQ,GAAG,WAAW,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;gBACpB,WAAW,GAAG,CAAC,CAAC;gBAChB,QAAQ,GAAG,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,CAAC,WAAW;IAC1B,CAAC;CACF;AAED,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAE/D,MAAM,YAAY;IACP,IAAI,GAAG,OAAO,CAAC;IAChB,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,MAAe,EAAE,UAAmB,EAAE,IAAa;QACnF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QAED,6BAA6B;QAC7B,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACxD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CACxC,CAAC;QACF,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;QAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE;oBACtC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;oBAC3B,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;gBACH,IAAI,UAAU,EAAE,CAAC;oBACf,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7C,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACF;AAED,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D,MAAM,OAAO,QAAQ;IACX,QAAQ,GAAgB,EAAE,CAAC;IAC3B,YAAY,CAAS;IAE7B,YAAY,YAAoB,EAAE,gBAAyB,EAAE,OAA8B;QACzF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,SAAS;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAEvC,mBAAmB;QACnB,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;YACtE,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,uBAAuB;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,UAAkB,EAAE,IAAY,EAAE,OAAe;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,UAAU,IAAI,IAAI,IAAI,SAAS,KAAK,CAAC,CAAC;QAEzE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB,CAAC,KAAgB,EAAE,cAAsB,EAAE,eAAuB;QACtF,OAAO;YACL,QAAQ;YACR,EAAE;YACF,QAAQ;YACR,SAAS,cAAc,OAAO;YAC9B,EAAE;YACF,SAAS;YACT,iBAAiB,KAAK,CAAC,SAAS,EAAE;YAClC,EAAE;YACF,SAAS;YACT,eAAe,IAAI,iBAAiB;YACpC,EAAE;YACF,SAAS;YACT,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/C,CAAC,CAAC,iBAAiB;YACrB,EAAE;YACF,oBAAoB;YACpB,EAAE;YACF,QAAQ;YACR,gBAAgB;YAChB,MAAM;YACN,EAAE;YACF,8BAA8B;YAC9B,EAAE;YACF,qBAAqB;YACrB,kBAAkB;YAClB,wBAAwB;YACxB,eAAe;YACf,oBAAoB;YACpB,EAAE;YACF,yBAAyB;YACzB,iBAAiB;YACjB,eAAe;YACf,gBAAgB;YAChB,EAAE;YACF,2BAA2B;YAC3B,cAAc;YACd,kBAAkB;YAClB,EAAE;YACF,+BAA+B;YAC/B,EAAE;YACF,SAAS;YACT,eAAe,KAAK,CAAC,UAAU,EAAE;YACjC,EAAE;YACF,OAAO;YACP,2DAA2D;YAC3D,uBAAuB;YACvB,mCAAmC;YACnC,eAAe;SAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CACjB,KAAgB,EAChB,iBAAyB;QAEzB,OAAO;YACL,gBAAgB;YAChB,EAAE;YACF,UAAU;YACV,SAAS,KAAK,CAAC,KAAK,EAAE;YACtB,SAAS,KAAK,CAAC,SAAS,EAAE;YAC1B,EAAE;YACF,QAAQ;YACR,cAAc,iBAAiB,EAAE;YACjC,EAAE;YACF,SAAS;YACT,EAAE;YACF,kBAAkB;YAClB,cAAc;YACd,eAAe;YACf,4BAA4B;YAC5B,gBAAgB;YAChB,EAAE;YACF,kBAAkB;YAClB,cAAc;YACd,aAAa;YACb,YAAY;YACZ,YAAY;YACZ,EAAE;YACF,oBAAoB;YACpB,oBAAoB;YACpB,mBAAmB;YACnB,mCAAmC;YACnC,mBAAmB;YACnB,EAAE;YACF,SAAS;YACT,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,EAAE;YACrE,EAAE;YACF,YAAY;YACZ,GAAG;YACH,gCAAgC;YAChC,kCAAkC;YAClC,iBAAiB;YACjB,OAAO;YACP,sBAAsB;YACtB,+CAA+C;YAC/C,6BAA6B;YAC7B,+BAA+B;YAC/B,mBAAmB;YACnB,mCAAmC;YACnC,OAAO;YACP,MAAM;YACN,sCAAsC;YACtC,GAAG;YACH,QAAQ;SACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CACnB,KAAgB,EAChB,iBAAyB,EACzB,YAAuB;QAEvB,OAAO;YACL,YAAY;YACZ,EAAE;YACF,eAAe,iBAAiB,EAAE;YAClC,EAAE;YACF,aAAa;YACb,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;YACtH,EAAE;YACF,OAAO;YACP,sCAAsC;YACtC,0BAA0B;YAC1B,qBAAqB;YACrB,EAAE;YACF,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC,EAAE;SACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,mBAAmB,CACvB,KAAgB,EAChB,cAAsB,EACtB,eAAuB,EACvB,KAAc;QAEd,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QACnF,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAEjF,SAAS;QACT,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QAEtF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3C,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YAE/E,OAAO;YACP,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,CAAC;YAED,kCAAkC;YAClC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,iDAAiD;gBAC9D,QAAQ,EAAE,4BAA4B,KAAK,CAAC,UAAU,oGAAoG;aAC3J,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE;gBACjD,QAAQ,EAAE,GAAG,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,KAAgB,EAChB,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,QAAQ,EAC7B,aAAqB,MAAM;QAE3B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;QAC/B,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAEjH,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAC;YACzE,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAE9D,cAAc;YACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE,CAAC;wBACT,EAAE,EAAE,OAAO;wBACX,QAAQ,EAAE,UAAU;wBACpB,WAAW,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE;wBACrD,IAAI,EAAE,EAAE;wBACR,SAAS,EAAE,KAAK;wBAChB,aAAa,EAAE,IAAI;qBACpB,CAAC;gBACF,YAAY,EAAE,CAAC,8BAA8B,CAAC;aAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,KAAgB,EAChB,YAAuB,EACvB,aAAqB,QAAQ,EAC7B,aAAqB,MAAM;QAE3B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;QAC/B,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAEjH,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC,CAAC;YAC5E,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,OAAO;IACP,+DAA+D;IAE/D;;OAEG;IACK,eAAe,CAAC,KAAgB,EAAE,eAAuB;QAC/D,OAAO;YACL,WAAW,KAAK,CAAC,KAAK,EAAE;YACxB,EAAE;YACF,aAAa,KAAK,CAAC,UAAU,EAAE;YAC/B,aAAa,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzE,EAAE;YACF,SAAS;YACT,KAAK,CAAC,WAAW;YACjB,EAAE;YACF,SAAS;YACT,eAAe,IAAI,iBAAiB;YACpC,EAAE;YACF,SAAS;YACT,YAAY,KAAK,CAAC,UAAU,EAAE;YAC9B,EAAE;YACF,OAAO;YACP,YAAY;YACZ,GAAG;YACH,8DAA8D;YAC9D,8BAA8B;YAC9B,4BAA4B;YAC5B,yBAAyB;YACzB,GAAG;YACH,QAAQ;SACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,UAAkB;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAElD,eAAe;QACf,IAAI,CAAC;YACH,YAAY;YACZ,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC9D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;oBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;oBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;QAED,UAAU;QACV,6BAA6B;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEjC,wBAAwB;QACxB,sDAAsD;QACtD,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAW,EAAE;YAC7D,mBAAmB;YACnB,MAAM,cAAc,GAAG;gBACrB,IAAI,MAAM,CAAC,kBAAkB,OAAO,EAAE,EAAE,GAAG,CAAC;gBAC5C,IAAI,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,GAAG,CAAC;gBACnC,IAAI,MAAM,CAAC,oBAAoB,OAAO,KAAK,EAAE,GAAG,CAAC;aAClD,CAAC;YACF,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE3D,oBAAoB;YACpB,MAAM,cAAc,GAAG,IAAI,MAAM,CAC/B,oDAAoD,OAAO,EAAE,EAC7D,GAAG,CACJ,CAAC;YACF,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,SAAS,EAAE,GAAG,CAAC,CAAC;YAChE,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,yBAAyB,CAAC,SAAS,CAAC;YACzD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,yBAAyB,CAAC,SAAS,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC;gBACvE,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC;oBACjC,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,MAAM,CAAC;QAEf,2BAA2B;QAC3B,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,eAAe,CAAU,CAAC;QAE1F,MAAM,MAAM,GAAoB,aAAa,CAAC,QAAQ,CAAC,cAAiC,CAAC;YACvF,CAAC,CAAC,cAAiC;YACnC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO;QAEnB,OAAO;YACL,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACrC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,UAAkB;QAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE,CAAC;wBACT,EAAE,EAAE,aAAa;wBACjB,QAAQ,EAAE,UAAU;wBACpB,WAAW,EAAE,yHAAyH;wBACtI,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,KAAK;wBAChB,aAAa,EAAE,IAAI;qBACpB,CAAC;gBACF,YAAY,EAAE;oBACZ,6EAA6E;oBAC7E,qDAAqD;oBACrD,kDAAkD;iBACnD;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAElD,aAAa;YACb,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAExE,OAAO;gBACL,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;gBAC1C,eAAe,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI;gBAC9C,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAC/C,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;oBACzD,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,WAAW;oBACnC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,gBAAgB;oBAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI;oBAC/B,aAAa,EAAE,CAAC,CAAC,aAAa,KAAK,IAAI;iBACxC,CAAC,CAAC;gBACH,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;aACtC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE,CAAC;wBACT,EAAE,EAAE,SAAS;wBACb,QAAQ,EAAE,UAAU;wBACpB,WAAW,EAAE,kCAAkC,GAAG,CAAC,OAAO,EAAE;wBAC5D,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,KAAK;wBAChB,aAAa,EAAE,KAAK;qBACrB,CAAC;gBACF,YAAY,EAAE,CAAC,4BAA4B,CAAC;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,GAAW;QAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,oBAAoB,CAAC;QACvD,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,eAAe,CAAC;QACxE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,aAAa,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,IAAY;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,6BAA6B;QAC7B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;CACF"}