@poetic-ai/poetic 1.42.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-JIMGP3LY.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-LUJPINLJ.js +322 -0
- package/dist/agent-ingest-3DJUJ7FU.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-5QT5QJVU.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-JULUCUIK.js +489 -0
- package/dist/api-transport-4TYTNLTJ.js +1087 -0
- package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-HWVV6QFR.js +135 -0
- package/dist/auth-5KEDKAPP.js +67 -0
- package/dist/auth-7TT3JINV.js +78 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-H3XDZE22.js +134 -0
- package/dist/auth-OC4E6633.js +71 -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-VPRWOWGU.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
- package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
- package/dist/autoloop-helpers-2KTK43GL.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-J2VKKBXQ.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-PW4XVFGQ.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-VCSBJVRN.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-YHGRB4QB.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-23A26CSN.js +123 -0
- package/dist/chunk-27UTJD3M.js +265 -0
- package/dist/chunk-2A5CILN3.js +310 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2BZ53J6J.js +2344 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2EIA4RBE.js +659 -0
- package/dist/chunk-2IUXIGQD.js +1064 -0
- package/dist/chunk-2N42MS2Z.js +2193 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2QLYTVYX.js +791 -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-34CNP2HB.js +148 -0
- package/dist/chunk-35P3W3JX.js +456 -0
- package/dist/chunk-36PEBZAF.js +18 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -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-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3ZPQLGV7.js +2904 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -0
- package/dist/chunk-4BOP7T6L.js +2321 -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-4GSN5O5J.js +62 -0
- package/dist/chunk-4HN6DF7V.js +1027 -0
- package/dist/chunk-4IAPOG5V.js +415 -0
- package/dist/chunk-4IYIZQWV.js +48 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4RCCF5BR.js +712 -0
- package/dist/chunk-4V7NAQ4R.js +19527 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4YX7J6QL.js +1859 -0
- package/dist/chunk-527OBWQB.js +338 -0
- package/dist/chunk-5D4A7E3D.js +448 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5H72XE4H.js +256 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5LTN43AS.js +1972 -0
- package/dist/chunk-5RBHQYDB.js +2206 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-5ZCXC23G.js +595 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -0
- package/dist/chunk-6VWVO2TU.js +3746 -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-73BBJOKA.js +263 -0
- package/dist/chunk-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DHRDWFS.js +3104 -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-7GPCEFUV.js +270 -0
- package/dist/chunk-7IL4A2PP.js +948 -0
- package/dist/chunk-7MMLMXO6.js +3679 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7T7RUJI7.js +949 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-ACDIT7OP.js +1376 -0
- package/dist/chunk-ACKIPAOJ.js +302 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -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-AURFMVCD.js +899 -0
- package/dist/chunk-AX6GWE7V.js +47 -0
- package/dist/chunk-AY5EWJPF.js +385 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BBPSTTPA.js +1004 -0
- package/dist/chunk-BDATUDDJ.js +992 -0
- package/dist/chunk-BKE5PG5L.js +20414 -0
- package/dist/chunk-BLPHWMDK.js +797 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BXGMAU4A.js +396 -0
- package/dist/chunk-BXI4NXL3.js +507 -0
- package/dist/chunk-BZU2O43F.js +1125 -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-CJC6GZ46.js +457 -0
- package/dist/chunk-CKCDGXIV.js +408 -0
- package/dist/chunk-CKNX3TTP.js +10338 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CP7H3HSP.js +1552 -0
- package/dist/chunk-CPLEWXNZ.js +66 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CS6P76D3.js +103 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CUSRN6RJ.js +632 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-D5RYINO7.js +412 -0
- package/dist/chunk-DBFS4HMH.js +751 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCBZP442.js +9243 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DDMAFNUK.js +5351 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DJFW7SMX.js +348 -0
- package/dist/chunk-DQFLLBJW.js +121 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-DXH5JBRS.js +437 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EI57M5BI.js +194 -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-ETYDXCK7.js +679 -0
- package/dist/chunk-EYRH3W74.js +239 -0
- package/dist/chunk-F23DIWNN.js +1024 -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-FD4ERYEG.js +22 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FHOWVDF5.js +1342 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FONNFJXA.js +137 -0
- package/dist/chunk-FQ7FSZRW.js +75 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-FYOILAN5.js +6818 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G3L2L5XZ.js +49 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GFGYB2ZU.js +1689 -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-GK37ILCX.js +1231 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNVDBVJP.js +156 -0
- package/dist/chunk-GPEL3FBM.js +924 -0
- package/dist/chunk-GPSNGPZS.js +1604 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GSUQJJXQ.js +331 -0
- package/dist/chunk-GSV226X6.js +110 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H66DXFS5.js +1374 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-H7ZEFECA.js +316 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HX5P3CSP.js +1784 -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-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -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-IRFBN336.js +878 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IV2RVAN7.js +1356 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-J3UUR7DE.js +210 -0
- package/dist/chunk-J54VUAY2.js +566 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -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-JQNJB2BB.js +2440 -0
- package/dist/chunk-JRVNSWSQ.js +2626 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-JZKNBBIB.js +152 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-K65546RE.js +183 -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-KP6YILMU.js +482 -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-KZ5CJVBP.js +1813 -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-LG3PDRTR.js +2872 -0
- package/dist/chunk-LGHII5ET.js +23 -0
- package/dist/chunk-LH5QY22X.js +1205 -0
- package/dist/chunk-LIVJ6266.js +438 -0
- package/dist/chunk-LKRAR3IH.js +276 -0
- package/dist/chunk-LO23NABI.js +3063 -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-LRGMHROI.js +79 -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-M3HQYKQX.js +308 -0
- package/dist/chunk-M6GVSPEH.js +1016 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MHLCBZJB.js +328 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MOEY65Z6.js +5678 -0
- package/dist/chunk-MQ4WA34C.js +206 -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-N4VTRA7K.js +131 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-N65O4XTH.js +5011 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NJVD4PWE.js +1033 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NN4PJDHP.js +708 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NRNE225N.js +1270 -0
- package/dist/chunk-NS2K2GTP.js +605 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NSHASMZZ.js +71 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-NZGDAWIP.js +1905 -0
- package/dist/chunk-O47UOKU3.js +395 -0
- package/dist/chunk-O4G2W3ST.js +9831 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OA4GPILI.js +624 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -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-OYZYO7TV.js +47 -0
- package/dist/chunk-OZ4REHIN.js +4386 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P5I4X7A7.js +353 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PCAGC5MR.js +1763 -0
- package/dist/chunk-PFTQBXS6.js +5181 -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-PL37JDNA.js +189 -0
- package/dist/chunk-PTH5E5XO.js +195 -0
- package/dist/chunk-PW6AXLQC.js +4128 -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-Q5XIXSHX.js +271 -0
- package/dist/chunk-QGJDMEOV.js +34 -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-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R35PEUKH.js +511 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6MLCREW.js +44 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-R7XDDX2A.js +4007 -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-RJAAKDRX.js +17 -0
- package/dist/chunk-ROMHOSMQ.js +185 -0
- package/dist/chunk-RWREC3KJ.js +517 -0
- package/dist/chunk-RYNETRDJ.js +118 -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-S5OIDFRM.js +302 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SLS2N4PH.js +2213 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQQTDDQA.js +537 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T5E4NQCM.js +5742 -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-TGQZHDY2.js +2373 -0
- package/dist/chunk-TJJZ2OKV.js +6783 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U6C3VVWS.js +13 -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-UMAKSB4Z.js +284 -0
- package/dist/chunk-UR2IBGIM.js +521 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVJ4PJDK.js +4533 -0
- package/dist/chunk-V53UG2OT.js +9924 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VPHVFK4A.js +1984 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VTW7HP3R.js +100 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VVLLL7I4.js +166 -0
- package/dist/chunk-VX3UMWB7.js +483 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3JMT2YY.js +712 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WIFZCHEG.js +12566 -0
- package/dist/chunk-WIRN3F75.js +736 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WTOKKE2V.js +784 -0
- package/dist/chunk-WX5IRLF6.js +740 -0
- package/dist/chunk-WZ6U3O7I.js +1581 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XEP5NQ5Y.js +688 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XNO4FM6X.js +1124 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XPK2I4NC.js +405 -0
- package/dist/chunk-XPU2XADL.js +2175 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XTXJGGUV.js +351 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-XZYR5EDO.js +152 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5VN7DMP.js +112 -0
- package/dist/chunk-Y67VAHN4.js +459 -0
- package/dist/chunk-YAXSKEUH.js +3544 -0
- package/dist/chunk-YB3JD4E6.js +975 -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-YTYIEZQY.js +119 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-Z2CUQDAR.js +3429 -0
- package/dist/chunk-Z2KYOFHS.js +7000 -0
- package/dist/chunk-Z6PC7QX6.js +161 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZSKKMTQJ.js +554 -0
- package/dist/chunk-ZTT5IVPY.js +1160 -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-IXL26KJT.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-P7CRJF5N.js +202 -0
- package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
- package/dist/compete-request-62JESVET.js +364 -0
- package/dist/compete-results-QEPG6FZX.js +208 -0
- package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
- package/dist/config-JCOKXOQT.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-7T4E2BQO.js +67 -0
- package/dist/config-validator-KKOHOW7O.js +72 -0
- package/dist/cost-YC42XUF3.js +53 -0
- package/dist/coverage-orchestrator-CISNKJC2.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-GJOYE7AE.js +186 -0
- package/dist/domain-analyzer-AWF3RP6E.js +29 -0
- package/dist/ensure-initialized-744DIZEZ.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-YS45U5ZI.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-MKTCEGSA.js +130 -0
- package/dist/evaluation-context-KV4GZNN7.js +35 -0
- package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
- package/dist/execution-data-writer-3ODTBDLH.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-R3DPPMD3.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-XBN7DFIM.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
- package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
- package/dist/flywheel-executor-6JFLA6J5.js +369 -0
- package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-XEY5SHM6.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-DPVWWIYY.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4LXEKJTA.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 +108661 -0
- package/dist/instructions-6BURLQJC.js +64 -0
- package/dist/invoke-provider-auth-GRUYP44M.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-BJRFLGK4.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
- package/dist/local-executor-CEHWE2PL.js +223 -0
- package/dist/logger-33TR6EE5.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-6UDN5X3F.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-XGYBG2DW.js +72 -0
- package/dist/next-PB5ZXZKB.js +90 -0
- package/dist/next-ZBDK725T.js +69 -0
- package/dist/optimization-config-resolver-O6WKR47U.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-VAGYBV3J.js +270 -0
- package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
- package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
- package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
- package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
- package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
- package/dist/planning-backlog-3CQ5QQBQ.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-SE5EVXAP.js +149 -0
- package/dist/prompts-WZZPGWBX.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-N5X57V3Y.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-YRHMQAEI.js +70 -0
- package/dist/quickstart-FIRLKGJI.js +62 -0
- package/dist/readiness-VZTMSG6J.js +96 -0
- package/dist/registry-YODFY77A.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-D6TX6FRG.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-F5WQEUOM.js +160 -0
- package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-CS2TNGHA.js +1092 -0
- package/dist/runner-HHH7ZN2Z.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-7SV3HGG3.js +60 -0
- package/dist/sandbox-32QXJEMV.js +81 -0
- package/dist/sandbox-RSO7VP6V.js +94 -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-UIXPYOXQ.js +338 -0
- package/dist/sprint-bridge-4BHMSC3M.js +68 -0
- package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
- package/dist/sprint-manager-IDQUDNQI.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-XD6EDVHF.js +185 -0
- package/dist/task-classifier-LNLXSHOM.js +494 -0
- package/dist/task-list-fast-PTMA4LUC.js +147 -0
- package/dist/task-manager-XAT7GOWB.js +93 -0
- package/dist/task-splitter-U7DJ7W6A.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-KKNQYSB4.js +42 -0
- package/dist/telemetry-5HWBBXLX.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-XUOZNZZ6.js +125 -0
- package/dist/token-estimator-MEQUL3EJ.js +37 -0
- package/dist/transports-KNSSV2V4.js +255 -0
- package/dist/unified-cost-tracker-4TFRBVPR.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-KLRNG6XA.js +33 -0
- package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-KUWKBLAH.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-JE2FSAQS.js +233 -0
- package/dist/verification-toolchains-V24UHW6Q.js +28 -0
- package/dist/verify-commands-H3DTCSGI.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-7SA2VS2Y.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 +7042 -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/npm-shrinkwrap.json +4950 -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,842 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-attempt service for BB custom task authoring and task relationships.
|
|
3
|
+
*
|
|
4
|
+
* Poetic is the only mutation and sync authority. This service:
|
|
5
|
+
*
|
|
6
|
+
* - validates the request against the closed authoring vocabulary and refuses
|
|
7
|
+
* any status, lifecycle, execution, or filesystem field before launch;
|
|
8
|
+
* - revalidates entity identity against a fresh Poetic read immediately before
|
|
9
|
+
* spawning, so a missing, archived, changed, or drifted entity is refused
|
|
10
|
+
* rather than mutated blind;
|
|
11
|
+
* - runs exactly one fixed argv, once, in the selected repository cwd, with
|
|
12
|
+
* `shell: false` and managed sync left on. Nothing is ever retried;
|
|
13
|
+
* - reads authority in one order — Poetic's structured outcome, then the fresh
|
|
14
|
+
* canonical reread, then the exit code — and always rereads, including after
|
|
15
|
+
* a nonzero exit or a timeout;
|
|
16
|
+
* - never predicts identity, status, membership, capacity, or push success.
|
|
17
|
+
*
|
|
18
|
+
* The runner and the canonical reads are injected. This module builds no
|
|
19
|
+
* transport of its own, resolves no executable, registers no RPC method, and
|
|
20
|
+
* imports nothing from the shared adapter, model, contract, server, app, or
|
|
21
|
+
* route modules.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { z } from 'zod';
|
|
25
|
+
import type { planningWorkspaceProjectionSchema } from './planning-workspace-schema.js';
|
|
26
|
+
import { repositorySchema } from './repository-schema.js';
|
|
27
|
+
import {
|
|
28
|
+
ProcessLocalTaskAuthoringAdmission,
|
|
29
|
+
taskAuthoringAdmissionScope,
|
|
30
|
+
taskAuthoringArgv,
|
|
31
|
+
taskAuthoringConsentRefusal,
|
|
32
|
+
taskAuthoringCreateEffect,
|
|
33
|
+
taskAuthoringDeclaredIdentities,
|
|
34
|
+
taskAuthoringDeniedInputKeys,
|
|
35
|
+
taskAuthoringDescriptionPrepopulation,
|
|
36
|
+
taskAuthoringRequestedIdentities,
|
|
37
|
+
taskAuthoringSyncState,
|
|
38
|
+
taskAuthoringSyncWarnings,
|
|
39
|
+
} from './task-authoring-model.js';
|
|
40
|
+
import {
|
|
41
|
+
type ApplyTaskAuthoringInput,
|
|
42
|
+
type ApplyTaskAuthoringOutput,
|
|
43
|
+
applyTaskAuthoringInputSchema,
|
|
44
|
+
applyTaskAuthoringOutputSchema,
|
|
45
|
+
TASK_AUTHORING_DISCLOSURE,
|
|
46
|
+
TASK_AUTHORING_MAX_DIAGNOSTIC_CHARS,
|
|
47
|
+
TASK_AUTHORING_MAX_OUTPUT_BYTES,
|
|
48
|
+
TASK_AUTHORING_MUTATION_TIMEOUT_MS,
|
|
49
|
+
TASK_AUTHORING_OUTCOME_VERSION,
|
|
50
|
+
type TaskAuthoringAction,
|
|
51
|
+
type TaskAuthoringCommandEvidence,
|
|
52
|
+
type TaskAuthoringEffect,
|
|
53
|
+
type TaskAuthoringRefusal,
|
|
54
|
+
type TaskAuthoringRefusalReason,
|
|
55
|
+
type TaskAuthoringRereads,
|
|
56
|
+
type TaskAuthoringResult,
|
|
57
|
+
type TaskAuthoringSprintFacts,
|
|
58
|
+
type TaskCreateIdentityEnvelope,
|
|
59
|
+
taskCreateIdentityEnvelopeSchema,
|
|
60
|
+
taskDescriptionEnvelopeSchema,
|
|
61
|
+
} from './task-authoring-schema.js';
|
|
62
|
+
import type { GetTaskDetailOutput } from './task-detail-schema.js';
|
|
63
|
+
|
|
64
|
+
type Repository = z.infer<typeof repositorySchema>;
|
|
65
|
+
type PlanningWorkspaceProjection = z.infer<typeof planningWorkspaceProjectionSchema>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The one command shape this service may ask for: the Poetic executable, a fixed
|
|
69
|
+
* argv, the selected repository cwd, the mutation timeout, no shell, and a
|
|
70
|
+
* bounded capture. There is no field for env, executable path, or a shell
|
|
71
|
+
* string, so no caller value can become one.
|
|
72
|
+
*/
|
|
73
|
+
export interface TaskAuthoringCommand {
|
|
74
|
+
file: 'poetic';
|
|
75
|
+
args: readonly string[];
|
|
76
|
+
cwd: string;
|
|
77
|
+
timeoutMs: typeof TASK_AUTHORING_MUTATION_TIMEOUT_MS;
|
|
78
|
+
shell: false;
|
|
79
|
+
maxOutputBytes: typeof TASK_AUTHORING_MAX_OUTPUT_BYTES;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* What the injected runner reports. `timedOut` is explicit because a timeout is
|
|
84
|
+
* an undetermined effect, not a failure, and `exitCode` is null when the process
|
|
85
|
+
* produced no status.
|
|
86
|
+
*/
|
|
87
|
+
export interface TaskAuthoringCommandResult {
|
|
88
|
+
exitCode: number | null;
|
|
89
|
+
stdout: string;
|
|
90
|
+
stderr: string;
|
|
91
|
+
timedOut: boolean;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type TaskAuthoringRunner = (
|
|
95
|
+
command: TaskAuthoringCommand
|
|
96
|
+
) => Promise<TaskAuthoringCommandResult>;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A canonical task read: Poetic's versioned task-detail projection plus the
|
|
100
|
+
* `taskDescriptionV1` sibling when Poetic published one. The sibling is the only
|
|
101
|
+
* permitted prepopulation source for a Description replacement.
|
|
102
|
+
*/
|
|
103
|
+
export interface TaskAuthoringTaskReadValue {
|
|
104
|
+
detail: GetTaskDetailOutput;
|
|
105
|
+
description: { taskId: string; description: string } | null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type TaskAuthoringTaskRead = (
|
|
109
|
+
repository: Repository,
|
|
110
|
+
taskId: string
|
|
111
|
+
) => Promise<TaskAuthoringTaskReadValue>;
|
|
112
|
+
|
|
113
|
+
/** A canonical sprint read. `null` means Poetic reports no such sprint. */
|
|
114
|
+
export type TaskAuthoringSprintRead = (
|
|
115
|
+
repository: Repository,
|
|
116
|
+
sprintId: string
|
|
117
|
+
) => Promise<TaskAuthoringSprintFacts | null>;
|
|
118
|
+
|
|
119
|
+
/** The planning workspace projection: the only source of sync evidence. */
|
|
120
|
+
export type TaskAuthoringWorkspaceRead = (
|
|
121
|
+
repository: Repository
|
|
122
|
+
) => Promise<PlanningWorkspaceProjection>;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Last gate before a mutation: Git's own current root and branch must still be
|
|
126
|
+
* the selected repository identity. Optional because the owning surface may
|
|
127
|
+
* already hold that gate; when supplied it runs immediately before the spawn.
|
|
128
|
+
*/
|
|
129
|
+
export type TaskAuthoringRepositoryGate = (repository: Repository) => Promise<void>;
|
|
130
|
+
|
|
131
|
+
export interface TaskAuthoringDependencies {
|
|
132
|
+
run: TaskAuthoringRunner;
|
|
133
|
+
readTask: TaskAuthoringTaskRead;
|
|
134
|
+
readSprint: TaskAuthoringSprintRead;
|
|
135
|
+
readWorkspace: TaskAuthoringWorkspaceRead;
|
|
136
|
+
requireFreshRepositoryIdentity?: TaskAuthoringRepositoryGate;
|
|
137
|
+
admission?: ProcessLocalTaskAuthoringAdmission;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
type Unavailable = { state: 'unavailable'; reason: string };
|
|
141
|
+
type Available<T> = { state: 'available'; value: T };
|
|
142
|
+
|
|
143
|
+
function refused(
|
|
144
|
+
reason: TaskAuthoringRefusalReason,
|
|
145
|
+
message: string,
|
|
146
|
+
action: TaskAuthoringAction | null
|
|
147
|
+
): TaskAuthoringRefusal {
|
|
148
|
+
return { state: 'refused', reason, message, action };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function errorReason(error: unknown): string {
|
|
152
|
+
if (error instanceof Error && error.message.length > 0) return error.message;
|
|
153
|
+
const text = String(error);
|
|
154
|
+
return text.length > 0 ? text : 'unknown error';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function timeoutError(error: unknown): boolean {
|
|
158
|
+
if (!error || typeof error !== 'object') return false;
|
|
159
|
+
const value = error as { code?: unknown; name?: unknown };
|
|
160
|
+
return value.code === 'ETIMEDOUT' || value.name === 'TimeoutError';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Bound one captured stream before it is parsed or disclosed. The runner owns
|
|
165
|
+
* the real capture ceiling; this is the second bound, so an oversized capture
|
|
166
|
+
* cannot be parsed or echoed in full.
|
|
167
|
+
*/
|
|
168
|
+
function boundedCapture(value: string): string {
|
|
169
|
+
return value.length > TASK_AUTHORING_MAX_OUTPUT_BYTES
|
|
170
|
+
? value.slice(0, TASK_AUTHORING_MAX_OUTPUT_BYTES)
|
|
171
|
+
: value;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Diagnostics for the current invocation only, truncated for disclosure. */
|
|
175
|
+
function currentInvocationDiagnostic(value: string): string | null {
|
|
176
|
+
const trimmed = value.trim();
|
|
177
|
+
if (trimmed.length === 0) return null;
|
|
178
|
+
return trimmed.slice(-TASK_AUTHORING_MAX_DIAGNOSTIC_CHARS);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Find Poetic's `taskCreateV1` envelope on stdout. Only whole JSON objects are
|
|
183
|
+
* considered, and a malformed line is skipped rather than guessed at; the CLI
|
|
184
|
+
* writes the envelope as one line.
|
|
185
|
+
*/
|
|
186
|
+
function findTaskCreateEnvelope(stdout: string): TaskCreateIdentityEnvelope | null {
|
|
187
|
+
for (const line of stdout.split('\n')) {
|
|
188
|
+
const candidate = line.trim();
|
|
189
|
+
if (!candidate.startsWith('{') || !candidate.includes('taskCreateV1')) continue;
|
|
190
|
+
let parsed: unknown;
|
|
191
|
+
try {
|
|
192
|
+
parsed = JSON.parse(candidate);
|
|
193
|
+
} catch {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (typeof parsed !== 'object' || parsed === null || !('taskCreateV1' in parsed)) continue;
|
|
197
|
+
const envelope = taskCreateIdentityEnvelopeSchema.safeParse(
|
|
198
|
+
(parsed as { taskCreateV1: unknown }).taskCreateV1
|
|
199
|
+
);
|
|
200
|
+
if (!envelope.success) return null;
|
|
201
|
+
if (envelope.data.schemaVersion.split('.')[0] !== '1') return null;
|
|
202
|
+
return envelope.data;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export class TaskAuthoringService {
|
|
208
|
+
private readonly admission: ProcessLocalTaskAuthoringAdmission;
|
|
209
|
+
|
|
210
|
+
constructor(private readonly dependencies: TaskAuthoringDependencies) {
|
|
211
|
+
this.admission = dependencies.admission ?? new ProcessLocalTaskAuthoringAdmission();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Apply one authoring action.
|
|
216
|
+
*
|
|
217
|
+
* A request that never reached a process is returned as a refusal, which the
|
|
218
|
+
* registering surface may map to an RPC error. Once a process has run, the
|
|
219
|
+
* outcome envelope is always returned — including on a nonzero exit or a
|
|
220
|
+
* timeout — so partial-effect evidence is never discarded.
|
|
221
|
+
*/
|
|
222
|
+
async apply(repositoryValue: unknown, requestValue: unknown): Promise<TaskAuthoringResult> {
|
|
223
|
+
const repository = repositorySchema.parse(repositoryValue);
|
|
224
|
+
const declaredAction =
|
|
225
|
+
typeof requestValue === 'object' &&
|
|
226
|
+
requestValue !== null &&
|
|
227
|
+
'action' in requestValue &&
|
|
228
|
+
typeof (requestValue as { action: unknown }).action === 'string'
|
|
229
|
+
? ((requestValue as { action: string }).action as TaskAuthoringAction)
|
|
230
|
+
: null;
|
|
231
|
+
|
|
232
|
+
// Reported before schema validation so an attempt to reach a status,
|
|
233
|
+
// lifecycle, or excluded execution surface is named rather than reduced to a
|
|
234
|
+
// generic invalid-request.
|
|
235
|
+
const denied =
|
|
236
|
+
typeof requestValue === 'object' && requestValue !== null && 'input' in requestValue
|
|
237
|
+
? taskAuthoringDeniedInputKeys((requestValue as { input: unknown }).input)
|
|
238
|
+
: [];
|
|
239
|
+
if (denied.length > 0) {
|
|
240
|
+
return refused(
|
|
241
|
+
'lifecycle-field',
|
|
242
|
+
`Task authoring does not accept ${denied.join(', ')}. Status and lifecycle transitions, time logging, task splitting, and generic execution or filesystem fields are not part of this vocabulary. No command was launched.`,
|
|
243
|
+
declaredAction
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const parsed = applyTaskAuthoringInputSchema.safeParse(requestValue);
|
|
248
|
+
if (!parsed.success) {
|
|
249
|
+
return refused('invalid-request', 'Invalid task authoring request.', declaredAction);
|
|
250
|
+
}
|
|
251
|
+
const request = parsed.data;
|
|
252
|
+
|
|
253
|
+
if (repository.state === 'blocked') {
|
|
254
|
+
return refused(
|
|
255
|
+
'repository-not-ready',
|
|
256
|
+
`Poetic reports the selected repository is not ready: ${repository.messages.join(' ') || 'no detail reported'}. No command was launched.`,
|
|
257
|
+
request.action
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
if (
|
|
261
|
+
request.projectId !== repository.projectId ||
|
|
262
|
+
request.sourceId !== repository.sourceId ||
|
|
263
|
+
request.expected.repositoryPath !== repository.path ||
|
|
264
|
+
request.expected.branch !== repository.branch
|
|
265
|
+
) {
|
|
266
|
+
return refused(
|
|
267
|
+
'repository-mismatch',
|
|
268
|
+
'The request does not identify the selected repository and branch. No command was launched.',
|
|
269
|
+
request.action
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const declaredIdentities = taskAuthoringDeclaredIdentities(request);
|
|
274
|
+
const expectedIdentities = [...new Set(request.expected.entityIds)].sort();
|
|
275
|
+
if (
|
|
276
|
+
expectedIdentities.length !== declaredIdentities.length ||
|
|
277
|
+
expectedIdentities.some((id, index) => id !== declaredIdentities[index])
|
|
278
|
+
) {
|
|
279
|
+
return refused(
|
|
280
|
+
'expected-identity-mismatch',
|
|
281
|
+
'The acknowledged entity ids do not match the entities this action would touch. No command was launched.',
|
|
282
|
+
request.action
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const consentRefusal = taskAuthoringConsentRefusal(request);
|
|
287
|
+
if (consentRefusal !== null) {
|
|
288
|
+
return refused(consentRefusal.reason, consentRefusal.message, request.action);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const admissionScope = taskAuthoringAdmissionScope(repository.path, request);
|
|
292
|
+
let release: () => void;
|
|
293
|
+
try {
|
|
294
|
+
release = this.admission.claim(admissionScope);
|
|
295
|
+
} catch (error) {
|
|
296
|
+
return refused('already-in-flight', errorReason(error), request.action);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
try {
|
|
300
|
+
const gate = await this.revalidate(repository, request);
|
|
301
|
+
if (gate.state === 'refused') return gate.refusal;
|
|
302
|
+
|
|
303
|
+
if (this.dependencies.requireFreshRepositoryIdentity) {
|
|
304
|
+
try {
|
|
305
|
+
await this.dependencies.requireFreshRepositoryIdentity(repository);
|
|
306
|
+
} catch (error) {
|
|
307
|
+
return refused(
|
|
308
|
+
'repository-moved',
|
|
309
|
+
`The selected repository or branch no longer matches what was acknowledged (${errorReason(error)}). No command was launched.`,
|
|
310
|
+
request.action
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
state: 'completed',
|
|
317
|
+
outcome: await this.run(repository, request, gate.sprintIdForReread),
|
|
318
|
+
};
|
|
319
|
+
} finally {
|
|
320
|
+
// Released on every terminal path: refusal, command failure, reread
|
|
321
|
+
// failure, and success alike.
|
|
322
|
+
release();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Revalidate the entities this action addresses against a fresh Poetic read,
|
|
328
|
+
* immediately before launch. Every refusal here comes from Poetic's own
|
|
329
|
+
* evidence; BB never decides on its own that an entity moved.
|
|
330
|
+
*/
|
|
331
|
+
private async revalidate(
|
|
332
|
+
repository: Repository,
|
|
333
|
+
request: ApplyTaskAuthoringInput
|
|
334
|
+
): Promise<
|
|
335
|
+
| { state: 'refused'; refusal: TaskAuthoringRefusal }
|
|
336
|
+
| { state: 'admitted'; sprintIdForReread: string | null }
|
|
337
|
+
> {
|
|
338
|
+
if (request.action === 'createCustomTask') {
|
|
339
|
+
const sprintId = request.input.sprintId;
|
|
340
|
+
let sprint: TaskAuthoringSprintFacts | null;
|
|
341
|
+
try {
|
|
342
|
+
sprint = await this.dependencies.readSprint(repository, sprintId);
|
|
343
|
+
} catch (error) {
|
|
344
|
+
return {
|
|
345
|
+
state: 'refused',
|
|
346
|
+
refusal: refused(
|
|
347
|
+
'sprint-unavailable',
|
|
348
|
+
`Poetic could not describe sprint ${sprintId} (${errorReason(error)}), so no task was created.`,
|
|
349
|
+
request.action
|
|
350
|
+
),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
if (sprint === null) {
|
|
354
|
+
return {
|
|
355
|
+
state: 'refused',
|
|
356
|
+
refusal: refused(
|
|
357
|
+
'missing-identity',
|
|
358
|
+
`Poetic reports no sprint ${sprintId} in this repository, so no task was created.`,
|
|
359
|
+
request.action
|
|
360
|
+
),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
if (sprint.id !== sprintId) {
|
|
364
|
+
return {
|
|
365
|
+
state: 'refused',
|
|
366
|
+
refusal: refused(
|
|
367
|
+
'changed-identity',
|
|
368
|
+
`Poetic returned sprint ${sprint.id} while BB asked for ${sprintId}, so no task was created.`,
|
|
369
|
+
request.action
|
|
370
|
+
),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
const observedMembership = request.expected.observedSprintTaskIds;
|
|
374
|
+
if (observedMembership !== null && !sameMembership(observedMembership, sprint.taskIds)) {
|
|
375
|
+
return {
|
|
376
|
+
state: 'refused',
|
|
377
|
+
refusal: refused(
|
|
378
|
+
'membership-drift',
|
|
379
|
+
`Poetic's current membership for sprint ${sprintId} differs from the membership BB showed, so no task was created. Refresh the sprint and submit again.`,
|
|
380
|
+
request.action
|
|
381
|
+
),
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
return { state: 'admitted', sprintIdForReread: sprintId };
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
const taskId = request.input.taskId;
|
|
388
|
+
let read: TaskAuthoringTaskReadValue;
|
|
389
|
+
try {
|
|
390
|
+
read = await this.dependencies.readTask(repository, taskId);
|
|
391
|
+
} catch (error) {
|
|
392
|
+
return {
|
|
393
|
+
state: 'refused',
|
|
394
|
+
refusal: refused(
|
|
395
|
+
'task-unavailable',
|
|
396
|
+
`Poetic could not describe task ${taskId} (${errorReason(error)}). No command was launched.`,
|
|
397
|
+
request.action
|
|
398
|
+
),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
const detail = read.detail.task;
|
|
402
|
+
if (detail.state === 'missing') {
|
|
403
|
+
return {
|
|
404
|
+
state: 'refused',
|
|
405
|
+
refusal: refused(
|
|
406
|
+
'missing-identity',
|
|
407
|
+
`Poetic reports no managed task ${taskId} in this repository. No command was launched.`,
|
|
408
|
+
request.action
|
|
409
|
+
),
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
if (detail.state === 'unavailable') {
|
|
413
|
+
return {
|
|
414
|
+
state: 'refused',
|
|
415
|
+
refusal: refused(
|
|
416
|
+
'task-unavailable',
|
|
417
|
+
`Poetic could not describe task ${taskId} (${detail.reason}). No command was launched.`,
|
|
418
|
+
request.action
|
|
419
|
+
),
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
if (detail.value.id !== taskId) {
|
|
423
|
+
return {
|
|
424
|
+
state: 'refused',
|
|
425
|
+
refusal: refused(
|
|
426
|
+
'changed-identity',
|
|
427
|
+
`Poetic returned task detail for ${detail.value.id} while BB asked for ${taskId}. No command was launched.`,
|
|
428
|
+
request.action
|
|
429
|
+
),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
if (detail.value.location === 'archive') {
|
|
433
|
+
return {
|
|
434
|
+
state: 'refused',
|
|
435
|
+
refusal: refused(
|
|
436
|
+
'archived-identity',
|
|
437
|
+
`Poetic reports task ${taskId} is archived. Authoring does not edit archived tasks, and it never reopens one. No command was launched.`,
|
|
438
|
+
request.action
|
|
439
|
+
),
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
const observedUpdatedAt = request.expected.observedTaskUpdatedAt;
|
|
443
|
+
if (observedUpdatedAt !== null && detail.value.updated !== observedUpdatedAt) {
|
|
444
|
+
return {
|
|
445
|
+
state: 'refused',
|
|
446
|
+
refusal: refused(
|
|
447
|
+
'changed-identity',
|
|
448
|
+
`Poetic reports task ${taskId} changed after BB read it. Refresh the task and submit again; nothing was launched.`,
|
|
449
|
+
request.action
|
|
450
|
+
),
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
if (request.action === 'updateCustomTask' && request.input.description !== undefined) {
|
|
455
|
+
const prepopulation = taskAuthoringDescriptionPrepopulation(
|
|
456
|
+
taskId,
|
|
457
|
+
read.description === null
|
|
458
|
+
? {
|
|
459
|
+
state: 'unavailable',
|
|
460
|
+
reason: 'Poetic published no taskDescriptionV1 sibling for this task',
|
|
461
|
+
}
|
|
462
|
+
: { state: 'available', value: read.description }
|
|
463
|
+
);
|
|
464
|
+
if (prepopulation.state === 'unavailable') {
|
|
465
|
+
return {
|
|
466
|
+
state: 'refused',
|
|
467
|
+
refusal: refused(
|
|
468
|
+
'description-prepopulation-unavailable',
|
|
469
|
+
`${prepopulation.reason} No command was launched.`,
|
|
470
|
+
request.action
|
|
471
|
+
),
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (request.action === 'addTaskDependency') {
|
|
477
|
+
const endpointId = request.input.onTaskId;
|
|
478
|
+
let endpoint: TaskAuthoringTaskReadValue;
|
|
479
|
+
try {
|
|
480
|
+
endpoint = await this.dependencies.readTask(repository, endpointId);
|
|
481
|
+
} catch (error) {
|
|
482
|
+
return {
|
|
483
|
+
state: 'refused',
|
|
484
|
+
refusal: refused(
|
|
485
|
+
'task-unavailable',
|
|
486
|
+
`Poetic could not describe dependency endpoint ${endpointId} (${errorReason(error)}). No command was launched.`,
|
|
487
|
+
request.action
|
|
488
|
+
),
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
if (endpoint.detail.task.state === 'missing') {
|
|
492
|
+
return {
|
|
493
|
+
state: 'refused',
|
|
494
|
+
refusal: refused(
|
|
495
|
+
'missing-identity',
|
|
496
|
+
`Poetic reports no managed task ${endpointId} to depend on. No command was launched.`,
|
|
497
|
+
request.action
|
|
498
|
+
),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
if (endpoint.detail.task.state === 'unavailable') {
|
|
502
|
+
return {
|
|
503
|
+
state: 'refused',
|
|
504
|
+
refusal: refused(
|
|
505
|
+
'task-unavailable',
|
|
506
|
+
`Poetic could not describe dependency endpoint ${endpointId} (${endpoint.detail.task.reason}). No command was launched.`,
|
|
507
|
+
request.action
|
|
508
|
+
),
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
// A removal endpoint is deliberately not required to exist: Poetic treats
|
|
513
|
+
// removing a dependency it does not hold as a no-op, so refusing here would
|
|
514
|
+
// block cleanup of a dependency whose task is already gone.
|
|
515
|
+
|
|
516
|
+
return { state: 'admitted', sprintIdForReread: request.expected.observedSprintId };
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/** Run the single fixed attempt, then reread and report. */
|
|
520
|
+
private async run(
|
|
521
|
+
repository: Repository,
|
|
522
|
+
request: ApplyTaskAuthoringInput,
|
|
523
|
+
sprintIdForReread: string | null
|
|
524
|
+
): Promise<ApplyTaskAuthoringOutput> {
|
|
525
|
+
const argv = taskAuthoringArgv(request);
|
|
526
|
+
const command: TaskAuthoringCommand = {
|
|
527
|
+
file: 'poetic',
|
|
528
|
+
args: argv,
|
|
529
|
+
cwd: repository.path,
|
|
530
|
+
timeoutMs: TASK_AUTHORING_MUTATION_TIMEOUT_MS,
|
|
531
|
+
shell: false,
|
|
532
|
+
maxOutputBytes: TASK_AUTHORING_MAX_OUTPUT_BYTES,
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
let result: TaskAuthoringCommandResult | null = null;
|
|
536
|
+
let spawnFailure: { timedOut: boolean; reason: string } | null = null;
|
|
537
|
+
try {
|
|
538
|
+
const raw = await this.dependencies.run(command);
|
|
539
|
+
result = {
|
|
540
|
+
exitCode: raw.exitCode,
|
|
541
|
+
stdout: boundedCapture(raw.stdout),
|
|
542
|
+
stderr: boundedCapture(raw.stderr),
|
|
543
|
+
timedOut: raw.timedOut,
|
|
544
|
+
};
|
|
545
|
+
} catch (error) {
|
|
546
|
+
// One attempt only: a failure, a timeout, or an ambiguous completion is
|
|
547
|
+
// reported verbatim and never retried, because a retry could re-apply a
|
|
548
|
+
// mutation Poetic may already have committed.
|
|
549
|
+
spawnFailure = { timedOut: timeoutError(error), reason: errorReason(error) };
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
const integrityNotes: string[] = [];
|
|
553
|
+
const identityOutcome =
|
|
554
|
+
request.action === 'createCustomTask' && result !== null && !result.timedOut
|
|
555
|
+
? this.identityEvidence(request.input.sprintId, result.stdout, integrityNotes)
|
|
556
|
+
: null;
|
|
557
|
+
|
|
558
|
+
const classified = classify(
|
|
559
|
+
request.action,
|
|
560
|
+
request.action === 'createCustomTask' ? null : request.input.taskId,
|
|
561
|
+
result,
|
|
562
|
+
spawnFailure,
|
|
563
|
+
identityOutcome
|
|
564
|
+
);
|
|
565
|
+
const diagnostics =
|
|
566
|
+
result === null
|
|
567
|
+
? currentInvocationDiagnostic(spawnFailure?.reason ?? '')
|
|
568
|
+
: currentInvocationDiagnostic(`${result.stdout}\n${result.stderr}`);
|
|
569
|
+
|
|
570
|
+
const command_: TaskAuthoringCommandEvidence = {
|
|
571
|
+
state: classified.state,
|
|
572
|
+
attempts: 1,
|
|
573
|
+
argv,
|
|
574
|
+
exitCode: result?.exitCode ?? null,
|
|
575
|
+
diagnostics,
|
|
576
|
+
remoteSyncConfirmedByExitCode: false,
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
const createdTaskId = classified.effect.createdIdentities[0] ?? null;
|
|
580
|
+
const rereadTaskId =
|
|
581
|
+
request.action === 'createCustomTask' ? createdTaskId : request.input.taskId;
|
|
582
|
+
const rereads = await this.reread(repository, request, rereadTaskId, sprintIdForReread);
|
|
583
|
+
const workspace = await this.rereadWorkspace(repository);
|
|
584
|
+
|
|
585
|
+
this.collectIntegrityNotes(request, rereads, workspace, createdTaskId, integrityNotes);
|
|
586
|
+
|
|
587
|
+
return applyTaskAuthoringOutputSchema.parse({
|
|
588
|
+
outcomeVersion: TASK_AUTHORING_OUTCOME_VERSION,
|
|
589
|
+
repository,
|
|
590
|
+
disclosure: TASK_AUTHORING_DISCLOSURE,
|
|
591
|
+
action: request.action,
|
|
592
|
+
requestedIdentities: taskAuthoringRequestedIdentities(request),
|
|
593
|
+
command: command_,
|
|
594
|
+
identityOutcome,
|
|
595
|
+
effect: classified.effect,
|
|
596
|
+
sync: taskAuthoringSyncState(workspace),
|
|
597
|
+
syncWarnings:
|
|
598
|
+
workspace.state === 'available' ? taskAuthoringSyncWarnings(workspace.value) : [],
|
|
599
|
+
integrityNotes: [...new Set(integrityNotes)],
|
|
600
|
+
canonicalRereads: rereads,
|
|
601
|
+
workspace,
|
|
602
|
+
} satisfies ApplyTaskAuthoringOutput);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* Poetic's own identity evidence for a create. A missing, malformed, or
|
|
607
|
+
* internally inconsistent envelope is reported as no evidence at all: BB never
|
|
608
|
+
* substitutes the newest task it can see for the identity Poetic failed to
|
|
609
|
+
* publish.
|
|
610
|
+
*/
|
|
611
|
+
private identityEvidence(
|
|
612
|
+
sprintId: string,
|
|
613
|
+
stdout: string,
|
|
614
|
+
integrityNotes: string[]
|
|
615
|
+
): TaskCreateIdentityEnvelope | null {
|
|
616
|
+
const envelope = findTaskCreateEnvelope(stdout);
|
|
617
|
+
if (envelope === null) {
|
|
618
|
+
integrityNotes.push(
|
|
619
|
+
'Poetic published no usable taskCreateV1 identity envelope for this create, so whether a task was created is undetermined. BB did not infer an identity from any task list.'
|
|
620
|
+
);
|
|
621
|
+
return null;
|
|
622
|
+
}
|
|
623
|
+
if (envelope.sprintId !== sprintId) {
|
|
624
|
+
integrityNotes.push(
|
|
625
|
+
`Poetic's identity envelope names sprint ${envelope.sprintId} while BB asked for ${sprintId}, so the create is reported as undetermined.`
|
|
626
|
+
);
|
|
627
|
+
return null;
|
|
628
|
+
}
|
|
629
|
+
if (envelope.state === 'created' && envelope.taskId === null) {
|
|
630
|
+
integrityNotes.push(
|
|
631
|
+
'Poetic reported a created task without a task id, so the create is reported as undetermined.'
|
|
632
|
+
);
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
return envelope;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/** Perform this action's reread set. Failures are members, never exceptions. */
|
|
639
|
+
private async reread(
|
|
640
|
+
repository: Repository,
|
|
641
|
+
request: ApplyTaskAuthoringInput,
|
|
642
|
+
taskId: string | null,
|
|
643
|
+
sprintId: string | null
|
|
644
|
+
): Promise<TaskAuthoringRereads> {
|
|
645
|
+
const task: Available<GetTaskDetailOutput> | Unavailable = await (async () => {
|
|
646
|
+
if (taskId === null) {
|
|
647
|
+
return {
|
|
648
|
+
state: 'unavailable' as const,
|
|
649
|
+
reason:
|
|
650
|
+
'Poetic published no task identity for this action, so BB had no id to reread. It did not guess one.',
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
try {
|
|
654
|
+
const read = await this.dependencies.readTask(repository, taskId);
|
|
655
|
+
return { state: 'available' as const, value: read.detail };
|
|
656
|
+
} catch (error) {
|
|
657
|
+
return { state: 'unavailable' as const, reason: errorReason(error) };
|
|
658
|
+
}
|
|
659
|
+
})();
|
|
660
|
+
|
|
661
|
+
const description =
|
|
662
|
+
request.action === 'updateCustomTask' && request.input.description !== undefined
|
|
663
|
+
? await this.rereadDescription(repository, request.input.taskId)
|
|
664
|
+
: null;
|
|
665
|
+
|
|
666
|
+
const sprint =
|
|
667
|
+
sprintId === null
|
|
668
|
+
? null
|
|
669
|
+
: await (async (): Promise<Available<TaskAuthoringSprintFacts> | Unavailable> => {
|
|
670
|
+
try {
|
|
671
|
+
const facts = await this.dependencies.readSprint(repository, sprintId);
|
|
672
|
+
if (facts === null) {
|
|
673
|
+
return {
|
|
674
|
+
state: 'unavailable' as const,
|
|
675
|
+
reason: `Poetic reports no sprint ${sprintId} after this action.`,
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
return { state: 'available' as const, value: facts };
|
|
679
|
+
} catch (error) {
|
|
680
|
+
return { state: 'unavailable' as const, reason: errorReason(error) };
|
|
681
|
+
}
|
|
682
|
+
})();
|
|
683
|
+
|
|
684
|
+
return { task, sprint, description };
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
private async rereadDescription(
|
|
688
|
+
repository: Repository,
|
|
689
|
+
taskId: string
|
|
690
|
+
): Promise<Available<z.infer<typeof taskDescriptionEnvelopeSchema>> | Unavailable> {
|
|
691
|
+
try {
|
|
692
|
+
const read = await this.dependencies.readTask(repository, taskId);
|
|
693
|
+
if (read.description === null) {
|
|
694
|
+
return {
|
|
695
|
+
state: 'unavailable',
|
|
696
|
+
reason: `Poetic published no taskDescriptionV1 sibling for task ${taskId} after this action.`,
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
const envelope = taskDescriptionEnvelopeSchema.safeParse({
|
|
700
|
+
schemaVersion: '1.0.0',
|
|
701
|
+
taskId: read.description.taskId,
|
|
702
|
+
description: read.description.description,
|
|
703
|
+
});
|
|
704
|
+
if (!envelope.success) {
|
|
705
|
+
return {
|
|
706
|
+
state: 'unavailable',
|
|
707
|
+
reason: `Poetic published a malformed Description for task ${taskId} after this action.`,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
return { state: 'available', value: envelope.data };
|
|
711
|
+
} catch (error) {
|
|
712
|
+
return { state: 'unavailable', reason: errorReason(error) };
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
private async rereadWorkspace(
|
|
717
|
+
repository: Repository
|
|
718
|
+
): Promise<Available<PlanningWorkspaceProjection> | Unavailable> {
|
|
719
|
+
try {
|
|
720
|
+
return { state: 'available', value: await this.dependencies.readWorkspace(repository) };
|
|
721
|
+
} catch (error) {
|
|
722
|
+
return { state: 'unavailable', reason: errorReason(error) };
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* Integrity notes taken from the rereads. Each one reports what Poetic
|
|
728
|
+
* published; none of them repairs anything or asserts a status.
|
|
729
|
+
*/
|
|
730
|
+
private collectIntegrityNotes(
|
|
731
|
+
request: ApplyTaskAuthoringInput,
|
|
732
|
+
rereads: TaskAuthoringRereads,
|
|
733
|
+
workspace: Available<PlanningWorkspaceProjection> | Unavailable,
|
|
734
|
+
createdTaskId: string | null,
|
|
735
|
+
notes: string[]
|
|
736
|
+
): void {
|
|
737
|
+
if (rereads.task.state === 'unavailable') {
|
|
738
|
+
notes.push(`Poetic's task reread after this action was unavailable: ${rereads.task.reason}`);
|
|
739
|
+
} else if (rereads.task.value.task.state === 'missing') {
|
|
740
|
+
notes.push(
|
|
741
|
+
'Poetic reports no managed task at this id after the action. BB did not infer a completed, cancelled, or archived state.'
|
|
742
|
+
);
|
|
743
|
+
}
|
|
744
|
+
if (rereads.sprint?.state === 'unavailable') {
|
|
745
|
+
notes.push(
|
|
746
|
+
`Poetic's sprint reread after this action was unavailable: ${rereads.sprint.reason}`
|
|
747
|
+
);
|
|
748
|
+
}
|
|
749
|
+
if (rereads.description?.state === 'unavailable') {
|
|
750
|
+
notes.push(
|
|
751
|
+
`Poetic's Description reread after this action was unavailable: ${rereads.description.reason}`
|
|
752
|
+
);
|
|
753
|
+
}
|
|
754
|
+
if (workspace.state === 'unavailable') {
|
|
755
|
+
notes.push(`Poetic's planning workspace reread was unavailable: ${workspace.reason}`);
|
|
756
|
+
}
|
|
757
|
+
if (
|
|
758
|
+
createdTaskId !== null &&
|
|
759
|
+
rereads.sprint?.state === 'available' &&
|
|
760
|
+
!rereads.sprint.value.taskIds.includes(createdTaskId)
|
|
761
|
+
) {
|
|
762
|
+
notes.push(
|
|
763
|
+
`Poetic created task ${createdTaskId} but its sprint reread does not list it as a member. BB reports this and repairs nothing.`
|
|
764
|
+
);
|
|
765
|
+
}
|
|
766
|
+
if (
|
|
767
|
+
request.action === 'addTaskDependency' &&
|
|
768
|
+
rereads.task.state === 'available' &&
|
|
769
|
+
rereads.task.value.task.state === 'available' &&
|
|
770
|
+
!rereads.task.value.task.value.dependencies.some(
|
|
771
|
+
(dependency) => dependency.id === request.input.onTaskId
|
|
772
|
+
)
|
|
773
|
+
) {
|
|
774
|
+
notes.push(
|
|
775
|
+
`Poetic's task reread does not list ${request.input.onTaskId} among this task's dependencies.`
|
|
776
|
+
);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
function sameMembership(observed: readonly string[], current: readonly string[]): boolean {
|
|
782
|
+
const left = [...new Set(observed)].sort();
|
|
783
|
+
const right = [...new Set(current)].sort();
|
|
784
|
+
return left.length === right.length && left.every((id, index) => id === right[index]);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/**
|
|
788
|
+
* Command state and effect phase for one attempt.
|
|
789
|
+
*
|
|
790
|
+
* Authority order is fixed: Poetic's structured identity outcome decides a
|
|
791
|
+
* create; otherwise the exit code is the only report available, and a nonzero
|
|
792
|
+
* exit is reported as possibly partial rather than as "nothing happened".
|
|
793
|
+
*/
|
|
794
|
+
function classify(
|
|
795
|
+
action: TaskAuthoringAction,
|
|
796
|
+
addressedTaskId: string | null,
|
|
797
|
+
result: TaskAuthoringCommandResult | null,
|
|
798
|
+
spawnFailure: { timedOut: boolean; reason: string } | null,
|
|
799
|
+
identityOutcome: TaskCreateIdentityEnvelope | null
|
|
800
|
+
): { state: TaskAuthoringCommandEvidence['state']; effect: TaskAuthoringEffect } {
|
|
801
|
+
const affected = addressedTaskId === null ? [] : [addressedTaskId];
|
|
802
|
+
if (result === null) {
|
|
803
|
+
if (spawnFailure?.timedOut) {
|
|
804
|
+
return {
|
|
805
|
+
state: 'timed_out',
|
|
806
|
+
effect: { phase: 'unknown-after-timeout', createdIdentities: [], affectedIdentities: [] },
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
// The command never ran, so no managed state can have changed.
|
|
810
|
+
return {
|
|
811
|
+
state: 'failed',
|
|
812
|
+
effect: { phase: 'refused-before-effect', createdIdentities: [], affectedIdentities: [] },
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
if (result.timedOut) {
|
|
816
|
+
return {
|
|
817
|
+
state: 'timed_out',
|
|
818
|
+
effect: {
|
|
819
|
+
phase: 'unknown-after-timeout',
|
|
820
|
+
createdIdentities: [],
|
|
821
|
+
affectedIdentities: affected,
|
|
822
|
+
},
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
if (action === 'createCustomTask') return taskAuthoringCreateEffect(identityOutcome);
|
|
826
|
+
if (result.exitCode === 0) {
|
|
827
|
+
return {
|
|
828
|
+
state: 'succeeded',
|
|
829
|
+
effect: { phase: 'applied', createdIdentities: [], affectedIdentities: affected },
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
// A failed command may still have applied part of its change; nothing is
|
|
833
|
+
// retried, and the fresh reread is the only authority on what it did.
|
|
834
|
+
return {
|
|
835
|
+
state: 'failed',
|
|
836
|
+
effect: {
|
|
837
|
+
phase: 'failed-after-partial-effect',
|
|
838
|
+
createdIdentities: [],
|
|
839
|
+
affectedIdentities: affected,
|
|
840
|
+
},
|
|
841
|
+
};
|
|
842
|
+
}
|