@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,1356 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isProviderStderrOnlyRecoverableNoise,
|
|
3
|
+
stripAnsiControlSequences
|
|
4
|
+
} from "./chunk-MYLH2S4G.js";
|
|
5
|
+
import {
|
|
6
|
+
normalizeTokenUsage
|
|
7
|
+
} from "./chunk-7DNSNKJV.js";
|
|
8
|
+
import {
|
|
9
|
+
resolveProviderStreamingEnabled
|
|
10
|
+
} from "./chunk-HIO33P3G.js";
|
|
11
|
+
import {
|
|
12
|
+
buildProviderExecutionEnv
|
|
13
|
+
} from "./chunk-APV6MK5E.js";
|
|
14
|
+
import {
|
|
15
|
+
createLineDelimitedTmuxCompletionSignal,
|
|
16
|
+
executeProviderCommand
|
|
17
|
+
} from "./chunk-SQZRPY23.js";
|
|
18
|
+
import {
|
|
19
|
+
isSkipAuthEnvActive
|
|
20
|
+
} from "./chunk-4VJITV4P.js";
|
|
21
|
+
import {
|
|
22
|
+
createEngineMetadata
|
|
23
|
+
} from "./chunk-GHHFDU2U.js";
|
|
24
|
+
import {
|
|
25
|
+
resolveProviderCliCommand
|
|
26
|
+
} from "./chunk-SURZ2WFE.js";
|
|
27
|
+
import {
|
|
28
|
+
requireActivePolicyBoundary
|
|
29
|
+
} from "./chunk-2AICM4P3.js";
|
|
30
|
+
import {
|
|
31
|
+
mkPoeticTempDir
|
|
32
|
+
} from "./chunk-C57KJOUQ.js";
|
|
33
|
+
import {
|
|
34
|
+
ProviderExecutionError
|
|
35
|
+
} from "./chunk-LUVKFFWR.js";
|
|
36
|
+
import {
|
|
37
|
+
isDebugMode
|
|
38
|
+
} from "./chunk-EJGCZGUF.js";
|
|
39
|
+
import {
|
|
40
|
+
sanitizeString
|
|
41
|
+
} from "./chunk-LPITVM7M.js";
|
|
42
|
+
import {
|
|
43
|
+
POETIC_GROK_ALLOW_BROWSER_AUTH,
|
|
44
|
+
POETIC_GROK_AUTH_PROBE_TIMEOUT_MS,
|
|
45
|
+
POETIC_SKIP_AUTH,
|
|
46
|
+
readRawEnv
|
|
47
|
+
} from "./chunk-5DLKYTQX.js";
|
|
48
|
+
|
|
49
|
+
// src/core/providers/grok/auth.ts
|
|
50
|
+
import { readFile, rm, writeFile } from "fs/promises";
|
|
51
|
+
import path2 from "path";
|
|
52
|
+
|
|
53
|
+
// src/core/providers/grok/auth-file.ts
|
|
54
|
+
import { stat } from "fs/promises";
|
|
55
|
+
import { homedir } from "os";
|
|
56
|
+
import path from "path";
|
|
57
|
+
var GROK_AUTH_FILE_MIN_SIZE = 100;
|
|
58
|
+
var GROK_AUTH_FILE_MODE = 384;
|
|
59
|
+
function grokAuthFilePath(env) {
|
|
60
|
+
return path.join(env?.HOME?.trim() || homedir(), ".grok", "auth.json");
|
|
61
|
+
}
|
|
62
|
+
async function probeGrokAuthFile(env) {
|
|
63
|
+
try {
|
|
64
|
+
const info = await stat(grokAuthFilePath(env));
|
|
65
|
+
if (!info.isFile()) {
|
|
66
|
+
return "no";
|
|
67
|
+
}
|
|
68
|
+
if (info.size < GROK_AUTH_FILE_MIN_SIZE) {
|
|
69
|
+
return "no";
|
|
70
|
+
}
|
|
71
|
+
if (process.platform !== "win32") {
|
|
72
|
+
const permissionBits = info.mode & 511;
|
|
73
|
+
if (permissionBits !== GROK_AUTH_FILE_MODE) {
|
|
74
|
+
return "no";
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return "yes";
|
|
78
|
+
} catch (error) {
|
|
79
|
+
const code = error?.code;
|
|
80
|
+
if (code === "ENOENT") {
|
|
81
|
+
return "unknown";
|
|
82
|
+
}
|
|
83
|
+
if (code === "EACCES" || code === "EPERM") {
|
|
84
|
+
return "no";
|
|
85
|
+
}
|
|
86
|
+
return "unknown";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/core/providers/grok/cli-session-probe.ts
|
|
91
|
+
var GROK_CLI_PROBE_TIMEOUT_MS = 8e3;
|
|
92
|
+
var GROK_DONT_ASK_MIN_VERSION = "0.2.93";
|
|
93
|
+
function parseGrokCliVersion(raw) {
|
|
94
|
+
const match = raw.match(/\b(\d+)\.(\d+)\.(\d+)\b/);
|
|
95
|
+
return match ? match[0] : void 0;
|
|
96
|
+
}
|
|
97
|
+
function grokVersionAtLeast(version, minimum) {
|
|
98
|
+
const a = version.split(".").map((n) => Number.parseInt(n, 10));
|
|
99
|
+
const b = minimum.split(".").map((n) => Number.parseInt(n, 10));
|
|
100
|
+
if (a.some(Number.isNaN) || b.some(Number.isNaN)) return false;
|
|
101
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
102
|
+
const x = a[i] ?? 0;
|
|
103
|
+
const y = b[i] ?? 0;
|
|
104
|
+
if (x !== y) return x > y;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
var GROK_READ_ONLY_ALLOW_RULES = ["Read", "Grep", "Bash", "WebFetch", "WebSearch"];
|
|
109
|
+
var GROK_READ_ONLY_TOOLS = ["Read", "Grep", "Bash", "WebFetch", "WebSearch"];
|
|
110
|
+
var GROK_READ_ONLY_DISALLOWED_TOOLS = ["Edit", "Write"];
|
|
111
|
+
var GROK_READ_ONLY_DENY_RULES = ["MCPTool(*)"];
|
|
112
|
+
function grokResolvedHasLockedReadOnlyPosture(resolved) {
|
|
113
|
+
if (resolved.permissionMode !== "dontAsk") return false;
|
|
114
|
+
if (resolved.lockReadOnlyPosture !== true) return false;
|
|
115
|
+
if (resolved.alwaysApprove === true) return false;
|
|
116
|
+
if (!sameStringList(resolved.allowRules, GROK_READ_ONLY_ALLOW_RULES)) return false;
|
|
117
|
+
if (!sameStringList(resolved.tools, GROK_READ_ONLY_TOOLS)) return false;
|
|
118
|
+
if (!sameStringList(resolved.disallowedTools, GROK_READ_ONLY_DISALLOWED_TOOLS)) return false;
|
|
119
|
+
if (!sameStringList(resolved.denyRules, GROK_READ_ONLY_DENY_RULES)) return false;
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
function sameStringList(actual, expected) {
|
|
123
|
+
if (!actual || actual.length !== expected.length) return false;
|
|
124
|
+
return expected.every((value, index) => actual[index] === value);
|
|
125
|
+
}
|
|
126
|
+
var cachedDontAskSupport;
|
|
127
|
+
async function grokCliSupportsDontAsk(runVersionProbe) {
|
|
128
|
+
if (cachedDontAskSupport !== void 0) return cachedDontAskSupport;
|
|
129
|
+
try {
|
|
130
|
+
const raw = await runVersionProbe();
|
|
131
|
+
const version = parseGrokCliVersion(raw);
|
|
132
|
+
cachedDontAskSupport = version !== void 0 && grokVersionAtLeast(version, GROK_DONT_ASK_MIN_VERSION);
|
|
133
|
+
} catch {
|
|
134
|
+
cachedDontAskSupport = false;
|
|
135
|
+
}
|
|
136
|
+
return cachedDontAskSupport;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/core/providers/grok/env.ts
|
|
140
|
+
var GROK_CLI_PARENT_FALLBACK_KEYS = [
|
|
141
|
+
"HOME",
|
|
142
|
+
"PATH",
|
|
143
|
+
"PWD",
|
|
144
|
+
"SHELL",
|
|
145
|
+
"USER",
|
|
146
|
+
"LOGNAME",
|
|
147
|
+
"TMPDIR",
|
|
148
|
+
"TERM",
|
|
149
|
+
"LANG",
|
|
150
|
+
"LC_ALL",
|
|
151
|
+
"LC_CTYPE",
|
|
152
|
+
"XDG_CACHE_HOME",
|
|
153
|
+
"XDG_CONFIG_HOME",
|
|
154
|
+
"XDG_DATA_HOME",
|
|
155
|
+
"XDG_STATE_HOME"
|
|
156
|
+
];
|
|
157
|
+
function createGrokCliChildEnv(env) {
|
|
158
|
+
const childEnv = buildProviderExecutionEnv("grok", env);
|
|
159
|
+
for (const key of GROK_CLI_PARENT_FALLBACK_KEYS) {
|
|
160
|
+
const current = childEnv[key];
|
|
161
|
+
const isBlank = current === void 0 || current.trim() === "";
|
|
162
|
+
if (isBlank && process.env[key] !== void 0) {
|
|
163
|
+
childEnv[key] = process.env[key];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return childEnv;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// src/core/providers/grok/error-parser.ts
|
|
170
|
+
function resolveModelUsageIdentity(obj) {
|
|
171
|
+
const modelUsage = obj.modelUsage;
|
|
172
|
+
if (!modelUsage || typeof modelUsage !== "object" || Array.isArray(modelUsage)) {
|
|
173
|
+
return void 0;
|
|
174
|
+
}
|
|
175
|
+
const ids = Object.keys(modelUsage).filter((id) => id.trim().length > 0);
|
|
176
|
+
if (ids.length !== 1) return void 0;
|
|
177
|
+
return ids[0]?.replace(/-build$/, "");
|
|
178
|
+
}
|
|
179
|
+
var TERMINAL_SUCCESS_STOP_REASONS = /* @__PURE__ */ new Set(["endturn"]);
|
|
180
|
+
var ABORTED_STOP_REASONS = /* @__PURE__ */ new Set(["cancelled", "abort", "aborted"]);
|
|
181
|
+
function normalizeStopReason(stopReason) {
|
|
182
|
+
if (typeof stopReason !== "string") return void 0;
|
|
183
|
+
const normalized = stopReason.trim().toLowerCase().replace(/[\s._-]+/g, "");
|
|
184
|
+
return normalized.length > 0 ? normalized : void 0;
|
|
185
|
+
}
|
|
186
|
+
function isTerminalSuccessStopReason(stopReason) {
|
|
187
|
+
const normalized = normalizeStopReason(stopReason);
|
|
188
|
+
return normalized !== void 0 && TERMINAL_SUCCESS_STOP_REASONS.has(normalized);
|
|
189
|
+
}
|
|
190
|
+
function isAbortedStopReason(stopReason) {
|
|
191
|
+
const normalized = normalizeStopReason(stopReason);
|
|
192
|
+
return normalized !== void 0 && ABORTED_STOP_REASONS.has(normalized);
|
|
193
|
+
}
|
|
194
|
+
function isAbortedSuccessEnvelope(stopReason) {
|
|
195
|
+
return isAbortedStopReason(stopReason);
|
|
196
|
+
}
|
|
197
|
+
function isConcludingStopReason(stopReason) {
|
|
198
|
+
return isTerminalSuccessStopReason(stopReason) || isAbortedStopReason(stopReason);
|
|
199
|
+
}
|
|
200
|
+
function isGrokTerminalEnvelope(obj) {
|
|
201
|
+
const record = asRecord(obj);
|
|
202
|
+
if (!record) return false;
|
|
203
|
+
const type = typeof record.type === "string" ? record.type.toLowerCase() : void 0;
|
|
204
|
+
if (type === "error") return true;
|
|
205
|
+
const isSuccessShaped = typeof record.text === "string" || type === void 0 || type !== void 0 && TERMINAL_SUCCESS_EVENT_TYPES.has(type) || type === "end";
|
|
206
|
+
if (!isSuccessShaped) return false;
|
|
207
|
+
const data = asRecord(record.data);
|
|
208
|
+
const stopReason = readStringField(record, "stopReason", "stop_reason") ?? (data ? readStringField(data, "stopReason", "stop_reason") : void 0);
|
|
209
|
+
return isConcludingStopReason(stopReason);
|
|
210
|
+
}
|
|
211
|
+
function isGrokTerminalSuccessEnvelope(obj) {
|
|
212
|
+
const record = asRecord(obj);
|
|
213
|
+
if (!record) return false;
|
|
214
|
+
const type = typeof record.type === "string" ? record.type.toLowerCase() : void 0;
|
|
215
|
+
if (type === "error") return false;
|
|
216
|
+
const isSuccessShaped = typeof record.text === "string" || type === void 0 || type !== void 0 && TERMINAL_SUCCESS_EVENT_TYPES.has(type) || type === "end";
|
|
217
|
+
if (!isSuccessShaped) return false;
|
|
218
|
+
const data = asRecord(record.data);
|
|
219
|
+
const stopReason = readStringField(record, "stopReason", "stop_reason") ?? (data ? readStringField(data, "stopReason", "stop_reason") : void 0);
|
|
220
|
+
return isTerminalSuccessStopReason(stopReason);
|
|
221
|
+
}
|
|
222
|
+
function capturedStdoutHasTerminalEnvelope(stdout) {
|
|
223
|
+
if (!stdout || !stdout.trim()) return false;
|
|
224
|
+
for (const obj of findJsonObjects(stdout)) {
|
|
225
|
+
const record = asRecord(obj);
|
|
226
|
+
if (!record) continue;
|
|
227
|
+
const type = typeof record.type === "string" ? record.type.toLowerCase() : void 0;
|
|
228
|
+
if (type === "error") return true;
|
|
229
|
+
if (isGrokTerminalSuccessEnvelope(obj)) return true;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
function grokLineConcludes(line) {
|
|
234
|
+
const trimmed = line.trim();
|
|
235
|
+
if (trimmed[0] !== "{") return false;
|
|
236
|
+
const parsed = tryParseJson(trimmed);
|
|
237
|
+
return isGrokTerminalEnvelope(parsed);
|
|
238
|
+
}
|
|
239
|
+
function createGrokTmuxCompletionSignal() {
|
|
240
|
+
const lineSignal = createLineDelimitedTmuxCompletionSignal(grokLineConcludes);
|
|
241
|
+
let accumulated = "";
|
|
242
|
+
let concluded = false;
|
|
243
|
+
const MAX_ACCUMULATED_BYTES = 8 * 1024 * 1024;
|
|
244
|
+
return (chunk, stream) => {
|
|
245
|
+
if (concluded) return true;
|
|
246
|
+
if (lineSignal(chunk, stream)) {
|
|
247
|
+
concluded = true;
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
if (stream !== "stdout" || !chunk) return false;
|
|
251
|
+
if (accumulated.length <= MAX_ACCUMULATED_BYTES) {
|
|
252
|
+
accumulated += chunk;
|
|
253
|
+
if (accumulated.trimEnd().endsWith("}")) {
|
|
254
|
+
for (const obj of findJsonObjects(accumulated)) {
|
|
255
|
+
if (isGrokTerminalEnvelope(obj)) {
|
|
256
|
+
concluded = true;
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function isStderrOnlyNoise(stderr) {
|
|
266
|
+
return isProviderStderrOnlyRecoverableNoise("grok", stderr);
|
|
267
|
+
}
|
|
268
|
+
function tryParseJson(text) {
|
|
269
|
+
try {
|
|
270
|
+
return JSON.parse(text);
|
|
271
|
+
} catch {
|
|
272
|
+
return void 0;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function findBalancedJsonTexts(text) {
|
|
276
|
+
const results = [];
|
|
277
|
+
let start = -1;
|
|
278
|
+
let depth = 0;
|
|
279
|
+
let inString = false;
|
|
280
|
+
let escaped = false;
|
|
281
|
+
const stack = [];
|
|
282
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
283
|
+
const char = text[i];
|
|
284
|
+
if (start < 0) {
|
|
285
|
+
if (char === "{" || char === "[") {
|
|
286
|
+
start = i;
|
|
287
|
+
depth = 1;
|
|
288
|
+
stack.push(char === "{" ? "}" : "]");
|
|
289
|
+
}
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (inString) {
|
|
293
|
+
if (escaped) {
|
|
294
|
+
escaped = false;
|
|
295
|
+
} else if (char === "\\") {
|
|
296
|
+
escaped = true;
|
|
297
|
+
} else if (char === '"') {
|
|
298
|
+
inString = false;
|
|
299
|
+
}
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
if (char === '"') {
|
|
303
|
+
inString = true;
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
if (char === "{" || char === "[") {
|
|
307
|
+
depth += 1;
|
|
308
|
+
stack.push(char === "{" ? "}" : "]");
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (char === "}" || char === "]") {
|
|
312
|
+
const expected = stack.pop();
|
|
313
|
+
if (char !== expected) {
|
|
314
|
+
start = -1;
|
|
315
|
+
depth = 0;
|
|
316
|
+
inString = false;
|
|
317
|
+
escaped = false;
|
|
318
|
+
stack.length = 0;
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
depth -= 1;
|
|
322
|
+
if (depth === 0) {
|
|
323
|
+
results.push(text.slice(start, i + 1));
|
|
324
|
+
start = -1;
|
|
325
|
+
inString = false;
|
|
326
|
+
escaped = false;
|
|
327
|
+
stack.length = 0;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return results;
|
|
332
|
+
}
|
|
333
|
+
function appendJsonObject(value, values) {
|
|
334
|
+
if (Array.isArray(value)) {
|
|
335
|
+
for (const item of value) {
|
|
336
|
+
if (item && typeof item === "object") values.push(item);
|
|
337
|
+
}
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (value && typeof value === "object") values.push(value);
|
|
341
|
+
}
|
|
342
|
+
function findJsonObjects(stdout) {
|
|
343
|
+
if (!stdout) return [];
|
|
344
|
+
const trimmed = stdout.trim();
|
|
345
|
+
if (!trimmed) return [];
|
|
346
|
+
const whole = tryParseJson(trimmed);
|
|
347
|
+
if (whole && typeof whole === "object") {
|
|
348
|
+
const values2 = [];
|
|
349
|
+
appendJsonObject(whole, values2);
|
|
350
|
+
return values2;
|
|
351
|
+
}
|
|
352
|
+
const values = [];
|
|
353
|
+
for (const balanced of findBalancedJsonTexts(trimmed)) {
|
|
354
|
+
const parsed = tryParseJson(balanced);
|
|
355
|
+
appendJsonObject(parsed, values);
|
|
356
|
+
}
|
|
357
|
+
if (values.length > 0) return values;
|
|
358
|
+
for (const line of trimmed.split(/\r?\n/)) {
|
|
359
|
+
const t = line.trim();
|
|
360
|
+
if (!t || t[0] !== "{" && t[0] !== "[") continue;
|
|
361
|
+
const parsed = tryParseJson(t);
|
|
362
|
+
appendJsonObject(parsed, values);
|
|
363
|
+
}
|
|
364
|
+
return values;
|
|
365
|
+
}
|
|
366
|
+
function readStringField(obj, camelKey, snakeKey) {
|
|
367
|
+
const camel = obj[camelKey];
|
|
368
|
+
if (typeof camel === "string") return camel;
|
|
369
|
+
if (snakeKey) {
|
|
370
|
+
const snake = obj[snakeKey];
|
|
371
|
+
if (typeof snake === "string") return snake;
|
|
372
|
+
}
|
|
373
|
+
return void 0;
|
|
374
|
+
}
|
|
375
|
+
function asRecord(value) {
|
|
376
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
377
|
+
}
|
|
378
|
+
var STREAM_TEXT_EVENT_TYPES = /* @__PURE__ */ new Set([
|
|
379
|
+
"answer",
|
|
380
|
+
"assistant",
|
|
381
|
+
"completion",
|
|
382
|
+
"content",
|
|
383
|
+
"delta",
|
|
384
|
+
"final",
|
|
385
|
+
"message",
|
|
386
|
+
"output",
|
|
387
|
+
"response",
|
|
388
|
+
"result",
|
|
389
|
+
"success",
|
|
390
|
+
"text"
|
|
391
|
+
]);
|
|
392
|
+
var TERMINAL_SUCCESS_EVENT_TYPES = /* @__PURE__ */ new Set(["final", "result", "success"]);
|
|
393
|
+
function buildSuccessEnvelope(obj, text, accumulatedThought) {
|
|
394
|
+
const data = asRecord(obj.data);
|
|
395
|
+
const success = {
|
|
396
|
+
type: "success",
|
|
397
|
+
text
|
|
398
|
+
};
|
|
399
|
+
const stopReason = readStringField(obj, "stopReason", "stop_reason") ?? (data ? readStringField(data, "stopReason", "stop_reason") : void 0);
|
|
400
|
+
const sessionId = readStringField(obj, "sessionId", "session_id") ?? (data ? readStringField(data, "sessionId", "session_id") : void 0);
|
|
401
|
+
const requestId = readStringField(obj, "requestId", "request_id") ?? (data ? readStringField(data, "requestId", "request_id") : void 0);
|
|
402
|
+
const thought = readStringField(obj, "thought") ?? (data ? readStringField(data, "thought") : void 0) ?? accumulatedThought;
|
|
403
|
+
if (stopReason) success.stopReason = stopReason;
|
|
404
|
+
if (sessionId) success.sessionId = sessionId;
|
|
405
|
+
if (requestId) success.requestId = requestId;
|
|
406
|
+
if (thought) success.thought = thought;
|
|
407
|
+
const usage = obj.usage ?? data?.usage;
|
|
408
|
+
if (usage && typeof usage === "object" && !Array.isArray(usage)) {
|
|
409
|
+
success.tokenUsage = normalizeTokenUsage(usage, "grok");
|
|
410
|
+
}
|
|
411
|
+
return success;
|
|
412
|
+
}
|
|
413
|
+
function extractTokenUsageFromObject(obj) {
|
|
414
|
+
const data = asRecord(obj.data);
|
|
415
|
+
const usageCandidates = [obj.usage, data?.usage];
|
|
416
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
417
|
+
if (type === "usage") {
|
|
418
|
+
usageCandidates.push(data);
|
|
419
|
+
}
|
|
420
|
+
for (const candidate of usageCandidates) {
|
|
421
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) continue;
|
|
422
|
+
const usage = normalizeTokenUsage(candidate, "grok");
|
|
423
|
+
if (usage) return usage;
|
|
424
|
+
}
|
|
425
|
+
return void 0;
|
|
426
|
+
}
|
|
427
|
+
function isStepUsageEventType(type) {
|
|
428
|
+
if (typeof type !== "string") return false;
|
|
429
|
+
return /^step[-_.]?finish$/i.test(type);
|
|
430
|
+
}
|
|
431
|
+
function sumTokenUsages(usages) {
|
|
432
|
+
if (usages.length === 0) return void 0;
|
|
433
|
+
if (usages.length === 1) return usages[0];
|
|
434
|
+
const usage = usages.reduce(
|
|
435
|
+
(sum, current) => ({
|
|
436
|
+
inputTokens: sum.inputTokens + current.inputTokens,
|
|
437
|
+
outputTokens: sum.outputTokens + current.outputTokens,
|
|
438
|
+
cachedInputTokens: (sum.cachedInputTokens ?? 0) + (current.cachedInputTokens ?? 0),
|
|
439
|
+
cacheCreationInputTokens: (sum.cacheCreationInputTokens ?? 0) + (current.cacheCreationInputTokens ?? 0)
|
|
440
|
+
}),
|
|
441
|
+
{
|
|
442
|
+
inputTokens: 0,
|
|
443
|
+
outputTokens: 0,
|
|
444
|
+
cachedInputTokens: 0,
|
|
445
|
+
cacheCreationInputTokens: 0
|
|
446
|
+
}
|
|
447
|
+
);
|
|
448
|
+
return {
|
|
449
|
+
inputTokens: usage.inputTokens,
|
|
450
|
+
outputTokens: usage.outputTokens,
|
|
451
|
+
...usage.cachedInputTokens > 0 ? { cachedInputTokens: usage.cachedInputTokens } : {},
|
|
452
|
+
...usage.cacheCreationInputTokens > 0 ? { cacheCreationInputTokens: usage.cacheCreationInputTokens } : {},
|
|
453
|
+
totalTokens: usage.inputTokens + usage.outputTokens
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function extractSuccessEnvelope(obj, accumulatedThought) {
|
|
457
|
+
if (typeof obj.text === "string") {
|
|
458
|
+
return buildSuccessEnvelope(obj, obj.text, accumulatedThought);
|
|
459
|
+
}
|
|
460
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
461
|
+
if (!type || !TERMINAL_SUCCESS_EVENT_TYPES.has(type)) return void 0;
|
|
462
|
+
if (typeof obj.data === "string") {
|
|
463
|
+
return buildSuccessEnvelope(obj, obj.data, accumulatedThought);
|
|
464
|
+
}
|
|
465
|
+
const data = asRecord(obj.data);
|
|
466
|
+
const dataText = data ? readStringField(data, "text") : void 0;
|
|
467
|
+
if (dataText !== void 0) {
|
|
468
|
+
return buildSuccessEnvelope(obj, dataText, accumulatedThought);
|
|
469
|
+
}
|
|
470
|
+
const message = asRecord(obj.message);
|
|
471
|
+
const messageText = message ? readStringField(message, "text") : void 0;
|
|
472
|
+
if (messageText !== void 0) {
|
|
473
|
+
return buildSuccessEnvelope(obj, messageText, accumulatedThought);
|
|
474
|
+
}
|
|
475
|
+
return void 0;
|
|
476
|
+
}
|
|
477
|
+
function extractStreamTextChunk(obj) {
|
|
478
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
479
|
+
if (!type || !STREAM_TEXT_EVENT_TYPES.has(type) || type === "success" || type === "result") {
|
|
480
|
+
return void 0;
|
|
481
|
+
}
|
|
482
|
+
if (typeof obj.data === "string") return obj.data;
|
|
483
|
+
const data = asRecord(obj.data);
|
|
484
|
+
return data ? readStringField(data, "text") : void 0;
|
|
485
|
+
}
|
|
486
|
+
function extractInnerFromMessage(message) {
|
|
487
|
+
if (!message) return void 0;
|
|
488
|
+
const firstBrace = message.indexOf("{");
|
|
489
|
+
if (firstBrace < 0) return void 0;
|
|
490
|
+
const candidate = message.slice(firstBrace).trim();
|
|
491
|
+
const parsed = tryParseJson(candidate);
|
|
492
|
+
if (!parsed || typeof parsed !== "object") return void 0;
|
|
493
|
+
const inner = {};
|
|
494
|
+
if (typeof parsed.code === "string") inner.code = parsed.code;
|
|
495
|
+
if (typeof parsed.detail === "string") inner.detail = parsed.detail;
|
|
496
|
+
if (typeof parsed.http_status === "number") inner.httpStatus = parsed.http_status;
|
|
497
|
+
if (typeof parsed.message === "string") inner.message = parsed.message;
|
|
498
|
+
return Object.keys(inner).length > 0 ? inner : void 0;
|
|
499
|
+
}
|
|
500
|
+
function hasProviderTransportDeathEvidence(haystack) {
|
|
501
|
+
return /Transport channel closed.*Auth\(AuthorizationRequired\)/i.test(haystack) || /Auth\(AuthorizationRequired\).*Transport channel closed/i.test(haystack) || /worker quit with fatal/i.test(haystack) || /Transport channel closed/i.test(haystack);
|
|
502
|
+
}
|
|
503
|
+
function isMaxTurnsExceededMessage(haystack) {
|
|
504
|
+
return /max[_\s-]?turns(?:[_\s-]?(?:exceeded|reached))?/i.test(haystack) || /max_turns_reached/i.test(haystack) || /turn limit/i.test(haystack);
|
|
505
|
+
}
|
|
506
|
+
function categorizeError(message, inner) {
|
|
507
|
+
const haystack = `${message}
|
|
508
|
+
${inner?.code ?? ""}
|
|
509
|
+
${inner?.detail ?? ""}
|
|
510
|
+
${inner?.message ?? ""}`;
|
|
511
|
+
if (/FS_PERMISSION_DENIED/i.test(haystack)) return "fs_permission_denied";
|
|
512
|
+
if (hasProviderTransportDeathEvidence(haystack)) {
|
|
513
|
+
return "provider_transport_failure";
|
|
514
|
+
}
|
|
515
|
+
if (/AuthorizationRequired|Authentication|not authenticated/i.test(haystack)) return "auth";
|
|
516
|
+
if (isMaxTurnsExceededMessage(haystack)) return "max_turns_exceeded";
|
|
517
|
+
if (/rate[_\s-]?limit/i.test(haystack) || /too many requests/i.test(haystack) || /\b429\b/.test(haystack) || inner?.httpStatus === 429) {
|
|
518
|
+
return "rate_limit";
|
|
519
|
+
}
|
|
520
|
+
if (/\bECONNRESET\b/i.test(haystack) || /\bETIMEDOUT\b/i.test(haystack) || /\bENOTFOUND\b/i.test(haystack) || /\bECONNREFUSED\b/i.test(haystack) || /socket hang up/i.test(haystack) || /connection refused/i.test(haystack) || /network (?:error|failure|unreachable)/i.test(haystack) || /fetch failed/i.test(haystack)) {
|
|
521
|
+
return "network";
|
|
522
|
+
}
|
|
523
|
+
if (/does not support parameter/i.test(haystack) || inner?.httpStatus === 400) {
|
|
524
|
+
return "model_rejection";
|
|
525
|
+
}
|
|
526
|
+
if (/Internal error|API error/i.test(haystack)) return "runtime";
|
|
527
|
+
return "unknown";
|
|
528
|
+
}
|
|
529
|
+
function readStopReason(obj) {
|
|
530
|
+
const data = asRecord(obj.data);
|
|
531
|
+
return readStringField(obj, "stopReason", "stop_reason") ?? (data ? readStringField(data, "stopReason", "stop_reason") : void 0);
|
|
532
|
+
}
|
|
533
|
+
function hasTerminalSuccessSemantics(obj, stopReason) {
|
|
534
|
+
if (isAbortedStopReason(stopReason)) return false;
|
|
535
|
+
if (isTerminalSuccessStopReason(stopReason)) return true;
|
|
536
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
537
|
+
return type !== void 0 && TERMINAL_SUCCESS_EVENT_TYPES.has(type);
|
|
538
|
+
}
|
|
539
|
+
function buildAbortedRunError(stopReason, text, stderr) {
|
|
540
|
+
const stderrClean = stripAnsiControlSequences(stderr).trim();
|
|
541
|
+
const category = stderrClean.length > 0 && isStderrOnlyNoise(stderr) ? "provider_transport_failure" : categorizeError(`${stopReason ?? ""}
|
|
542
|
+
${stderrClean}`);
|
|
543
|
+
const textNote = text.trim().length > 0 ? "non-empty partial output" : "empty output";
|
|
544
|
+
return {
|
|
545
|
+
type: "error",
|
|
546
|
+
message: `grok run aborted before completion (stopReason=${stopReason ?? "unknown"}, ${textNote})`,
|
|
547
|
+
category: category === "unknown" ? "provider_transport_failure" : category
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
function parseGrokOutput(stdout, stderr, exitCode) {
|
|
551
|
+
const objects = findJsonObjects(stdout);
|
|
552
|
+
if (objects.length === 0) {
|
|
553
|
+
const stderrClean = stripAnsiControlSequences(stderr).trim();
|
|
554
|
+
const stdoutClean = stripAnsiControlSequences(stdout).trim();
|
|
555
|
+
const message = [stdoutClean, stderrClean].filter(Boolean).join("\n") || `grok exited with code ${exitCode} and no parseable JSON on stdout`;
|
|
556
|
+
const category = categorizeError(message);
|
|
557
|
+
return {
|
|
558
|
+
type: "error",
|
|
559
|
+
message,
|
|
560
|
+
category: category === "unknown" ? "runtime" : category
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
const thoughtChunks = [];
|
|
564
|
+
const textChunks = [];
|
|
565
|
+
let success;
|
|
566
|
+
let abortedStopReason;
|
|
567
|
+
let abortedText = "";
|
|
568
|
+
let sawTerminalSuccessStop = false;
|
|
569
|
+
let terminalEndMeta;
|
|
570
|
+
let latestFinalTokenUsage;
|
|
571
|
+
let resolvedModel;
|
|
572
|
+
const stepTokenUsages = [];
|
|
573
|
+
for (const obj of objects) {
|
|
574
|
+
resolvedModel ??= resolveModelUsageIdentity(obj);
|
|
575
|
+
if (obj.type === "error") {
|
|
576
|
+
const message = typeof obj.message === "string" ? obj.message : JSON.stringify(obj.message);
|
|
577
|
+
const inner = extractInnerFromMessage(message);
|
|
578
|
+
const category = categorizeError(
|
|
579
|
+
`${message}
|
|
580
|
+
${stripAnsiControlSequences(stderr).trim()}`,
|
|
581
|
+
inner
|
|
582
|
+
);
|
|
583
|
+
return {
|
|
584
|
+
type: "error",
|
|
585
|
+
message,
|
|
586
|
+
inner,
|
|
587
|
+
category
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
const tokenUsage = extractTokenUsageFromObject(obj);
|
|
591
|
+
if (tokenUsage) {
|
|
592
|
+
if (isStepUsageEventType(obj.type)) {
|
|
593
|
+
stepTokenUsages.push(tokenUsage);
|
|
594
|
+
} else {
|
|
595
|
+
latestFinalTokenUsage = tokenUsage;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
if (obj.type === "thought" && typeof obj.data === "string") {
|
|
599
|
+
thoughtChunks.push(obj.data);
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
const stopReason = readStopReason(obj);
|
|
603
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
604
|
+
if (type === "end") {
|
|
605
|
+
if (isAbortedStopReason(stopReason)) {
|
|
606
|
+
abortedStopReason = stopReason;
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
if (isTerminalSuccessStopReason(stopReason)) {
|
|
610
|
+
sawTerminalSuccessStop = true;
|
|
611
|
+
terminalEndMeta = obj;
|
|
612
|
+
continue;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
const accumulatedThought = thoughtChunks.length > 0 ? thoughtChunks.join("") : void 0;
|
|
616
|
+
const parsedSuccess = extractSuccessEnvelope(obj, accumulatedThought);
|
|
617
|
+
if (parsedSuccess) {
|
|
618
|
+
if (isAbortedSuccessEnvelope(parsedSuccess.stopReason)) {
|
|
619
|
+
abortedStopReason = parsedSuccess.stopReason;
|
|
620
|
+
abortedText = parsedSuccess.text;
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
if (hasTerminalSuccessSemantics(obj, parsedSuccess.stopReason)) {
|
|
624
|
+
success = parsedSuccess;
|
|
625
|
+
if (isTerminalSuccessStopReason(parsedSuccess.stopReason)) {
|
|
626
|
+
sawTerminalSuccessStop = true;
|
|
627
|
+
}
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
if (parsedSuccess.text.length > 0) {
|
|
631
|
+
textChunks.push(parsedSuccess.text);
|
|
632
|
+
}
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
const chunk = extractStreamTextChunk(obj);
|
|
636
|
+
if (chunk !== void 0) textChunks.push(chunk);
|
|
637
|
+
}
|
|
638
|
+
if (abortedStopReason !== void 0) {
|
|
639
|
+
return buildAbortedRunError(abortedStopReason, abortedText || textChunks.join(""), stderr);
|
|
640
|
+
}
|
|
641
|
+
if (!success && sawTerminalSuccessStop) {
|
|
642
|
+
const accumulatedThought = thoughtChunks.length > 0 ? thoughtChunks.join("") : void 0;
|
|
643
|
+
success = buildSuccessEnvelope(
|
|
644
|
+
terminalEndMeta ?? { stopReason: "EndTurn" },
|
|
645
|
+
textChunks.join(""),
|
|
646
|
+
accumulatedThought
|
|
647
|
+
);
|
|
648
|
+
} else if (success && success.text.length === 0 && textChunks.length > 0) {
|
|
649
|
+
success = { ...success, text: textChunks.join("") };
|
|
650
|
+
}
|
|
651
|
+
if (success) {
|
|
652
|
+
if (resolvedModel) success.resolvedModel = resolvedModel;
|
|
653
|
+
const tokenUsage = latestFinalTokenUsage ?? sumTokenUsages(stepTokenUsages);
|
|
654
|
+
if (tokenUsage) {
|
|
655
|
+
success.tokenUsage = tokenUsage;
|
|
656
|
+
}
|
|
657
|
+
if (exitCode !== 0 && !isStderrOnlyNoise(stderr)) {
|
|
658
|
+
return {
|
|
659
|
+
type: "error",
|
|
660
|
+
message: `grok exited with code ${exitCode} despite success-shaped stdout`,
|
|
661
|
+
category: "runtime"
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
return success;
|
|
665
|
+
}
|
|
666
|
+
const hasOnlyNonterminalStreamEvents = objects.every((obj) => {
|
|
667
|
+
const type = typeof obj.type === "string" ? obj.type.toLowerCase() : void 0;
|
|
668
|
+
return type === "thought" || type === "status" || type === "progress" || type === "usage" || type !== void 0 && STREAM_TEXT_EVENT_TYPES.has(type) && type !== "success" && type !== "result";
|
|
669
|
+
});
|
|
670
|
+
if (hasOnlyNonterminalStreamEvents || textChunks.length > 0) {
|
|
671
|
+
return {
|
|
672
|
+
type: "error",
|
|
673
|
+
message: `Grok stdout stream ended without a terminal success/error envelope (${objects.length} event${objects.length === 1 ? "" : "s"})`,
|
|
674
|
+
category: exitCode === 0 ? "runtime" : "unknown"
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
return {
|
|
678
|
+
type: "error",
|
|
679
|
+
message: `Unrecognized Grok stdout envelope: ${JSON.stringify(objects[0]).slice(0, 200)}`,
|
|
680
|
+
category: "unknown"
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
var GROK_NONTERMINAL_STREAM_TYPES = /* @__PURE__ */ new Set(["thought", "status", "progress", "usage"]);
|
|
684
|
+
function formatGrokStreamLineForDisplay(line, options = {}) {
|
|
685
|
+
const trimmed = line.trim();
|
|
686
|
+
if (!trimmed) {
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
let parsed;
|
|
690
|
+
try {
|
|
691
|
+
parsed = JSON.parse(trimmed);
|
|
692
|
+
} catch {
|
|
693
|
+
return trimmed;
|
|
694
|
+
}
|
|
695
|
+
const type = typeof parsed.type === "string" ? parsed.type.toLowerCase() : void 0;
|
|
696
|
+
const includePartials = options.includePartials ?? isDebugMode();
|
|
697
|
+
if (!includePartials && type && GROK_NONTERMINAL_STREAM_TYPES.has(type)) {
|
|
698
|
+
return null;
|
|
699
|
+
}
|
|
700
|
+
if (type === "success" && typeof parsed.text === "string" && parsed.text.length > 0) {
|
|
701
|
+
return parsed.text;
|
|
702
|
+
}
|
|
703
|
+
if (type === "error" && typeof parsed.message === "string") {
|
|
704
|
+
return `Error: ${parsed.message}`;
|
|
705
|
+
}
|
|
706
|
+
if (includePartials) {
|
|
707
|
+
if (type === "thought" && typeof parsed.data === "string") {
|
|
708
|
+
return parsed.data;
|
|
709
|
+
}
|
|
710
|
+
const chunk = extractStreamTextChunk(parsed);
|
|
711
|
+
if (chunk !== void 0 && chunk.length > 0) {
|
|
712
|
+
return chunk;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return null;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// src/core/providers/grok/execution/commands.ts
|
|
719
|
+
var ALLOWED_OUTPUT_FORMATS = /* @__PURE__ */ new Set(["plain", "json", "streaming-json"]);
|
|
720
|
+
var ALLOWED_PERMISSION_MODES = /* @__PURE__ */ new Set([
|
|
721
|
+
"default",
|
|
722
|
+
"acceptEdits",
|
|
723
|
+
"auto",
|
|
724
|
+
"dontAsk",
|
|
725
|
+
"bypassPermissions"
|
|
726
|
+
]);
|
|
727
|
+
var UNSUPPORTED_PERMISSION_MODES = /* @__PURE__ */ new Set(["plan", "delegate"]);
|
|
728
|
+
var UNSAFE_HEADLESS_PERMISSION_MODES = /* @__PURE__ */ new Set(["acceptEdits", "auto"]);
|
|
729
|
+
var ELEVATING_PERMISSION_MODES = /* @__PURE__ */ new Set(["bypassPermissions", "acceptEdits", "auto"]);
|
|
730
|
+
var CLI_DEFAULT_MODEL = "auto";
|
|
731
|
+
function shouldEmitGrokModelArg(model) {
|
|
732
|
+
const normalized = model?.trim();
|
|
733
|
+
return Boolean(normalized && normalized.toLowerCase() !== CLI_DEFAULT_MODEL);
|
|
734
|
+
}
|
|
735
|
+
function readEnv(env, key) {
|
|
736
|
+
const source = env ?? process.env;
|
|
737
|
+
const value = source[key];
|
|
738
|
+
if (typeof value !== "string") return void 0;
|
|
739
|
+
const trimmed = value.trim();
|
|
740
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
741
|
+
}
|
|
742
|
+
function throwUnsafePermissionMode(raw) {
|
|
743
|
+
throw new Error(
|
|
744
|
+
[
|
|
745
|
+
`POETIC_GROK_PERMISSION_MODE=${raw} is unsafe for Grok headless execution.`,
|
|
746
|
+
"Unset POETIC_GROK_PERMISSION_MODE to use Grok CLI native defaults,",
|
|
747
|
+
`use locked dontAsk read-only posture for consults (grok >= ${GROK_DONT_ASK_MIN_VERSION}),`,
|
|
748
|
+
"or set POETIC_GROK_PERMISSION_MODE=bypassPermissions when policy permits."
|
|
749
|
+
].join(" ")
|
|
750
|
+
);
|
|
751
|
+
}
|
|
752
|
+
function throwUnsupportedPermissionMode(raw) {
|
|
753
|
+
throw new Error(
|
|
754
|
+
[
|
|
755
|
+
`permissionMode=${raw} is not supported for Grok headless execution.`,
|
|
756
|
+
"Supported modes: default (omit flag), dontAsk (+ allow rules), bypassPermissions.",
|
|
757
|
+
"acceptEdits/auto are unsafe under headless OAuth and are rejected."
|
|
758
|
+
].join(" ")
|
|
759
|
+
);
|
|
760
|
+
}
|
|
761
|
+
function throwDontAskUnsupported() {
|
|
762
|
+
throw new Error(
|
|
763
|
+
[
|
|
764
|
+
`Grok dontAsk requires Grok CLI >= ${GROK_DONT_ASK_MIN_VERSION}.`,
|
|
765
|
+
"The installed CLI does not support the locked headless read-only / dontAsk posture",
|
|
766
|
+
"(approval-worker modes die under headless OAuth on older versions; full",
|
|
767
|
+
"native read-only controls are verified on 0.2.93+).",
|
|
768
|
+
"Upgrade grok, or omit dontAsk / unset POETIC_GROK_PERMISSION_MODE."
|
|
769
|
+
].join(" ")
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
function resolvePermissionMode(env, requested, options = {}) {
|
|
773
|
+
const envRaw = readEnv(env, "POETIC_GROK_PERMISSION_MODE");
|
|
774
|
+
const requestedMode = requested?.trim() || void 0;
|
|
775
|
+
if (requestedMode && UNSUPPORTED_PERMISSION_MODES.has(requestedMode)) {
|
|
776
|
+
throwUnsupportedPermissionMode(requestedMode);
|
|
777
|
+
}
|
|
778
|
+
if (requestedMode && UNSAFE_HEADLESS_PERMISSION_MODES.has(requestedMode)) {
|
|
779
|
+
throwUnsafePermissionMode(requestedMode);
|
|
780
|
+
}
|
|
781
|
+
let raw;
|
|
782
|
+
if (options.lockPermissionMode) {
|
|
783
|
+
if (envRaw && UNSAFE_HEADLESS_PERMISSION_MODES.has(envRaw)) {
|
|
784
|
+
throwUnsafePermissionMode(envRaw);
|
|
785
|
+
}
|
|
786
|
+
if (envRaw && ELEVATING_PERMISSION_MODES.has(envRaw)) {
|
|
787
|
+
raw = requestedMode;
|
|
788
|
+
} else {
|
|
789
|
+
raw = requestedMode ?? envRaw;
|
|
790
|
+
}
|
|
791
|
+
} else {
|
|
792
|
+
raw = envRaw ?? requestedMode;
|
|
793
|
+
}
|
|
794
|
+
if (!raw) return "default";
|
|
795
|
+
if (UNSUPPORTED_PERMISSION_MODES.has(raw)) {
|
|
796
|
+
if (envRaw === raw && requestedMode !== raw) return "default";
|
|
797
|
+
throwUnsupportedPermissionMode(raw);
|
|
798
|
+
}
|
|
799
|
+
if (!ALLOWED_PERMISSION_MODES.has(raw)) return "default";
|
|
800
|
+
if (UNSAFE_HEADLESS_PERMISSION_MODES.has(raw)) {
|
|
801
|
+
throwUnsafePermissionMode(raw);
|
|
802
|
+
}
|
|
803
|
+
if (raw === "dontAsk" && options.supportsDontAsk === false) {
|
|
804
|
+
throwDontAskUnsupported();
|
|
805
|
+
}
|
|
806
|
+
return raw;
|
|
807
|
+
}
|
|
808
|
+
function resolveAllowRules(env, requested) {
|
|
809
|
+
const raw = readEnv(env, "POETIC_GROK_ALLOW_RULES");
|
|
810
|
+
const source = raw ? raw.split(",").map((r) => r.trim()) : (requested ?? []).map((r) => r.trim());
|
|
811
|
+
const rules = source.filter((r) => r.length > 0);
|
|
812
|
+
return rules.length > 0 ? rules : void 0;
|
|
813
|
+
}
|
|
814
|
+
function resolveMaxTurns(env) {
|
|
815
|
+
const raw = readEnv(env, "POETIC_GROK_MAX_TURNS");
|
|
816
|
+
if (!raw) return void 0;
|
|
817
|
+
if (!/^[0-9]+$/.test(raw)) return void 0;
|
|
818
|
+
const n = Number.parseInt(raw, 10);
|
|
819
|
+
if (!Number.isFinite(n) || n <= 0) return void 0;
|
|
820
|
+
return n;
|
|
821
|
+
}
|
|
822
|
+
function resolveOutputFormat(env) {
|
|
823
|
+
const raw = readEnv(env, "POETIC_GROK_OUTPUT_FORMAT");
|
|
824
|
+
if (raw && ALLOWED_OUTPUT_FORMATS.has(raw)) return raw;
|
|
825
|
+
if (resolveProviderStreamingEnabled(env ?? process.env)) return "streaming-json";
|
|
826
|
+
return "json";
|
|
827
|
+
}
|
|
828
|
+
function resolveMemoryDisabled(env) {
|
|
829
|
+
const raw = readEnv(env, "POETIC_GROK_MEMORY");
|
|
830
|
+
return raw !== "1";
|
|
831
|
+
}
|
|
832
|
+
function resolveAutoApprove(env) {
|
|
833
|
+
const raw = readEnv(env, "POETIC_GROK_AUTO_APPROVE") ?? readEnv(env, "POETIC_GROK_ALWAYS_APPROVE");
|
|
834
|
+
return raw !== "0";
|
|
835
|
+
}
|
|
836
|
+
function resolveTools(env) {
|
|
837
|
+
const raw = readEnv(env, "POETIC_GROK_TOOLS");
|
|
838
|
+
if (!raw) return void 0;
|
|
839
|
+
const tools = raw.split(",").map((t) => t.trim()).filter((t) => t.length > 0);
|
|
840
|
+
return tools.length > 0 ? tools : void 0;
|
|
841
|
+
}
|
|
842
|
+
function resolveResumeSessionId(resumeSessionId) {
|
|
843
|
+
const trimmed = resumeSessionId?.trim();
|
|
844
|
+
return trimmed && trimmed.length > 0 ? trimmed : void 0;
|
|
845
|
+
}
|
|
846
|
+
function buildGrokArgv(input) {
|
|
847
|
+
if (!input.promptFile || input.promptFile.trim().length === 0) {
|
|
848
|
+
throw new Error("buildGrokArgv: promptFile is required");
|
|
849
|
+
}
|
|
850
|
+
const lockReadOnlyPosture = input.lockReadOnlyPosture === true;
|
|
851
|
+
const permissionMode = resolvePermissionMode(input.env, input.permissionMode, {
|
|
852
|
+
lockPermissionMode: input.lockPermissionMode === true,
|
|
853
|
+
supportsDontAsk: input.supportsDontAsk
|
|
854
|
+
});
|
|
855
|
+
const maxTurns = resolveMaxTurns(input.env);
|
|
856
|
+
const outputFormat = resolveOutputFormat(input.env);
|
|
857
|
+
const memoryDisabled = resolveMemoryDisabled(input.env);
|
|
858
|
+
const alwaysApprove = resolveAutoApprove(input.env);
|
|
859
|
+
const tools = lockReadOnlyPosture ? [...GROK_READ_ONLY_TOOLS] : resolveTools(input.env);
|
|
860
|
+
const disallowedTools = lockReadOnlyPosture ? [...GROK_READ_ONLY_DISALLOWED_TOOLS] : void 0;
|
|
861
|
+
const denyRules = lockReadOnlyPosture ? [...GROK_READ_ONLY_DENY_RULES] : void 0;
|
|
862
|
+
const allowRules = permissionMode === "dontAsk" ? lockReadOnlyPosture ? [...GROK_READ_ONLY_ALLOW_RULES] : resolveAllowRules(input.env, input.allowRules) : void 0;
|
|
863
|
+
const resumeSessionId = resolveResumeSessionId(input.resumeSessionId);
|
|
864
|
+
if (permissionMode === "dontAsk" && !allowRules) {
|
|
865
|
+
throw new Error(
|
|
866
|
+
"Grok dontAsk permission mode requires at least one allow rule (allowRules input or POETIC_GROK_ALLOW_RULES); without allow rules the allow channel grants no tools."
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
const args = [
|
|
870
|
+
"--prompt-file",
|
|
871
|
+
input.promptFile,
|
|
872
|
+
"--output-format",
|
|
873
|
+
outputFormat,
|
|
874
|
+
"--no-auto-update",
|
|
875
|
+
"--no-alt-screen"
|
|
876
|
+
];
|
|
877
|
+
if (maxTurns !== void 0) {
|
|
878
|
+
args.push("--max-turns", String(maxTurns));
|
|
879
|
+
}
|
|
880
|
+
if (permissionMode !== "default") {
|
|
881
|
+
args.push("--permission-mode", permissionMode);
|
|
882
|
+
}
|
|
883
|
+
if (allowRules) {
|
|
884
|
+
for (const rule of allowRules) {
|
|
885
|
+
args.push("--allow", rule);
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
if (memoryDisabled) {
|
|
889
|
+
args.push("--no-memory");
|
|
890
|
+
}
|
|
891
|
+
if (alwaysApprove && permissionMode !== "dontAsk" && !lockReadOnlyPosture) {
|
|
892
|
+
args.push("--always-approve");
|
|
893
|
+
}
|
|
894
|
+
if (resumeSessionId) {
|
|
895
|
+
args.push("--resume", resumeSessionId);
|
|
896
|
+
}
|
|
897
|
+
if (input.modelReasoningEffort) {
|
|
898
|
+
args.push("--reasoning-effort", input.modelReasoningEffort);
|
|
899
|
+
}
|
|
900
|
+
if (tools && tools.length > 0) {
|
|
901
|
+
args.push("--tools", tools.join(","));
|
|
902
|
+
}
|
|
903
|
+
if (disallowedTools && disallowedTools.length > 0) {
|
|
904
|
+
args.push("--disallowed-tools", disallowedTools.join(","));
|
|
905
|
+
}
|
|
906
|
+
if (denyRules) {
|
|
907
|
+
for (const rule of denyRules) {
|
|
908
|
+
args.push("--deny", rule);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
const model = input.model?.trim();
|
|
912
|
+
if (shouldEmitGrokModelArg(model)) {
|
|
913
|
+
args.push("-m", model);
|
|
914
|
+
}
|
|
915
|
+
return {
|
|
916
|
+
args,
|
|
917
|
+
resolved: {
|
|
918
|
+
permissionMode,
|
|
919
|
+
maxTurns,
|
|
920
|
+
outputFormat,
|
|
921
|
+
memoryDisabled,
|
|
922
|
+
alwaysApprove: alwaysApprove && permissionMode !== "dontAsk" && !lockReadOnlyPosture,
|
|
923
|
+
reasoningEffort: input.modelReasoningEffort,
|
|
924
|
+
tools,
|
|
925
|
+
allowRules,
|
|
926
|
+
resumeSessionId,
|
|
927
|
+
...lockReadOnlyPosture ? {
|
|
928
|
+
disallowedTools,
|
|
929
|
+
denyRules,
|
|
930
|
+
lockReadOnlyPosture: true
|
|
931
|
+
} : {}
|
|
932
|
+
}
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
// src/core/providers/grok/metadata.ts
|
|
937
|
+
var metadata = createEngineMetadata(
|
|
938
|
+
{
|
|
939
|
+
id: "grok",
|
|
940
|
+
name: "Grok",
|
|
941
|
+
description: "xAI Grok Build via the grok CLI (headless mode)",
|
|
942
|
+
cliCommand: "grok",
|
|
943
|
+
cliBinary: "grok",
|
|
944
|
+
installCommand: "curl -fsSL https://x.ai/cli/install.sh | bash",
|
|
945
|
+
authHint: "grok # first run opens browser auth; set XAI_API_KEY for headless",
|
|
946
|
+
setupCommand: "poetic provider setup --providers grok",
|
|
947
|
+
docsPath: "docs/PROVIDER_SETUP.md",
|
|
948
|
+
docsAnchor: "grok-cli",
|
|
949
|
+
experimental: false
|
|
950
|
+
},
|
|
951
|
+
["installCommand", "experimental"]
|
|
952
|
+
);
|
|
953
|
+
|
|
954
|
+
// src/core/providers/grok/auth.ts
|
|
955
|
+
var AUTH_PROBE_ENV = {
|
|
956
|
+
POETIC_GROK_MAX_TURNS: "2",
|
|
957
|
+
POETIC_GROK_AUTO_APPROVE: "0"
|
|
958
|
+
};
|
|
959
|
+
var EDIT_PROBE_ENV = {
|
|
960
|
+
POETIC_GROK_MAX_TURNS: "8",
|
|
961
|
+
POETIC_GROK_AUTO_APPROVE: "1"
|
|
962
|
+
};
|
|
963
|
+
var DEFAULT_AUTH_PROBE_TIMEOUT_MS = 45e3;
|
|
964
|
+
var API_KEY_REQUIRES_ACTIVE_VERIFICATION_REASON = "Grok API key is configured, but authentication is not verified by passive checks. Requested execution or `poetic doctor --probe --provider grok` provides authoritative evidence.";
|
|
965
|
+
var AUTH_FILE_REQUIRES_ACTIVE_VERIFICATION_REASON = "Grok CLI auth file exists, but headless edit execution is not verified by passive checks. Run `poetic doctor --probe --provider grok` to verify headless execution.";
|
|
966
|
+
function authSkipRequested(env) {
|
|
967
|
+
return isSkipAuthEnvActive(POETIC_SKIP_AUTH.name, env);
|
|
968
|
+
}
|
|
969
|
+
function parsePositiveTimeoutMs(raw) {
|
|
970
|
+
if (!raw) return void 0;
|
|
971
|
+
const n = Number.parseInt(raw, 10);
|
|
972
|
+
if (!Number.isFinite(n) || n <= 0) return void 0;
|
|
973
|
+
return n;
|
|
974
|
+
}
|
|
975
|
+
function resolveAuthProbeTimeoutMs(env) {
|
|
976
|
+
const raw = env?.POETIC_GROK_AUTH_PROBE_TIMEOUT_MS ?? readRawEnv(POETIC_GROK_AUTH_PROBE_TIMEOUT_MS);
|
|
977
|
+
return parsePositiveTimeoutMs(raw) ?? DEFAULT_AUTH_PROBE_TIMEOUT_MS;
|
|
978
|
+
}
|
|
979
|
+
function hasGrokHeadlessApiKey(env = process.env) {
|
|
980
|
+
return Boolean(env?.GROK_CODE_XAI_API_KEY?.trim() || env?.XAI_API_KEY?.trim());
|
|
981
|
+
}
|
|
982
|
+
function allowsGrokBrowserAuth(env = process.env) {
|
|
983
|
+
const raw = env?.POETIC_GROK_ALLOW_BROWSER_AUTH ?? readRawEnv(POETIC_GROK_ALLOW_BROWSER_AUTH);
|
|
984
|
+
return raw === "1" || raw?.toLowerCase() === "true" || raw?.toLowerCase() === "yes";
|
|
985
|
+
}
|
|
986
|
+
function isTimeoutReason(reason) {
|
|
987
|
+
return reason === "hard_timeout" || reason === "idle_timeout" || reason === "timeout" || reason === "plm_timeout";
|
|
988
|
+
}
|
|
989
|
+
function requireActiveEditProbePolicyBoundary(env) {
|
|
990
|
+
try {
|
|
991
|
+
requireActivePolicyBoundary(
|
|
992
|
+
"Grok",
|
|
993
|
+
"Grok active edit auth probe (--always-approve)",
|
|
994
|
+
metadata.id,
|
|
995
|
+
{ env }
|
|
996
|
+
);
|
|
997
|
+
return void 0;
|
|
998
|
+
} catch (error) {
|
|
999
|
+
if (error instanceof ProviderExecutionError) {
|
|
1000
|
+
return {
|
|
1001
|
+
ok: false,
|
|
1002
|
+
category: "runtime",
|
|
1003
|
+
message: error.message,
|
|
1004
|
+
exitCode: error.exitCode
|
|
1005
|
+
};
|
|
1006
|
+
}
|
|
1007
|
+
throw error;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
function normalizeHeadlessProbeFailure(parsed, stdout, stderr) {
|
|
1011
|
+
if (parsed.category === "auth" && !stdout.trim() && isStderrOnlyNoise(stderr)) {
|
|
1012
|
+
return {
|
|
1013
|
+
ok: false,
|
|
1014
|
+
category: "runtime",
|
|
1015
|
+
message: parsed.message
|
|
1016
|
+
};
|
|
1017
|
+
}
|
|
1018
|
+
return {
|
|
1019
|
+
ok: false,
|
|
1020
|
+
category: parsed.category,
|
|
1021
|
+
message: parsed.message
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
async function probeHeadlessSessionDetailed(options) {
|
|
1025
|
+
const argvEnvOverrides = options?.argvEnvOverrides ?? AUTH_PROBE_ENV;
|
|
1026
|
+
const childEnv = options?.env ? { ...options.env, ...argvEnvOverrides } : argvEnvOverrides;
|
|
1027
|
+
const dir = await mkPoeticTempDir("grok-auth");
|
|
1028
|
+
const promptFile = path2.join(dir, "prompt.txt");
|
|
1029
|
+
try {
|
|
1030
|
+
await writeFile(promptFile, "Reply with exactly: OK", "utf8");
|
|
1031
|
+
const { command, prefixArgs } = resolveProviderCliCommand(metadata.id);
|
|
1032
|
+
const { args } = buildGrokArgv({
|
|
1033
|
+
promptFile,
|
|
1034
|
+
model: metadata.defaultModel ?? "auto",
|
|
1035
|
+
env: argvEnvOverrides
|
|
1036
|
+
});
|
|
1037
|
+
const childResult = await executeProviderCommand({
|
|
1038
|
+
command,
|
|
1039
|
+
args: [...prefixArgs, ...args],
|
|
1040
|
+
workingDir: process.cwd(),
|
|
1041
|
+
env: createGrokCliChildEnv(childEnv),
|
|
1042
|
+
timeout: resolveAuthProbeTimeoutMs(options?.env),
|
|
1043
|
+
metadata: {
|
|
1044
|
+
id: metadata.id,
|
|
1045
|
+
name: metadata.name,
|
|
1046
|
+
installCommand: metadata.installCommand,
|
|
1047
|
+
authHint: metadata.authHint,
|
|
1048
|
+
docsPath: metadata.docsPath,
|
|
1049
|
+
docsAnchor: metadata.docsAnchor
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
const stdout = childResult.stdout ?? "";
|
|
1053
|
+
const stderr = childResult.stderr ?? "";
|
|
1054
|
+
const exitCode = typeof childResult.exitCode === "number" ? childResult.exitCode : 1;
|
|
1055
|
+
const parsed = parseGrokOutput(stdout, stderr, exitCode);
|
|
1056
|
+
if (parsed.type === "success") {
|
|
1057
|
+
return { ok: true, exitCode };
|
|
1058
|
+
}
|
|
1059
|
+
return {
|
|
1060
|
+
...normalizeHeadlessProbeFailure(parsed, stdout, stderr),
|
|
1061
|
+
exitCode
|
|
1062
|
+
};
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
if (error instanceof ProviderExecutionError) {
|
|
1065
|
+
const stdout = error.stdout ?? "";
|
|
1066
|
+
const stderr = error.stderr ?? "";
|
|
1067
|
+
if (isTimeoutReason(error.reason)) {
|
|
1068
|
+
return {
|
|
1069
|
+
ok: false,
|
|
1070
|
+
category: "runtime",
|
|
1071
|
+
message: error.message,
|
|
1072
|
+
exitCode: error.exitCode
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
if (stdout || stderr) {
|
|
1076
|
+
const parsed = parseGrokOutput(stdout, stderr, error.exitCode ?? 1);
|
|
1077
|
+
if (parsed.type === "success") {
|
|
1078
|
+
return { ok: true, exitCode: error.exitCode };
|
|
1079
|
+
}
|
|
1080
|
+
return {
|
|
1081
|
+
...normalizeHeadlessProbeFailure(parsed, stdout, stderr),
|
|
1082
|
+
exitCode: error.exitCode
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
return {
|
|
1086
|
+
ok: false,
|
|
1087
|
+
category: "runtime",
|
|
1088
|
+
message: error.message,
|
|
1089
|
+
exitCode: error.exitCode
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
return {
|
|
1093
|
+
ok: false,
|
|
1094
|
+
category: "runtime",
|
|
1095
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1096
|
+
};
|
|
1097
|
+
} finally {
|
|
1098
|
+
await rm(dir, { recursive: true, force: true }).catch(() => {
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
async function probeHeadlessEditSessionDetailed(options) {
|
|
1103
|
+
const argvEnvOverrides = options?.argvEnvOverrides ?? EDIT_PROBE_ENV;
|
|
1104
|
+
const childEnv = options?.env ? { ...options.env, ...argvEnvOverrides } : argvEnvOverrides;
|
|
1105
|
+
const boundaryFailure = requireActiveEditProbePolicyBoundary(options?.env);
|
|
1106
|
+
if (boundaryFailure) return boundaryFailure;
|
|
1107
|
+
const dir = await mkPoeticTempDir("grok-edit-auth");
|
|
1108
|
+
const promptFile = path2.join(dir, "prompt.txt");
|
|
1109
|
+
const targetFile = "poetic-grok-edit-probe.txt";
|
|
1110
|
+
const targetPath = path2.join(dir, targetFile);
|
|
1111
|
+
const expected = "POETIC_GROK_EDIT_PROBE_OK\n";
|
|
1112
|
+
try {
|
|
1113
|
+
await writeFile(
|
|
1114
|
+
promptFile,
|
|
1115
|
+
[
|
|
1116
|
+
`Create a file named ${targetFile} in the current working directory.`,
|
|
1117
|
+
`The file must contain exactly one line: ${expected.trim()}.`,
|
|
1118
|
+
"Do not modify any other file."
|
|
1119
|
+
].join(" "),
|
|
1120
|
+
"utf8"
|
|
1121
|
+
);
|
|
1122
|
+
const { command, prefixArgs } = resolveProviderCliCommand(metadata.id);
|
|
1123
|
+
const { args } = buildGrokArgv({
|
|
1124
|
+
promptFile,
|
|
1125
|
+
model: metadata.defaultModel ?? "auto",
|
|
1126
|
+
env: argvEnvOverrides
|
|
1127
|
+
});
|
|
1128
|
+
const childResult = await executeProviderCommand({
|
|
1129
|
+
command,
|
|
1130
|
+
args: [...prefixArgs, ...args],
|
|
1131
|
+
workingDir: dir,
|
|
1132
|
+
env: createGrokCliChildEnv(childEnv),
|
|
1133
|
+
timeout: resolveAuthProbeTimeoutMs(options?.env),
|
|
1134
|
+
metadata: {
|
|
1135
|
+
id: metadata.id,
|
|
1136
|
+
name: metadata.name,
|
|
1137
|
+
installCommand: metadata.installCommand,
|
|
1138
|
+
authHint: metadata.authHint,
|
|
1139
|
+
docsPath: metadata.docsPath,
|
|
1140
|
+
docsAnchor: metadata.docsAnchor
|
|
1141
|
+
}
|
|
1142
|
+
});
|
|
1143
|
+
const stdout = childResult.stdout ?? "";
|
|
1144
|
+
const stderr = childResult.stderr ?? "";
|
|
1145
|
+
const exitCode = typeof childResult.exitCode === "number" ? childResult.exitCode : 1;
|
|
1146
|
+
const parsed = parseGrokOutput(stdout, stderr, exitCode);
|
|
1147
|
+
if (parsed.type !== "success") {
|
|
1148
|
+
return {
|
|
1149
|
+
...normalizeHeadlessProbeFailure(parsed, stdout, stderr),
|
|
1150
|
+
exitCode
|
|
1151
|
+
};
|
|
1152
|
+
}
|
|
1153
|
+
try {
|
|
1154
|
+
const actual = await readFile(targetPath, "utf8");
|
|
1155
|
+
if (actual === expected) {
|
|
1156
|
+
return { ok: true, exitCode };
|
|
1157
|
+
}
|
|
1158
|
+
return {
|
|
1159
|
+
ok: false,
|
|
1160
|
+
category: "runtime",
|
|
1161
|
+
message: `${metadata.name} active edit probe created ${targetFile}, but its contents did not match the expected sentinel.`,
|
|
1162
|
+
exitCode
|
|
1163
|
+
};
|
|
1164
|
+
} catch {
|
|
1165
|
+
return {
|
|
1166
|
+
ok: false,
|
|
1167
|
+
category: "runtime",
|
|
1168
|
+
message: `${metadata.name} active edit probe completed but did not create ${targetFile}; headless text generation works, but edit/tool execution was not verified.`,
|
|
1169
|
+
exitCode
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1172
|
+
} catch (error) {
|
|
1173
|
+
if (error instanceof ProviderExecutionError) {
|
|
1174
|
+
const stdout = error.stdout ?? "";
|
|
1175
|
+
const stderr = error.stderr ?? "";
|
|
1176
|
+
if (isTimeoutReason(error.reason)) {
|
|
1177
|
+
return {
|
|
1178
|
+
ok: false,
|
|
1179
|
+
category: "runtime",
|
|
1180
|
+
message: error.message,
|
|
1181
|
+
exitCode: error.exitCode
|
|
1182
|
+
};
|
|
1183
|
+
}
|
|
1184
|
+
if (stdout || stderr) {
|
|
1185
|
+
const parsed = parseGrokOutput(stdout, stderr, error.exitCode ?? 1);
|
|
1186
|
+
if (parsed.type === "success") {
|
|
1187
|
+
try {
|
|
1188
|
+
const actual = await readFile(targetPath, "utf8");
|
|
1189
|
+
if (actual === expected) {
|
|
1190
|
+
return { ok: true, exitCode: error.exitCode };
|
|
1191
|
+
}
|
|
1192
|
+
} catch {
|
|
1193
|
+
}
|
|
1194
|
+
return {
|
|
1195
|
+
ok: false,
|
|
1196
|
+
category: "runtime",
|
|
1197
|
+
message: `${metadata.name} active edit probe completed but did not create ${targetFile}; headless text generation works, but edit/tool execution was not verified.`,
|
|
1198
|
+
exitCode: error.exitCode
|
|
1199
|
+
};
|
|
1200
|
+
}
|
|
1201
|
+
return {
|
|
1202
|
+
...normalizeHeadlessProbeFailure(parsed, stdout, stderr),
|
|
1203
|
+
exitCode: error.exitCode
|
|
1204
|
+
};
|
|
1205
|
+
}
|
|
1206
|
+
return {
|
|
1207
|
+
ok: false,
|
|
1208
|
+
category: "runtime",
|
|
1209
|
+
message: error.message,
|
|
1210
|
+
exitCode: error.exitCode
|
|
1211
|
+
};
|
|
1212
|
+
}
|
|
1213
|
+
return {
|
|
1214
|
+
ok: false,
|
|
1215
|
+
category: "runtime",
|
|
1216
|
+
message: error instanceof Error ? error.message : String(error)
|
|
1217
|
+
};
|
|
1218
|
+
} finally {
|
|
1219
|
+
await rm(dir, { recursive: true, force: true }).catch(() => {
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
async function probeHeadlessSession(options) {
|
|
1224
|
+
return (await probeHeadlessSessionDetailed(options)).ok;
|
|
1225
|
+
}
|
|
1226
|
+
function shouldSoftFailGrokCliAuthProbe(hasCliAuthFile, probe) {
|
|
1227
|
+
if (!hasCliAuthFile || probe.ok) return false;
|
|
1228
|
+
return probe.category === "runtime";
|
|
1229
|
+
}
|
|
1230
|
+
async function probeActiveGrokAuth(options) {
|
|
1231
|
+
if (authSkipRequested(options?.env)) return { ok: true };
|
|
1232
|
+
if (hasGrokHeadlessApiKey(options?.env)) {
|
|
1233
|
+
return probeHeadlessEditSessionDetailed({ env: options?.env });
|
|
1234
|
+
}
|
|
1235
|
+
if (await probeGrokAuthFile(options?.env) === "yes") {
|
|
1236
|
+
return probeHeadlessEditSessionDetailed({ env: options?.env });
|
|
1237
|
+
}
|
|
1238
|
+
if (!allowsGrokBrowserAuth(options?.env)) {
|
|
1239
|
+
return {
|
|
1240
|
+
ok: false,
|
|
1241
|
+
category: "auth",
|
|
1242
|
+
message: "No Grok headless API key, CLI auth file, or browser-auth probe opt-in is available."
|
|
1243
|
+
};
|
|
1244
|
+
}
|
|
1245
|
+
return probeHeadlessEditSessionDetailed({ env: options?.env });
|
|
1246
|
+
}
|
|
1247
|
+
async function isAuthenticated(options) {
|
|
1248
|
+
return await isAuthenticatedTriState(options) === "yes";
|
|
1249
|
+
}
|
|
1250
|
+
async function isAuthenticatedTriState(options) {
|
|
1251
|
+
return (await getAuthReadiness(options)).state;
|
|
1252
|
+
}
|
|
1253
|
+
async function getAuthReadiness(options) {
|
|
1254
|
+
const mode = options?.mode ?? "passive";
|
|
1255
|
+
if (authSkipRequested(options?.env)) return { state: "yes" };
|
|
1256
|
+
if (mode === "passive") {
|
|
1257
|
+
if (hasGrokHeadlessApiKey(options?.env)) {
|
|
1258
|
+
return {
|
|
1259
|
+
state: "unknown",
|
|
1260
|
+
reason: API_KEY_REQUIRES_ACTIVE_VERIFICATION_REASON
|
|
1261
|
+
};
|
|
1262
|
+
}
|
|
1263
|
+
const authFileState = await probeGrokAuthFile(options?.env);
|
|
1264
|
+
if (authFileState === "yes") {
|
|
1265
|
+
return {
|
|
1266
|
+
state: "unknown",
|
|
1267
|
+
reason: AUTH_FILE_REQUIRES_ACTIVE_VERIFICATION_REASON
|
|
1268
|
+
};
|
|
1269
|
+
}
|
|
1270
|
+
return { state: authFileState };
|
|
1271
|
+
}
|
|
1272
|
+
const result = await probeActiveGrokAuth(options);
|
|
1273
|
+
if (result.ok) return { state: "yes", evidence: "execution" };
|
|
1274
|
+
return {
|
|
1275
|
+
state: result.category === "auth" ? "no" : "unknown",
|
|
1276
|
+
// Sanitize before surfacing to readiness/health UIs: the message is
|
|
1277
|
+
// provider-derived and may carry diagnostic text from the CLI.
|
|
1278
|
+
...result.message ? { reason: sanitizeString(result.message) } : {},
|
|
1279
|
+
...result.category ? { category: result.category } : {}
|
|
1280
|
+
};
|
|
1281
|
+
}
|
|
1282
|
+
async function isInstalled() {
|
|
1283
|
+
try {
|
|
1284
|
+
const { execa } = await import("execa");
|
|
1285
|
+
const { command, prefixArgs } = resolveProviderCliCommand(metadata.id);
|
|
1286
|
+
const result = await execa(command, [...prefixArgs, "--version"], {
|
|
1287
|
+
reject: false,
|
|
1288
|
+
timeout: GROK_CLI_PROBE_TIMEOUT_MS,
|
|
1289
|
+
stdio: "pipe"
|
|
1290
|
+
});
|
|
1291
|
+
return result.exitCode === 0;
|
|
1292
|
+
} catch {
|
|
1293
|
+
return false;
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
async function ensureAuth(options) {
|
|
1297
|
+
if (authSkipRequested(options?.env)) return true;
|
|
1298
|
+
if ((options?.mode ?? "passive") === "passive") return false;
|
|
1299
|
+
return (await probeActiveGrokAuth(options)).ok;
|
|
1300
|
+
}
|
|
1301
|
+
async function clearAuth() {
|
|
1302
|
+
}
|
|
1303
|
+
async function nextAuthMenuAction() {
|
|
1304
|
+
return "login";
|
|
1305
|
+
}
|
|
1306
|
+
var auth = {
|
|
1307
|
+
isAuthenticated,
|
|
1308
|
+
isAuthenticatedTriState,
|
|
1309
|
+
ensureAuth,
|
|
1310
|
+
clearAuth,
|
|
1311
|
+
nextAuthMenuAction
|
|
1312
|
+
};
|
|
1313
|
+
function getGrokAuthSetupInstructions() {
|
|
1314
|
+
return [
|
|
1315
|
+
`${metadata.name} requires authentication via the grok CLI.`,
|
|
1316
|
+
"",
|
|
1317
|
+
"To fix:",
|
|
1318
|
+
` 1. Install: ${metadata.installCommand}`,
|
|
1319
|
+
` 2. Auth: ${metadata.authHint ?? "grok login"}`,
|
|
1320
|
+
` 3. Verify: poetic doctor --provider ${metadata.id}`
|
|
1321
|
+
].join("\n");
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
export {
|
|
1325
|
+
GROK_CLI_PROBE_TIMEOUT_MS,
|
|
1326
|
+
GROK_DONT_ASK_MIN_VERSION,
|
|
1327
|
+
parseGrokCliVersion,
|
|
1328
|
+
GROK_READ_ONLY_ALLOW_RULES,
|
|
1329
|
+
grokResolvedHasLockedReadOnlyPosture,
|
|
1330
|
+
grokCliSupportsDontAsk,
|
|
1331
|
+
createGrokCliChildEnv,
|
|
1332
|
+
capturedStdoutHasTerminalEnvelope,
|
|
1333
|
+
createGrokTmuxCompletionSignal,
|
|
1334
|
+
isStderrOnlyNoise,
|
|
1335
|
+
parseGrokOutput,
|
|
1336
|
+
formatGrokStreamLineForDisplay,
|
|
1337
|
+
shouldEmitGrokModelArg,
|
|
1338
|
+
buildGrokArgv,
|
|
1339
|
+
metadata,
|
|
1340
|
+
hasGrokHeadlessApiKey,
|
|
1341
|
+
allowsGrokBrowserAuth,
|
|
1342
|
+
probeHeadlessSessionDetailed,
|
|
1343
|
+
probeHeadlessEditSessionDetailed,
|
|
1344
|
+
probeHeadlessSession,
|
|
1345
|
+
shouldSoftFailGrokCliAuthProbe,
|
|
1346
|
+
isAuthenticated,
|
|
1347
|
+
isAuthenticatedTriState,
|
|
1348
|
+
getAuthReadiness,
|
|
1349
|
+
isInstalled,
|
|
1350
|
+
ensureAuth,
|
|
1351
|
+
clearAuth,
|
|
1352
|
+
nextAuthMenuAction,
|
|
1353
|
+
auth,
|
|
1354
|
+
getGrokAuthSetupInstructions
|
|
1355
|
+
};
|
|
1356
|
+
//# sourceMappingURL=chunk-Y34DUC4A.js.map
|