@poetic-ai/poetic 1.42.1-bootstrap.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.
- package/.github/SECURITY.md +47 -0
- package/.nvmrc +1 -0
- package/.poetic/README.md +37 -0
- package/.poetic/providers/catalog.json +12051 -0
- package/.poetic/providers/pricing.json +1272 -0
- package/.poetic/providers/registry.json +3369 -0
- package/CHANGELOG.md +552 -0
- package/CODE_OF_CONDUCT.md +40 -0
- package/CONTRIBUTING.md +23 -0
- package/INSTALL.md +454 -0
- package/LICENSE +21 -0
- package/README.md +474 -0
- package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
- package/dist/ExecutionTracker-UVONC4C6.js +16 -0
- package/dist/OptimizationConfig-7DFY2TST.js +17 -0
- package/dist/OptimizationEngine-MXTSOSST.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-M3AESHFF.js +322 -0
- package/dist/agent-ingest-HO77TH26.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-LDWHURKK.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-GFYU6GCQ.js +489 -0
- package/dist/api-transport-FS3CQRMN.js +1087 -0
- package/dist/apply-completion-mode-JBT2CTQO.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-UYVZY7JH.js +135 -0
- package/dist/auth-CSQP5RHJ.js +67 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-KQLJPZ2E.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-R3NQ2ZF5.js +78 -0
- package/dist/auth-S4CTX4GQ.js +44 -0
- package/dist/auth-YLH3S7EY.js +69 -0
- package/dist/auth-liveness-TDDEZY3T.js +46 -0
- package/dist/auto-optimizer-HA3T23SF.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-ACB5YW5G.js +36 -0
- package/dist/autoloop-gate-policy-XZA5EQFN.js +175 -0
- package/dist/autoloop-helpers-EFJLBQUP.js +22 -0
- package/dist/autoloop-ledger-W7QO62PX.js +96 -0
- package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
- package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
- package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
- package/dist/autoloop-success-OPR74YEX.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-K5I45UBR.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-4QJMOIIN.js +4120 -0
- package/dist/backend-P3DAYRP7.js +29 -0
- package/dist/background-executor-CBN552V4.js +257 -0
- package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
- package/dist/backup-active-store-5WXG6SXT.js +17 -0
- package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
- package/dist/basic-competition-master-WXZHUT42.js +344 -0
- package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
- package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
- package/dist/build-gate-YFASRB5Z.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-25QL3M3L.js +899 -0
- package/dist/chunk-2ABC6SEC.js +2626 -0
- package/dist/chunk-2AICM4P3.js +1763 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2UH6VQRZ.js +328 -0
- package/dist/chunk-2VSQMRCB.js +18 -0
- package/dist/chunk-2XQXYBM2.js +130 -0
- package/dist/chunk-2YFUIER7.js +426 -0
- package/dist/chunk-2YXZCZTX.js +1160 -0
- package/dist/chunk-32VLDFRT.js +797 -0
- package/dist/chunk-34CNP2HB.js +148 -0
- package/dist/chunk-35P3W3JX.js +456 -0
- package/dist/chunk-36PEBZAF.js +18 -0
- package/dist/chunk-3733QTI7.js +6818 -0
- package/dist/chunk-3A5PDH5L.js +12513 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3C26DPFK.js +566 -0
- package/dist/chunk-3FLXLLB7.js +26 -0
- package/dist/chunk-3FOZ2VHV.js +100 -0
- package/dist/chunk-3G6FZCRF.js +106 -0
- package/dist/chunk-3JWNRJSB.js +736 -0
- package/dist/chunk-3LUMR3D3.js +156 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3VABAKT2.js +1784 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BIPZBT7.js +791 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4CSS7WVI.js +143 -0
- package/dist/chunk-4CUY7AFY.js +247 -0
- package/dist/chunk-4HN6DF7V.js +1027 -0
- package/dist/chunk-4HXKHDNH.js +1064 -0
- package/dist/chunk-4KKI477Q.js +44 -0
- package/dist/chunk-4NA7FSTV.js +595 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4SALLK63.js +9831 -0
- package/dist/chunk-4SHKPCGK.js +110 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4W2NRXQL.js +1205 -0
- package/dist/chunk-4XICK3HN.js +784 -0
- package/dist/chunk-55EJVV3C.js +385 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5REDMNLZ.js +310 -0
- package/dist/chunk-5UCJARII.js +1984 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-66AGFTBQ.js +131 -0
- package/dist/chunk-66CIO2SV.js +48 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6BTFXYRO.js +276 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6KMJKHIQ.js +2193 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6QMUKUHH.js +632 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -0
- package/dist/chunk-6Y5TWI7H.js +146 -0
- package/dist/chunk-6Y5U7UFY.js +91 -0
- package/dist/chunk-6ZLAK3XG.js +14 -0
- package/dist/chunk-72XCRQED.js +34 -0
- package/dist/chunk-72YTZMAM.js +589 -0
- package/dist/chunk-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7D7QT3BE.js +688 -0
- package/dist/chunk-7DNSNKJV.js +78 -0
- package/dist/chunk-7FMJVYBS.js +307 -0
- package/dist/chunk-7GDRQBQC.js +419 -0
- package/dist/chunk-7IL4A2PP.js +948 -0
- package/dist/chunk-7NPSXSHO.js +975 -0
- package/dist/chunk-7PS6INZP.js +302 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7XV3QXLT.js +878 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A5MRWHMI.js +1604 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-AG2Z2SUZ.js +554 -0
- package/dist/chunk-AHWAZ2MU.js +137 -0
- package/dist/chunk-AIAQ3HS3.js +119 -0
- package/dist/chunk-ALAB3PBR.js +2206 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-AQNPGRWS.js +395 -0
- package/dist/chunk-ASEP3M2W.js +968 -0
- package/dist/chunk-AT4TNPWW.js +2931 -0
- package/dist/chunk-ATVKCSGT.js +250 -0
- package/dist/chunk-AX6GWE7V.js +47 -0
- package/dist/chunk-AZQILSNQ.js +1376 -0
- package/dist/chunk-B76KHLX6.js +13 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BCZAENOH.js +448 -0
- package/dist/chunk-BIGSACCY.js +19527 -0
- package/dist/chunk-BPYMCIVD.js +9243 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BVPWRDCO.js +2321 -0
- package/dist/chunk-BXI4NXL3.js +507 -0
- package/dist/chunk-C3L6YQ7P.js +147 -0
- package/dist/chunk-C57KJOUQ.js +121 -0
- package/dist/chunk-CCV7BPSY.js +118 -0
- package/dist/chunk-CD7ISXA4.js +826 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFBIG37O.js +154 -0
- package/dist/chunk-CHQV73H5.js +408 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CJHRFSNY.js +924 -0
- package/dist/chunk-CKP2Q3TP.js +1905 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CSLAS5GW.js +4007 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CVMVZWG4.js +3544 -0
- package/dist/chunk-CYB6QDCT.js +263 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCAVAABI.js +348 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DN7UMLF7.js +5678 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EJ42BNGY.js +2904 -0
- package/dist/chunk-EJ4ZAWLV.js +305 -0
- package/dist/chunk-EJGCZGUF.js +1483 -0
- package/dist/chunk-EK2U3YEG.js +486 -0
- package/dist/chunk-ELMFYNV7.js +109 -0
- package/dist/chunk-ENRGKNR5.js +25 -0
- package/dist/chunk-EQGIDAUF.js +62 -0
- package/dist/chunk-EX3OM35G.js +20414 -0
- package/dist/chunk-F5JO7HAS.js +94 -0
- package/dist/chunk-F7ER6ANO.js +174 -0
- package/dist/chunk-FATUVIIN.js +374 -0
- package/dist/chunk-FC23CTXV.js +322 -0
- package/dist/chunk-FCNAS3W2.js +1033 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FDVZLG6Z.js +3104 -0
- package/dist/chunk-FEPIFY7D.js +511 -0
- package/dist/chunk-FEQ4HXL7.js +412 -0
- package/dist/chunk-FFH5HHJU.js +5351 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-G2PTLLEL.js +284 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GCCAPO3S.js +118 -0
- package/dist/chunk-GG6KJYW6.js +85 -0
- package/dist/chunk-GHHFDU2U.js +55 -0
- package/dist/chunk-GHTZSQB7.js +57 -0
- package/dist/chunk-GJTWJNLV.js +1374 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNH3QGTL.js +1342 -0
- package/dist/chunk-GOAQ2I7Y.js +7000 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GXWAJQOJ.js +5011 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HE2KH6EQ.js +161 -0
- package/dist/chunk-HIHENQDX.js +66 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HK4AQZSR.js +438 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HQLGXODD.js +123 -0
- package/dist/chunk-HQXYYUNY.js +1231 -0
- package/dist/chunk-HY3ESWCA.js +708 -0
- package/dist/chunk-I46EG2XQ.js +65 -0
- package/dist/chunk-I4NPDSCB.js +279 -0
- package/dist/chunk-I5WRT7ZR.js +514 -0
- package/dist/chunk-I6BL3PDH.js +1024 -0
- package/dist/chunk-IATQ7NBI.js +679 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IEXU4RR6.js +5742 -0
- package/dist/chunk-IFCBYECK.js +112 -0
- package/dist/chunk-IFZCPEY2.js +66 -0
- package/dist/chunk-IKFP2KUR.js +48 -0
- package/dist/chunk-IP7BYVUV.js +338 -0
- package/dist/chunk-IRJ2I6KH.js +166 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-IZZK3H6I.js +2175 -0
- package/dist/chunk-J3J4P7RW.js +353 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JD6SIZED.js +712 -0
- package/dist/chunk-JEV6UI7H.js +537 -0
- package/dist/chunk-JKBHJQMT.js +434 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JOSYEJKY.js +141 -0
- package/dist/chunk-JPKSXKNB.js +94 -0
- package/dist/chunk-JQD5VYKR.js +483 -0
- package/dist/chunk-JSOWEFEQ.js +351 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-K4XK7SGB.js +6783 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-KAT4RXUT.js +521 -0
- package/dist/chunk-KDMKKIRK.js +103 -0
- package/dist/chunk-KM3F7SYE.js +702 -0
- package/dist/chunk-KNDYMVWN.js +102 -0
- package/dist/chunk-KNT72VR6.js +132 -0
- package/dist/chunk-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-L4427KOE.js +26 -0
- package/dist/chunk-L6OM4A22.js +189 -0
- package/dist/chunk-L7E6XCRA.js +1042 -0
- package/dist/chunk-L7JZLXQL.js +173 -0
- package/dist/chunk-LAMKBTXX.js +40 -0
- package/dist/chunk-LDCF2MKN.js +132 -0
- package/dist/chunk-LEIIWPWQ.js +78 -0
- package/dist/chunk-LFTQVYBB.js +31 -0
- package/dist/chunk-LGHII5ET.js +23 -0
- package/dist/chunk-LH34OGSB.js +265 -0
- package/dist/chunk-LO3X5NLS.js +326 -0
- package/dist/chunk-LPITVM7M.js +339 -0
- package/dist/chunk-LR5IJIGV.js +810 -0
- package/dist/chunk-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-LZBBXYWF.js +1004 -0
- package/dist/chunk-M34PS4NE.js +2213 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-MCPQNJMK.js +482 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MFADRRTR.js +112 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MTVZITQ2.js +185 -0
- package/dist/chunk-MWHF5V7U.js +223 -0
- package/dist/chunk-MWHLBPNU.js +211 -0
- package/dist/chunk-MWK5UZQ3.js +1068 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NEDCMN7E.js +415 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NOZGR2QO.js +2373 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NPZJMUZ4.js +194 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OKBTRSZI.js +205 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ON3G73BU.js +264 -0
- package/dist/chunk-OPYFYTWQ.js +220 -0
- package/dist/chunk-OQ6K46CK.js +1734 -0
- package/dist/chunk-OSDYVKHW.js +2440 -0
- package/dist/chunk-OUM5S64R.js +3429 -0
- package/dist/chunk-OWB7JXUS.js +751 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PA6BCSOX.js +2872 -0
- package/dist/chunk-PGSPX4SU.js +15 -0
- package/dist/chunk-PIKLF7BM.js +432 -0
- package/dist/chunk-PJWJ3SAV.js +22 -0
- package/dist/chunk-PKIFMV72.js +100 -0
- package/dist/chunk-PTH5E5XO.js +195 -0
- package/dist/chunk-PYITM4N2.js +79 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3RO7N35.js +45 -0
- package/dist/chunk-Q3WIC6GQ.js +2670 -0
- package/dist/chunk-QGJDMEOV.js +34 -0
- package/dist/chunk-QJYIHVXT.js +100 -0
- package/dist/chunk-QNOB37UH.js +58 -0
- package/dist/chunk-QOCOVLUH.js +462 -0
- package/dist/chunk-QTCJ5CC5.js +172 -0
- package/dist/chunk-QU6JQJMH.js +3063 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R2ZYWNW3.js +1581 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-RAK5HOIJ.js +459 -0
- package/dist/chunk-RDFRCT64.js +168 -0
- package/dist/chunk-RE5VZDFQ.js +58 -0
- package/dist/chunk-RGROYC2G.js +638 -0
- package/dist/chunk-RGWHUI5E.js +68 -0
- package/dist/chunk-RHVG6UNL.js +205 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIKFAWZF.js +71 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-RSXSD4MH.js +1016 -0
- package/dist/chunk-RW7RVSDV.js +79 -0
- package/dist/chunk-RWREC3KJ.js +517 -0
- package/dist/chunk-RZY7RKM5.js +500 -0
- package/dist/chunk-S2MNWFAG.js +52 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S54MKU6V.js +117 -0
- package/dist/chunk-S77XPALC.js +239 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SKHGYQ7W.js +405 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQZRPY23.js +5181 -0
- package/dist/chunk-SSB5UQHA.js +4128 -0
- package/dist/chunk-STJOHHSF.js +605 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SUN4OFTW.js +740 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SUZ7UYZH.js +1972 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T2SZELJL.js +624 -0
- package/dist/chunk-T6VPI2XP.js +10338 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TAOOYK3P.js +358 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TFTGP7Z7.js +174 -0
- package/dist/chunk-TGON4N4O.js +197 -0
- package/dist/chunk-TIBZPAD2.js +9924 -0
- package/dist/chunk-TK644IOG.js +1813 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSPQONRT.js +4533 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-TWYLVAS2.js +152 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U32HWI76.js +437 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U62VCQGR.js +49 -0
- package/dist/chunk-UDMS5AD3.js +307 -0
- package/dist/chunk-UGX7GI37.js +94 -0
- package/dist/chunk-UH3JJSHK.js +1 -0
- package/dist/chunk-UHRBTZYY.js +208 -0
- package/dist/chunk-UHT2KRG5.js +193 -0
- package/dist/chunk-UI2F6DJ5.js +118 -0
- package/dist/chunk-UKMAFG7A.js +189 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVBBFDFQ.js +270 -0
- package/dist/chunk-UXZF3B7T.js +75 -0
- package/dist/chunk-V6YLL5WA.js +3746 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCAUV5XQ.js +3679 -0
- package/dist/chunk-VDSH7O4Y.js +152 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VV6HOXRC.js +302 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3ZGW3C5.js +331 -0
- package/dist/chunk-W4OMESPG.js +271 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WGXYDLMX.js +4386 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WOEVVPDP.js +1125 -0
- package/dist/chunk-WTLMSPBQ.js +256 -0
- package/dist/chunk-X43NMU4Z.js +1124 -0
- package/dist/chunk-X5NTI5U5.js +368 -0
- package/dist/chunk-X6UIEADS.js +949 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XUSRFFA7.js +1859 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XXCGJGSQ.js +121 -0
- package/dist/chunk-XYGDZCB5.js +659 -0
- package/dist/chunk-XZAMZUX5.js +992 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-Y34DUC4A.js +1356 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y4RC2YFX.js +1270 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5677NDO.js +183 -0
- package/dist/chunk-YESZJFK6.js +220 -0
- package/dist/chunk-YGXKOBQQ.js +292 -0
- package/dist/chunk-YMX76IOS.js +31 -0
- package/dist/chunk-YOTXESEH.js +257 -0
- package/dist/chunk-YQAAKTVH.js +712 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-YWNAHW24.js +1552 -0
- package/dist/chunk-Z476RATD.js +1689 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZDTMICNY.js +316 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZIVYXF7A.js +2344 -0
- package/dist/chunk-ZX65UI5W.js +78 -0
- package/dist/chunk-ZYG7GGKO.js +218 -0
- package/dist/chunk-ZZZUL4OF.js +38 -0
- package/dist/cli-utils-HUOTBRM3.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-3QV2P6RA.js +202 -0
- package/dist/compete-config-resolver-SNH3TT2Q.js +76 -0
- package/dist/compete-request-XWNPOARL.js +364 -0
- package/dist/compete-results-PAP67LDR.js +208 -0
- package/dist/competition-outcome-tracker-GOZXNAQU.js +38 -0
- package/dist/config-HWHUNA72.js +166 -0
- package/dist/config-audit-EL3GHXS7.js +360 -0
- package/dist/config-explain-TNILDEVJ.js +12 -0
- package/dist/config-loader-VPFPFO4B.js +38 -0
- package/dist/config-manager-L3VRNTSG.js +67 -0
- package/dist/config-validator-SIIQEOFQ.js +72 -0
- package/dist/cost-7CX37DU3.js +53 -0
- package/dist/coverage-orchestrator-MNKHD6YC.js +772 -0
- package/dist/coverage-scanner-YVD62MLH.js +12 -0
- package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
- package/dist/data-migration-state-VJK64DLT.js +31 -0
- package/dist/db-migrator-XSEIOGWY.js +34 -0
- package/dist/discovery-JGYGDD25.js +25 -0
- package/dist/doctor-CGBCD7IQ.js +186 -0
- package/dist/domain-analyzer-DL6BDR2N.js +29 -0
- package/dist/ensure-initialized-4BY73HLE.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-IGVH5X53.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-NWY5BJ57.js +130 -0
- package/dist/evaluation-context-KMWDSDYD.js +35 -0
- package/dist/evidence-plan-resolver-YIVH76PU.js +85 -0
- package/dist/execution-data-writer-OHAQ7G5H.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-KBH2MC3M.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-IYBMCZG7.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-R3KD2G4D.js +249 -0
- package/dist/flywheel-competition-executor-XCFGVJSK.js +259 -0
- package/dist/flywheel-executor-LTSIZN2L.js +369 -0
- package/dist/flywheel-git-isolation-CZ5YVVZY.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-6E33DJDK.js +104 -0
- package/dist/flywheel-resume-7HELH7QS.js +23 -0
- package/dist/flywheel-safety-7U7DPOAP.js +28 -0
- package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
- package/dist/get-telemetry-logger-AZ46EPRP.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4XUO2YTM.js +211 -0
- package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
- package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
- package/dist/index-query-4JEUKA44.js +31 -0
- package/dist/index.js +108644 -0
- package/dist/instructions-CM6THDV7.js +64 -0
- package/dist/invoke-provider-auth-V5TC5UDS.js +223 -0
- package/dist/judge-scoring.json +80 -0
- package/dist/judge-test.js +555 -0
- package/dist/lab-mode-OTWVHN63.js +39 -0
- package/dist/lab-utils-VA6VXNOV.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-34YPIRJ7.js +133 -0
- package/dist/local-executor-LJJSCWZX.js +223 -0
- package/dist/logger-6PRYM56M.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-LHDTJ4TY.js +497 -0
- package/dist/matrix-result-parser-7W35EUOV.js +15 -0
- package/dist/metadata-HQ43NDEK.js +22 -0
- package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
- package/dist/monitor-MCI3F4PX.js +72 -0
- package/dist/next-HQKDXIIR.js +90 -0
- package/dist/next-JC3V2UCS.js +69 -0
- package/dist/optimization-config-resolver-QPSFLCJU.js +75 -0
- package/dist/package-3YCWIQQ5.js +10 -0
- package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
- package/dist/parallel-worker.js +279 -0
- package/dist/parse-git-status-PIAF3OTP.js +10 -0
- package/dist/path-security-ETTH6TZL.js +39 -0
- package/dist/pattern-bank-UNJR5ADV.js +15 -0
- package/dist/plan-backlog-list-fast-DZK24LSZ.js +270 -0
- package/dist/plan-backlog-show-fast-63GBBH6Q.js +406 -0
- package/dist/plan-sprint-list-fast-TJ6ZUF5E.js +162 -0
- package/dist/plan-sprint-status-fast-YWE5X3NG.js +208 -0
- package/dist/plan-task-status-fast-K22BTTBW.js +349 -0
- package/dist/plan-to-flywheel-VFGCPINA.js +456 -0
- package/dist/planning-backlog-Y6TIJYWU.js +319 -0
- package/dist/poetic-root-V5DNXEAE.js +17 -0
- package/dist/preflight-OPANWMME.js +12 -0
- package/dist/process-registry-PDZJPTAS.js +27 -0
- package/dist/process-scanner-C22SYXYD.js +22 -0
- package/dist/processes-KMQUD7HY.js +29 -0
- package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
- package/dist/profile-2XP3FWH2.js +149 -0
- package/dist/prompts-EPAAAMMF.js +168 -0
- package/dist/protected-branches-RNTEX7ET.js +57 -0
- package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
- package/dist/provider-matrix-KWTYA5QV.js +154 -0
- package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
- package/dist/provider-output-forwarding-DERID3TP.js +30 -0
- package/dist/provider-registry-J5NRBJKI.js +128 -0
- package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
- package/dist/prune-engine-Q6E2DXBN.js +451 -0
- package/dist/quality-gate-33SHK43X.js +70 -0
- package/dist/quickstart-E32SODTA.js +62 -0
- package/dist/readiness-REWW7OSV.js +96 -0
- package/dist/registry-N6L36RE2.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-LXQYDSKS.js +127 -0
- package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
- package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
- package/dist/result-streamer-WEHW476R.js +19 -0
- package/dist/routing-events-DHPUZDDF.js +27 -0
- package/dist/routing-history-store-UWCEXAP3.js +46 -0
- package/dist/routing-planner-VGQU35QM.js +160 -0
- package/dist/run-poetic-tui-ZZXFDOQ4.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-2YPKOJ6A.js +1092 -0
- package/dist/runner-HEJJ65AJ.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-BSVE6OJU.js +60 -0
- package/dist/sandbox-3AG2WJLM.js +94 -0
- package/dist/sandbox-5JOFBS75.js +81 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-2KI5XNDG.js +17 -0
- package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
- package/dist/setup-claude-code-P7BTTSPO.js +317 -0
- package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
- package/dist/shared-utils-D6U6UREP.js +37 -0
- package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
- package/dist/sprint-QGXLN3SO.js +338 -0
- package/dist/sprint-bridge-FNKQCJGL.js +68 -0
- package/dist/sprint-execution-service-4ELKNJDS.js +311 -0
- package/dist/sprint-manager-7TNCXCIX.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-H5XKGZP2.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-TGQUVAW3.js +185 -0
- package/dist/task-classifier-DZIRBSS2.js +494 -0
- package/dist/task-list-fast-PJ2EXVZE.js +147 -0
- package/dist/task-manager-5742GMJK.js +93 -0
- package/dist/task-splitter-6MBXSWF6.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-4HG6TXFV.js +42 -0
- package/dist/telemetry-JX7EMNOZ.js +131 -0
- package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
- package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
- package/dist/telemetry-reliability-2MLJ4J6B.js +125 -0
- package/dist/token-estimator-PDU345YE.js +37 -0
- package/dist/transports-3UEO6C5Y.js +255 -0
- package/dist/unified-cost-tracker-F3W5NMPG.js +35 -0
- package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
- package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
- package/dist/user-agents-GHUGCSKN.js +22 -0
- package/dist/variant-delivery-state-XCOYVCM4.js +33 -0
- package/dist/variant-state-cleanup-QIEKRULB.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-HPTUA37Z.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-2HDYZOCG.js +233 -0
- package/dist/verification-toolchains-VVKT3GBF.js +28 -0
- package/dist/verify-commands-5F6CJV4B.js +37 -0
- package/dist/warning-EGQGUUIO.js +12 -0
- package/dist/work-edge-RWEDWJZF.js +49 -0
- package/dist/work-item-writer-WHAVZXAY.js +19 -0
- package/dist/worker-AGWHD4D2.js +1435 -0
- package/dist/worker.js +19 -0
- package/dist/worktree-metrics-3DFUYVYE.js +26 -0
- package/dist/writeback-VZKHYHSN.js +44 -0
- package/docs/CLI_REFERENCE.md +7040 -0
- package/docs/PROVIDER_SETUP.md +1570 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2232 -0
- package/docs/getting-started/QUICK_START.md +294 -0
- package/docs/getting-started/README.md +188 -0
- package/docs/getting-started/SETUP.md +52 -0
- package/docs/reference/AGENT_CONTEXT.md +38 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/README.md +381 -0
- package/docs/reference/SECURITY.md +262 -0
- package/integrations/bb-plugin-poetic/README.md +362 -0
- package/integrations/bb-plugin-poetic/app.css +341 -0
- package/integrations/bb-plugin-poetic/app.tsx +5059 -0
- package/integrations/bb-plugin-poetic/package.json +45 -0
- package/integrations/bb-plugin-poetic/server.ts +444 -0
- package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
- package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
- package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
- package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
- package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
- package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
- package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
- package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
- package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
- package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
- package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
- package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
- package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
- package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
- package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
- package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
- package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
- package/package.json +331 -0
- package/schemas/README.md +80 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +370 -0
- package/schemas/poetic.config.schema.json +2214 -0
- package/schemas/provider-config.schema.json +203 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +140 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/preinstall-node-check.mjs +78 -0
- package/scripts/setup-git-hooks.mjs +24 -0
- package/scripts/sync.sh +2722 -0
- package/scripts/write-node-launcher.sh +108 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.poetic/README.md +37 -0
- package/templates/.poetic/agents/README.md +296 -0
- package/templates/.poetic/agents/api-documenter.md +147 -0
- package/templates/.poetic/agents/backend-architect.md +31 -0
- package/templates/.poetic/agents/code-reviewer.md +157 -0
- package/templates/.poetic/agents/data-scientist.md +179 -0
- package/templates/.poetic/agents/database-optimizer.md +145 -0
- package/templates/.poetic/agents/debugger.md +31 -0
- package/templates/.poetic/agents/deployment-engineer.md +164 -0
- package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
- package/templates/.poetic/agents/frontend-developer.md +150 -0
- package/templates/.poetic/agents/javascript-pro.md +36 -0
- package/templates/.poetic/agents/performance-engineer.md +151 -0
- package/templates/.poetic/agents/python-pro.md +137 -0
- package/templates/.poetic/agents/test-automator.md +147 -0
- package/templates/.poetic/agents/typescript-pro.md +34 -0
- package/templates/.poetic/config/poetic.config.jsonc +69 -0
- package/templates/.poetic/config/project-context.template.json +6 -0
- package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.poetic/config/task-type-aliases.yaml +28 -0
- package/templates/.poetic/gitignore.template +55 -0
- package/templates/.poetic/task-types/analysis.yaml +40 -0
- package/templates/.poetic/task-types/architecture.yaml +38 -0
- package/templates/.poetic/task-types/doc.yaml +35 -0
- package/templates/.poetic/task-types/feature.yaml +23 -0
- package/templates/.poetic/task-types/general.yaml +6 -0
- package/templates/.poetic/task-types/security.yaml +39 -0
- package/templates/AGENTS.template.md +99 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/compete-streak.yaml +78 -0
- package/templates/builtin-workflows/hello-verify.yaml +10 -0
- package/templates/builtin-workflows/judge-regression.yaml +114 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
- package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
- package/templates/guard-kit/check.mjs.template +777 -0
- package/templates/guard-kit/config.json.template +6 -0
- package/templates/guard-kit/poetic-guard.yml.template +189 -0
- package/templates/profiles/README.md +56 -0
- package/templates/profiles/frontier-claude.json +27 -0
- package/templates/profiles/frontier-codex.json +26 -0
|
@@ -0,0 +1,1231 @@
|
|
|
1
|
+
import {
|
|
2
|
+
estimateRuntime
|
|
3
|
+
} from "./chunk-LDCF2MKN.js";
|
|
4
|
+
import {
|
|
5
|
+
classifyFailure,
|
|
6
|
+
shouldFailover
|
|
7
|
+
} from "./chunk-NWRUSEXG.js";
|
|
8
|
+
import {
|
|
9
|
+
evaluateComplexity
|
|
10
|
+
} from "./chunk-NEQUQHOX.js";
|
|
11
|
+
import {
|
|
12
|
+
registry
|
|
13
|
+
} from "./chunk-GOAQ2I7Y.js";
|
|
14
|
+
import {
|
|
15
|
+
isNodeLikeProject
|
|
16
|
+
} from "./chunk-MFADRRTR.js";
|
|
17
|
+
import {
|
|
18
|
+
runProviderNative
|
|
19
|
+
} from "./chunk-YQAAKTVH.js";
|
|
20
|
+
import {
|
|
21
|
+
getProviderHealth
|
|
22
|
+
} from "./chunk-UHRBTZYY.js";
|
|
23
|
+
import {
|
|
24
|
+
resolveConfig
|
|
25
|
+
} from "./chunk-IZZK3H6I.js";
|
|
26
|
+
import {
|
|
27
|
+
normalizeEngineId
|
|
28
|
+
} from "./chunk-SURZ2WFE.js";
|
|
29
|
+
import {
|
|
30
|
+
parseJsonWithContext
|
|
31
|
+
} from "./chunk-QVZMFDYG.js";
|
|
32
|
+
import {
|
|
33
|
+
detectProjectCapabilities
|
|
34
|
+
} from "./chunk-GNH3QGTL.js";
|
|
35
|
+
import {
|
|
36
|
+
ProviderRegistry
|
|
37
|
+
} from "./chunk-AT4TNPWW.js";
|
|
38
|
+
import {
|
|
39
|
+
isDebugMode
|
|
40
|
+
} from "./chunk-EJGCZGUF.js";
|
|
41
|
+
|
|
42
|
+
// src/orchestrator/swarm-planner.ts
|
|
43
|
+
import { randomUUID } from "crypto";
|
|
44
|
+
import { promises as fs } from "fs";
|
|
45
|
+
import * as path from "path";
|
|
46
|
+
import chalk from "chalk";
|
|
47
|
+
|
|
48
|
+
// src/core/config/decomposition-recovery.ts
|
|
49
|
+
function providerSupportsApiTransportFallback(provider) {
|
|
50
|
+
try {
|
|
51
|
+
const config = ProviderRegistry.getProviderConfig(provider);
|
|
52
|
+
return config.channels.includes("api") && config.api?.base_url !== void 0;
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
var PROVIDERS_WITH_API_TRANSPORT = (() => {
|
|
58
|
+
try {
|
|
59
|
+
return new Set(
|
|
60
|
+
ProviderRegistry.getAllProviderIds().filter((id) => providerSupportsApiTransportFallback(id))
|
|
61
|
+
);
|
|
62
|
+
} catch {
|
|
63
|
+
return /* @__PURE__ */ new Set();
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
var TRANSPORT_RETRY_CATEGORIES = /* @__PURE__ */ new Set([
|
|
67
|
+
"startup_timeout",
|
|
68
|
+
"transport_error"
|
|
69
|
+
]);
|
|
70
|
+
var SAME_PROVIDER_RETRY_CATEGORIES = /* @__PURE__ */ new Set([
|
|
71
|
+
"idle_terminated",
|
|
72
|
+
"output_malformed",
|
|
73
|
+
"startup_timeout",
|
|
74
|
+
"transport_error"
|
|
75
|
+
]);
|
|
76
|
+
function getDecompositionRecoveryPlan(candidate, failureCategory) {
|
|
77
|
+
const failoverEligible = shouldFailover(failureCategory);
|
|
78
|
+
const retryEligible = TRANSPORT_RETRY_CATEGORIES.has(failureCategory) || SAME_PROVIDER_RETRY_CATEGORIES.has(failureCategory);
|
|
79
|
+
if (!failoverEligible && !retryEligible) {
|
|
80
|
+
return "hard_fail";
|
|
81
|
+
}
|
|
82
|
+
if (process.env.POETIC_PLAN_DECOMPOSE_DISABLE_RECOVERY === "1") {
|
|
83
|
+
return "hard_fail";
|
|
84
|
+
}
|
|
85
|
+
if (providerSupportsApiTransportFallback(candidate.provider) && TRANSPORT_RETRY_CATEGORIES.has(failureCategory)) {
|
|
86
|
+
return "retry_same_transport";
|
|
87
|
+
}
|
|
88
|
+
if (SAME_PROVIDER_RETRY_CATEGORIES.has(failureCategory)) {
|
|
89
|
+
return "retry_same_provider";
|
|
90
|
+
}
|
|
91
|
+
return failoverEligible ? "failover_next_candidate" : "hard_fail";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/core/config/runtime-selection.ts
|
|
95
|
+
async function checkProviderAuth(provider) {
|
|
96
|
+
const normalizedId = normalizeEngineId(provider);
|
|
97
|
+
try {
|
|
98
|
+
const providerModule = registry.get(normalizedId);
|
|
99
|
+
if (!providerModule?.auth?.isAuthenticated) {
|
|
100
|
+
return "no";
|
|
101
|
+
}
|
|
102
|
+
if (providerModule.auth.isAuthenticatedTriState) {
|
|
103
|
+
return await providerModule.auth.isAuthenticatedTriState({ mode: "passive" });
|
|
104
|
+
}
|
|
105
|
+
const isAuth = await providerModule.auth.isAuthenticated({ mode: "passive" });
|
|
106
|
+
return isAuth === true ? "yes" : "no";
|
|
107
|
+
} catch {
|
|
108
|
+
return "unknown";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function hasHighMidExecutionFailureRate(provider) {
|
|
112
|
+
const health = getProviderHealth(provider);
|
|
113
|
+
const midExecFailures = health.failuresByPhase.mid_execution ?? 0;
|
|
114
|
+
const total = health.totalFailures + health.totalSuccesses;
|
|
115
|
+
if (total < 3) return false;
|
|
116
|
+
return midExecFailures >= 3 && midExecFailures / total > 0.5;
|
|
117
|
+
}
|
|
118
|
+
async function filterAvailable(candidates, options = {}) {
|
|
119
|
+
const mockProvidersAllowed = process.env.POETIC_MOCK_PROVIDERS === "1" && process.env.POETIC_ALLOW_MOCK_PROVIDERS === "1";
|
|
120
|
+
const { skipAuthCheck = mockProvidersAllowed, skipHealthReorder = false } = options;
|
|
121
|
+
const available = [];
|
|
122
|
+
for (const candidate of candidates) {
|
|
123
|
+
if (skipAuthCheck) {
|
|
124
|
+
available.push(candidate);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
let authState = "unknown";
|
|
128
|
+
try {
|
|
129
|
+
authState = await checkProviderAuth(candidate.provider);
|
|
130
|
+
} catch {
|
|
131
|
+
authState = "unknown";
|
|
132
|
+
}
|
|
133
|
+
if (authState !== "no") {
|
|
134
|
+
available.push(candidate);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (skipHealthReorder || available.length <= 1) {
|
|
138
|
+
return available;
|
|
139
|
+
}
|
|
140
|
+
const scored = available.map((candidate) => ({
|
|
141
|
+
candidate,
|
|
142
|
+
health: getProviderHealth(candidate.provider)
|
|
143
|
+
}));
|
|
144
|
+
scored.sort((a, b) => {
|
|
145
|
+
if (a.health.degraded !== b.health.degraded) {
|
|
146
|
+
return a.health.degraded ? 1 : -1;
|
|
147
|
+
}
|
|
148
|
+
if (a.health.score !== b.health.score) {
|
|
149
|
+
return b.health.score - a.health.score;
|
|
150
|
+
}
|
|
151
|
+
return a.candidate.index - b.candidate.index;
|
|
152
|
+
});
|
|
153
|
+
return scored.map((entry) => entry.candidate);
|
|
154
|
+
}
|
|
155
|
+
function selectNext(candidates, failureContext) {
|
|
156
|
+
const {
|
|
157
|
+
failedProvider,
|
|
158
|
+
failedModel,
|
|
159
|
+
error,
|
|
160
|
+
failedIndex,
|
|
161
|
+
callSite,
|
|
162
|
+
policyOverrides,
|
|
163
|
+
gateHighMidExecutionFailureRate = false
|
|
164
|
+
} = failureContext;
|
|
165
|
+
const category = classifyFailure(error);
|
|
166
|
+
if (!shouldFailover(category, policyOverrides)) {
|
|
167
|
+
return { candidate: null, event: null };
|
|
168
|
+
}
|
|
169
|
+
const failedPos = candidates.findIndex((c) => c.index === failedIndex);
|
|
170
|
+
const startPos = failedPos === -1 ? 0 : failedPos + 1;
|
|
171
|
+
let next = null;
|
|
172
|
+
for (let i = startPos; i < candidates.length; i += 1) {
|
|
173
|
+
const candidate = candidates[i] ?? null;
|
|
174
|
+
if (!candidate) continue;
|
|
175
|
+
if (failedPos === -1 && candidate.provider.toLowerCase() === failedProvider.toLowerCase()) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (gateHighMidExecutionFailureRate && hasHighMidExecutionFailureRate(candidate.provider)) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
next = candidate;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
const event = {
|
|
186
|
+
purpose: callSite,
|
|
187
|
+
attemptedProvider: failedProvider,
|
|
188
|
+
attemptedModel: failedModel,
|
|
189
|
+
failureType: category,
|
|
190
|
+
selectedProvider: next?.provider ?? "",
|
|
191
|
+
selectedModel: next?.model ?? "",
|
|
192
|
+
candidateIndex: next?.index ?? -1,
|
|
193
|
+
source: callSite,
|
|
194
|
+
timestamp: now,
|
|
195
|
+
decision: next ? "failed-over" : "skipped"
|
|
196
|
+
};
|
|
197
|
+
emitFailoverEvent(event);
|
|
198
|
+
return { candidate: next, event };
|
|
199
|
+
}
|
|
200
|
+
function emitFailoverEvent(event) {
|
|
201
|
+
try {
|
|
202
|
+
import("./warning-EGQGUUIO.js").then(({ emitTelemetryFallbackWarning }) => {
|
|
203
|
+
emitTelemetryFallbackWarning(`[failover] ${JSON.stringify(event)}`);
|
|
204
|
+
}).catch(() => {
|
|
205
|
+
console.warn(`[failover] ${JSON.stringify(event)}`);
|
|
206
|
+
});
|
|
207
|
+
} catch {
|
|
208
|
+
console.warn(`[failover] ${JSON.stringify(event)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/orchestrator/swarm-planner.ts
|
|
213
|
+
var DEFAULT_SCAN_DEPTH = 3;
|
|
214
|
+
var MAX_DIRECTORY_ENTRIES = 400;
|
|
215
|
+
var FRONTEND_HINTS = ["src/components", "src/ui", "app/", "pages/", "client/", "public/"];
|
|
216
|
+
var BACKEND_HINTS = ["src/api", "src/server", "server/", "api/", "src/lib", "src/services"];
|
|
217
|
+
var TEST_HINTS = ["tests", "__tests__", "test", "integration", "e2e"];
|
|
218
|
+
var DOC_HINTS = ["docs", "guides", "handbook"];
|
|
219
|
+
var IGNORE_DIRS = /* @__PURE__ */ new Set([
|
|
220
|
+
".git",
|
|
221
|
+
".poetic",
|
|
222
|
+
"node_modules",
|
|
223
|
+
"dist",
|
|
224
|
+
"coverage",
|
|
225
|
+
".next",
|
|
226
|
+
".turbo",
|
|
227
|
+
".cache"
|
|
228
|
+
]);
|
|
229
|
+
var DYNAMIC_AGENT_CAP = 8;
|
|
230
|
+
var DEFAULT_DYNAMIC_AGENT_CAP = 6;
|
|
231
|
+
var CLASSIC_WEBAPP_ROLES = ["backend", "frontend", "testing", "documentation"];
|
|
232
|
+
var CLASSIC_WEBAPP_KEYWORDS = [
|
|
233
|
+
"build",
|
|
234
|
+
"implement",
|
|
235
|
+
"add",
|
|
236
|
+
"refactor",
|
|
237
|
+
"fix",
|
|
238
|
+
"feature",
|
|
239
|
+
"auth",
|
|
240
|
+
"api",
|
|
241
|
+
"frontend",
|
|
242
|
+
"backend",
|
|
243
|
+
"ui",
|
|
244
|
+
"service"
|
|
245
|
+
];
|
|
246
|
+
var ANALYSIS_KEYWORDS = [
|
|
247
|
+
"analyze",
|
|
248
|
+
"analysis",
|
|
249
|
+
"compare",
|
|
250
|
+
"research",
|
|
251
|
+
"benchmark",
|
|
252
|
+
"investigate",
|
|
253
|
+
"audit",
|
|
254
|
+
"evaluate",
|
|
255
|
+
"competitive",
|
|
256
|
+
"market",
|
|
257
|
+
"survey"
|
|
258
|
+
];
|
|
259
|
+
var IMPLEMENTATION_KEYWORDS = [
|
|
260
|
+
"build",
|
|
261
|
+
"implement",
|
|
262
|
+
"refactor",
|
|
263
|
+
"migrate",
|
|
264
|
+
"fix",
|
|
265
|
+
"ship",
|
|
266
|
+
"deliver",
|
|
267
|
+
"launch",
|
|
268
|
+
"upgrade",
|
|
269
|
+
"extend",
|
|
270
|
+
"optimize"
|
|
271
|
+
];
|
|
272
|
+
function normalizeRoleName(role) {
|
|
273
|
+
return role.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
274
|
+
}
|
|
275
|
+
function humanizeRole(role) {
|
|
276
|
+
const normalized = role.replace(/[^a-z0-9]+/gi, " ").trim();
|
|
277
|
+
if (!normalized) return "Agent";
|
|
278
|
+
return normalized.split(/\s+/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
279
|
+
}
|
|
280
|
+
function padRoleNames(baseRoles, targetCount, extras, fallbackPrefix) {
|
|
281
|
+
const roles = baseRoles.slice(0, targetCount);
|
|
282
|
+
const seen = new Set(roles.map((role) => normalizeRoleName(role) || role));
|
|
283
|
+
let extraIndex = 0;
|
|
284
|
+
while (roles.length < targetCount) {
|
|
285
|
+
const candidate = extras[extraIndex] ?? `${fallbackPrefix}-${roles.length + 1}`;
|
|
286
|
+
extraIndex += 1;
|
|
287
|
+
const normalized = normalizeRoleName(candidate) || candidate;
|
|
288
|
+
if (seen.has(normalized)) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
roles.push(candidate);
|
|
292
|
+
seen.add(normalized);
|
|
293
|
+
}
|
|
294
|
+
return roles;
|
|
295
|
+
}
|
|
296
|
+
function dedupeStrings(values) {
|
|
297
|
+
const seen = /* @__PURE__ */ new Set();
|
|
298
|
+
for (const value of values) {
|
|
299
|
+
const trimmed = value.trim();
|
|
300
|
+
if (!trimmed) continue;
|
|
301
|
+
seen.add(trimmed);
|
|
302
|
+
}
|
|
303
|
+
return Array.from(seen);
|
|
304
|
+
}
|
|
305
|
+
function isAnalysisTask(task) {
|
|
306
|
+
const lower = task.toLowerCase();
|
|
307
|
+
return ANALYSIS_KEYWORDS.some((keyword) => lower.includes(keyword));
|
|
308
|
+
}
|
|
309
|
+
function isImplementationTask(task) {
|
|
310
|
+
const lower = task.toLowerCase();
|
|
311
|
+
return IMPLEMENTATION_KEYWORDS.some((keyword) => lower.includes(keyword));
|
|
312
|
+
}
|
|
313
|
+
function isClassicWebAppProject(domain) {
|
|
314
|
+
const frameworks = domain.frameworks.map((framework) => framework.toLowerCase());
|
|
315
|
+
const hasWebFramework = frameworks.some(
|
|
316
|
+
(framework) => ["react", "next", "vue", "svelte", "angular", "express", "fastify", "nestjs"].some(
|
|
317
|
+
(hint) => framework.includes(hint)
|
|
318
|
+
)
|
|
319
|
+
) || domain.hasFrontend || domain.hasBackend;
|
|
320
|
+
return hasWebFramework && domain.hasFrontend && domain.hasBackend;
|
|
321
|
+
}
|
|
322
|
+
function shouldUseClassicWebAppFastPath(task, domain, options) {
|
|
323
|
+
if (options.roles && options.roles.length > 0) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
const requestedAgents = options.agents;
|
|
327
|
+
if (requestedAgents !== void 0 && requestedAgents !== CLASSIC_WEBAPP_ROLES.length) {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
if (!isClassicWebAppProject(domain)) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
const lower = task.toLowerCase();
|
|
334
|
+
const hasClassicKeyword = CLASSIC_WEBAPP_KEYWORDS.some((keyword) => lower.includes(keyword));
|
|
335
|
+
const isExplicitAnalysis = isAnalysisTask(task) && !hasClassicKeyword && !isImplementationTask(task);
|
|
336
|
+
return hasClassicKeyword || !isExplicitAnalysis;
|
|
337
|
+
}
|
|
338
|
+
function estimateDynamicAgentCount(task, domain, target) {
|
|
339
|
+
if (typeof target === "number" && Number.isFinite(target) && target > 0) {
|
|
340
|
+
return Math.min(Math.max(1, Math.round(target)), DYNAMIC_AGENT_CAP);
|
|
341
|
+
}
|
|
342
|
+
const lower = task.toLowerCase();
|
|
343
|
+
if (isAnalysisTask(task)) {
|
|
344
|
+
if (lower.includes("compare") || lower.includes("competitive") || lower.includes("market")) {
|
|
345
|
+
return 3;
|
|
346
|
+
}
|
|
347
|
+
return 2;
|
|
348
|
+
}
|
|
349
|
+
if (domain.metrics.totalFiles > 1e3 || domain.frameworks.length > 3) {
|
|
350
|
+
return 4;
|
|
351
|
+
}
|
|
352
|
+
if (isImplementationTask(task)) {
|
|
353
|
+
return 3;
|
|
354
|
+
}
|
|
355
|
+
return 2;
|
|
356
|
+
}
|
|
357
|
+
function summarizeProjectDomain(domain) {
|
|
358
|
+
const lines = [
|
|
359
|
+
`Project root: ${domain.rootPath}`,
|
|
360
|
+
`Tech stack: ${domain.techStack.join(", ") || "unknown"}`,
|
|
361
|
+
`Languages: ${domain.languages.join(", ") || "unknown"}`,
|
|
362
|
+
`Frameworks: ${domain.frameworks.join(", ") || "none detected"}`,
|
|
363
|
+
`Directories: frontend=${domain.directories.frontend.length}, backend=${domain.directories.backend.length}, tests=${domain.directories.tests.length}, docs=${domain.directories.docs.length}`,
|
|
364
|
+
`File metrics: total=${domain.metrics.totalFiles}, code=${domain.metrics.codeFiles}, tests=${domain.metrics.testFiles}, docs=${domain.metrics.docFiles}`
|
|
365
|
+
];
|
|
366
|
+
if ((domain.metrics.truncatedDirectoryEntries ?? 0) > 0) {
|
|
367
|
+
lines.push(
|
|
368
|
+
`Survey bounds: ${domain.metrics.truncatedDirectoryEntries} directory entries omitted by scan cap`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
if (domain.notes.length > 0) {
|
|
372
|
+
lines.push(`Notes: ${domain.notes.join(" | ")}`);
|
|
373
|
+
}
|
|
374
|
+
return lines.join("\n");
|
|
375
|
+
}
|
|
376
|
+
var SWARM_ROLE_BASE_RUNTIME_MS = 10 * 6e4;
|
|
377
|
+
function estimateSubtaskRuntimeMinutes(objective) {
|
|
378
|
+
const complexity = evaluateComplexity(objective).complexityScore;
|
|
379
|
+
const complexityMultiplier = 0.5 + 2 * Math.max(0, Math.min(1, complexity));
|
|
380
|
+
const estimate = estimateRuntime({
|
|
381
|
+
baseExpectedRuntimeMs: SWARM_ROLE_BASE_RUNTIME_MS,
|
|
382
|
+
complexityMultiplier,
|
|
383
|
+
factors: ["swarm-role", `complexity=${complexity.toFixed(2)}`]
|
|
384
|
+
});
|
|
385
|
+
return Math.max(1, Math.round(estimate.expectedRuntimeMs / 6e4));
|
|
386
|
+
}
|
|
387
|
+
function createSubtask(role, summary, objective, acceptanceCriteria, suggestedArtifacts, dependencies = [], mandate) {
|
|
388
|
+
const normalizedDependencies = dedupeStrings(dependencies);
|
|
389
|
+
return {
|
|
390
|
+
id: `${normalizeRoleName(role) || "agent"}-${randomUUID()}`,
|
|
391
|
+
role,
|
|
392
|
+
summary,
|
|
393
|
+
description: objective,
|
|
394
|
+
mandate,
|
|
395
|
+
dependencies: normalizedDependencies,
|
|
396
|
+
acceptanceCriteria: dedupeStrings(acceptanceCriteria),
|
|
397
|
+
suggestedArtifacts: dedupeStrings(suggestedArtifacts),
|
|
398
|
+
expectedRuntimeMinutes: estimateSubtaskRuntimeMinutes(objective)
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
async function readJson(file) {
|
|
402
|
+
try {
|
|
403
|
+
const raw = await fs.readFile(file, "utf8");
|
|
404
|
+
return parseJsonWithContext(raw, `Swarm planner JSON (${file})`);
|
|
405
|
+
} catch {
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function statSafe(target) {
|
|
410
|
+
try {
|
|
411
|
+
return await fs.stat(target);
|
|
412
|
+
} catch {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async function surveyDirectory(root, maxDepth) {
|
|
417
|
+
const survey = {
|
|
418
|
+
totalFiles: 0,
|
|
419
|
+
codeFiles: 0,
|
|
420
|
+
testFiles: 0,
|
|
421
|
+
docFiles: 0,
|
|
422
|
+
truncatedDirectoryEntries: 0,
|
|
423
|
+
frontend: /* @__PURE__ */ new Set(),
|
|
424
|
+
backend: /* @__PURE__ */ new Set(),
|
|
425
|
+
tests: /* @__PURE__ */ new Set(),
|
|
426
|
+
docs: /* @__PURE__ */ new Set(),
|
|
427
|
+
languages: /* @__PURE__ */ new Set()
|
|
428
|
+
};
|
|
429
|
+
async function walk(current, currentDepth) {
|
|
430
|
+
if (currentDepth > maxDepth) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
let entries;
|
|
434
|
+
try {
|
|
435
|
+
entries = await fs.readdir(current);
|
|
436
|
+
} catch {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
const surveyableEntries = entries.filter((entry) => !IGNORE_DIRS.has(entry));
|
|
440
|
+
if (surveyableEntries.length > MAX_DIRECTORY_ENTRIES) {
|
|
441
|
+
survey.truncatedDirectoryEntries += surveyableEntries.length - MAX_DIRECTORY_ENTRIES;
|
|
442
|
+
}
|
|
443
|
+
for (const entry of surveyableEntries.slice(0, MAX_DIRECTORY_ENTRIES)) {
|
|
444
|
+
const fullPath = path.join(current, entry);
|
|
445
|
+
const stats = await statSafe(fullPath);
|
|
446
|
+
if (!stats) continue;
|
|
447
|
+
if (stats.isDirectory()) {
|
|
448
|
+
await walk(fullPath, currentDepth + 1);
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
survey.totalFiles += 1;
|
|
452
|
+
const relativePath = path.relative(root, fullPath);
|
|
453
|
+
const lowerPath = relativePath.toLowerCase();
|
|
454
|
+
const ext = path.extname(entry).replace(/\./, "");
|
|
455
|
+
if (/(^|\/)tests?\//.test(lowerPath) || /\.test\./.test(lowerPath)) {
|
|
456
|
+
survey.testFiles += 1;
|
|
457
|
+
survey.tests.add(path.dirname(relativePath));
|
|
458
|
+
} else if (/(^|\/)docs?\//.test(lowerPath) || /\.mdx?$/.test(lowerPath)) {
|
|
459
|
+
survey.docFiles += 1;
|
|
460
|
+
survey.docs.add(path.dirname(relativePath));
|
|
461
|
+
} else {
|
|
462
|
+
survey.codeFiles += 1;
|
|
463
|
+
}
|
|
464
|
+
if (FRONTEND_HINTS.some((hint) => lowerPath.includes(hint))) {
|
|
465
|
+
survey.frontend.add(path.dirname(relativePath));
|
|
466
|
+
}
|
|
467
|
+
if (BACKEND_HINTS.some((hint) => lowerPath.includes(hint))) {
|
|
468
|
+
survey.backend.add(path.dirname(relativePath));
|
|
469
|
+
}
|
|
470
|
+
if (TEST_HINTS.some((hint) => lowerPath.includes(hint))) {
|
|
471
|
+
survey.tests.add(path.dirname(relativePath));
|
|
472
|
+
}
|
|
473
|
+
if (DOC_HINTS.some((hint) => lowerPath.includes(hint))) {
|
|
474
|
+
survey.docs.add(path.dirname(relativePath));
|
|
475
|
+
}
|
|
476
|
+
if (ext) {
|
|
477
|
+
survey.languages.add(ext.toLowerCase());
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
await walk(root, 0);
|
|
482
|
+
return survey;
|
|
483
|
+
}
|
|
484
|
+
function detectFrameworks(pkg, survey) {
|
|
485
|
+
const frameworks = /* @__PURE__ */ new Set();
|
|
486
|
+
const dependencies = /* @__PURE__ */ new Set();
|
|
487
|
+
if (pkg?.dependencies && typeof pkg.dependencies === "object") {
|
|
488
|
+
Object.keys(pkg.dependencies).forEach((dep) => {
|
|
489
|
+
dependencies.add(dep);
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
if (pkg?.devDependencies && typeof pkg.devDependencies === "object") {
|
|
493
|
+
Object.keys(pkg.devDependencies).forEach((dep) => {
|
|
494
|
+
dependencies.add(dep);
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
const addIf = (cond, name) => {
|
|
498
|
+
if (cond) frameworks.add(name);
|
|
499
|
+
};
|
|
500
|
+
addIf(dependencies.has("next"), "Next.js");
|
|
501
|
+
addIf(dependencies.has("react") || survey.frontend.size > 0, "React");
|
|
502
|
+
addIf(dependencies.has("vue"), "Vue");
|
|
503
|
+
addIf(dependencies.has("@angular/core"), "Angular");
|
|
504
|
+
addIf(dependencies.has("svelte") || dependencies.has("@sveltejs/kit"), "Svelte");
|
|
505
|
+
addIf(dependencies.has("express"), "Express");
|
|
506
|
+
addIf(dependencies.has("fastify"), "Fastify");
|
|
507
|
+
addIf(dependencies.has("@nestjs/core"), "NestJS");
|
|
508
|
+
addIf(dependencies.has("prisma"), "Prisma");
|
|
509
|
+
addIf(dependencies.has("vitest") || dependencies.has("jest"), "Automated Tests");
|
|
510
|
+
return Array.from(frameworks);
|
|
511
|
+
}
|
|
512
|
+
function inferDependencies(subtasks) {
|
|
513
|
+
const adjacency = {};
|
|
514
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
515
|
+
const issues = [];
|
|
516
|
+
const subtaskIds = new Set(subtasks.map((task) => task.id));
|
|
517
|
+
for (const subtask of subtasks) {
|
|
518
|
+
const validDeps = [];
|
|
519
|
+
for (const dep of subtask.dependencies) {
|
|
520
|
+
if (!subtaskIds.has(dep)) {
|
|
521
|
+
issues.push(`Dangling dependency reference: ${subtask.id} depends on missing task ${dep}.`);
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
validDeps.push(dep);
|
|
525
|
+
}
|
|
526
|
+
adjacency[subtask.id] = validDeps;
|
|
527
|
+
inDegree.set(subtask.id, validDeps.length);
|
|
528
|
+
}
|
|
529
|
+
const queue = subtasks.filter((task) => (inDegree.get(task.id) ?? 0) === 0);
|
|
530
|
+
const phases = [];
|
|
531
|
+
const visited = /* @__PURE__ */ new Set();
|
|
532
|
+
while (queue.length > 0) {
|
|
533
|
+
const phaseTasks = queue.splice(0);
|
|
534
|
+
phases.push({
|
|
535
|
+
id: `phase-${phases.length + 1}`,
|
|
536
|
+
description: `Parallel execution slot ${phases.length + 1}`,
|
|
537
|
+
subtasks: phaseTasks.map((t) => t.id)
|
|
538
|
+
});
|
|
539
|
+
for (const task of phaseTasks) {
|
|
540
|
+
visited.add(task.id);
|
|
541
|
+
for (const [candidateId, deps] of Object.entries(adjacency)) {
|
|
542
|
+
if (deps.includes(task.id)) {
|
|
543
|
+
const degree = (inDegree.get(candidateId) ?? 0) - 1;
|
|
544
|
+
inDegree.set(candidateId, degree);
|
|
545
|
+
if (degree === 0) {
|
|
546
|
+
const candidate = subtasks.find((item) => item.id === candidateId);
|
|
547
|
+
if (candidate) {
|
|
548
|
+
queue.push(candidate);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
const hasCycles = visited.size !== subtasks.length;
|
|
556
|
+
if (hasCycles) {
|
|
557
|
+
issues.push("Dependency cycle detected; defaulting to sequential execution.");
|
|
558
|
+
}
|
|
559
|
+
const normalizedPhases = hasCycles ? subtasks.map((task, index) => ({
|
|
560
|
+
id: `phase-${index + 1}`,
|
|
561
|
+
description: `${humanizeRole(task.role)} fallback phase`,
|
|
562
|
+
subtasks: [task.id]
|
|
563
|
+
})) : phases;
|
|
564
|
+
return { adjacency, phases: normalizedPhases, hasCycles, issues };
|
|
565
|
+
}
|
|
566
|
+
function buildClassicWebAppPlan(task, domain) {
|
|
567
|
+
const normalizedTask = task.trim();
|
|
568
|
+
const subtasks = [];
|
|
569
|
+
const backendMandate = [
|
|
570
|
+
`You are the backend agent for the swarm task "${normalizedTask}".`,
|
|
571
|
+
"Mission: implement and stabilize the server-side work needed for the task.",
|
|
572
|
+
`Project context: ${summarizeProjectDomain(domain)}`,
|
|
573
|
+
"Focus on APIs, persistence, integration contracts, and any server scaffolding required to unblock the rest of the work.",
|
|
574
|
+
"Deliverables:",
|
|
575
|
+
"- API contracts or server behavior changes",
|
|
576
|
+
"- Error handling and logging improvements",
|
|
577
|
+
"- Core backend logic validated by tests or clear verification notes"
|
|
578
|
+
].join("\n");
|
|
579
|
+
const backendTask = createSubtask(
|
|
580
|
+
"backend",
|
|
581
|
+
"Backend coordination",
|
|
582
|
+
`Implement and stabilize the server-side work needed for ${normalizedTask}. Focus on APIs, persistence, and integration contracts.`,
|
|
583
|
+
[
|
|
584
|
+
"API contracts documented",
|
|
585
|
+
"Error handling and logging present",
|
|
586
|
+
"Core backend logic covered by tests"
|
|
587
|
+
],
|
|
588
|
+
domain.directories.backend.length > 0 ? domain.directories.backend.map((dir) => path.join(dir, "**/*")) : ["src/server/**/*", "src/api/**/*"],
|
|
589
|
+
[],
|
|
590
|
+
backendMandate
|
|
591
|
+
);
|
|
592
|
+
subtasks.push(backendTask);
|
|
593
|
+
const frontendDependencies = [backendTask.id];
|
|
594
|
+
const frontendMandate = [
|
|
595
|
+
`You are the frontend agent for the swarm task "${normalizedTask}".`,
|
|
596
|
+
"Mission: deliver the user-facing experience and align UI behavior with the backend contract.",
|
|
597
|
+
`Project context: ${summarizeProjectDomain(domain)}`,
|
|
598
|
+
"Focus on navigation, loading states, error handling, accessibility, and any view-layer changes required by the task.",
|
|
599
|
+
"Deliverables:",
|
|
600
|
+
"- UI changes or design adjustments",
|
|
601
|
+
"- Loading, empty, and error states handled cleanly",
|
|
602
|
+
"- Accessibility and interaction notes for review"
|
|
603
|
+
].join("\n");
|
|
604
|
+
const frontendTask = createSubtask(
|
|
605
|
+
"frontend",
|
|
606
|
+
"Frontend coordination",
|
|
607
|
+
`Deliver the user-facing experience for ${normalizedTask}. Align UI behavior with backend contracts and ensure loading, empty, and error states are handled cleanly.`,
|
|
608
|
+
[
|
|
609
|
+
"UI flows cover happy and error paths",
|
|
610
|
+
"Accessibility considerations applied",
|
|
611
|
+
"Backend contract integration validated"
|
|
612
|
+
],
|
|
613
|
+
domain.directories.frontend.length > 0 ? domain.directories.frontend.map((dir) => path.join(dir, "**/*")) : ["src/components/**/*", "src/ui/**/*"],
|
|
614
|
+
frontendDependencies,
|
|
615
|
+
frontendMandate
|
|
616
|
+
);
|
|
617
|
+
subtasks.push(frontendTask);
|
|
618
|
+
const testingMandate = [
|
|
619
|
+
`You are the testing agent for the swarm task "${normalizedTask}".`,
|
|
620
|
+
"Mission: extend or bootstrap automated verification for the web-app change.",
|
|
621
|
+
`Project context: ${summarizeProjectDomain(domain)}`,
|
|
622
|
+
"Focus on regression coverage, integration behavior, and any edge cases introduced by the task.",
|
|
623
|
+
"Deliverables:",
|
|
624
|
+
"- Test additions or validation notes",
|
|
625
|
+
"- Critical paths and regressions covered",
|
|
626
|
+
"- Negative scenarios documented clearly"
|
|
627
|
+
].join("\n");
|
|
628
|
+
const testingTask = createSubtask(
|
|
629
|
+
"testing",
|
|
630
|
+
"Testing coverage",
|
|
631
|
+
`Extend or bootstrap automated verification for ${normalizedTask}. Cover core logic, integration paths, and the expected regressions for the web application flow.`,
|
|
632
|
+
[
|
|
633
|
+
"Regression suite extended with new cases",
|
|
634
|
+
"Critical paths validated with integration tests",
|
|
635
|
+
"Negative scenarios documented"
|
|
636
|
+
],
|
|
637
|
+
domain.directories.tests.length > 0 ? domain.directories.tests.map((dir) => path.join(dir, "**/*")) : ["tests/**/*"],
|
|
638
|
+
[backendTask.id],
|
|
639
|
+
testingMandate
|
|
640
|
+
);
|
|
641
|
+
subtasks.push(testingTask);
|
|
642
|
+
const docsMandate = [
|
|
643
|
+
`You are the documentation agent for the swarm task "${normalizedTask}".`,
|
|
644
|
+
"Mission: update README files, guides, or onboarding materials so the change can be understood and reused.",
|
|
645
|
+
`Project context: ${summarizeProjectDomain(domain)}`,
|
|
646
|
+
"Focus on describing the user-visible change, implementation notes, and how to verify the result.",
|
|
647
|
+
"Deliverables:",
|
|
648
|
+
"- Documentation or changelog updates",
|
|
649
|
+
"- Usage examples refreshed",
|
|
650
|
+
"- Verification notes for maintainers"
|
|
651
|
+
].join("\n");
|
|
652
|
+
const documentationTask = createSubtask(
|
|
653
|
+
"documentation",
|
|
654
|
+
"Documentation update",
|
|
655
|
+
`Update README files, guides, or onboarding materials to reflect ${normalizedTask}. Capture the implementation notes and any changes in how the feature should be used or verified.`,
|
|
656
|
+
["README or docs updated", "Changelog entry created if necessary", "Usage examples refreshed"],
|
|
657
|
+
domain.directories.docs.length > 0 ? domain.directories.docs.map((dir) => path.join(dir, "**/*")) : ["docs/**/*", "README.md"],
|
|
658
|
+
[backendTask.id, frontendTask.id, testingTask.id],
|
|
659
|
+
docsMandate
|
|
660
|
+
);
|
|
661
|
+
subtasks.push(documentationTask);
|
|
662
|
+
const dependencyGraph = inferDependencies(subtasks);
|
|
663
|
+
const issues = [...dependencyGraph.issues];
|
|
664
|
+
if (!domain.hasBackend) {
|
|
665
|
+
issues.push("Backend stack not detected. Backend agent will bootstrap required scaffolding.");
|
|
666
|
+
}
|
|
667
|
+
if (!domain.hasFrontend) {
|
|
668
|
+
issues.push("Frontend stack not detected. Frontend agent will bootstrap UI foundation.");
|
|
669
|
+
}
|
|
670
|
+
return {
|
|
671
|
+
task: normalizedTask,
|
|
672
|
+
domain,
|
|
673
|
+
subtasks,
|
|
674
|
+
phases: dependencyGraph.phases,
|
|
675
|
+
issues,
|
|
676
|
+
planningMode: "classic-webapp",
|
|
677
|
+
planningReasoning: "Classic web-app fast path selected from project structure and task intent.",
|
|
678
|
+
agentCount: subtasks.length
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
function buildMandateVariants(task, domain, roleSpec) {
|
|
682
|
+
const roleLabel = humanizeRole(roleSpec.role);
|
|
683
|
+
return [
|
|
684
|
+
`You are the ${roleLabel} for the swarm task "${task}".`,
|
|
685
|
+
`Role label: ${roleSpec.role}`,
|
|
686
|
+
`Mission: ${roleSpec.objective}`,
|
|
687
|
+
`Project context: ${summarizeProjectDomain(domain)}`,
|
|
688
|
+
"Acceptance criteria:",
|
|
689
|
+
...roleSpec.acceptanceCriteria.map((criterion) => `- ${criterion}`),
|
|
690
|
+
"Expected artifacts:",
|
|
691
|
+
...roleSpec.suggestedArtifacts.map((artifact) => `- ${artifact}`),
|
|
692
|
+
roleSpec.dependsOn.length > 0 ? `Dependencies: wait for ${roleSpec.dependsOn.join(", ")} before finalizing your output.` : "Dependencies: none; proceed independently.",
|
|
693
|
+
"Rules:",
|
|
694
|
+
"- Stay within your specialization and do not duplicate other agents.",
|
|
695
|
+
"- Output concrete work, not a generic plan.",
|
|
696
|
+
"- If this is analysis work, produce evidence and comparison notes.",
|
|
697
|
+
"- If this is implementation work, cite the code paths, files, or interfaces you will touch."
|
|
698
|
+
].join("\n");
|
|
699
|
+
}
|
|
700
|
+
function buildDynamicPlanFromSpecs(task, domain, specs, planningMode, reasoning) {
|
|
701
|
+
const subtasks = specs.map(
|
|
702
|
+
(spec) => createSubtask(
|
|
703
|
+
spec.role,
|
|
704
|
+
spec.summary,
|
|
705
|
+
spec.objective,
|
|
706
|
+
spec.acceptanceCriteria,
|
|
707
|
+
spec.suggestedArtifacts,
|
|
708
|
+
[],
|
|
709
|
+
buildMandateVariants(task, domain, spec)
|
|
710
|
+
)
|
|
711
|
+
);
|
|
712
|
+
const roleToId = /* @__PURE__ */ new Map();
|
|
713
|
+
subtasks.forEach((subtask, index) => {
|
|
714
|
+
roleToId.set(normalizeRoleName(specs[index]?.role ?? subtask.role), subtask.id);
|
|
715
|
+
});
|
|
716
|
+
subtasks.forEach((subtask, index) => {
|
|
717
|
+
const deps = specs[index]?.dependsOn ?? [];
|
|
718
|
+
const missingRoles = deps.filter(
|
|
719
|
+
(dep) => roleToId.has(normalizeRoleName(dep) || dep) === false
|
|
720
|
+
);
|
|
721
|
+
if (missingRoles.length > 0) {
|
|
722
|
+
throw new Error(
|
|
723
|
+
`Unknown dependency role(s) for "${subtask.role}": ${missingRoles.join(", ")}`
|
|
724
|
+
);
|
|
725
|
+
}
|
|
726
|
+
subtask.dependencies = dedupeStrings(
|
|
727
|
+
deps.map((dep) => roleToId.get(normalizeRoleName(dep) || dep)).filter((value) => typeof value === "string" && value.length > 0)
|
|
728
|
+
);
|
|
729
|
+
});
|
|
730
|
+
const dependencyGraph = inferDependencies(subtasks);
|
|
731
|
+
return {
|
|
732
|
+
task: task.trim(),
|
|
733
|
+
domain,
|
|
734
|
+
subtasks,
|
|
735
|
+
phases: dependencyGraph.phases,
|
|
736
|
+
issues: dependencyGraph.issues,
|
|
737
|
+
planningMode,
|
|
738
|
+
planningReasoning: reasoning,
|
|
739
|
+
agentCount: subtasks.length
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
function synthesizeAnalysisPlan(task, domain, requestedAgents, explicitRoles, planningMode = "fallback") {
|
|
743
|
+
const agentCount = explicitRoles && explicitRoles.length > 0 ? explicitRoles.length : estimateDynamicAgentCount(task, domain, requestedAgents);
|
|
744
|
+
const normalizedTask = task.trim();
|
|
745
|
+
const roleNames = explicitRoles && explicitRoles.length > 0 ? explicitRoles : agentCount === 1 ? ["researcher"] : agentCount === 2 ? ["researcher", "synthesizer"] : padRoleNames(
|
|
746
|
+
["researcher", "analyst", "synthesizer"],
|
|
747
|
+
agentCount,
|
|
748
|
+
["reviewer", "fact-checker", "source-curator"],
|
|
749
|
+
"research-role"
|
|
750
|
+
);
|
|
751
|
+
const specs = roleNames.slice(0, agentCount).map((role, index, roles) => {
|
|
752
|
+
const normalized = normalizeRoleName(role) || `agent-${index + 1}`;
|
|
753
|
+
const isFinal = index === roles.length - 1;
|
|
754
|
+
const isFirst = index === 0;
|
|
755
|
+
const objective = isFinal ? `Synthesize findings for ${normalizedTask}, reconcile differences, and produce the final comparison narrative.` : isFirst ? `Gather high-signal sources, baseline context, and the minimum facts needed to understand ${normalizedTask}.` : `Analyze and compare the key evidence for ${normalizedTask}, focusing on gaps, tradeoffs, and differentiated findings.`;
|
|
756
|
+
return {
|
|
757
|
+
role: normalized,
|
|
758
|
+
summary: humanizeRole(normalized),
|
|
759
|
+
objective,
|
|
760
|
+
acceptanceCriteria: isFinal ? [
|
|
761
|
+
"Findings are reconciled into a coherent conclusion",
|
|
762
|
+
"Key tradeoffs and uncertainties are called out",
|
|
763
|
+
"Output is ready to brief a decision-maker"
|
|
764
|
+
] : isFirst ? [
|
|
765
|
+
"Sources are documented with enough detail to verify claims",
|
|
766
|
+
"Current state and context are captured before analysis",
|
|
767
|
+
"No unsupported assumptions are introduced"
|
|
768
|
+
] : [
|
|
769
|
+
"Comparative evidence is organized by theme or criterion",
|
|
770
|
+
"Conflicting signals are identified explicitly",
|
|
771
|
+
"Analysis stays grounded in observable data"
|
|
772
|
+
],
|
|
773
|
+
suggestedArtifacts: isFinal ? ["synthesis-notes.md", "comparison-summary.md"] : isFirst ? ["research-notes.md", "source-index.md"] : ["analysis-table.md", "evidence-log.md"],
|
|
774
|
+
dependsOn: isFirst ? [] : [roleNames[0] ?? "researcher"]
|
|
775
|
+
};
|
|
776
|
+
});
|
|
777
|
+
const reasoning = explicitRoles && explicitRoles.length > 0 ? `Explicit role override supplied; using ${specs.length} requested analysis role(s).` : `Heuristic dynamic decomposition selected ${specs.length} agent(s) for an analysis-oriented task.`;
|
|
778
|
+
return buildDynamicPlanFromSpecs(normalizedTask, domain, specs, planningMode, reasoning);
|
|
779
|
+
}
|
|
780
|
+
function synthesizeImplementationPlan(task, domain, requestedAgents, explicitRoles, planningMode = "fallback") {
|
|
781
|
+
const agentCount = explicitRoles && explicitRoles.length > 0 ? explicitRoles.length : estimateDynamicAgentCount(task, domain, requestedAgents);
|
|
782
|
+
const normalizedTask = task.trim();
|
|
783
|
+
const baseRoles = explicitRoles && explicitRoles.length > 0 ? explicitRoles : agentCount === 1 ? ["implementer"] : agentCount === 2 ? ["architect", "implementer"] : agentCount === 3 ? ["architect", "implementer", "verifier"] : padRoleNames(
|
|
784
|
+
["architect", "implementer", "verifier", "synthesizer"],
|
|
785
|
+
agentCount,
|
|
786
|
+
["integrator", "release-manager", "stabilizer"],
|
|
787
|
+
"implementation-role"
|
|
788
|
+
);
|
|
789
|
+
const specs = baseRoles.slice(0, agentCount).map((role, index, roles) => {
|
|
790
|
+
const normalized = normalizeRoleName(role) || `agent-${index + 1}`;
|
|
791
|
+
const isFinal = index === roles.length - 1;
|
|
792
|
+
const objective = isFinal ? `Tie the work together for ${normalizedTask}, resolve remaining edges, and produce the final integration notes.` : index === 0 ? `Design the implementation approach for ${normalizedTask} and identify the code paths that need to change.` : `Implement and validate the changes required for ${normalizedTask}, keeping the outcome aligned with the project context.`;
|
|
793
|
+
return {
|
|
794
|
+
role: normalized,
|
|
795
|
+
summary: humanizeRole(normalized),
|
|
796
|
+
objective,
|
|
797
|
+
acceptanceCriteria: isFinal ? [
|
|
798
|
+
"All critical paths are covered by implementation or validation",
|
|
799
|
+
"Remaining risks are documented clearly",
|
|
800
|
+
"Output is ready for handoff or merge"
|
|
801
|
+
] : index === 0 ? [
|
|
802
|
+
"Implementation approach is scoped and grounded in the current codebase",
|
|
803
|
+
"Dependencies and affected files are identified",
|
|
804
|
+
"Risky assumptions are surfaced early"
|
|
805
|
+
] : [
|
|
806
|
+
"Concrete changes are made in the relevant code paths",
|
|
807
|
+
"Validation or tests are updated alongside the implementation",
|
|
808
|
+
"Edge cases and regressions are considered"
|
|
809
|
+
],
|
|
810
|
+
suggestedArtifacts: isFinal ? ["integration-notes.md", "handoff-summary.md"] : index === 0 ? ["implementation-plan.md", "affected-files.md"] : ["diff-notes.md", "verification-checklist.md"],
|
|
811
|
+
dependsOn: isFinal && roles.length > 1 ? roles.slice(0, -1).map((role2) => normalizeRoleName(role2)) : index === 0 ? [] : [normalizeRoleName(baseRoles[0] ?? "implementer")]
|
|
812
|
+
};
|
|
813
|
+
});
|
|
814
|
+
const reasoning = explicitRoles && explicitRoles.length > 0 ? `Explicit role override supplied; using ${specs.length} requested implementation role(s).` : `Heuristic dynamic decomposition selected ${specs.length} agent(s) for an implementation-oriented task.`;
|
|
815
|
+
return buildDynamicPlanFromSpecs(normalizedTask, domain, specs, planningMode, reasoning);
|
|
816
|
+
}
|
|
817
|
+
function parseRoleSpecs(raw) {
|
|
818
|
+
if (!raw || typeof raw !== "object") return null;
|
|
819
|
+
const record = raw;
|
|
820
|
+
const subtasksRaw = Array.isArray(record.subtasks) ? record.subtasks : [];
|
|
821
|
+
const subtasks = [];
|
|
822
|
+
for (const item of subtasksRaw) {
|
|
823
|
+
if (!item || typeof item !== "object") continue;
|
|
824
|
+
const subtask = item;
|
|
825
|
+
const role = typeof subtask.role === "string" ? subtask.role.trim() : "";
|
|
826
|
+
const summary = typeof subtask.summary === "string" ? subtask.summary.trim() : "";
|
|
827
|
+
const objective = typeof subtask.objective === "string" ? subtask.objective.trim() : typeof subtask.mandate === "string" ? subtask.mandate.trim() : typeof subtask.description === "string" ? subtask.description.trim() : "";
|
|
828
|
+
if (!role || !summary || !objective) continue;
|
|
829
|
+
subtasks.push({
|
|
830
|
+
role,
|
|
831
|
+
summary,
|
|
832
|
+
objective,
|
|
833
|
+
acceptanceCriteria: Array.isArray(subtask.acceptanceCriteria) ? subtask.acceptanceCriteria.filter((value) => typeof value === "string") : [],
|
|
834
|
+
suggestedArtifacts: Array.isArray(subtask.suggestedArtifacts) ? subtask.suggestedArtifacts.filter((value) => typeof value === "string") : [],
|
|
835
|
+
dependsOn: Array.isArray(subtask.dependsOn) ? subtask.dependsOn.filter((value) => typeof value === "string") : Array.isArray(subtask.dependencies) ? subtask.dependencies.filter((value) => typeof value === "string") : []
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
const reasoning = typeof record.reasoning === "string" ? record.reasoning.trim() : "";
|
|
839
|
+
const agentCount = typeof record.agentCount === "number" && Number.isFinite(record.agentCount) ? Math.max(1, Math.round(record.agentCount)) : void 0;
|
|
840
|
+
if (!reasoning || subtasks.length === 0) return null;
|
|
841
|
+
return { reasoning, agentCount, subtasks };
|
|
842
|
+
}
|
|
843
|
+
function buildDecompositionPrompt(params) {
|
|
844
|
+
const { task, domain, requestedAgents, explicitRoles, classicPathHint } = params;
|
|
845
|
+
const roleOverrideSection = explicitRoles && explicitRoles.length > 0 ? `
|
|
846
|
+
Explicit role override: use these roles exactly and preserve their order:
|
|
847
|
+
${explicitRoles.map((role, index) => `${index + 1}. ${role}`).join("\n")}` : "";
|
|
848
|
+
const agentConstraint = typeof requestedAgents === "number" && Number.isFinite(requestedAgents) ? `
|
|
849
|
+
Target agent count: ${requestedAgents}` : `
|
|
850
|
+
Target agent count: infer the smallest useful number, capped at ${DEFAULT_DYNAMIC_AGENT_CAP}`;
|
|
851
|
+
return [
|
|
852
|
+
"You are the Swarm Decomposition Supervisor.",
|
|
853
|
+
"Your job is to turn the task into a small set of specialist agents with concrete mandates.",
|
|
854
|
+
"Do not force backend/frontend/testing/documentation roles unless the task and project are clearly a classic web app implementation.",
|
|
855
|
+
"Choose role names that describe the actual work, using arbitrary strings if needed.",
|
|
856
|
+
"Each subtask must be self-contained, specific, and actionable.",
|
|
857
|
+
"Return JSON only with this structure:",
|
|
858
|
+
"{",
|
|
859
|
+
' "reasoning": "brief explanation",',
|
|
860
|
+
' "agentCount": 3,',
|
|
861
|
+
' "subtasks": [',
|
|
862
|
+
" {",
|
|
863
|
+
' "role": "researcher",',
|
|
864
|
+
' "summary": "short label",',
|
|
865
|
+
' "objective": "specific mandate",',
|
|
866
|
+
' "acceptanceCriteria": ["..."],',
|
|
867
|
+
' "suggestedArtifacts": ["..."],',
|
|
868
|
+
' "dependsOn": ["other-role"]',
|
|
869
|
+
" }",
|
|
870
|
+
" ]",
|
|
871
|
+
"}",
|
|
872
|
+
"Rules:",
|
|
873
|
+
"- Prefer 1-3 agents for narrow analysis tasks unless the task is clearly broader.",
|
|
874
|
+
"- Prefer 3-5 agents for substantial implementation work if the project context supports it.",
|
|
875
|
+
"- Use analysis/research/synthesis roles for comparison, audit, and market work.",
|
|
876
|
+
"- Use architect/implementer/verifier/synthesizer roles for implementation work when appropriate.",
|
|
877
|
+
"- Keep dependencies minimal and only add them when one role truly needs another role\u2019s output.",
|
|
878
|
+
"- Make mandates specific enough that another agent can execute them without further clarification.",
|
|
879
|
+
`Classic web-app fast path candidate: ${classicPathHint ? "yes" : "no"}.`,
|
|
880
|
+
`Task:
|
|
881
|
+
${task}`,
|
|
882
|
+
`Project context:
|
|
883
|
+
${summarizeProjectDomain(domain)}`,
|
|
884
|
+
roleOverrideSection,
|
|
885
|
+
agentConstraint,
|
|
886
|
+
"Use the project context to determine the right number of agents and the right role specializations."
|
|
887
|
+
].filter((section) => section.length > 0).join("\n\n");
|
|
888
|
+
}
|
|
889
|
+
function buildRepairPrompt(prompt, parseError) {
|
|
890
|
+
return [
|
|
891
|
+
prompt,
|
|
892
|
+
"The previous response could not be parsed as valid JSON.",
|
|
893
|
+
`Parse error: ${parseError}`,
|
|
894
|
+
"Return ONLY valid JSON matching the requested schema. No markdown. No code fences. No commentary."
|
|
895
|
+
].join("\n\n");
|
|
896
|
+
}
|
|
897
|
+
function extractJsonPayload(raw) {
|
|
898
|
+
const trimmed = raw.trim();
|
|
899
|
+
if (trimmed.startsWith("{")) return trimmed;
|
|
900
|
+
const codeBlockMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
|
|
901
|
+
if (codeBlockMatch?.[1]) {
|
|
902
|
+
return codeBlockMatch[1].trim();
|
|
903
|
+
}
|
|
904
|
+
return trimmed;
|
|
905
|
+
}
|
|
906
|
+
var DomainAwareSwarmPlanner = class {
|
|
907
|
+
constructor(options = {}) {
|
|
908
|
+
this.options = options;
|
|
909
|
+
}
|
|
910
|
+
options;
|
|
911
|
+
async analyzeDomain(projectPath) {
|
|
912
|
+
const resolvedPath = path.resolve(projectPath);
|
|
913
|
+
const capabilities = detectProjectCapabilities(resolvedPath);
|
|
914
|
+
const isNodeTarget = isNodeLikeProject(capabilities);
|
|
915
|
+
const packageJson = isNodeTarget ? await readJson(path.join(resolvedPath, "package.json")) : null;
|
|
916
|
+
const survey = await surveyDirectory(
|
|
917
|
+
resolvedPath,
|
|
918
|
+
this.options.scanDepth ?? DEFAULT_SCAN_DEPTH
|
|
919
|
+
);
|
|
920
|
+
const frameworks = isNodeTarget ? detectFrameworks(packageJson, survey) : [];
|
|
921
|
+
const hasFrontend = survey.frontend.size > 0 || frameworks.some((fw) => fw.includes("React") || fw.includes("Next"));
|
|
922
|
+
const hasBackend = survey.backend.size > 0 || frameworks.some((fw) => ["Express", "Fastify", "NestJS"].includes(fw));
|
|
923
|
+
const resolverHasTestCommand = capabilities.verification.test.length > 0;
|
|
924
|
+
const hasTests = resolverHasTestCommand || survey.testFiles > 0 || frameworks.includes("Automated Tests");
|
|
925
|
+
const hasDocs = survey.docFiles > 0;
|
|
926
|
+
const techStack = [];
|
|
927
|
+
if (capabilities.languages.length > 0) {
|
|
928
|
+
techStack.push(...capabilities.languages.map((language) => `Language: ${language}`));
|
|
929
|
+
}
|
|
930
|
+
if (isNodeTarget) {
|
|
931
|
+
if (packageJson?.name && typeof packageJson.name === "string") {
|
|
932
|
+
techStack.push(`Package: ${packageJson.name}`);
|
|
933
|
+
}
|
|
934
|
+
if (packageJson?.scripts && typeof packageJson.scripts === "object") {
|
|
935
|
+
techStack.push("npm scripts");
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
for (const buildCommand of capabilities.verification.build) {
|
|
939
|
+
const tool = buildCommand.trim().split(/\s+/)[0];
|
|
940
|
+
if (tool && !isNodeTarget) techStack.push(`Build: ${tool}`);
|
|
941
|
+
}
|
|
942
|
+
if (frameworks.length > 0) {
|
|
943
|
+
techStack.push(...frameworks);
|
|
944
|
+
}
|
|
945
|
+
const notes = [];
|
|
946
|
+
const isUnknownTarget = capabilities.languages.length === 0 || capabilities.languages.every((language) => language === "unknown");
|
|
947
|
+
if (isUnknownTarget) {
|
|
948
|
+
notes.push(
|
|
949
|
+
"Project language/toolchain could not be detected; treat domain analysis as language-agnostic and verify with the target project conventions."
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
if (!hasTests) {
|
|
953
|
+
notes.push("Test suite not detected; testing agent should bootstrap infrastructure.");
|
|
954
|
+
}
|
|
955
|
+
if (!hasDocs) {
|
|
956
|
+
notes.push(
|
|
957
|
+
"Documentation directory not found; documentation agent should create baseline docs."
|
|
958
|
+
);
|
|
959
|
+
}
|
|
960
|
+
try {
|
|
961
|
+
const packagesDir = path.join(resolvedPath, "packages");
|
|
962
|
+
const pkStat = await statSafe(packagesDir);
|
|
963
|
+
if (pkStat?.isDirectory()) {
|
|
964
|
+
const entries = await fs.readdir(packagesDir).catch(() => []);
|
|
965
|
+
let packageCount = 0;
|
|
966
|
+
for (const entry of entries) {
|
|
967
|
+
const pkgPath = path.join(packagesDir, entry, "package.json");
|
|
968
|
+
const st = await statSafe(pkgPath);
|
|
969
|
+
if (st) packageCount += 1;
|
|
970
|
+
if (packageCount >= 2) break;
|
|
971
|
+
}
|
|
972
|
+
if (packageCount >= 2) {
|
|
973
|
+
notes.push("Monorepo structure detected under packages/ directory.");
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
} catch {
|
|
977
|
+
}
|
|
978
|
+
return {
|
|
979
|
+
rootPath: resolvedPath,
|
|
980
|
+
techStack: Array.from(new Set(techStack)),
|
|
981
|
+
// Prefer the resolver's detected languages; fall back to the file-extension
|
|
982
|
+
// survey only when the resolver could not classify the target.
|
|
983
|
+
languages: isUnknownTarget ? Array.from(survey.languages) : Array.from(capabilities.languages),
|
|
984
|
+
frameworks,
|
|
985
|
+
hasFrontend,
|
|
986
|
+
hasBackend,
|
|
987
|
+
hasTests,
|
|
988
|
+
hasDocs,
|
|
989
|
+
inferredServices: Array.from(
|
|
990
|
+
/* @__PURE__ */ new Set([...Array.from(survey.frontend), ...Array.from(survey.backend)])
|
|
991
|
+
),
|
|
992
|
+
directories: {
|
|
993
|
+
frontend: Array.from(survey.frontend),
|
|
994
|
+
backend: Array.from(survey.backend),
|
|
995
|
+
tests: Array.from(survey.tests),
|
|
996
|
+
docs: Array.from(survey.docs)
|
|
997
|
+
},
|
|
998
|
+
metrics: {
|
|
999
|
+
totalFiles: survey.totalFiles,
|
|
1000
|
+
codeFiles: survey.codeFiles,
|
|
1001
|
+
testFiles: survey.testFiles,
|
|
1002
|
+
docFiles: survey.docFiles,
|
|
1003
|
+
truncatedDirectoryEntries: survey.truncatedDirectoryEntries > 0 ? survey.truncatedDirectoryEntries : void 0
|
|
1004
|
+
},
|
|
1005
|
+
notes
|
|
1006
|
+
};
|
|
1007
|
+
}
|
|
1008
|
+
async decomposeTask(task, domain, options = {}) {
|
|
1009
|
+
const normalizedTask = task.trim();
|
|
1010
|
+
const explicitRoles = dedupeStrings(options.roles ?? []).map(
|
|
1011
|
+
(role) => normalizeRoleName(role) || role
|
|
1012
|
+
);
|
|
1013
|
+
if (shouldUseClassicWebAppFastPath(normalizedTask, domain, {
|
|
1014
|
+
agents: options.agents,
|
|
1015
|
+
roles: explicitRoles
|
|
1016
|
+
})) {
|
|
1017
|
+
return buildClassicWebAppPlan(normalizedTask, domain);
|
|
1018
|
+
}
|
|
1019
|
+
const planningMode = explicitRoles.length > 0 ? "explicit" : "dynamic";
|
|
1020
|
+
const classicPathHint = isClassicWebAppProject(domain);
|
|
1021
|
+
const prompt = buildDecompositionPrompt({
|
|
1022
|
+
task: normalizedTask,
|
|
1023
|
+
domain,
|
|
1024
|
+
requestedAgents: explicitRoles.length > 0 ? explicitRoles.length : options.agents ?? estimateDynamicAgentCount(normalizedTask, domain),
|
|
1025
|
+
explicitRoles: explicitRoles.length > 0 ? explicitRoles : void 0,
|
|
1026
|
+
classicPathHint
|
|
1027
|
+
});
|
|
1028
|
+
if (!options.dryRun) {
|
|
1029
|
+
const providerPlan = await this.tryLLMDecomposition(normalizedTask, domain, prompt, {
|
|
1030
|
+
agents: options.agents,
|
|
1031
|
+
roles: explicitRoles.length > 0 ? explicitRoles : void 0,
|
|
1032
|
+
planningMode
|
|
1033
|
+
});
|
|
1034
|
+
if (providerPlan) {
|
|
1035
|
+
return providerPlan;
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
return this.buildHeuristicPlan(normalizedTask, domain, {
|
|
1039
|
+
agents: options.agents,
|
|
1040
|
+
roles: explicitRoles,
|
|
1041
|
+
planningMode
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
async tryLLMDecomposition(task, domain, prompt, options) {
|
|
1045
|
+
if (process.env.NODE_ENV === "test" || process.env.VITEST === "true") {
|
|
1046
|
+
return null;
|
|
1047
|
+
}
|
|
1048
|
+
const resolvedConfig = resolveConfig(void 0, domain.rootPath);
|
|
1049
|
+
const provider = resolvedConfig.defaultProvider.value;
|
|
1050
|
+
const model = resolvedConfig.defaultModel.value;
|
|
1051
|
+
if (!provider || !model) {
|
|
1052
|
+
return null;
|
|
1053
|
+
}
|
|
1054
|
+
try {
|
|
1055
|
+
const result = await runProviderNative({
|
|
1056
|
+
provider,
|
|
1057
|
+
model,
|
|
1058
|
+
workingDir: domain.rootPath,
|
|
1059
|
+
prompt,
|
|
1060
|
+
executionIntent: "analysis",
|
|
1061
|
+
strategy: "conservative",
|
|
1062
|
+
timeoutMs: 6e4
|
|
1063
|
+
});
|
|
1064
|
+
if (result.exitCode !== void 0 && result.exitCode !== 0 || !result.stdout?.trim()) {
|
|
1065
|
+
return null;
|
|
1066
|
+
}
|
|
1067
|
+
const parsed = this.parseLLMResponse(result.stdout);
|
|
1068
|
+
if (!parsed) {
|
|
1069
|
+
const repairResult = await runProviderNative({
|
|
1070
|
+
provider,
|
|
1071
|
+
model,
|
|
1072
|
+
workingDir: domain.rootPath,
|
|
1073
|
+
prompt: buildRepairPrompt(
|
|
1074
|
+
prompt,
|
|
1075
|
+
"The previous response was not valid JSON or did not match the schema."
|
|
1076
|
+
),
|
|
1077
|
+
executionIntent: "analysis",
|
|
1078
|
+
strategy: "conservative",
|
|
1079
|
+
timeoutMs: 6e4
|
|
1080
|
+
});
|
|
1081
|
+
if (repairResult.exitCode !== void 0 && repairResult.exitCode !== 0 || !repairResult.stdout?.trim()) {
|
|
1082
|
+
return null;
|
|
1083
|
+
}
|
|
1084
|
+
const repaired = this.parseLLMResponse(repairResult.stdout);
|
|
1085
|
+
if (!repaired) {
|
|
1086
|
+
return null;
|
|
1087
|
+
}
|
|
1088
|
+
const normalizedSpecs2 = this.normalizeRoleSpecs(
|
|
1089
|
+
task,
|
|
1090
|
+
repaired,
|
|
1091
|
+
options.roles,
|
|
1092
|
+
options.agents
|
|
1093
|
+
);
|
|
1094
|
+
if (!normalizedSpecs2 || normalizedSpecs2.length === 0) {
|
|
1095
|
+
return null;
|
|
1096
|
+
}
|
|
1097
|
+
return buildDynamicPlanFromSpecs(
|
|
1098
|
+
task,
|
|
1099
|
+
domain,
|
|
1100
|
+
normalizedSpecs2,
|
|
1101
|
+
options.planningMode,
|
|
1102
|
+
repaired.reasoning || "LLM decomposition completed successfully."
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
const normalizedSpecs = this.normalizeRoleSpecs(task, parsed, options.roles, options.agents);
|
|
1106
|
+
if (!normalizedSpecs || normalizedSpecs.length === 0) {
|
|
1107
|
+
return null;
|
|
1108
|
+
}
|
|
1109
|
+
const mode = options.planningMode;
|
|
1110
|
+
const reasoning = parsed.reasoning || "LLM decomposition completed successfully.";
|
|
1111
|
+
return buildDynamicPlanFromSpecs(task, domain, normalizedSpecs, mode, reasoning);
|
|
1112
|
+
} catch (error) {
|
|
1113
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1114
|
+
if (isDebugMode()) {
|
|
1115
|
+
console.warn(chalk.gray(`[Swarm planner] LLM decomposition fallback: ${message}`));
|
|
1116
|
+
}
|
|
1117
|
+
return null;
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
parseLLMResponse(raw) {
|
|
1121
|
+
try {
|
|
1122
|
+
const extracted = extractJsonPayload(raw);
|
|
1123
|
+
let candidate;
|
|
1124
|
+
try {
|
|
1125
|
+
candidate = parseJsonWithContext(
|
|
1126
|
+
extracted,
|
|
1127
|
+
"Swarm decomposition response"
|
|
1128
|
+
);
|
|
1129
|
+
} catch {
|
|
1130
|
+
const objectMatch = extracted.match(/(\{[\s\S]*\})/);
|
|
1131
|
+
if (!objectMatch?.[1]) {
|
|
1132
|
+
return null;
|
|
1133
|
+
}
|
|
1134
|
+
candidate = parseJsonWithContext(
|
|
1135
|
+
objectMatch[1],
|
|
1136
|
+
"Swarm decomposition response"
|
|
1137
|
+
);
|
|
1138
|
+
}
|
|
1139
|
+
return parseRoleSpecs(candidate);
|
|
1140
|
+
} catch {
|
|
1141
|
+
return null;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
normalizeRoleSpecs(task, parsed, explicitRoles, requestedAgents) {
|
|
1145
|
+
const specs = parsed.subtasks.slice();
|
|
1146
|
+
const normalizedExplicitRoles = explicitRoles?.map((role) => normalizeRoleName(role) || role);
|
|
1147
|
+
if (normalizedExplicitRoles && normalizedExplicitRoles.length > 0) {
|
|
1148
|
+
return normalizedExplicitRoles.map((role, index) => {
|
|
1149
|
+
const spec = specs[index];
|
|
1150
|
+
const objective = spec?.objective ?? `Execute the ${role} portion of the task with a concrete, role-specific mandate.`;
|
|
1151
|
+
return {
|
|
1152
|
+
role,
|
|
1153
|
+
summary: spec?.summary ?? humanizeRole(role),
|
|
1154
|
+
objective,
|
|
1155
|
+
acceptanceCriteria: spec?.acceptanceCriteria ?? [],
|
|
1156
|
+
suggestedArtifacts: spec?.suggestedArtifacts ?? [],
|
|
1157
|
+
dependsOn: spec?.dependsOn ?? []
|
|
1158
|
+
};
|
|
1159
|
+
});
|
|
1160
|
+
}
|
|
1161
|
+
const limit = typeof requestedAgents === "number" && Number.isFinite(requestedAgents) ? requestedAgents : parsed.agentCount ?? specs.length;
|
|
1162
|
+
const targetCount = Math.max(1, Math.round(limit));
|
|
1163
|
+
const normalized = specs.slice(0, targetCount);
|
|
1164
|
+
const fillerRoles = isAnalysisTask(task) ? targetCount === 1 ? ["researcher"] : targetCount === 2 ? ["researcher", "synthesizer"] : padRoleNames(
|
|
1165
|
+
["researcher", "analyst", "synthesizer"],
|
|
1166
|
+
targetCount,
|
|
1167
|
+
["reviewer", "fact-checker", "source-curator"],
|
|
1168
|
+
"research-role"
|
|
1169
|
+
) : targetCount === 1 ? ["implementer"] : targetCount === 2 ? ["architect", "implementer"] : targetCount === 3 ? ["architect", "implementer", "verifier"] : padRoleNames(
|
|
1170
|
+
["architect", "implementer", "verifier", "synthesizer"],
|
|
1171
|
+
targetCount,
|
|
1172
|
+
["integrator", "release-manager", "stabilizer"],
|
|
1173
|
+
"implementation-role"
|
|
1174
|
+
);
|
|
1175
|
+
while (normalized.length < targetCount) {
|
|
1176
|
+
const index = normalized.length;
|
|
1177
|
+
const role = fillerRoles[index] ?? `${isAnalysisTask(task) ? "research-role" : "implementation-role"}-${index + 1}`;
|
|
1178
|
+
normalized.push({
|
|
1179
|
+
role,
|
|
1180
|
+
summary: humanizeRole(role),
|
|
1181
|
+
objective: `Complete the ${role} portion of "${task.trim()}" with a clear, role-specific mandate.`,
|
|
1182
|
+
acceptanceCriteria: [
|
|
1183
|
+
"Role-specific deliverable produced",
|
|
1184
|
+
"Work is aligned with the task context"
|
|
1185
|
+
],
|
|
1186
|
+
suggestedArtifacts: ["handoff-notes.md"],
|
|
1187
|
+
dependsOn: index === 0 ? [] : [normalized[0]?.role ?? role]
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
return normalized;
|
|
1191
|
+
}
|
|
1192
|
+
buildHeuristicPlan(task, domain, options) {
|
|
1193
|
+
const hasAnalysisSignals = isAnalysisTask(task);
|
|
1194
|
+
const explicitRoles = options.roles && options.roles.length > 0 ? options.roles : void 0;
|
|
1195
|
+
if (hasAnalysisSignals) {
|
|
1196
|
+
const plan2 = synthesizeAnalysisPlan(
|
|
1197
|
+
task,
|
|
1198
|
+
domain,
|
|
1199
|
+
options.agents,
|
|
1200
|
+
explicitRoles,
|
|
1201
|
+
options.planningMode
|
|
1202
|
+
);
|
|
1203
|
+
return {
|
|
1204
|
+
...plan2,
|
|
1205
|
+
planningMode: options.planningMode
|
|
1206
|
+
};
|
|
1207
|
+
}
|
|
1208
|
+
const plan = synthesizeImplementationPlan(
|
|
1209
|
+
task,
|
|
1210
|
+
domain,
|
|
1211
|
+
options.agents,
|
|
1212
|
+
explicitRoles,
|
|
1213
|
+
options.planningMode
|
|
1214
|
+
);
|
|
1215
|
+
return {
|
|
1216
|
+
...plan,
|
|
1217
|
+
planningMode: options.planningMode
|
|
1218
|
+
};
|
|
1219
|
+
}
|
|
1220
|
+
async validateDependencies(plan) {
|
|
1221
|
+
return inferDependencies(plan.subtasks);
|
|
1222
|
+
}
|
|
1223
|
+
};
|
|
1224
|
+
|
|
1225
|
+
export {
|
|
1226
|
+
getDecompositionRecoveryPlan,
|
|
1227
|
+
filterAvailable,
|
|
1228
|
+
selectNext,
|
|
1229
|
+
DomainAwareSwarmPlanner
|
|
1230
|
+
};
|
|
1231
|
+
//# sourceMappingURL=chunk-HQXYYUNY.js.map
|