promptfoo 0.125.0 → 0.125.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/src/accounts-BOxNYxVN.js +229 -0
- package/dist/src/accounts-BezXLdAW.cjs +276 -0
- package/dist/src/accounts-CPISMNlh.js +227 -0
- package/dist/src/accounts-vJBPs89d.js +222 -0
- package/dist/src/agentWorkspace-Bom7SpF2.js +592 -0
- package/dist/src/agentWorkspace-CEomAcws.cjs +619 -0
- package/dist/src/agentWorkspace-DPtMLrlI.js +593 -0
- package/dist/src/agentWorkspace-DkAeEYLz.js +592 -0
- package/dist/src/agentic-utils-121v7mJo.js +197 -0
- package/dist/src/agentic-utils-CBWD_rcd.cjs +237 -0
- package/dist/src/agentic-utils-D8wyQwPG.js +198 -0
- package/dist/src/agentic-utils-EP1QkQCs.js +197 -0
- package/dist/src/agents-Br3ah8iA.js +778 -0
- package/dist/src/agents-C5wj_UTv.js +777 -0
- package/dist/src/agents-C9Efp4mC.js +266 -0
- package/dist/src/agents-CQYwaVCO.js +267 -0
- package/dist/src/agents-CjCd4Vo8.js +777 -0
- package/dist/src/agents-DRWiCHYz.js +266 -0
- package/dist/src/agents-F2rhx0iL.cjs +266 -0
- package/dist/src/agents-RTYyy69h.cjs +777 -0
- package/dist/src/agents-api-CY72O86e.js +711 -0
- package/dist/src/agents-api-CsSsC21b.js +710 -0
- package/dist/src/agents-api-DN-ibDc8.js +710 -0
- package/dist/src/agents-api-cNDsCCv1.cjs +710 -0
- package/dist/src/ai.studio-Bj6Dyi6o.js +2 -0
- package/dist/src/ai.studio-C-e0LzyW.js +369 -0
- package/dist/src/ai.studio-CR8M6Aqf.cjs +391 -0
- package/dist/src/ai.studio-YKk7F0tv.js +374 -0
- package/dist/src/aimlapi-BGunsuTu.js +30 -0
- package/dist/src/aimlapi-BkzcfBsL.js +29 -0
- package/dist/src/aimlapi-DXFcEdP8.js +28 -0
- package/dist/src/aimlapi-r-8iCcAw.cjs +29 -0
- package/dist/src/anthropicMessages-7-YNRgQR.js +114 -0
- package/dist/src/anthropicMessages-C8m9Whrd.cjs +114 -0
- package/dist/src/anthropicMessages-DS1vXD0f.js +115 -0
- package/dist/src/anthropicMessages-DmvGkz-0.js +114 -0
- package/dist/src/app/assets/index-CrdXWTXm.js +392 -0
- package/dist/src/app/browser-inventory.json +4 -4
- package/dist/src/app/index.html +1 -1
- package/dist/src/audio-BLgFgyw-.cjs +104 -0
- package/dist/src/audio-C2sibT7Q.js +104 -0
- package/dist/src/audio-DXEXb03H.js +104 -0
- package/dist/src/audio-TkvojpwO.js +105 -0
- package/dist/src/authoritativeMarkupInjection-BAT9B-Wj.js +79 -0
- package/dist/src/authoritativeMarkupInjection-B_yHETKT.js +78 -0
- package/dist/src/authoritativeMarkupInjection-BfjecQ3Q.cjs +78 -0
- package/dist/src/authoritativeMarkupInjection-D-hDKrhD.js +78 -0
- package/dist/src/aws-B_9unI_-.js +1149 -0
- package/dist/src/aws-D0FY3qkc.js +2433 -0
- package/dist/src/aws-Dh1-a90n.js +2433 -0
- package/dist/src/aws-qskKGczY.cjs +2454 -0
- package/dist/src/base-CaWlBkVz.js +462 -0
- package/dist/src/base-CcViNwVs.js +255 -0
- package/dist/src/base-CsVbPJkU.cjs +467 -0
- package/dist/src/base-DNK9py25.js +255 -0
- package/dist/src/base-DlH5tjEZ.js +463 -0
- package/dist/src/base-DyLOZ_iX.js +256 -0
- package/dist/src/base-RRYXfG7l.cjs +305 -0
- package/dist/src/base-oXVgvtVn.js +462 -0
- package/dist/src/bedrock-BP17ZXbR.cjs +2 -0
- package/dist/src/bedrock-CsjM1dOt.js +1300 -0
- package/dist/src/bedrock-CzPwj8GO.js +1 -0
- package/dist/src/bedrock-eGXZw8oh.js +1 -0
- package/dist/src/bedrock-tSWjmXdj.js +2 -0
- package/dist/src/bestOfN-BQ93nUKV.js +160 -0
- package/dist/src/bestOfN-ByGGwlcb.cjs +161 -0
- package/dist/src/bestOfN-CbP7csHr.js +159 -0
- package/dist/src/bestOfN-xn6i2Xs2.js +159 -0
- package/dist/src/cache-CHq9hPz9.js +2 -0
- package/dist/src/cache-D-9eZN3I.js +754 -0
- package/dist/src/cache-DSm6t1MZ.js +741 -0
- package/dist/src/cache-DeF5zIEN.js +782 -0
- package/dist/src/cache-iG87oYan.cjs +856 -0
- package/dist/src/cerebras-CTtM4yMH.js +98 -0
- package/dist/src/cerebras-CogcJ3ce.cjs +97 -0
- package/dist/src/cerebras-DmkRypTh.js +97 -0
- package/dist/src/cerebras-GUp0B8JY.js +97 -0
- package/dist/src/chat-B4ihd3fw.js +226 -0
- package/dist/src/chat-B9cAQ_rS.js +227 -0
- package/dist/src/chat-BU7EB4R-.cjs +76 -0
- package/dist/src/chat-C8yxJ2-s.cjs +226 -0
- package/dist/src/chat-ClTFM3qq.js +934 -0
- package/dist/src/chat-Cnq0Is68.js +123 -0
- package/dist/src/chat-CwrurR57.cjs +987 -0
- package/dist/src/chat-D0lsojPv.js +124 -0
- package/dist/src/chat-D7_8yFIx.js +76 -0
- package/dist/src/chat-DCoETlLG.js +226 -0
- package/dist/src/chat-DHE7xaTR.js +76 -0
- package/dist/src/chat-DmhT6rz2.cjs +123 -0
- package/dist/src/chat-DvfMe8KI.js +123 -0
- package/dist/src/chat-DwP5kVnl.js +935 -0
- package/dist/src/chat-MB7U-QE2.js +77 -0
- package/dist/src/chat-zCWuBKAj.js +934 -0
- package/dist/src/claude-agent-sdk-23bIVI75.js +999 -0
- package/dist/src/claude-agent-sdk-BACpnIJi.cjs +1005 -0
- package/dist/src/claude-agent-sdk-BlYlmcEr.js +999 -0
- package/dist/src/claude-agent-sdk-Cr-jqJZl.js +1000 -0
- package/dist/src/client-BktbiPx9.cjs +357 -0
- package/dist/src/client-CjztEBmW.js +351 -0
- package/dist/src/client-mRs2UvH9.js +351 -0
- package/dist/src/client-uCz0ydjC.js +352 -0
- package/dist/src/cloud-BtYF555L.js +2 -0
- package/dist/src/cloud-CVSUEmAy.js +287 -0
- package/dist/src/cloud-D7Ifb-Fl.js +599 -0
- package/dist/src/cloud-DB5oK5NX.cjs +666 -0
- package/dist/src/cloud-ecu989Em.js +657 -0
- package/dist/src/cloud-ramjGURF.js +599 -0
- package/dist/src/cloudflare-ai-BfDkIjO8.js +133 -0
- package/dist/src/cloudflare-ai-D9HaXz1M.js +134 -0
- package/dist/src/cloudflare-ai-HrD5WUK8.js +132 -0
- package/dist/src/cloudflare-ai-Qdj8aKP2.cjs +133 -0
- package/dist/src/cloudflare-gateway-C81uKETQ.js +276 -0
- package/dist/src/cloudflare-gateway-CX5Z9X0k.js +276 -0
- package/dist/src/cloudflare-gateway-DW-og8gb.js +277 -0
- package/dist/src/cloudflare-gateway-iRyXo9n2.cjs +276 -0
- package/dist/src/codex-app-server-BFIrSgdy.js +2155 -0
- package/dist/src/codex-app-server-By1eDVD4.js +2 -0
- package/dist/src/codex-app-server-DKsF4qmY.js +2156 -0
- package/dist/src/codex-app-server-n7n4uZzC.cjs +2162 -0
- package/dist/src/codex-app-server-xAoELVxu.js +2155 -0
- package/dist/src/codex-sdk-C2ZLxa6r.js +1552 -0
- package/dist/src/codex-sdk-CzG02tQt.cjs +1588 -0
- package/dist/src/codex-sdk-DNxAOhiV.js +2 -0
- package/dist/src/codex-sdk-DT3aQezK.js +1557 -0
- package/dist/src/codex-sdk-pw9DpcJP.js +1557 -0
- package/dist/src/codex-security-B0bLmXJF.js +406 -0
- package/dist/src/codex-security-BhYs-3iY.js +406 -0
- package/dist/src/codex-security-DQcOfxYW.js +407 -0
- package/dist/src/codex-security-DsCWr6GZ.cjs +411 -0
- package/dist/src/cometapi-B16asPLX.cjs +55 -0
- package/dist/src/cometapi-MgTbZA_H.js +53 -0
- package/dist/src/cometapi-i33vKzPV.js +55 -0
- package/dist/src/cometapi-wK2UWK0X.js +56 -0
- package/dist/src/compatible-COj8ZCy9.js +24 -0
- package/dist/src/compatible-CRSsIUGb.cjs +24 -0
- package/dist/src/compatible-Dy1vCcNF.js +25 -0
- package/dist/src/compatible-aUItQrpk.js +24 -0
- package/dist/src/completion-Bn7COFMk.js +119 -0
- package/dist/src/completion-Bub2N48b.js +118 -0
- package/dist/src/completion-Cf2G9OlM.cjs +123 -0
- package/dist/src/conversationScoring-BiTYJ9MD.js +374 -0
- package/dist/src/conversationScoring-CKL47uIu.js +373 -0
- package/dist/src/conversationScoring-DCvQKp6k.cjs +398 -0
- package/dist/src/conversationScoring-DLNJtDZI.js +373 -0
- package/dist/src/crescendo-5iLk9WiJ.cjs +734 -0
- package/dist/src/crescendo-B5ylG7kW.js +733 -0
- package/dist/src/crescendo-BD7k6TIx.js +730 -0
- package/dist/src/crescendo-DqO2Ch0P.js +732 -0
- package/dist/src/custom-8rv_aG2K.js +617 -0
- package/dist/src/custom-BOtrIHFN.js +619 -0
- package/dist/src/custom-BvN8seCs.cjs +620 -0
- package/dist/src/custom-Cld9v_Y4.js +618 -0
- package/dist/src/dataUrl-BdHUey2l.cjs +3187 -0
- package/dist/src/dataUrl-DBMifX6C.js +3133 -0
- package/dist/src/dataUrl-DUSr-ZvI.js +2868 -0
- package/dist/src/decisions-CLazADTw.js +516 -0
- package/dist/src/decisions-D5X93awq.js +515 -0
- package/dist/src/decisions-DmaeArEn.js +515 -0
- package/dist/src/decisions-DyQJyHJz.cjs +514 -0
- package/dist/src/docker-C9NYQFeu.js +94 -0
- package/dist/src/docker-CGq3mMol.cjs +94 -0
- package/dist/src/docker-DOm7nmpl.js +95 -0
- package/dist/src/docker-skFN-Kfo.js +93 -0
- package/dist/src/embedding-0UbzkTk9.js +82 -0
- package/dist/src/embedding-DTrSDt7k.cjs +86 -0
- package/dist/src/embedding-j2ORNl5H.js +81 -0
- package/dist/src/envoy-BvS8XTQO.js +60 -0
- package/dist/src/envoy-Cn6Hzw0e.js +60 -0
- package/dist/src/envoy-DC3KWcUY.cjs +60 -0
- package/dist/src/envoy-DetHjo5B.js +61 -0
- package/dist/src/eval-Cer9dPe9.js +1920 -0
- package/dist/src/eval-CytYmI2Z.js +2 -0
- package/dist/src/evalResult-DzOq5wt9.js +1300 -0
- package/dist/src/evaluator-BxCmvGtv.js +10578 -0
- package/dist/src/evaluator-Ct7YDELm.js +2 -0
- package/dist/src/evaluatorHelpers-B_AwIrsl.js +600 -0
- package/dist/src/evaluatorHelpers-D1Tpc7gd.js +601 -0
- package/dist/src/evaluatorHelpers-DRR3rLq0.cjs +622 -0
- package/dist/src/fetch-B5KxZuKu.js +1559 -0
- package/dist/src/fetch-BG_Jl7ty.js +1556 -0
- package/dist/src/fetch-BKlgUg08.cjs +1853 -0
- package/dist/src/fetch-C9Fsja0R.js +2 -0
- package/dist/src/fetch-CM7P8KWA.cjs +14 -0
- package/dist/src/fetch-D0FkIB3G.js +9 -0
- package/dist/src/fetch-RXHsZF-J.js +1280 -0
- package/dist/src/fetch-rSECy8jR.js +10 -0
- package/dist/src/functionCallbackUtils-BB9tmf6a.cjs +262 -0
- package/dist/src/functionCallbackUtils-BXk2iY01.js +246 -0
- package/dist/src/functionCallbackUtils-B_cYp7P5.js +245 -0
- package/dist/src/functionCallbackUtils-BfXnPo0o.js +245 -0
- package/dist/src/gemini-image-BXLMADDz.js +471 -0
- package/dist/src/gemini-image-BYUZyEUx.js +472 -0
- package/dist/src/gemini-image-DSt1QubZ.cjs +471 -0
- package/dist/src/gemini-image-DdNDMiZ_.js +471 -0
- package/dist/src/goat-9b-uU_k6.js +514 -0
- package/dist/src/goat-BCJuiDd0.js +515 -0
- package/dist/src/goat-CmAHbemm.js +512 -0
- package/dist/src/goat-DdOTdyoS.cjs +515 -0
- package/dist/src/goblin-Bp5C5lyb.js +22 -0
- package/dist/src/goblin-Dmr7GItI.js +23 -0
- package/dist/src/goblin-DpM8wxlf.cjs +22 -0
- package/dist/src/goblin-cJyH6Pq-.js +22 -0
- package/dist/src/google-B6eaPAbE.js +142 -0
- package/dist/src/google-D-FStdN6.cjs +142 -0
- package/dist/src/google-DAC7BsCW.js +142 -0
- package/dist/src/google-Id18H0Va.js +143 -0
- package/dist/src/graders-BjNQWkaB.js +2 -0
- package/dist/src/graders-CqdIp_vl.js +15470 -0
- package/dist/src/hydra-6Ouh74DE.js +610 -0
- package/dist/src/hydra-BHjhZnLB.cjs +612 -0
- package/dist/src/hydra-BL6k2REV.js +2 -0
- package/dist/src/hydra-BWUc0o67.js +613 -0
- package/dist/src/hydra-CUkEOLKw.js +612 -0
- package/dist/src/image-B6hG_xhb.js +481 -0
- package/dist/src/image-BFaq7Krd.cjs +209 -0
- package/dist/src/image-Bql5C0N9.cjs +504 -0
- package/dist/src/image-BtZfI2pT.js +163 -0
- package/dist/src/image-CIM4oN7Z.cjs +163 -0
- package/dist/src/image-CbAl7Jpu.js +209 -0
- package/dist/src/image-CiYm_yFw.js +209 -0
- package/dist/src/image-DCMNvBiV.js +163 -0
- package/dist/src/image-DL7pIuUZ.js +210 -0
- package/dist/src/image-ey0kxF8o.js +164 -0
- package/dist/src/image-smgIk3rE.js +482 -0
- package/dist/src/index.cjs +27 -27
- package/dist/src/index.d.cts +8 -8
- package/dist/src/index.js +27 -27
- package/dist/src/indirectWebPwn-B_-UpWY5.js +285 -0
- package/dist/src/indirectWebPwn-Cz3SLiEq.js +434 -0
- package/dist/src/indirectWebPwn-D2s8zGiM.cjs +463 -0
- package/dist/src/indirectWebPwn-DXbj2wGu.cjs +285 -0
- package/dist/src/indirectWebPwn-D_4H44E6.js +285 -0
- package/dist/src/indirectWebPwn-L044SrpV.js +434 -0
- package/dist/src/indirectWebPwn-cnmvdavH.js +435 -0
- package/dist/src/indirectWebPwn-zUBzsqTt.js +286 -0
- package/dist/src/interactions-Bu3oVQ-j.js +850 -0
- package/dist/src/interactions-CND010Lh.cjs +850 -0
- package/dist/src/interactions-DAx7tqUz.js +851 -0
- package/dist/src/interactions-DPkIumeh.js +850 -0
- package/dist/src/iterative-BO4JRnpG.js +545 -0
- package/dist/src/iterative-CAK-k9rz.js +548 -0
- package/dist/src/iterative-CDgHc0xO.cjs +549 -0
- package/dist/src/iterative-CXJlHLl9.js +547 -0
- package/dist/src/iterativeImage-BEdGKSmh.cjs +419 -0
- package/dist/src/iterativeImage-BfL0QZw5.js +417 -0
- package/dist/src/iterativeImage-C9KhnibC.js +417 -0
- package/dist/src/iterativeImage-btjkOfWG.js +418 -0
- package/dist/src/iterativeMeta-B5Bdw6QA.js +437 -0
- package/dist/src/iterativeMeta-C3mI4gpT.js +440 -0
- package/dist/src/iterativeMeta-Co2BKyqS.cjs +439 -0
- package/dist/src/iterativeMeta-DD8ihRWD.js +439 -0
- package/dist/src/iterativeTree-AMi4GV2O.js +878 -0
- package/dist/src/iterativeTree-C8FJOEje.cjs +879 -0
- package/dist/src/iterativeTree-CvrY1f2Z.js +877 -0
- package/dist/src/iterativeTree-bPtESmaD.js +876 -0
- package/dist/src/knowledgeBase-Cf5871e3.js +163 -0
- package/dist/src/knowledgeBase-D2PQhqLH.js +164 -0
- package/dist/src/knowledgeBase-DpoMw1IH.cjs +163 -0
- package/dist/src/knowledgeBase-npGFl763.js +163 -0
- package/dist/src/litellm-BBB5DQdt.cjs +146 -0
- package/dist/src/litellm-Bo43ow7r.js +145 -0
- package/dist/src/litellm-CaU8CMLS.js +146 -0
- package/dist/src/litellm-wY7Unh8o.js +147 -0
- package/dist/src/live-5g2w-M-E.js +891 -0
- package/dist/src/live-BfaXsDyD.cjs +891 -0
- package/dist/src/live-C1xewnGD.js +2 -0
- package/dist/src/live-DaF7nYy5.js +892 -0
- package/dist/src/live-lp3urLUw.js +891 -0
- package/dist/src/luma-ray-B7zvKGVG.js +309 -0
- package/dist/src/luma-ray-DCf5fnrz.cjs +309 -0
- package/dist/src/luma-ray-DepBcn6z.js +309 -0
- package/dist/src/luma-ray-XQC4M1pt.js +310 -0
- package/dist/src/main.js +26 -26
- package/dist/src/mantleChat-7xm95vSV.js +154 -0
- package/dist/src/mantleChat-CXhAs5RD.js +155 -0
- package/dist/src/mantleChat-CcE-zjfj.cjs +154 -0
- package/dist/src/mantleChat-Cpefl7Zm.js +154 -0
- package/dist/src/mcp-B0V0ikdM.js +84 -0
- package/dist/src/mcp-CV2k2gwj.js +85 -0
- package/dist/src/memoryPoisoning-BC5FQQWZ.js +111 -0
- package/dist/src/memoryPoisoning-BDwrtZKX.js +111 -0
- package/dist/src/memoryPoisoning-BFemS_FF.js +112 -0
- package/dist/src/memoryPoisoning-DRs2rbVV.cjs +111 -0
- package/dist/src/messages-Bc5oZoAJ.js +1128 -0
- package/dist/src/messages-BkaH8fRW.js +1127 -0
- package/dist/src/messages-CoHlziS5.js +1127 -0
- package/dist/src/messages-Cv_m6kYs.cjs +1161 -0
- package/dist/src/mischievousUser-BcyFxrqJ.js +51 -0
- package/dist/src/mischievousUser-BlhOQSd2.js +52 -0
- package/dist/src/mischievousUser-BuQiKE8D.js +51 -0
- package/dist/src/mischievousUser-ChIOk6cT.cjs +51 -0
- package/dist/src/modelslab-BXIWBTgX.js +171 -0
- package/dist/src/modelslab-ChVsUiaJ.js +170 -0
- package/dist/src/modelslab-DZ6BFlDv.js +170 -0
- package/dist/src/modelslab-DhRr-vyo.cjs +170 -0
- package/dist/src/nova-reel-BL8DrN4_.js +272 -0
- package/dist/src/nova-reel-BiOMUm5q.cjs +272 -0
- package/dist/src/nova-reel-CTsya1hV.js +273 -0
- package/dist/src/nova-reel-kgBY4Svd.js +272 -0
- package/dist/src/nova-sonic-CaSSA3Jq.cjs +374 -0
- package/dist/src/nova-sonic-DLpmoGsR.js +375 -0
- package/dist/src/nova-sonic-DwWc4SoN.js +374 -0
- package/dist/src/nova-sonic-qnReTaXm.js +374 -0
- package/dist/src/novita-B5mAt3Ui.js +114 -0
- package/dist/src/novita-D57vCjDD.js +116 -0
- package/dist/src/novita-ITRtG8IJ.js +115 -0
- package/dist/src/novita-Rh3T13YO.cjs +115 -0
- package/dist/src/nscale-8V7iZ_pI.js +210 -0
- package/dist/src/nscale-BQnMv4pH.cjs +209 -0
- package/dist/src/nscale-BWZXHZVF.js +209 -0
- package/dist/src/nscale-BqrHiUqU.js +207 -0
- package/dist/src/openaiResponses-BMtGTu8R.js +317 -0
- package/dist/src/openaiResponses-CvcI_viE.js +318 -0
- package/dist/src/openaiResponses-DYPZEMX1.cjs +318 -0
- package/dist/src/openaiResponses-DZTg1-kb.js +319 -0
- package/dist/src/openclaw-BeKuig4g.js +1338 -0
- package/dist/src/openclaw-COkdQ83y.js +1337 -0
- package/dist/src/openclaw-CSoX_HQ5.cjs +1344 -0
- package/dist/src/openclaw-DJlhPGCb.js +1336 -0
- package/dist/src/opencode-sdk-BEJftEs6.cjs +1018 -0
- package/dist/src/opencode-sdk-DMvBB3V7.js +1013 -0
- package/dist/src/opencode-sdk-Df7hMjLO.js +1012 -0
- package/dist/src/opencode-sdk-bQp5Xf3W.js +1012 -0
- package/dist/src/openinterpreter-B3GgVZjK.js +431 -0
- package/dist/src/openinterpreter-BiGcU-HN.cjs +435 -0
- package/dist/src/openinterpreter-Buj2l3Eh.js +432 -0
- package/dist/src/openinterpreter-C3_Cg5b_.js +431 -0
- package/dist/src/pricing-0Pampf0q.cjs +999 -0
- package/dist/src/pricing-B8VdhEhY.js +976 -0
- package/dist/src/pricing-CtLA-rKA.js +976 -0
- package/dist/src/promptfoo-4OkHtH9P.cjs +341 -0
- package/dist/src/promptfoo-Bhpm7sH6.js +286 -0
- package/dist/src/promptfoo-BqV8ogVA.js +285 -0
- package/dist/src/promptfoo-S1Q9OHk_.js +286 -0
- package/dist/src/providers-B5zs1ZRv.js +24437 -0
- package/dist/src/providers-Cd6CJh6m.js +2 -0
- package/dist/src/providers-CpJlgHET.js +24039 -0
- package/dist/src/providers-CzvLvK6G.cjs +24180 -0
- package/dist/src/quiverai-1E_IvLHn.js +325 -0
- package/dist/src/quiverai-BXH004Vv.js +325 -0
- package/dist/src/quiverai-Ccya2z8Y.cjs +325 -0
- package/dist/src/quiverai-Cez57oe-.js +326 -0
- package/dist/src/registry-3zX_M9Ik.js +131 -0
- package/dist/src/registry-AuCrKTvS.js +132 -0
- package/dist/src/registry-CxXWKtQG.js +131 -0
- package/dist/src/registry-DG3o66JQ.cjs +131 -0
- package/dist/src/remoteGeneration-CAtvamG6.js +370 -0
- package/dist/src/remoteGeneration-CF225pDl.cjs +482 -0
- package/dist/src/remoteGeneration-DtnqocnL.js +370 -0
- package/dist/src/remoteGeneration-g3KvW-sP.js +371 -0
- package/dist/src/responses-BMbaUXQI.js +1098 -0
- package/dist/src/responses-B_TOSof-.js +1099 -0
- package/dist/src/responses-v-yANwTA.cjs +1109 -0
- package/dist/src/runtimeTransform-BBZv-oUZ.js +156 -0
- package/dist/src/runtimeTransform-DT2v5ovW.js +156 -0
- package/dist/src/runtimeTransform-GXXEIXdS.cjs +161 -0
- package/dist/src/runtimeTransform-JTwBQc-P.js +157 -0
- package/dist/src/sagemaker-B8D0L4rj.cjs +716 -0
- package/dist/src/sagemaker-CR2_AGdB.js +713 -0
- package/dist/src/sagemaker-Cd9qSQUV.js +714 -0
- package/dist/src/sagemaker-mKlltN4p.js +713 -0
- package/dist/src/scanner-PG_8lh8r.js +1971 -0
- package/dist/src/server/index.js +55 -55
- package/dist/src/server-Bmh7sd9F.js +155 -0
- package/dist/src/server-C7b8z6aC.js +63 -0
- package/dist/src/server-CAcovgtL.js +2 -0
- package/dist/src/server-CuuMfKlh.cjs +74 -0
- package/dist/src/server-DMPCj9jy.js +189 -0
- package/dist/src/session-BksXvRH_.cjs +69 -0
- package/dist/src/session-DOxUjqGQ.js +63 -0
- package/dist/src/session-Dujsc-b9.js +62 -0
- package/dist/src/session-VjtIxREd.js +62 -0
- package/dist/src/shared-Bkyz_7e5.cjs +2185 -0
- package/dist/src/shared-DDJg8ycC.js +1929 -0
- package/dist/src/shared-Dh3yfRBd.js +1927 -0
- package/dist/src/shared-tfPT8Tna.js +1928 -0
- package/dist/src/simulatedUser-6JdkyL3k.cjs +252 -0
- package/dist/src/simulatedUser-CFr2mr3M.js +248 -0
- package/dist/src/simulatedUser-DjwwUqx-.js +247 -0
- package/dist/src/slack-C_gIYiUs.js +144 -0
- package/dist/src/slack-DhNbz9CM.cjs +144 -0
- package/dist/src/slack-Dm2iI1zu.js +145 -0
- package/dist/src/strategies-BIY-bNul.js +2248 -0
- package/dist/src/strategies-C1KQQj9G.cjs +2420 -0
- package/dist/src/strategies-DM_3mReG.js +2385 -0
- package/dist/src/telemetry-BhMTibZO.js +2 -0
- package/dist/src/telemetry-C04d25BM.cjs +216 -0
- package/dist/src/telemetry-CIqy4fSC.js +201 -0
- package/dist/src/telemetry-CXozp_6C.js +205 -0
- package/dist/src/telemetry-g7PkBxmY.js +205 -0
- package/dist/src/togetherai-BvCim68-.js +50 -0
- package/dist/src/togetherai-CWyDCA9m.cjs +49 -0
- package/dist/src/togetherai-CeSE31vK.js +49 -0
- package/dist/src/togetherai-_2W0URf8.js +48 -0
- package/dist/src/traceContext-Brw3Oe41.js +1016 -0
- package/dist/src/traceContext-DpAYv27G.js +1015 -0
- package/dist/src/traceContext-KSqhzZI2.cjs +1032 -0
- package/dist/src/transcription-BySopazW.js +175 -0
- package/dist/src/transcription-DO4UPkRI.cjs +178 -0
- package/dist/src/transcription-RJGBa-pC.js +176 -0
- package/dist/src/transcription-fZenF3G5.js +175 -0
- package/dist/src/transform-BzhRc5z2.js +125 -0
- package/dist/src/transform-CPQu05u6.cjs +154 -0
- package/dist/src/transform-DAED8imp.js +126 -0
- package/dist/src/transform-DIOIQDmM.js +125 -0
- package/dist/src/typesafe-ByE0Kxfg.js +253 -0
- package/dist/src/typesafe-CFqGFY34.js +253 -0
- package/dist/src/typesafe-DCWIw-CP.cjs +253 -0
- package/dist/src/typesafe-DyHFV5Qk.js +254 -0
- package/dist/src/util-BHkj9joz.js +2049 -0
- package/dist/src/util-CICwIpmu.cjs +934 -0
- package/dist/src/util-CePiY2xZ.js +286 -0
- package/dist/src/util-CgT3uf4p.js +743 -0
- package/dist/src/util-Cj9drvOY.js +1770 -0
- package/dist/src/util-ClJRjlQA.cjs +357 -0
- package/dist/src/util-Cxf8VF2M.js +395 -0
- package/dist/src/util-D7RdV7rS.js +395 -0
- package/dist/src/util-DMNFhk47.js +351 -0
- package/dist/src/util-DNzh3M0z.js +396 -0
- package/dist/src/util-Df7rfMGb.cjs +2305 -0
- package/dist/src/util-Kf0KnG_6.js +2051 -0
- package/dist/src/util-LEbeiYw_.js +743 -0
- package/dist/src/util-WH8CgVs4.js +352 -0
- package/dist/src/util-cx6Xw8Lw.cjs +478 -0
- package/dist/src/util-qzBqirBH.js +2050 -0
- package/dist/src/vertex-CBAMfRz3.js +854 -0
- package/dist/src/vertex-CMP2IpN9.js +2 -0
- package/dist/src/vertex-CZ5YOotT.js +848 -0
- package/dist/src/vertex-DNsh1F1M.cjs +871 -0
- package/dist/src/vertexLive-BTXYj3-F.js +55 -0
- package/dist/src/vertexLive-Ba_LAqEF.cjs +55 -0
- package/dist/src/vertexLive-DM4sFaaj.js +56 -0
- package/dist/src/vertexLive-JqZOw7HC.js +55 -0
- package/dist/src/video-BY7Q2Gii.cjs +706 -0
- package/dist/src/video-CYElP-CK.js +703 -0
- package/dist/src/video-C_AdEDH0.js +702 -0
- package/dist/src/video-DGvjQ_4j.js +702 -0
- package/package.json +1 -1
- package/dist/src/accounts-Dpb43yde.cjs +0 -276
- package/dist/src/accounts-GKrO1olH.js +0 -229
- package/dist/src/accounts-e4FGOsji.js +0 -227
- package/dist/src/accounts-sUiEJfkB.js +0 -222
- package/dist/src/agentWorkspace-B8A_wuMR.cjs +0 -619
- package/dist/src/agentWorkspace-DSPIscXR.js +0 -593
- package/dist/src/agentWorkspace-DxUqd-XK.js +0 -592
- package/dist/src/agentWorkspace-n0uOJXhD.js +0 -592
- package/dist/src/agentic-utils-9bCj4twQ.js +0 -197
- package/dist/src/agentic-utils-CyCLuLoj.js +0 -197
- package/dist/src/agentic-utils-D23qtOlx.cjs +0 -237
- package/dist/src/agentic-utils-DuBMMNCw.js +0 -198
- package/dist/src/agents-6hDRNoYD.js +0 -777
- package/dist/src/agents-B8w2o7Sc.cjs +0 -777
- package/dist/src/agents-Ck0NXl7v.js +0 -777
- package/dist/src/agents-CwT3B1qB.js +0 -778
- package/dist/src/agents-DOLjfOEq.js +0 -266
- package/dist/src/agents-OcF9hq--.js +0 -267
- package/dist/src/agents-api-CnZZt8bn.cjs +0 -710
- package/dist/src/agents-api-D04u3bmL.js +0 -711
- package/dist/src/agents-api-DWw0_Vio.js +0 -710
- package/dist/src/agents-api-IWHEwp8i.js +0 -710
- package/dist/src/agents-mHt2Mh9O.cjs +0 -266
- package/dist/src/agents-sICccZCA.js +0 -266
- package/dist/src/ai.studio-Ci4rypDT.js +0 -2
- package/dist/src/ai.studio-KkQ6KaHa.js +0 -369
- package/dist/src/ai.studio-gSXK2cGI.js +0 -374
- package/dist/src/ai.studio-nQF_B4DH.cjs +0 -391
- package/dist/src/aimlapi-BeSk5BDV.js +0 -30
- package/dist/src/aimlapi-CzNUhdKu.cjs +0 -29
- package/dist/src/aimlapi-DCkazDPI.js +0 -29
- package/dist/src/aimlapi-WeH5B6K1.js +0 -28
- package/dist/src/anthropicMessages-AcNWTpYO.js +0 -115
- package/dist/src/anthropicMessages-BUtvzbpL.js +0 -114
- package/dist/src/anthropicMessages-DTWhZDCd.js +0 -114
- package/dist/src/anthropicMessages-lGVnSgyx.cjs +0 -114
- package/dist/src/app/assets/index-CyEI5aDN.js +0 -392
- package/dist/src/audio-BE_Duiu1.js +0 -104
- package/dist/src/audio-CiUd00k2.cjs +0 -104
- package/dist/src/audio-Dop6omna.js +0 -105
- package/dist/src/audio-EZNTInr_.js +0 -104
- package/dist/src/authoritativeMarkupInjection-BUqH6hNk.js +0 -78
- package/dist/src/authoritativeMarkupInjection-BmbJdJO0.cjs +0 -78
- package/dist/src/authoritativeMarkupInjection-Cpz12Y3w.js +0 -78
- package/dist/src/authoritativeMarkupInjection-W4XfcH91.js +0 -79
- package/dist/src/aws-B2Jqbnet.js +0 -2433
- package/dist/src/aws-DHtuUIzQ.js +0 -1149
- package/dist/src/aws-DLqXP6wY.js +0 -2433
- package/dist/src/aws-DfduhmwL.cjs +0 -2454
- package/dist/src/base-B9L2Xvpc.js +0 -255
- package/dist/src/base-BTZnIsuH.cjs +0 -305
- package/dist/src/base-BhaWNQPJ.js +0 -462
- package/dist/src/base-Br-G_Xou.js +0 -256
- package/dist/src/base-Bzo8hiUS.cjs +0 -467
- package/dist/src/base-C82fd2jq.js +0 -463
- package/dist/src/base-CRdQwC1W.js +0 -462
- package/dist/src/base-CjGwZNOQ.js +0 -255
- package/dist/src/bedrock-BdMru_ro.js +0 -1300
- package/dist/src/bedrock-CBUmfLX1.cjs +0 -2
- package/dist/src/bedrock-DBDxBaF9.js +0 -2
- package/dist/src/bedrock-DDrECM21.js +0 -1
- package/dist/src/bedrock-DVwkgvRS.js +0 -1
- package/dist/src/bestOfN-AKF5beq4.js +0 -159
- package/dist/src/bestOfN-C1UIVGJV.js +0 -160
- package/dist/src/bestOfN-DlkETbXy.cjs +0 -161
- package/dist/src/bestOfN-XIfEgU-g.js +0 -159
- package/dist/src/cache-BZaVoKaA.js +0 -2
- package/dist/src/cache-CEYhFUsH.js +0 -741
- package/dist/src/cache-Cbw1zH6q.js +0 -782
- package/dist/src/cache-CdaZNb75.js +0 -754
- package/dist/src/cache-DpuIzPxh.cjs +0 -856
- package/dist/src/cerebras-Bpn6FPkJ.js +0 -97
- package/dist/src/cerebras-CqJ0BRCJ.cjs +0 -97
- package/dist/src/cerebras-D4ILa_TY.js +0 -97
- package/dist/src/cerebras-DR8uc7ee.js +0 -98
- package/dist/src/chat-B7PZfaYp.cjs +0 -987
- package/dist/src/chat-BVuSjdEb.js +0 -227
- package/dist/src/chat-BsaZRjXN.js +0 -76
- package/dist/src/chat-C5liqe3Y.js +0 -226
- package/dist/src/chat-C9hyHf5B.js +0 -124
- package/dist/src/chat-CFLalAck.js +0 -226
- package/dist/src/chat-CN8JGrHu.js +0 -76
- package/dist/src/chat-CaHBBpCb.js +0 -123
- package/dist/src/chat-CcbLSghx.js +0 -123
- package/dist/src/chat-CoSN6sr2.js +0 -934
- package/dist/src/chat-CsJRFX8a.cjs +0 -226
- package/dist/src/chat-DFoZLvO_.js +0 -934
- package/dist/src/chat-DiLQvL7r.js +0 -77
- package/dist/src/chat-F6qVSDk3.cjs +0 -123
- package/dist/src/chat-Oq4FaJgI.cjs +0 -76
- package/dist/src/chat-knMfQUKz.js +0 -935
- package/dist/src/claude-agent-sdk-CJkOLpnI.js +0 -999
- package/dist/src/claude-agent-sdk-Ckn76PRD.js +0 -999
- package/dist/src/claude-agent-sdk-DX0gTr11.cjs +0 -1005
- package/dist/src/claude-agent-sdk-LMeikxoR.js +0 -1000
- package/dist/src/client-BFf1r6Z8.js +0 -352
- package/dist/src/client-CdXyDdDi.js +0 -351
- package/dist/src/client-DV8XMu7i.js +0 -351
- package/dist/src/client-iEXtOBKW.cjs +0 -357
- package/dist/src/cloud-B02qcpjf.js +0 -2
- package/dist/src/cloud-BlHP-g1v.cjs +0 -666
- package/dist/src/cloud-C9BI4isF.js +0 -287
- package/dist/src/cloud-CTTLNdvj.js +0 -657
- package/dist/src/cloud-D5X5yQ_d.js +0 -599
- package/dist/src/cloud-QxPkpsHA.js +0 -599
- package/dist/src/cloudflare-ai-DRTRT1fc.js +0 -132
- package/dist/src/cloudflare-ai-DgaXapAV.cjs +0 -133
- package/dist/src/cloudflare-ai-DkuJXijS.js +0 -134
- package/dist/src/cloudflare-ai-wy9QCHku.js +0 -133
- package/dist/src/cloudflare-gateway-9cAN8g29.cjs +0 -276
- package/dist/src/cloudflare-gateway-BVFMD292.js +0 -277
- package/dist/src/cloudflare-gateway-BuUI4p6I.js +0 -276
- package/dist/src/cloudflare-gateway-TlYHizbW.js +0 -276
- package/dist/src/codex-app-server-BPz_feug.cjs +0 -2162
- package/dist/src/codex-app-server-C9noXM9C.js +0 -2155
- package/dist/src/codex-app-server-CEmD-Y5U.js +0 -2
- package/dist/src/codex-app-server-DZolc18r.js +0 -2156
- package/dist/src/codex-app-server-Dd0A37nO.js +0 -2155
- package/dist/src/codex-sdk-BbxjBvBk.cjs +0 -1588
- package/dist/src/codex-sdk-BpXeIs-_.js +0 -1557
- package/dist/src/codex-sdk-BtQp5X0f.js +0 -1552
- package/dist/src/codex-sdk-CH0v9Bk1.js +0 -2
- package/dist/src/codex-sdk-CgrN7JB8.js +0 -1557
- package/dist/src/codex-security-B5fENNUr.js +0 -406
- package/dist/src/codex-security-C6uuJx-y.cjs +0 -411
- package/dist/src/codex-security-CifWtZR_.js +0 -407
- package/dist/src/codex-security-Kg2bOEKy.js +0 -406
- package/dist/src/cometapi-BFpIDLIx.js +0 -55
- package/dist/src/cometapi-C6O2PIrN.js +0 -56
- package/dist/src/cometapi-D5Yupc6F.js +0 -53
- package/dist/src/cometapi-DzgIwJzJ.cjs +0 -55
- package/dist/src/compatible-0jhmVfOp.js +0 -25
- package/dist/src/compatible-DdtwWdJi.cjs +0 -24
- package/dist/src/compatible-Di4nR3sU.js +0 -24
- package/dist/src/compatible-iJKLWdnf.js +0 -24
- package/dist/src/completion-B0_hVUDG.js +0 -119
- package/dist/src/completion-BdI6v0-Q.cjs +0 -123
- package/dist/src/completion-CWcJscwv.js +0 -118
- package/dist/src/conversationScoring-99EOPJRa.js +0 -373
- package/dist/src/conversationScoring-BIq4J0Cq.js +0 -374
- package/dist/src/conversationScoring-DARyeATr.cjs +0 -398
- package/dist/src/conversationScoring-DS48t4Hb.js +0 -373
- package/dist/src/crescendo-CebvXIu4.js +0 -730
- package/dist/src/crescendo-CxrLS0oo.js +0 -732
- package/dist/src/crescendo-DZQXBSkj.js +0 -733
- package/dist/src/crescendo-wjEx68uD.cjs +0 -734
- package/dist/src/custom-BiQ-aUNw.cjs +0 -620
- package/dist/src/custom-ByyB5Z93.js +0 -619
- package/dist/src/custom-C5jOevNb.js +0 -617
- package/dist/src/custom-CCrsCz8o.js +0 -618
- package/dist/src/dataUrl-C9J7wz9H.js +0 -3133
- package/dist/src/dataUrl-CGsBT7UZ.cjs +0 -3187
- package/dist/src/dataUrl-CzKvvWNO.js +0 -2868
- package/dist/src/decisions-BTusXCUx.cjs +0 -514
- package/dist/src/decisions-BYtL9edD.js +0 -515
- package/dist/src/decisions-jYix_gCF.js +0 -515
- package/dist/src/decisions-nxxfHRAN.js +0 -516
- package/dist/src/docker-DDIv4zkg.js +0 -93
- package/dist/src/docker-DVLp_5OG.js +0 -94
- package/dist/src/docker-INm9w0SY.cjs +0 -94
- package/dist/src/docker-sGuoCul_.js +0 -95
- package/dist/src/embedding-CAhqLLrR.js +0 -82
- package/dist/src/embedding-D94GAsti.cjs +0 -86
- package/dist/src/embedding-zb4MAzQy.js +0 -81
- package/dist/src/envoy-BMPszwEa.cjs +0 -60
- package/dist/src/envoy-Bp-s39_8.js +0 -60
- package/dist/src/envoy-BswDt-Ou.js +0 -61
- package/dist/src/envoy-rVbYcV80.js +0 -60
- package/dist/src/eval-B1-XfrC7.js +0 -2
- package/dist/src/eval-pC4qCvLw.js +0 -1920
- package/dist/src/evalResult-CzjCb5bd.js +0 -1300
- package/dist/src/evaluator-CNq2K7J_.js +0 -10578
- package/dist/src/evaluator-LtfxdxEu.js +0 -2
- package/dist/src/evaluatorHelpers-C5J0NYpQ.js +0 -601
- package/dist/src/evaluatorHelpers-DcdCglCs.cjs +0 -622
- package/dist/src/evaluatorHelpers-Rvb88W6B.js +0 -600
- package/dist/src/fetch-5HtnNhHg.js +0 -1556
- package/dist/src/fetch-BCwjoIFd.js +0 -1559
- package/dist/src/fetch-BhfUnKen.js +0 -1280
- package/dist/src/fetch-C08w4vVl.js +0 -9
- package/dist/src/fetch-DBxy8Tlb.cjs +0 -14
- package/dist/src/fetch-DYte6oQX.cjs +0 -1853
- package/dist/src/fetch-ElpfcAVG.js +0 -10
- package/dist/src/fetch-lM1OIaSt.js +0 -2
- package/dist/src/functionCallbackUtils-BCAdWfHO.js +0 -246
- package/dist/src/functionCallbackUtils-BYq9qOhG.js +0 -245
- package/dist/src/functionCallbackUtils-ByWkmVud.cjs +0 -262
- package/dist/src/functionCallbackUtils-D_C_JaFd.js +0 -245
- package/dist/src/gemini-image-CAlwaJhZ.js +0 -471
- package/dist/src/gemini-image-DJoVoOnZ.cjs +0 -471
- package/dist/src/gemini-image-Waio-9Xx.js +0 -472
- package/dist/src/gemini-image-vbY6Ftbf.js +0 -471
- package/dist/src/goat-BWbtyY9c.js +0 -512
- package/dist/src/goat-CXzzeCOQ.cjs +0 -515
- package/dist/src/goat-CfgvzSgZ.js +0 -514
- package/dist/src/goat-DLeoIHBp.js +0 -515
- package/dist/src/goblin-CmfCfwqk.cjs +0 -22
- package/dist/src/goblin-CtcaORRH.js +0 -22
- package/dist/src/goblin-DF6DDhM-.js +0 -22
- package/dist/src/goblin-Nai0xxBV.js +0 -23
- package/dist/src/google-ClpkLtKL.cjs +0 -142
- package/dist/src/google-CrFgKu9k.js +0 -143
- package/dist/src/google-Dj_EIBqS.js +0 -142
- package/dist/src/google-e4-vARv6.js +0 -142
- package/dist/src/graders-BN1IIa71.js +0 -15470
- package/dist/src/graders-C5sCfSP5.js +0 -2
- package/dist/src/hydra-B7RfXVBK.js +0 -2
- package/dist/src/hydra-C1cFN-Jg.js +0 -613
- package/dist/src/hydra-CK6Uc1ia.js +0 -612
- package/dist/src/hydra-Dg65rAP_.js +0 -610
- package/dist/src/hydra-Fqx8l_Xu.cjs +0 -612
- package/dist/src/image-BdlUDAtp.js +0 -163
- package/dist/src/image-C-KwEhwt.cjs +0 -163
- package/dist/src/image-C76fp6NK.cjs +0 -209
- package/dist/src/image-D75ehv3D.js +0 -482
- package/dist/src/image-DKtc5v5W.js +0 -209
- package/dist/src/image-DT_xOkJY.js +0 -163
- package/dist/src/image-DVpdllEE.js +0 -209
- package/dist/src/image-DXZ8AzMf.js +0 -481
- package/dist/src/image-DZl_1mvy.js +0 -164
- package/dist/src/image-DcTD7Ak0.cjs +0 -504
- package/dist/src/image-ndxEvBKB.js +0 -210
- package/dist/src/indirectWebPwn-70WA5x_q.js +0 -435
- package/dist/src/indirectWebPwn-BRVyd3qV.cjs +0 -463
- package/dist/src/indirectWebPwn-BsJVsu0q.js +0 -285
- package/dist/src/indirectWebPwn-Cw6yJu0i.js +0 -285
- package/dist/src/indirectWebPwn-D-PhJzo4.js +0 -286
- package/dist/src/indirectWebPwn-DRPHt2I8.js +0 -434
- package/dist/src/indirectWebPwn-DXtfFhd9.cjs +0 -285
- package/dist/src/indirectWebPwn-DvpNouzc.js +0 -434
- package/dist/src/interactions-5ixfW7Cl.js +0 -850
- package/dist/src/interactions-BOUzfmg1.cjs +0 -850
- package/dist/src/interactions-CSSXcGNc.js +0 -851
- package/dist/src/interactions-WB_sgkN0.js +0 -850
- package/dist/src/iterative-BShRNqjC.cjs +0 -549
- package/dist/src/iterative-BcW_ELtB.js +0 -548
- package/dist/src/iterative-BpHbHz8B.js +0 -547
- package/dist/src/iterative-YcchP12d.js +0 -545
- package/dist/src/iterativeImage-BMFE5Hl7.cjs +0 -419
- package/dist/src/iterativeImage-CkSaYLMY.js +0 -417
- package/dist/src/iterativeImage-DAEUlQX_.js +0 -418
- package/dist/src/iterativeImage-DeUSkEnj.js +0 -417
- package/dist/src/iterativeMeta-DbdaKdEO.cjs +0 -439
- package/dist/src/iterativeMeta-DcF9JWEK.js +0 -437
- package/dist/src/iterativeMeta-DkfPqWIC.js +0 -439
- package/dist/src/iterativeMeta-DkrpnVSs.js +0 -440
- package/dist/src/iterativeTree-CEMY1FhE.cjs +0 -879
- package/dist/src/iterativeTree-Cv5W4tX9.js +0 -877
- package/dist/src/iterativeTree-DGvomd3M.js +0 -876
- package/dist/src/iterativeTree-KbtC2Mkz.js +0 -878
- package/dist/src/knowledgeBase-AYRXn4wO.js +0 -163
- package/dist/src/knowledgeBase-BNqQfx01.js +0 -163
- package/dist/src/knowledgeBase-C0IaCCVs.js +0 -164
- package/dist/src/knowledgeBase-C2uj6wK4.cjs +0 -163
- package/dist/src/litellm-CN1ScAwZ.js +0 -147
- package/dist/src/litellm-CTjwiKSa.js +0 -146
- package/dist/src/litellm-Cd4Nj5ue.js +0 -145
- package/dist/src/litellm-DMqLpEBg.cjs +0 -146
- package/dist/src/live-Bt50-InO.cjs +0 -891
- package/dist/src/live-Bu2ujadG.js +0 -2
- package/dist/src/live-C3M52i3p.js +0 -891
- package/dist/src/live-CRfHMO3B.js +0 -892
- package/dist/src/live-iCIpO14m.js +0 -891
- package/dist/src/luma-ray-B8eHC4c8.cjs +0 -309
- package/dist/src/luma-ray-BIvkPw0s.js +0 -309
- package/dist/src/luma-ray-ChsiBxMA.js +0 -309
- package/dist/src/luma-ray-DAvKrInz.js +0 -310
- package/dist/src/mantleChat-5YeEXAZI.js +0 -154
- package/dist/src/mantleChat-D--mW3hl.js +0 -154
- package/dist/src/mantleChat-DHP3siNg.cjs +0 -154
- package/dist/src/mantleChat-wBfAX46o.js +0 -155
- package/dist/src/mcp-49jlEcTQ.js +0 -85
- package/dist/src/mcp-__PIz81I.js +0 -84
- package/dist/src/memoryPoisoning-Chxge74M.js +0 -111
- package/dist/src/memoryPoisoning-QH6NCUVE.js +0 -112
- package/dist/src/memoryPoisoning-tCxZt8Nz.js +0 -111
- package/dist/src/memoryPoisoning-ymrRItRR.cjs +0 -111
- package/dist/src/messages-BE_eZ7NA.js +0 -1127
- package/dist/src/messages-Bo638ShI.js +0 -1127
- package/dist/src/messages-BzR0-NQ1.js +0 -1128
- package/dist/src/messages-Cbg5Pfd0.cjs +0 -1161
- package/dist/src/mischievousUser-BtED2Z5Z.cjs +0 -51
- package/dist/src/mischievousUser-KqSOjrDJ.js +0 -51
- package/dist/src/mischievousUser-YMD41YNZ.js +0 -51
- package/dist/src/mischievousUser-zBxlNdCu.js +0 -52
- package/dist/src/modelslab-B8gZxtfE.js +0 -171
- package/dist/src/modelslab-C7bmVpTB.js +0 -170
- package/dist/src/modelslab-CCeQCTZg.js +0 -170
- package/dist/src/modelslab-CvBJGv7y.cjs +0 -170
- package/dist/src/nova-reel-BOEWsEKA.cjs +0 -272
- package/dist/src/nova-reel-BtyBXq5M.js +0 -273
- package/dist/src/nova-reel-C1eF3-EE.js +0 -272
- package/dist/src/nova-reel-YhgrxEKT.js +0 -272
- package/dist/src/nova-sonic-BaERP20w.js +0 -374
- package/dist/src/nova-sonic-CxgM3O-P.cjs +0 -374
- package/dist/src/nova-sonic-DJS22fC3.js +0 -375
- package/dist/src/nova-sonic-DwvwHyRX.js +0 -374
- package/dist/src/novita-D1l2tG0O.js +0 -116
- package/dist/src/novita-D84VM3v0.cjs +0 -115
- package/dist/src/novita-DGInvwfR.js +0 -115
- package/dist/src/novita-vXHkXhTg.js +0 -114
- package/dist/src/nscale-CU0Ldr00.js +0 -209
- package/dist/src/nscale-ClfKlQeM.cjs +0 -209
- package/dist/src/nscale-DxaVnF0x.js +0 -210
- package/dist/src/nscale-_poVxIrO.js +0 -207
- package/dist/src/openaiResponses-CJGsneNj.js +0 -317
- package/dist/src/openaiResponses-CKSl5Sdg.js +0 -319
- package/dist/src/openaiResponses-DC8rzFUc.js +0 -318
- package/dist/src/openaiResponses-rMHIA3dV.cjs +0 -318
- package/dist/src/openclaw-CCbvsNFW.cjs +0 -1344
- package/dist/src/openclaw-CZw1lCDZ.js +0 -1336
- package/dist/src/openclaw-ChFLgC-a.js +0 -1338
- package/dist/src/openclaw-DrPMoRrH.js +0 -1337
- package/dist/src/opencode-sdk-2EfIDhFp.cjs +0 -1018
- package/dist/src/opencode-sdk-CHw3F845.js +0 -1013
- package/dist/src/opencode-sdk-D0EGGxvy.js +0 -1012
- package/dist/src/opencode-sdk-jSS7NI2Q.js +0 -1012
- package/dist/src/openinterpreter-CY622xHC.js +0 -431
- package/dist/src/openinterpreter-DATyhuhP.js +0 -432
- package/dist/src/openinterpreter-DDUMyIf1.js +0 -431
- package/dist/src/openinterpreter-s5Tz6Lid.cjs +0 -435
- package/dist/src/pricing-C498twd2.js +0 -976
- package/dist/src/pricing-DBd_bMIh.cjs +0 -999
- package/dist/src/pricing-ISrMCskv.js +0 -976
- package/dist/src/promptfoo-6p0WG2ih.js +0 -286
- package/dist/src/promptfoo-BQRfgNs_.js +0 -285
- package/dist/src/promptfoo-Bqo88z20.cjs +0 -341
- package/dist/src/promptfoo-Cq5AVI3I.js +0 -286
- package/dist/src/providers-ATbeMX5E.cjs +0 -24180
- package/dist/src/providers-B7F1FiNI.js +0 -2
- package/dist/src/providers-DazIw8mI.js +0 -24039
- package/dist/src/providers-QvGlNAD0.js +0 -24437
- package/dist/src/quiverai-BPlNcLkV.cjs +0 -325
- package/dist/src/quiverai-By99-YmJ.js +0 -325
- package/dist/src/quiverai-CmmByDqo.js +0 -325
- package/dist/src/quiverai-HZkoJJqw.js +0 -326
- package/dist/src/registry-BLTnTfjT.cjs +0 -131
- package/dist/src/registry-BMC-COHT.js +0 -132
- package/dist/src/registry-C8UZtmBp.js +0 -131
- package/dist/src/registry-CfwEUYXG.js +0 -131
- package/dist/src/remoteGeneration-Bgg6kC5V.js +0 -370
- package/dist/src/remoteGeneration-CKJFE960.cjs +0 -482
- package/dist/src/remoteGeneration-DaxwJDKv.js +0 -370
- package/dist/src/remoteGeneration-vHMGVKr1.js +0 -371
- package/dist/src/responses-BvnyIHrq.js +0 -1099
- package/dist/src/responses-CERAgvf-.js +0 -1098
- package/dist/src/responses-CwgjeuOg.cjs +0 -1109
- package/dist/src/runtimeTransform-3RF9Avyg.cjs +0 -161
- package/dist/src/runtimeTransform-C51Z5j4H.js +0 -156
- package/dist/src/runtimeTransform-CKE_Iyv8.js +0 -157
- package/dist/src/runtimeTransform-Cs11xJpj.js +0 -156
- package/dist/src/sagemaker-BJ4dOCxE.js +0 -713
- package/dist/src/sagemaker-Bt3JUAWq.js +0 -714
- package/dist/src/sagemaker-QVKyLgLF.cjs +0 -716
- package/dist/src/sagemaker-l3IB8iTs.js +0 -713
- package/dist/src/scanner-DGjIiTZ1.js +0 -1971
- package/dist/src/server-BNaLZH6u.js +0 -63
- package/dist/src/server-CBMuQul3.js +0 -189
- package/dist/src/server-CMKKIzKv.cjs +0 -74
- package/dist/src/server-CN2IS9Cs.js +0 -155
- package/dist/src/server-ua4cqbjC.js +0 -2
- package/dist/src/session-CQIjq_HZ.cjs +0 -69
- package/dist/src/session-FTlg8sEu.js +0 -62
- package/dist/src/session-GBQXtPWp.js +0 -63
- package/dist/src/session-_0-rTdwY.js +0 -62
- package/dist/src/shared-BtuO-OAM.js +0 -1927
- package/dist/src/shared-Ci78wTZX.js +0 -1928
- package/dist/src/shared-Dd3rimdM.js +0 -1929
- package/dist/src/shared-KAjFxRre.cjs +0 -2185
- package/dist/src/simulatedUser--OjW6xCx.js +0 -247
- package/dist/src/simulatedUser-D0-slRye.cjs +0 -252
- package/dist/src/simulatedUser-D1Kh_cwA.js +0 -248
- package/dist/src/slack-BX0FUevO.js +0 -144
- package/dist/src/slack-CcwXFiJE.cjs +0 -144
- package/dist/src/slack-CnfqKfXp.js +0 -145
- package/dist/src/strategies-2ntcK4tN.js +0 -2248
- package/dist/src/strategies-DZIW7Zcs.js +0 -2385
- package/dist/src/strategies-YRDF2j-N.cjs +0 -2420
- package/dist/src/telemetry-CL8CVA4p.js +0 -205
- package/dist/src/telemetry-Cix90qqz.js +0 -201
- package/dist/src/telemetry-CkmlqTjV.js +0 -205
- package/dist/src/telemetry-DQH7l5bb.js +0 -2
- package/dist/src/telemetry-DUCXc1-r.cjs +0 -216
- package/dist/src/togetherai-3yUt5Ck7.js +0 -49
- package/dist/src/togetherai-BJUByLwt.cjs +0 -49
- package/dist/src/togetherai-Bh6KZkmd.js +0 -50
- package/dist/src/togetherai-DDl9yk3b.js +0 -48
- package/dist/src/traceContext-BiJVppjT.cjs +0 -1032
- package/dist/src/traceContext-CKKluULP.js +0 -1016
- package/dist/src/traceContext-D3Sk8fO-.js +0 -1015
- package/dist/src/transcription-BoVQKIVz.js +0 -175
- package/dist/src/transcription-Bs5u8780.js +0 -175
- package/dist/src/transcription-Dl654d1p.cjs +0 -178
- package/dist/src/transcription-VEvhM1Fu.js +0 -176
- package/dist/src/transform-BAbkGpvl.js +0 -125
- package/dist/src/transform-C_j4hUH8.js +0 -126
- package/dist/src/transform-Da86hs4M.cjs +0 -154
- package/dist/src/transform-_i1raQNo.js +0 -125
- package/dist/src/typesafe-CKXBeh82.cjs +0 -253
- package/dist/src/typesafe-D3VaGeNm.js +0 -253
- package/dist/src/typesafe-DYM-SFNH.js +0 -253
- package/dist/src/typesafe-LXmSbw8F.js +0 -254
- package/dist/src/util-41rb0XHX.js +0 -743
- package/dist/src/util-B0WlHYFM.js +0 -2049
- package/dist/src/util-BD1R_PsR.js +0 -1770
- package/dist/src/util-BLbM_ItC.js +0 -395
- package/dist/src/util-C72P0iIa.js +0 -352
- package/dist/src/util-C7MpGlJ6.cjs +0 -2305
- package/dist/src/util-CCtqagKc.js +0 -286
- package/dist/src/util-CM2Ec_uY.js +0 -2051
- package/dist/src/util-CSSAWO8v.js +0 -351
- package/dist/src/util-CkQc-fx3.cjs +0 -934
- package/dist/src/util-DcOlFTFa.cjs +0 -478
- package/dist/src/util-DluGTGVB.js +0 -395
- package/dist/src/util-PfQ60chz.js +0 -743
- package/dist/src/util-f14-CPij.js +0 -396
- package/dist/src/util-l9pXX3Eu.cjs +0 -357
- package/dist/src/util-o_BnlYqS.js +0 -2050
- package/dist/src/vertex-B_-gQgzc.js +0 -2
- package/dist/src/vertex-CU4gqoYa.js +0 -854
- package/dist/src/vertex-DZ42UHb3.js +0 -848
- package/dist/src/vertex-DsYQJA0T.cjs +0 -871
- package/dist/src/vertexLive-BvIaHKGB.js +0 -55
- package/dist/src/vertexLive-CTULqNx7.js +0 -56
- package/dist/src/vertexLive-DjJ_YQBe.cjs +0 -55
- package/dist/src/vertexLive-STUGcteB.js +0 -55
- package/dist/src/video-CAQGmtEV.js +0 -703
- package/dist/src/video-_FSTWlwX.js +0 -702
- package/dist/src/video-aBPJPWdt.js +0 -702
- package/dist/src/video-gDjkWv5m.cjs +0 -706
|
@@ -1,2155 +0,0 @@
|
|
|
1
|
-
import { X as getProcessEnv, g as normalizeFieldName, l as REDACTED, o as logger, rt as state, y as sanitizeObject } from "./logger-CNHLbG5Y.js";
|
|
2
|
-
import { Y as VERSION } from "./fetch-5HtnNhHg.js";
|
|
3
|
-
import { n as renderVarsInObject } from "./render-DrCSgzhR.js";
|
|
4
|
-
import { n as resolveProviderApiKey } from "./credentials-DDeu2YaG.js";
|
|
5
|
-
import { t as providerRegistry } from "./providerRegistry-BfOvxmGI.js";
|
|
6
|
-
import { a as closeTurnSpan, d as openTurnSpan, h as withGenAISpan, r as addActiveSpanRoleAttribute, t as GenAIAttributes, u as getTraceparent } from "./genaiTracer-QTyx3Q-T.js";
|
|
7
|
-
import { o as resolveAgenticWorkingDir } from "./agentic-utils-9bCj4twQ.js";
|
|
8
|
-
import { n as createAbortError, t as AgenticRunQueue } from "./agenticRunQueue-87RBabL0.js";
|
|
9
|
-
import { i as isAgentWorkspace, n as clearRepositoryEnv } from "./agentWorkspace-n0uOJXhD.js";
|
|
10
|
-
import { i as calculateOpenAIUsageCostFromTokenUsage } from "./billing-DstHUOON.js";
|
|
11
|
-
import { a as COMMON_OPTIONAL_PROCESS_ENV_KEYS, c as applyApiKeyToCliEnv, d as getCodexTraceEndpoint, f as getCodexTraceProtocol, i as getCodexSkillRootPrefixes, l as shouldInjectApiKey, m as withCodexTraceExporter, o as findGitRepositoryRoot, p as getCodexTraceShutdownGraceMs, r as getCodexSkillMetadataFields, s as getMinimalProcessEnv, t as buildCodexSkillMetadata } from "./codexSkillMetadata-KByC5BEd.js";
|
|
12
|
-
import { z as z$1 } from "zod";
|
|
13
|
-
import path from "path";
|
|
14
|
-
import fs from "fs";
|
|
15
|
-
import dedent from "dedent";
|
|
16
|
-
import { spawn } from "child_process";
|
|
17
|
-
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
18
|
-
import crypto from "crypto";
|
|
19
|
-
import readline from "readline";
|
|
20
|
-
//#region src/providers/openai/codex-app-server.ts
|
|
21
|
-
function redactAppServerText(value) {
|
|
22
|
-
return value.replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi, REDACTED).replace(/\b(?:sk-(?:proj-)?[A-Za-z0-9_-]{20,}|sk-ant-[A-Za-z0-9_-]{20,}|AKIA[A-Z0-9]{16}|AIza[A-Za-z0-9_-]{35}|Bearer\s+[A-Za-z0-9._~+/-]{20,}|Basic\s+[A-Za-z0-9+/=]{20,})\b/g, REDACTED).replace(/(\\["'](?:authorization|auth)\\["']\s*[:=]\s*\\["'])(?:bearer|basic)\s+[^\\\s"'`]+(\\["'])/gi, (_match, prefix, suffix) => `${prefix}${REDACTED}${suffix}`).replace(/\b(authorization|auth)(["']?)\s*([=:])(\s*)(["']?)(?:bearer|basic)\s+[^\s"'`]+(\5)/gi, (_match, key, keyQuote, separator, spacing, quote) => `${key}${keyQuote}${separator}${spacing}${quote}${REDACTED}${quote}`).replace(/\b(api[_-]?key|token|password|secret|authorization|auth)(["']?)\s*([=:])(\s*)(["']?)[^\s"'`]+(\5)/gi, (_match, key, keyQuote, separator, spacing, quote) => `${key}${keyQuote}${separator}${spacing}${quote}${REDACTED}${quote}`);
|
|
23
|
-
}
|
|
24
|
-
const MAX_BUFFERED_JSON_RPC_CHARS = 5e6;
|
|
25
|
-
const MAX_BUFFERED_TURN_EVENT_CHARS = 1e7;
|
|
26
|
-
const DEFAULT_REQUEST_TIMEOUT_MS = 3e4;
|
|
27
|
-
const DEFAULT_STARTUP_TIMEOUT_MS = 3e4;
|
|
28
|
-
const CodexCliEnvValueSchema = z$1.union([
|
|
29
|
-
z$1.string(),
|
|
30
|
-
z$1.number(),
|
|
31
|
-
z$1.boolean()
|
|
32
|
-
]).transform(String);
|
|
33
|
-
const CodexAppServerReasoningEffortSchema = z$1.enum([
|
|
34
|
-
"none",
|
|
35
|
-
"minimal",
|
|
36
|
-
"low",
|
|
37
|
-
"medium",
|
|
38
|
-
"high",
|
|
39
|
-
"xhigh",
|
|
40
|
-
"max",
|
|
41
|
-
"ultra"
|
|
42
|
-
]);
|
|
43
|
-
const CodexAppServerGranularApprovalPolicySchema = z$1.object({ granular: z$1.object({
|
|
44
|
-
sandbox_approval: z$1.boolean(),
|
|
45
|
-
rules: z$1.boolean(),
|
|
46
|
-
skill_approval: z$1.boolean(),
|
|
47
|
-
request_permissions: z$1.boolean(),
|
|
48
|
-
mcp_elicitations: z$1.boolean()
|
|
49
|
-
}).strict() }).strict();
|
|
50
|
-
const CodexAppServerApprovalPolicySchema = z$1.union([z$1.enum([
|
|
51
|
-
"never",
|
|
52
|
-
"on-request",
|
|
53
|
-
"on-failure",
|
|
54
|
-
"untrusted"
|
|
55
|
-
]), CodexAppServerGranularApprovalPolicySchema]);
|
|
56
|
-
const CommandExecutionApprovalDecisionSchema = z$1.union([
|
|
57
|
-
z$1.enum([
|
|
58
|
-
"accept",
|
|
59
|
-
"acceptForSession",
|
|
60
|
-
"decline",
|
|
61
|
-
"cancel"
|
|
62
|
-
]),
|
|
63
|
-
z$1.object({ acceptWithExecpolicyAmendment: z$1.object({ execpolicy_amendment: z$1.array(z$1.string()) }).strict() }).strict(),
|
|
64
|
-
z$1.object({ applyNetworkPolicyAmendment: z$1.object({ network_policy_amendment: z$1.object({
|
|
65
|
-
host: z$1.string().min(1),
|
|
66
|
-
action: z$1.enum(["allow", "deny"])
|
|
67
|
-
}).strict() }).strict() }).strict()
|
|
68
|
-
]);
|
|
69
|
-
const McpElicitationPolicySchema = z$1.union([z$1.enum([
|
|
70
|
-
"accept",
|
|
71
|
-
"decline",
|
|
72
|
-
"cancel"
|
|
73
|
-
]), z$1.object({
|
|
74
|
-
action: z$1.enum([
|
|
75
|
-
"accept",
|
|
76
|
-
"decline",
|
|
77
|
-
"cancel"
|
|
78
|
-
]),
|
|
79
|
-
content: z$1.unknown().optional(),
|
|
80
|
-
_meta: z$1.unknown().optional()
|
|
81
|
-
}).strict()]);
|
|
82
|
-
const CollaborationModeSchema = z$1.object({
|
|
83
|
-
mode: z$1.enum(["plan", "default"]),
|
|
84
|
-
settings: z$1.object({
|
|
85
|
-
model: z$1.string().min(1),
|
|
86
|
-
reasoning_effort: CodexAppServerReasoningEffortSchema.nullable(),
|
|
87
|
-
developer_instructions: z$1.string().nullable()
|
|
88
|
-
}).strict()
|
|
89
|
-
}).strict();
|
|
90
|
-
const ServerRequestPolicySchema = z$1.object({
|
|
91
|
-
command_execution: CommandExecutionApprovalDecisionSchema.optional(),
|
|
92
|
-
file_change: z$1.enum([
|
|
93
|
-
"accept",
|
|
94
|
-
"acceptForSession",
|
|
95
|
-
"decline",
|
|
96
|
-
"cancel"
|
|
97
|
-
]).optional(),
|
|
98
|
-
permissions: z$1.object({
|
|
99
|
-
permissions: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
100
|
-
scope: z$1.enum(["turn", "session"]).optional(),
|
|
101
|
-
strict_auto_review: z$1.boolean().nullable().optional()
|
|
102
|
-
}).optional(),
|
|
103
|
-
user_input: z$1.union([z$1.enum(["empty", "first-option"]), z$1.record(z$1.string(), z$1.union([z$1.string(), z$1.array(z$1.string())]))]).optional(),
|
|
104
|
-
mcp_elicitation: McpElicitationPolicySchema.optional(),
|
|
105
|
-
dynamic_tools: z$1.record(z$1.string(), z$1.object({
|
|
106
|
-
success: z$1.boolean().optional(),
|
|
107
|
-
text: z$1.string().optional(),
|
|
108
|
-
contentItems: z$1.array(z$1.union([z$1.object({
|
|
109
|
-
type: z$1.literal("inputText"),
|
|
110
|
-
text: z$1.string()
|
|
111
|
-
}), z$1.object({
|
|
112
|
-
type: z$1.literal("inputImage"),
|
|
113
|
-
imageUrl: z$1.string()
|
|
114
|
-
})])).optional()
|
|
115
|
-
})).optional()
|
|
116
|
-
}).strict();
|
|
117
|
-
const CodexAppServerConfigShape = {
|
|
118
|
-
basePath: z$1.string().optional(),
|
|
119
|
-
prefix: z$1.string().optional(),
|
|
120
|
-
suffix: z$1.string().optional(),
|
|
121
|
-
provider: z$1.unknown().optional(),
|
|
122
|
-
linkedTargetId: z$1.string().optional(),
|
|
123
|
-
apiKey: z$1.string().min(1).optional(),
|
|
124
|
-
base_url: z$1.string().min(1).optional(),
|
|
125
|
-
working_dir: z$1.string().min(1).optional(),
|
|
126
|
-
additional_directories: z$1.array(z$1.string().min(1)).optional(),
|
|
127
|
-
skip_git_repo_check: z$1.boolean().optional(),
|
|
128
|
-
codex_path_override: z$1.string().min(1).optional(),
|
|
129
|
-
model: z$1.string().min(1).optional(),
|
|
130
|
-
model_provider: z$1.string().min(1).optional(),
|
|
131
|
-
service_tier: z$1.enum(["fast", "flex"]).optional(),
|
|
132
|
-
sandbox_mode: z$1.enum([
|
|
133
|
-
"read-only",
|
|
134
|
-
"workspace-write",
|
|
135
|
-
"danger-full-access"
|
|
136
|
-
]).optional(),
|
|
137
|
-
sandbox_policy: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
138
|
-
network_access_enabled: z$1.boolean().optional(),
|
|
139
|
-
approval_policy: CodexAppServerApprovalPolicySchema.optional(),
|
|
140
|
-
approvals_reviewer: z$1.enum([
|
|
141
|
-
"user",
|
|
142
|
-
"auto_review",
|
|
143
|
-
"guardian_subagent"
|
|
144
|
-
]).optional(),
|
|
145
|
-
model_reasoning_effort: CodexAppServerReasoningEffortSchema.optional(),
|
|
146
|
-
reasoning_summary: z$1.enum([
|
|
147
|
-
"auto",
|
|
148
|
-
"concise",
|
|
149
|
-
"detailed",
|
|
150
|
-
"none"
|
|
151
|
-
]).optional(),
|
|
152
|
-
personality: z$1.enum([
|
|
153
|
-
"none",
|
|
154
|
-
"friendly",
|
|
155
|
-
"pragmatic"
|
|
156
|
-
]).optional(),
|
|
157
|
-
base_instructions: z$1.string().min(1).optional(),
|
|
158
|
-
developer_instructions: z$1.string().min(1).optional(),
|
|
159
|
-
collaboration_mode: CollaborationModeSchema.optional(),
|
|
160
|
-
output_schema: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
161
|
-
thread_id: z$1.string().min(1).optional(),
|
|
162
|
-
persist_threads: z$1.boolean().optional(),
|
|
163
|
-
thread_pool_size: z$1.number().int().positive().optional(),
|
|
164
|
-
thread_cleanup: z$1.enum([
|
|
165
|
-
"unsubscribe",
|
|
166
|
-
"archive",
|
|
167
|
-
"none"
|
|
168
|
-
]).optional(),
|
|
169
|
-
ephemeral: z$1.boolean().optional(),
|
|
170
|
-
persist_extended_history: z$1.boolean().optional(),
|
|
171
|
-
experimental_raw_events: z$1.boolean().optional(),
|
|
172
|
-
experimental_api: z$1.boolean().optional(),
|
|
173
|
-
include_raw_events: z$1.boolean().optional(),
|
|
174
|
-
cli_config: z$1.record(z$1.string(), z$1.unknown()).optional(),
|
|
175
|
-
cli_env: z$1.record(z$1.string(), CodexCliEnvValueSchema).optional(),
|
|
176
|
-
inherit_process_env: z$1.boolean().optional(),
|
|
177
|
-
reuse_server: z$1.boolean().optional(),
|
|
178
|
-
deep_tracing: z$1.boolean().optional(),
|
|
179
|
-
request_timeout_ms: z$1.number().int().positive().optional(),
|
|
180
|
-
startup_timeout_ms: z$1.number().int().positive().optional(),
|
|
181
|
-
turn_timeout_ms: z$1.number().int().positive().optional(),
|
|
182
|
-
server_request_policy: ServerRequestPolicySchema.optional()
|
|
183
|
-
};
|
|
184
|
-
const CodexAppServerConfigSchema = z$1.object(CodexAppServerConfigShape).strict();
|
|
185
|
-
const CodexAppServerMergedPromptConfigSchema = z$1.object(CodexAppServerConfigShape).strip();
|
|
186
|
-
function createDeferred() {
|
|
187
|
-
let resolve;
|
|
188
|
-
let reject;
|
|
189
|
-
return {
|
|
190
|
-
promise: new Promise((promiseResolve, promiseReject) => {
|
|
191
|
-
resolve = promiseResolve;
|
|
192
|
-
reject = promiseReject;
|
|
193
|
-
}),
|
|
194
|
-
resolve,
|
|
195
|
-
reject
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
function parseCodexAppServerConfig(config, options = {}) {
|
|
199
|
-
const schema = options.stripUnknownKeys ? CodexAppServerMergedPromptConfigSchema : CodexAppServerConfigSchema;
|
|
200
|
-
try {
|
|
201
|
-
return schema.parse(config ?? {});
|
|
202
|
-
} catch (error) {
|
|
203
|
-
if (error instanceof z$1.ZodError) {
|
|
204
|
-
const issues = error.issues.map((issue) => {
|
|
205
|
-
return `${issue.path.length > 0 ? issue.path.join(".") : "(root)"}: ${issue.message}`;
|
|
206
|
-
}).join("; ");
|
|
207
|
-
throw new Error(`Invalid OpenAI Codex app-server config: ${issues}`);
|
|
208
|
-
}
|
|
209
|
-
throw error;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
function mergeOptionalRecord(base, override) {
|
|
213
|
-
if (!base && !override) return;
|
|
214
|
-
return {
|
|
215
|
-
...base ?? {},
|
|
216
|
-
...override ?? {}
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function mergeServerRequestPolicy(base, override) {
|
|
220
|
-
if (!base && !override) return;
|
|
221
|
-
const merged = {
|
|
222
|
-
...base ?? {},
|
|
223
|
-
...override ?? {}
|
|
224
|
-
};
|
|
225
|
-
const permissions = mergeOptionalRecord(base?.permissions, override?.permissions);
|
|
226
|
-
const dynamicTools = mergeOptionalRecord(base?.dynamic_tools, override?.dynamic_tools);
|
|
227
|
-
if (permissions) merged.permissions = permissions;
|
|
228
|
-
else delete merged.permissions;
|
|
229
|
-
if (dynamicTools) merged.dynamic_tools = dynamicTools;
|
|
230
|
-
else delete merged.dynamic_tools;
|
|
231
|
-
return merged;
|
|
232
|
-
}
|
|
233
|
-
function mergeCodexAppServerConfig(base, override) {
|
|
234
|
-
if (!override) return { ...base };
|
|
235
|
-
return {
|
|
236
|
-
...base,
|
|
237
|
-
...override,
|
|
238
|
-
cli_config: mergeOptionalRecord(base.cli_config, override.cli_config),
|
|
239
|
-
cli_env: mergeOptionalRecord(base.cli_env, override.cli_env),
|
|
240
|
-
server_request_policy: mergeServerRequestPolicy(base.server_request_policy, override.server_request_policy)
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
function isPlainObject(value) {
|
|
244
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
245
|
-
}
|
|
246
|
-
function flattenConfig(value, prefix = "") {
|
|
247
|
-
const entries = [];
|
|
248
|
-
for (const [key, entryValue] of Object.entries(value)) {
|
|
249
|
-
const nextKey = prefix ? `${prefix}.${key}` : key;
|
|
250
|
-
if (isPlainObject(entryValue)) entries.push(...flattenConfig(entryValue, nextKey));
|
|
251
|
-
else if (entryValue !== void 0) entries.push({
|
|
252
|
-
key: nextKey,
|
|
253
|
-
value: entryValue
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
return entries;
|
|
257
|
-
}
|
|
258
|
-
function getCodexTraceExporterSettings(config) {
|
|
259
|
-
if (!isPlainObject(config)) return;
|
|
260
|
-
const entries = new Map(flattenConfig(config).map(({ key, value }) => [key, value]));
|
|
261
|
-
for (const exporter of ["otlp-http", "otlp-grpc"]) {
|
|
262
|
-
const prefix = `otel.trace_exporter.${exporter}`;
|
|
263
|
-
const endpoint = entries.get(`${prefix}.endpoint`);
|
|
264
|
-
if (typeof endpoint !== "string" || endpoint.length === 0) continue;
|
|
265
|
-
const protocol = entries.get(`${prefix}.protocol`);
|
|
266
|
-
return {
|
|
267
|
-
endpoint,
|
|
268
|
-
...typeof protocol === "string" && { protocol },
|
|
269
|
-
endpointConfigKey: `${prefix}.endpoint`,
|
|
270
|
-
protocolConfigKey: `${prefix}.protocol`
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
function getCodexTraceExporterValue(config) {
|
|
275
|
-
if (!isPlainObject(config)) return;
|
|
276
|
-
if ("otel.trace_exporter" in config) return config["otel.trace_exporter"];
|
|
277
|
-
const otel = config.otel;
|
|
278
|
-
return isPlainObject(otel) ? otel.trace_exporter : void 0;
|
|
279
|
-
}
|
|
280
|
-
function getCodexConfigOriginType(origins, key) {
|
|
281
|
-
if (!isPlainObject(origins)) return;
|
|
282
|
-
const origin = origins[key];
|
|
283
|
-
if (!isPlainObject(origin)) return;
|
|
284
|
-
const name = origin.name;
|
|
285
|
-
if (typeof name === "string") return name;
|
|
286
|
-
if (isPlainObject(name) && typeof name.type === "string") return name.type;
|
|
287
|
-
return typeof origin.source === "string" ? origin.source : void 0;
|
|
288
|
-
}
|
|
289
|
-
function getSafeTraceExporterOrigin(endpoint) {
|
|
290
|
-
try {
|
|
291
|
-
return new URL(endpoint).origin;
|
|
292
|
-
} catch {
|
|
293
|
-
return "[invalid exporter endpoint]";
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
function toTomlLiteral(value) {
|
|
297
|
-
if (typeof value === "string") return JSON.stringify(value);
|
|
298
|
-
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
299
|
-
if (Array.isArray(value)) return `[${value.map((item) => toTomlLiteral(item)).join(", ")}]`;
|
|
300
|
-
if (value === null) return "\"\"";
|
|
301
|
-
return JSON.stringify(value);
|
|
302
|
-
}
|
|
303
|
-
function getJsonRpcErrorMessage(message) {
|
|
304
|
-
if (typeof message.error?.message === "string" && message.error.message) return message.error.message;
|
|
305
|
-
return "Unknown app-server error";
|
|
306
|
-
}
|
|
307
|
-
var JsonRpcError = class extends Error {
|
|
308
|
-
code;
|
|
309
|
-
constructor(message, code) {
|
|
310
|
-
super(message);
|
|
311
|
-
this.name = "JsonRpcError";
|
|
312
|
-
this.code = code;
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
var StaleExplicitThreadConnectionClosedError = class extends Error {
|
|
316
|
-
constructor() {
|
|
317
|
-
super("stale explicit-thread cleanup closed the current app-server connection");
|
|
318
|
-
this.name = "StaleExplicitThreadConnectionClosedError";
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
function isMethodNotFoundError(error) {
|
|
322
|
-
return error instanceof JsonRpcError && error.code === -32601;
|
|
323
|
-
}
|
|
324
|
-
/** Find npm's entrypoint only when Windows cannot launch a native Codex binary. */
|
|
325
|
-
function getCodexNpmEntrypoint(env) {
|
|
326
|
-
const pathKey = Object.keys(env).sort().find((key) => key.toUpperCase() === "PATH");
|
|
327
|
-
const directories = ((pathKey ? env[pathKey] : Object.entries(process.env).find(([key]) => key.toUpperCase() === "PATH")?.[1] ?? "").match(new RegExp(`(?:"[^"]*(?:"|$)|'[^']*(?:'|$)|[^${path.delimiter}]+)[^${path.delimiter}]*`, "g")) ?? []).map((directory) => directory.replace(/^["']|["']$/g, ""));
|
|
328
|
-
if ((!Object.keys(process.env).some((key) => key.toUpperCase() === "NODEFAULTCURRENTDIRECTORYINEXEPATH") ? [process.cwd(), ...directories] : directories).some((directory) => ["codex.com", "codex.exe"].some((file) => fs.existsSync(path.resolve(process.cwd(), directory, file))))) return;
|
|
329
|
-
const binDirectory = directories.find((directory) => path.isAbsolute(directory) && fs.existsSync(path.join(directory, "codex.cmd")));
|
|
330
|
-
if (!binDirectory) return;
|
|
331
|
-
const nodeModulesDirectory = path.basename(binDirectory).toLowerCase() === ".bin" ? path.dirname(binDirectory) : path.join(binDirectory, "node_modules");
|
|
332
|
-
const entrypoint = path.join(nodeModulesDirectory, "@openai", "codex", "bin", "codex.js");
|
|
333
|
-
return fs.existsSync(entrypoint) ? entrypoint : void 0;
|
|
334
|
-
}
|
|
335
|
-
var CodexAppServerConnection = class {
|
|
336
|
-
options;
|
|
337
|
-
instanceId;
|
|
338
|
-
process;
|
|
339
|
-
lineInterface;
|
|
340
|
-
nextRequestId = 1;
|
|
341
|
-
pending = /* @__PURE__ */ new Map();
|
|
342
|
-
closed = false;
|
|
343
|
-
stderrChunks = [];
|
|
344
|
-
stderrTotalLength = 0;
|
|
345
|
-
bufferedJsonRpcLines = [];
|
|
346
|
-
closePromise = null;
|
|
347
|
-
constructor(options) {
|
|
348
|
-
this.options = options;
|
|
349
|
-
this.instanceId = options.connectionInstanceId;
|
|
350
|
-
this.process = spawn(options.command, options.args, {
|
|
351
|
-
env: options.env,
|
|
352
|
-
stdio: [
|
|
353
|
-
"pipe",
|
|
354
|
-
"pipe",
|
|
355
|
-
"pipe"
|
|
356
|
-
]
|
|
357
|
-
});
|
|
358
|
-
this.lineInterface = readline.createInterface({ input: this.process.stdout });
|
|
359
|
-
this.lineInterface.on("line", (line) => this.handleLine(line));
|
|
360
|
-
this.process.stderr.on("data", (chunk) => this.recordStderr(chunk));
|
|
361
|
-
this.process.stdin.on("error", (error) => {
|
|
362
|
-
logger.debug("[CodexAppServer] stdin error", { error: error.message });
|
|
363
|
-
});
|
|
364
|
-
this.process.on("error", (error) => this.handleProcessFailure(error));
|
|
365
|
-
this.process.on("exit", (code, signal) => {
|
|
366
|
-
if (this.closed) this.rejectPending(/* @__PURE__ */ new Error("codex app-server process closed"));
|
|
367
|
-
else this.handleProcessFailure(/* @__PURE__ */ new Error(`codex app-server exited with code ${code ?? "null"} signal ${signal ?? "null"}`));
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
isClosed() {
|
|
371
|
-
return this.closed;
|
|
372
|
-
}
|
|
373
|
-
async initialize(config) {
|
|
374
|
-
await this.request("initialize", {
|
|
375
|
-
clientInfo: {
|
|
376
|
-
name: "promptfoo_codex_app_server",
|
|
377
|
-
title: "Promptfoo Codex App Server Provider",
|
|
378
|
-
version: VERSION
|
|
379
|
-
},
|
|
380
|
-
capabilities: { experimentalApi: config.experimental_api ?? true }
|
|
381
|
-
}, { timeoutMs: this.options.startupTimeoutMs });
|
|
382
|
-
this.notify("initialized", {});
|
|
383
|
-
}
|
|
384
|
-
request(method, params, options = {}) {
|
|
385
|
-
if (this.closed) return Promise.reject(/* @__PURE__ */ new Error("codex app-server connection is closed"));
|
|
386
|
-
if (options.abortSignal?.aborted) return Promise.reject(createAbortError(`codex app-server request aborted: ${method}`));
|
|
387
|
-
const id = this.nextRequestId++;
|
|
388
|
-
const message = {
|
|
389
|
-
method,
|
|
390
|
-
id
|
|
391
|
-
};
|
|
392
|
-
if (params !== void 0) message.params = params;
|
|
393
|
-
const timeoutMs = options.timeoutMs ?? this.options.requestTimeoutMs;
|
|
394
|
-
return new Promise((resolve, reject) => {
|
|
395
|
-
const pendingRequest = {
|
|
396
|
-
method,
|
|
397
|
-
resolve,
|
|
398
|
-
reject,
|
|
399
|
-
abortSignal: options.abortSignal,
|
|
400
|
-
onResponse: options.onResponse
|
|
401
|
-
};
|
|
402
|
-
pendingRequest.timeout = setTimeout(() => {
|
|
403
|
-
const error = /* @__PURE__ */ new Error(`codex app-server request timed out: ${method}`);
|
|
404
|
-
this.pending.delete(id);
|
|
405
|
-
if (options.abortSignal && pendingRequest.abortListener) options.abortSignal.removeEventListener("abort", pendingRequest.abortListener);
|
|
406
|
-
reject(error);
|
|
407
|
-
this.closeAfterRequestTimeout(method, error);
|
|
408
|
-
}, timeoutMs);
|
|
409
|
-
if (options.abortSignal) {
|
|
410
|
-
pendingRequest.abortListener = () => {
|
|
411
|
-
const error = createAbortError(`codex app-server request aborted: ${method}`);
|
|
412
|
-
this.pending.delete(id);
|
|
413
|
-
clearTimeout(pendingRequest.timeout);
|
|
414
|
-
reject(error);
|
|
415
|
-
logger.debug("[CodexAppServer] JSON-RPC request aborted", {
|
|
416
|
-
error: error.message,
|
|
417
|
-
method
|
|
418
|
-
});
|
|
419
|
-
};
|
|
420
|
-
options.abortSignal.addEventListener("abort", pendingRequest.abortListener, { once: true });
|
|
421
|
-
}
|
|
422
|
-
this.pending.set(id, pendingRequest);
|
|
423
|
-
this.send(message);
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
notify(method, params) {
|
|
427
|
-
const message = { method };
|
|
428
|
-
if (params !== void 0) message.params = params;
|
|
429
|
-
this.send(message);
|
|
430
|
-
}
|
|
431
|
-
getStderr() {
|
|
432
|
-
return this.stderrChunks.join("").slice(-1e4);
|
|
433
|
-
}
|
|
434
|
-
async close(options = {}) {
|
|
435
|
-
if (this.closePromise !== null) return this.closePromise;
|
|
436
|
-
this.closePromise = new Promise((resolve) => {
|
|
437
|
-
this.closed = true;
|
|
438
|
-
this.rejectPending(/* @__PURE__ */ new Error("codex app-server connection closed"));
|
|
439
|
-
let terminateTimer;
|
|
440
|
-
let killTimer;
|
|
441
|
-
const finish = () => {
|
|
442
|
-
clearTimeout(terminateTimer);
|
|
443
|
-
clearTimeout(killTimer);
|
|
444
|
-
this.lineInterface.close();
|
|
445
|
-
resolve();
|
|
446
|
-
};
|
|
447
|
-
const terminate = () => {
|
|
448
|
-
killTimer = setTimeout(() => {
|
|
449
|
-
try {
|
|
450
|
-
if (this.process.exitCode === null) this.process.kill("SIGKILL");
|
|
451
|
-
} catch {}
|
|
452
|
-
finish();
|
|
453
|
-
}, 1e3);
|
|
454
|
-
try {
|
|
455
|
-
this.process.kill("SIGTERM");
|
|
456
|
-
} catch {
|
|
457
|
-
finish();
|
|
458
|
-
}
|
|
459
|
-
};
|
|
460
|
-
this.process.once("exit", finish);
|
|
461
|
-
if (this.process.killed || this.process.exitCode !== null) {
|
|
462
|
-
finish();
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
try {
|
|
466
|
-
this.process.stdin.end();
|
|
467
|
-
if (options.graceful) terminateTimer = setTimeout(terminate, getCodexTraceShutdownGraceMs(this.options.env));
|
|
468
|
-
else terminate();
|
|
469
|
-
} catch {
|
|
470
|
-
finish();
|
|
471
|
-
}
|
|
472
|
-
});
|
|
473
|
-
return this.closePromise;
|
|
474
|
-
}
|
|
475
|
-
handleLine(line, retryBufferedMessage = true) {
|
|
476
|
-
const trimmed = line.trim();
|
|
477
|
-
if (!trimmed && this.bufferedJsonRpcLines.length === 0) return;
|
|
478
|
-
const candidateLines = this.bufferedJsonRpcLines.length > 0 ? [...this.bufferedJsonRpcLines, line] : [trimmed];
|
|
479
|
-
let candidate = candidateLines.join("\n");
|
|
480
|
-
if (candidate.length > MAX_BUFFERED_JSON_RPC_CHARS) {
|
|
481
|
-
this.bufferedJsonRpcLines = [];
|
|
482
|
-
this.handleProcessFailure(/* @__PURE__ */ new Error(`codex app-server JSON-RPC message exceeded ${MAX_BUFFERED_JSON_RPC_CHARS} characters`));
|
|
483
|
-
this.close();
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
let message;
|
|
487
|
-
try {
|
|
488
|
-
try {
|
|
489
|
-
message = JSON.parse(candidate);
|
|
490
|
-
} catch (error) {
|
|
491
|
-
if (candidateLines.length <= 1 || !(error instanceof Error) || !/Bad control character/i.test(error.message)) throw error;
|
|
492
|
-
candidate = this.escapeStringNewlines(candidate);
|
|
493
|
-
message = JSON.parse(candidate);
|
|
494
|
-
}
|
|
495
|
-
} catch (error) {
|
|
496
|
-
if (this.shouldBufferJsonRpcLine(error, candidate)) {
|
|
497
|
-
this.bufferedJsonRpcLines = candidateLines;
|
|
498
|
-
return;
|
|
499
|
-
}
|
|
500
|
-
logger.warn("[CodexAppServer] Failed to parse JSON-RPC line", {
|
|
501
|
-
error,
|
|
502
|
-
line: candidate
|
|
503
|
-
});
|
|
504
|
-
this.bufferedJsonRpcLines = [];
|
|
505
|
-
if (retryBufferedMessage && candidateLines.length > 1) {
|
|
506
|
-
let restartIndex = candidateLines.length - 1;
|
|
507
|
-
for (let index = candidateLines.length - 1; index > 0; index--) if (candidateLines[index].trimStart().startsWith("{")) {
|
|
508
|
-
restartIndex = index;
|
|
509
|
-
break;
|
|
510
|
-
}
|
|
511
|
-
this.bufferedJsonRpcLines = candidateLines.slice(restartIndex, -1);
|
|
512
|
-
this.handleLine(line, false);
|
|
513
|
-
}
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
this.bufferedJsonRpcLines = [];
|
|
517
|
-
this.handleMessage(message);
|
|
518
|
-
}
|
|
519
|
-
escapeStringNewlines(candidate) {
|
|
520
|
-
const parts = [];
|
|
521
|
-
let inString = false;
|
|
522
|
-
let escaped = false;
|
|
523
|
-
let start = 0;
|
|
524
|
-
for (let index = 0; index < candidate.length; index++) {
|
|
525
|
-
const character = candidate[index];
|
|
526
|
-
if (inString && character === "\n" && !escaped) {
|
|
527
|
-
parts.push(candidate.slice(start, index), "\\n");
|
|
528
|
-
start = index + 1;
|
|
529
|
-
}
|
|
530
|
-
if (escaped) escaped = false;
|
|
531
|
-
else if (inString && character === "\\") escaped = true;
|
|
532
|
-
else if (character === "\"") inString = !inString;
|
|
533
|
-
}
|
|
534
|
-
parts.push(candidate.slice(start));
|
|
535
|
-
return parts.join("");
|
|
536
|
-
}
|
|
537
|
-
shouldBufferJsonRpcLine(error, candidate) {
|
|
538
|
-
if (!candidate.trimStart().startsWith("{")) return false;
|
|
539
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
540
|
-
return /Unterminated string|Unexpected end of JSON input/i.test(message) || message.startsWith("Expected ") && message.includes(` in JSON at position ${candidate.length} (line`);
|
|
541
|
-
}
|
|
542
|
-
handleMessage(message) {
|
|
543
|
-
if (message.id !== void 0 && (message.result !== void 0 || message.error !== void 0)) {
|
|
544
|
-
this.handleResponse(message);
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
if (message.id !== void 0 && message.method) {
|
|
548
|
-
this.handleServerRequest(message);
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
551
|
-
if (message.method) {
|
|
552
|
-
this.options.onNotification(message);
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
logger.debug("[CodexAppServer] Ignoring unknown JSON-RPC message shape", { message });
|
|
556
|
-
}
|
|
557
|
-
handleResponse(message) {
|
|
558
|
-
const pendingRequest = this.pending.get(message.id);
|
|
559
|
-
if (!pendingRequest) {
|
|
560
|
-
logger.debug("[CodexAppServer] Received response for unknown request", { id: message.id });
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
this.pending.delete(message.id);
|
|
564
|
-
clearTimeout(pendingRequest.timeout);
|
|
565
|
-
if (pendingRequest.abortSignal && pendingRequest.abortListener) pendingRequest.abortSignal.removeEventListener("abort", pendingRequest.abortListener);
|
|
566
|
-
if (message.error) {
|
|
567
|
-
pendingRequest.reject(new JsonRpcError(getJsonRpcErrorMessage(message), message.error.code));
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
try {
|
|
571
|
-
pendingRequest.onResponse?.(message.result);
|
|
572
|
-
} catch (error) {
|
|
573
|
-
pendingRequest.reject(error instanceof Error ? error : new Error(String(error)));
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
pendingRequest.resolve(message.result);
|
|
577
|
-
}
|
|
578
|
-
async handleServerRequest(message) {
|
|
579
|
-
try {
|
|
580
|
-
const result = await this.options.onServerRequest(message);
|
|
581
|
-
this.send({
|
|
582
|
-
id: message.id,
|
|
583
|
-
result
|
|
584
|
-
});
|
|
585
|
-
} catch (error) {
|
|
586
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
587
|
-
try {
|
|
588
|
-
this.send({
|
|
589
|
-
id: message.id,
|
|
590
|
-
error: {
|
|
591
|
-
code: -32e3,
|
|
592
|
-
message: errorMessage
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
} catch (sendError) {
|
|
596
|
-
logger.debug("[CodexAppServer] Failed to send error response for server request", {
|
|
597
|
-
error: sendError,
|
|
598
|
-
originalError: errorMessage,
|
|
599
|
-
method: message.method
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
recordStderr(chunk) {
|
|
605
|
-
const text = chunk.toString("utf8");
|
|
606
|
-
this.stderrChunks.push(text);
|
|
607
|
-
this.stderrTotalLength += text.length;
|
|
608
|
-
if (this.stderrTotalLength > 2e4) {
|
|
609
|
-
const truncated = this.getStderr();
|
|
610
|
-
this.stderrChunks = [truncated];
|
|
611
|
-
this.stderrTotalLength = truncated.length;
|
|
612
|
-
}
|
|
613
|
-
logger.debug("[CodexAppServer] stderr", { text: redactAppServerText(sanitizeObject(text, { context: "Codex app-server stderr" })) });
|
|
614
|
-
}
|
|
615
|
-
handleProcessFailure(error) {
|
|
616
|
-
if (this.closed) return;
|
|
617
|
-
this.closed = true;
|
|
618
|
-
const stderr = this.getStderr().trim();
|
|
619
|
-
const sanitizedStderr = stderr ? redactAppServerText(sanitizeObject(stderr, { context: "Codex app-server stderr" })) : void 0;
|
|
620
|
-
const failure = typeof sanitizedStderr === "string" && sanitizedStderr ? /* @__PURE__ */ new Error(`${error.message}: ${sanitizedStderr}`) : error;
|
|
621
|
-
this.rejectPending(failure);
|
|
622
|
-
logger.error("[CodexAppServer] Process failure", {
|
|
623
|
-
error: failure.message,
|
|
624
|
-
stderr: sanitizedStderr
|
|
625
|
-
});
|
|
626
|
-
this.options.onClose(failure);
|
|
627
|
-
}
|
|
628
|
-
closeAfterRequestTimeout(method, error) {
|
|
629
|
-
if (this.closed) return;
|
|
630
|
-
logger.warn("[CodexAppServer] Closing app-server after JSON-RPC request timeout", {
|
|
631
|
-
error: error.message,
|
|
632
|
-
method
|
|
633
|
-
});
|
|
634
|
-
this.options.onClose(error);
|
|
635
|
-
this.close().catch((closeError) => {
|
|
636
|
-
logger.debug("[CodexAppServer] Error closing app-server after request timeout", { error: closeError });
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
rejectPending(error) {
|
|
640
|
-
for (const [id, pendingRequest] of this.pending) {
|
|
641
|
-
clearTimeout(pendingRequest.timeout);
|
|
642
|
-
if (pendingRequest.abortSignal && pendingRequest.abortListener) pendingRequest.abortSignal.removeEventListener("abort", pendingRequest.abortListener);
|
|
643
|
-
pendingRequest.reject(error);
|
|
644
|
-
this.pending.delete(id);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
send(message) {
|
|
648
|
-
if (this.closed) throw new Error("codex app-server connection is closed");
|
|
649
|
-
this.process.stdin.write(`${JSON.stringify(message)}\n`);
|
|
650
|
-
}
|
|
651
|
-
};
|
|
652
|
-
var OpenAICodexAppServerProvider = class {
|
|
653
|
-
registerForCleanup;
|
|
654
|
-
cleanupGeneration = 0;
|
|
655
|
-
config;
|
|
656
|
-
env;
|
|
657
|
-
apiKey;
|
|
658
|
-
providerId = "openai:codex-app-server";
|
|
659
|
-
connections = /* @__PURE__ */ new Map();
|
|
660
|
-
connectionPromises = /* @__PURE__ */ new Map();
|
|
661
|
-
initializingConnections = /* @__PURE__ */ new Set();
|
|
662
|
-
threads = /* @__PURE__ */ new Map();
|
|
663
|
-
threadPromises = /* @__PURE__ */ new Map();
|
|
664
|
-
threadPromiseConnectionInstances = /* @__PURE__ */ new Map();
|
|
665
|
-
explicitThreadAbortCleanups = /* @__PURE__ */ new Map();
|
|
666
|
-
protectedThreadCounts = /* @__PURE__ */ new Map();
|
|
667
|
-
threadRunQueues = new AgenticRunQueue("Codex app-server thread turn wait aborted");
|
|
668
|
-
activeTurnsByThread = /* @__PURE__ */ new Map();
|
|
669
|
-
activeTurnsByTurn = /* @__PURE__ */ new Map();
|
|
670
|
-
validatedWorkingDirs = /* @__PURE__ */ new Set();
|
|
671
|
-
ignoredProviderEnvWarningShown = false;
|
|
672
|
-
omittedProcessEnvWarningShown = false;
|
|
673
|
-
deepTracingWarningShown = false;
|
|
674
|
-
traceExporterOverrideWarningShown = false;
|
|
675
|
-
constructor(options = {}) {
|
|
676
|
-
this.registerForCleanup = options.registerForCleanup ?? true;
|
|
677
|
-
this.config = parseCodexAppServerConfig(options.config);
|
|
678
|
-
this.env = options.env;
|
|
679
|
-
this.apiKey = this.getApiKey();
|
|
680
|
-
this.providerId = options.id ?? this.providerId;
|
|
681
|
-
if (this.registerForCleanup) providerRegistry.register(this);
|
|
682
|
-
}
|
|
683
|
-
id() {
|
|
684
|
-
return this.providerId;
|
|
685
|
-
}
|
|
686
|
-
getApiKey(config = this.config) {
|
|
687
|
-
return resolveProviderApiKey(config, this.env, ["OPENAI_API_KEY", "CODEX_API_KEY"]);
|
|
688
|
-
}
|
|
689
|
-
requiresApiKey() {
|
|
690
|
-
return false;
|
|
691
|
-
}
|
|
692
|
-
toString() {
|
|
693
|
-
return "[OpenAI Codex App Server Provider]";
|
|
694
|
-
}
|
|
695
|
-
async cleanup() {
|
|
696
|
-
providerRegistry.unregister(this);
|
|
697
|
-
this.cleanupGeneration++;
|
|
698
|
-
this.resolveActiveTurns(/* @__PURE__ */ new Error("codex app-server provider cleanup interrupted active turn"));
|
|
699
|
-
this.threads.clear();
|
|
700
|
-
this.threadPromises.clear();
|
|
701
|
-
this.explicitThreadAbortCleanups.clear();
|
|
702
|
-
this.threadRunQueues.clear();
|
|
703
|
-
this.activeTurnsByThread.clear();
|
|
704
|
-
this.activeTurnsByTurn.clear();
|
|
705
|
-
this.protectedThreadCounts.clear();
|
|
706
|
-
this.validatedWorkingDirs.clear();
|
|
707
|
-
const connections = Array.from(/* @__PURE__ */ new Set([...this.connections.values(), ...this.initializingConnections]));
|
|
708
|
-
this.connections.clear();
|
|
709
|
-
this.connectionPromises.clear();
|
|
710
|
-
this.initializingConnections.clear();
|
|
711
|
-
await Promise.all(connections.map((connection) => connection.close().catch((error) => {
|
|
712
|
-
logger.warn("[CodexAppServer] Error during cleanup", { error });
|
|
713
|
-
})));
|
|
714
|
-
}
|
|
715
|
-
async shutdown() {
|
|
716
|
-
await this.cleanup();
|
|
717
|
-
}
|
|
718
|
-
async callApi(prompt, context, callOptions) {
|
|
719
|
-
const cleanupGeneration = this.cleanupGeneration;
|
|
720
|
-
const mergedConfig = mergeCodexAppServerConfig(this.config, context?.prompt?.config);
|
|
721
|
-
delete mergedConfig.provider;
|
|
722
|
-
const config = renderVarsInObject(mergedConfig, context?.vars);
|
|
723
|
-
const requestedModel = typeof config.model === "string" && config.model ? config.model : void 0;
|
|
724
|
-
return withGenAISpan(this.buildSpanContext(prompt, context, requestedModel), () => this.callApiInternal(prompt, context, callOptions, config, cleanupGeneration), (response) => this.extractSpanResult(response, requestedModel));
|
|
725
|
-
}
|
|
726
|
-
buildSpanContext(prompt, context, requestedModel) {
|
|
727
|
-
return {
|
|
728
|
-
system: "openai",
|
|
729
|
-
operationName: "invoke_agent",
|
|
730
|
-
model: requestedModel ?? "Codex App Server",
|
|
731
|
-
agentName: "Codex App Server",
|
|
732
|
-
providerId: this.id(),
|
|
733
|
-
evalId: context?.evaluationId || context?.test?.metadata?.evaluationId,
|
|
734
|
-
testIndex: typeof context?.test?.vars?.__testIdx === "number" ? context.test.vars.__testIdx : void 0,
|
|
735
|
-
promptLabel: context?.prompt?.label,
|
|
736
|
-
traceparent: context?.traceparent,
|
|
737
|
-
requestBody: prompt
|
|
738
|
-
};
|
|
739
|
-
}
|
|
740
|
-
extractSpanResult(response, requestedModel) {
|
|
741
|
-
const result = {};
|
|
742
|
-
if (response.tokenUsage) result.tokenUsage = response.tokenUsage;
|
|
743
|
-
if (response.sessionId) result.responseId = response.sessionId;
|
|
744
|
-
if (requestedModel) result.responseModel = requestedModel;
|
|
745
|
-
if (response.cached !== void 0) result.cacheHit = response.cached;
|
|
746
|
-
if (response.output !== void 0) result.responseBody = typeof response.output === "string" ? response.output : JSON.stringify(response.output);
|
|
747
|
-
if (response.metadata?.codexAppServer?.itemCounts) result.additionalAttributes = {
|
|
748
|
-
...result.additionalAttributes,
|
|
749
|
-
"codex.app_server.items.breakdown": JSON.stringify(response.metadata.codexAppServer.itemCounts)
|
|
750
|
-
};
|
|
751
|
-
return result;
|
|
752
|
-
}
|
|
753
|
-
async callApiInternal(prompt, context, callOptions, rawConfig, cleanupGeneration) {
|
|
754
|
-
let config;
|
|
755
|
-
try {
|
|
756
|
-
config = parseCodexAppServerConfig(rawConfig, { stripUnknownKeys: true });
|
|
757
|
-
} catch (error) {
|
|
758
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
759
|
-
logger.error("Error calling OpenAI Codex app-server", { error: errorMessage });
|
|
760
|
-
return { error: `Error calling OpenAI Codex app-server: ${errorMessage}` };
|
|
761
|
-
}
|
|
762
|
-
if (callOptions?.abortSignal?.aborted) return { error: "OpenAI Codex app-server call aborted before it started" };
|
|
763
|
-
const workingDirectory = this.resolveWorkingDirectory(config);
|
|
764
|
-
const resolvedConfig = {
|
|
765
|
-
approval_policy: "never",
|
|
766
|
-
sandbox_mode: "read-only",
|
|
767
|
-
network_access_enabled: false,
|
|
768
|
-
ephemeral: true,
|
|
769
|
-
thread_cleanup: "unsubscribe",
|
|
770
|
-
reuse_server: true,
|
|
771
|
-
...config,
|
|
772
|
-
working_dir: workingDirectory,
|
|
773
|
-
additional_directories: this.resolveAdditionalDirectories(config)
|
|
774
|
-
};
|
|
775
|
-
const currentTraceparent = getTraceparent();
|
|
776
|
-
const apiKey = this.getApiKey(resolvedConfig);
|
|
777
|
-
const env = this.prepareEnvironment(resolvedConfig, currentTraceparent, apiKey);
|
|
778
|
-
const promptInput = this.parsePromptInput(prompt);
|
|
779
|
-
const connectionKey = this.generateConnectionKey(env, resolvedConfig);
|
|
780
|
-
const useReusableConnection = resolvedConfig.reuse_server !== false && !resolvedConfig.deep_tracing;
|
|
781
|
-
let localConnection;
|
|
782
|
-
try {
|
|
783
|
-
this.validateWorkingDirectory(resolvedConfig.working_dir, resolvedConfig.skip_git_repo_check);
|
|
784
|
-
this.warnOnceForDeepTracingThreadOptions(resolvedConfig);
|
|
785
|
-
let connection = useReusableConnection ? await this.getOrCreateConnection(connectionKey, env, resolvedConfig) : await this.createConnection(connectionKey, env, resolvedConfig);
|
|
786
|
-
if (!useReusableConnection) localConnection = connection;
|
|
787
|
-
const promptCacheBasis = context?.prompt?.raw ?? prompt;
|
|
788
|
-
const explicitThreadQueueKey = resolvedConfig.thread_id ? `thread_id:${resolvedConfig.thread_id}` : void 0;
|
|
789
|
-
const runThreadTurn = async () => {
|
|
790
|
-
if (useReusableConnection && connection.isClosed()) connection = await this.getOrCreateConnection(connectionKey, env, resolvedConfig);
|
|
791
|
-
let threadHandle;
|
|
792
|
-
try {
|
|
793
|
-
threadHandle = await this.getOrCreateThread(connection, connectionKey, promptCacheBasis, resolvedConfig, useReusableConnection, callOptions);
|
|
794
|
-
} catch (error) {
|
|
795
|
-
if (!(error instanceof StaleExplicitThreadConnectionClosedError)) throw error;
|
|
796
|
-
connection = await this.getOrCreateConnection(connectionKey, env, resolvedConfig);
|
|
797
|
-
threadHandle = await this.getOrCreateThread(connection, connectionKey, promptCacheBasis, resolvedConfig, useReusableConnection, callOptions);
|
|
798
|
-
}
|
|
799
|
-
this.protectThread(threadHandle.threadId);
|
|
800
|
-
let turnStarted = false;
|
|
801
|
-
try {
|
|
802
|
-
const queueKey = explicitThreadQueueKey ? void 0 : this.getThreadRunQueueKey(resolvedConfig, threadHandle);
|
|
803
|
-
return await this.runSerializedThreadTurn(queueKey, callOptions?.abortSignal, async () => {
|
|
804
|
-
turnStarted = true;
|
|
805
|
-
const state = this.createTurnState(connection, connectionKey, connection.instanceId, threadHandle.threadId, promptInput, resolvedConfig, env);
|
|
806
|
-
this.registerTurnState(state);
|
|
807
|
-
try {
|
|
808
|
-
const turnResponse = await connection.request("turn/start", this.buildTurnStartParams(threadHandle.threadId, promptInput, resolvedConfig), {
|
|
809
|
-
abortSignal: callOptions?.abortSignal,
|
|
810
|
-
timeoutMs: this.getRequestTimeoutMs(resolvedConfig),
|
|
811
|
-
onResponse: (response) => {
|
|
812
|
-
const turnId = response?.turn?.id;
|
|
813
|
-
if (typeof turnId === "string") this.updateTurnStateId(state, turnId);
|
|
814
|
-
}
|
|
815
|
-
});
|
|
816
|
-
if (typeof turnResponse?.turn?.id === "string") this.updateTurnStateId(state, turnResponse.turn.id);
|
|
817
|
-
await this.waitForTurnCompletion(connection, state, resolvedConfig, callOptions);
|
|
818
|
-
return this.buildProviderResponse(state, threadHandle, resolvedConfig);
|
|
819
|
-
} finally {
|
|
820
|
-
this.unregisterTurnState(state);
|
|
821
|
-
await this.cleanupThreadAfterTurn(connection, threadHandle, resolvedConfig);
|
|
822
|
-
}
|
|
823
|
-
}, cleanupGeneration);
|
|
824
|
-
} finally {
|
|
825
|
-
this.unprotectThread(threadHandle.threadId);
|
|
826
|
-
if (!turnStarted) await this.cleanupThreadAfterTurn(connection, threadHandle, resolvedConfig, { skipIfActiveTurn: true });
|
|
827
|
-
this.scheduleThreadPoolEnforcement(connection, connectionKey, resolvedConfig);
|
|
828
|
-
}
|
|
829
|
-
};
|
|
830
|
-
return await this.runSerializedThreadTurn(explicitThreadQueueKey, callOptions?.abortSignal, runThreadTurn, cleanupGeneration);
|
|
831
|
-
} catch (error) {
|
|
832
|
-
if (error instanceof Error && error.name === "AbortError" || callOptions?.abortSignal?.aborted) {
|
|
833
|
-
logger.warn("OpenAI Codex app-server call aborted");
|
|
834
|
-
return { error: "OpenAI Codex app-server call aborted" };
|
|
835
|
-
}
|
|
836
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
837
|
-
logger.error("Error calling OpenAI Codex app-server", { error: errorMessage });
|
|
838
|
-
return { error: `Error calling OpenAI Codex app-server: ${errorMessage}` };
|
|
839
|
-
} finally {
|
|
840
|
-
if (localConnection) await localConnection.close({ graceful: resolvedConfig.deep_tracing === true }).catch((error) => {
|
|
841
|
-
logger.debug("[CodexAppServer] Error closing local connection", { error });
|
|
842
|
-
});
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
resolveWorkingDirectory(config) {
|
|
846
|
-
const basePath = config.basePath || state.basePath || process.cwd();
|
|
847
|
-
if (!config.working_dir) return process.cwd();
|
|
848
|
-
return resolveAgenticWorkingDir(config.working_dir, basePath) ?? process.cwd();
|
|
849
|
-
}
|
|
850
|
-
resolveAdditionalDirectories(config) {
|
|
851
|
-
if (!config.additional_directories?.length) return;
|
|
852
|
-
const basePath = config.basePath || state.basePath || process.cwd();
|
|
853
|
-
return config.additional_directories.map((directory) => path.resolve(basePath, directory));
|
|
854
|
-
}
|
|
855
|
-
prepareEnvironment(config, traceparent, apiKey = this.getApiKey(config)) {
|
|
856
|
-
const inheritProcessEnv = config.inherit_process_env === true;
|
|
857
|
-
const cliEnv = Object.fromEntries(Object.entries(config.cli_env ?? {}).map(([key, value]) => [key, String(value)]));
|
|
858
|
-
const env = {
|
|
859
|
-
...inheritProcessEnv ? getProcessEnv() : getMinimalProcessEnv(),
|
|
860
|
-
...cliEnv
|
|
861
|
-
};
|
|
862
|
-
const ignoredProviderEnvKeys = Object.keys(this.env ?? {}).filter((key) => key !== "OPENAI_API_KEY" && key !== "CODEX_API_KEY" && !(key in (config.cli_env ?? {}))).sort();
|
|
863
|
-
if (ignoredProviderEnvKeys.length > 0 && !this.ignoredProviderEnvWarningShown) {
|
|
864
|
-
logger.warn("[CodexAppServer] Ignoring promptfoo-level env overrides for the Codex app-server process. Move these keys into config.cli_env if Codex shell commands need them.", { envKeys: ignoredProviderEnvKeys });
|
|
865
|
-
this.ignoredProviderEnvWarningShown = true;
|
|
866
|
-
}
|
|
867
|
-
if (!inheritProcessEnv && !this.omittedProcessEnvWarningShown) {
|
|
868
|
-
const omittedProcessEnvKeys = this.getOmittedOptionalProcessEnvKeys(config, env);
|
|
869
|
-
if (omittedProcessEnvKeys.length > 0) {
|
|
870
|
-
logger.warn("[CodexAppServer] Optional Codex app-server process env vars are not inherited by default. Move these keys into config.cli_env or set inherit_process_env: true if Codex commands need them.", { envKeys: omittedProcessEnvKeys });
|
|
871
|
-
this.omittedProcessEnvWarningShown = true;
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
const sortedEnv = {};
|
|
875
|
-
for (const key of Object.keys(env).sort()) if (env[key] !== void 0) sortedEnv[key] = env[key];
|
|
876
|
-
applyApiKeyToCliEnv(sortedEnv, config, apiKey);
|
|
877
|
-
if (config.base_url) {
|
|
878
|
-
sortedEnv.OPENAI_BASE_URL = config.base_url;
|
|
879
|
-
sortedEnv.OPENAI_API_BASE_URL = config.base_url;
|
|
880
|
-
}
|
|
881
|
-
if (config.deep_tracing) {
|
|
882
|
-
if (!sortedEnv.OTEL_EXPORTER_OTLP_ENDPOINT) sortedEnv.OTEL_EXPORTER_OTLP_ENDPOINT = getCodexTraceEndpoint();
|
|
883
|
-
if (!sortedEnv.OTEL_EXPORTER_OTLP_PROTOCOL) sortedEnv.OTEL_EXPORTER_OTLP_PROTOCOL = getCodexTraceProtocol();
|
|
884
|
-
if (!sortedEnv.OTEL_SERVICE_NAME) sortedEnv.OTEL_SERVICE_NAME = "codex-app-server";
|
|
885
|
-
if (!sortedEnv.OTEL_TRACES_EXPORTER) sortedEnv.OTEL_TRACES_EXPORTER = "otlp";
|
|
886
|
-
if (traceparent) sortedEnv.TRACEPARENT = traceparent;
|
|
887
|
-
} else delete sortedEnv.TRACEPARENT;
|
|
888
|
-
if (config.working_dir && isAgentWorkspace(config.working_dir)) clearRepositoryEnv(sortedEnv);
|
|
889
|
-
return sortedEnv;
|
|
890
|
-
}
|
|
891
|
-
getOmittedOptionalProcessEnvKeys(config, env) {
|
|
892
|
-
const shouldWarnForSshEnv = config.network_access_enabled === true;
|
|
893
|
-
return COMMON_OPTIONAL_PROCESS_ENV_KEYS.filter((key) => typeof process.env[key] === "string" && !(key in env) && (shouldWarnForSshEnv || key !== "SSH_AUTH_SOCK" && key !== "GIT_SSH_COMMAND"));
|
|
894
|
-
}
|
|
895
|
-
buildAppServerArgs(config, env) {
|
|
896
|
-
const args = [
|
|
897
|
-
"app-server",
|
|
898
|
-
"--listen",
|
|
899
|
-
"stdio://"
|
|
900
|
-
];
|
|
901
|
-
const cliConfig = this.getResolvedCliConfig(config, env);
|
|
902
|
-
for (const { key, value } of flattenConfig(cliConfig)) args.push("-c", `${key}=${toTomlLiteral(value)}`);
|
|
903
|
-
return args;
|
|
904
|
-
}
|
|
905
|
-
getResolvedCliConfig(config, env = {}) {
|
|
906
|
-
return withCodexTraceExporter({ ...config.cli_config ?? {} }, env, config.deep_tracing === true);
|
|
907
|
-
}
|
|
908
|
-
getRequestTimeoutMs(config) {
|
|
909
|
-
return config.request_timeout_ms ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
910
|
-
}
|
|
911
|
-
async getOrCreateConnection(connectionKey, env, config) {
|
|
912
|
-
const existing = this.connections.get(connectionKey);
|
|
913
|
-
if (existing) return existing;
|
|
914
|
-
const pending = this.connectionPromises.get(connectionKey);
|
|
915
|
-
if (pending) return pending;
|
|
916
|
-
let connectionPromise;
|
|
917
|
-
connectionPromise = this.createConnection(connectionKey, env, config).then((connection) => {
|
|
918
|
-
if (this.connectionPromises.get(connectionKey) !== connectionPromise) {
|
|
919
|
-
connection.close().catch((error) => {
|
|
920
|
-
logger.debug("[CodexAppServer] Error closing stale initialized connection", { error });
|
|
921
|
-
});
|
|
922
|
-
throw new Error("codex app-server connection was closed during cleanup");
|
|
923
|
-
}
|
|
924
|
-
this.connections.set(connectionKey, connection);
|
|
925
|
-
return connection;
|
|
926
|
-
}).finally(() => {
|
|
927
|
-
this.connectionPromises.delete(connectionKey);
|
|
928
|
-
});
|
|
929
|
-
this.connectionPromises.set(connectionKey, connectionPromise);
|
|
930
|
-
return connectionPromise;
|
|
931
|
-
}
|
|
932
|
-
async createConnection(connectionKey, env, config) {
|
|
933
|
-
const connectionInstanceId = `${connectionKey}:${crypto.randomUUID()}`;
|
|
934
|
-
const entrypoint = process.platform === "win32" && config.codex_path_override === void 0 ? getCodexNpmEntrypoint(env) : void 0;
|
|
935
|
-
const args = this.buildAppServerArgs(config, env);
|
|
936
|
-
const connection = new CodexAppServerConnection({
|
|
937
|
-
connectionInstanceId,
|
|
938
|
-
command: config.codex_path_override ?? (entrypoint ? process.execPath : "codex"),
|
|
939
|
-
args: entrypoint ? [entrypoint, ...args] : args,
|
|
940
|
-
env,
|
|
941
|
-
requestTimeoutMs: this.getRequestTimeoutMs(config),
|
|
942
|
-
startupTimeoutMs: config.startup_timeout_ms ?? DEFAULT_STARTUP_TIMEOUT_MS,
|
|
943
|
-
onNotification: (message) => this.handleNotification(message),
|
|
944
|
-
onServerRequest: (message) => this.handleServerRequest(message, config),
|
|
945
|
-
onClose: (error) => this.handleConnectionClose(connectionKey, connectionInstanceId, error)
|
|
946
|
-
});
|
|
947
|
-
if (this.registerForCleanup) providerRegistry.register(this);
|
|
948
|
-
this.initializingConnections.add(connection);
|
|
949
|
-
try {
|
|
950
|
-
await connection.initialize(config);
|
|
951
|
-
const apiKey = this.getApiKey(config);
|
|
952
|
-
if (shouldInjectApiKey(config, apiKey)) try {
|
|
953
|
-
await connection.request("account/login/start", {
|
|
954
|
-
type: "apiKey",
|
|
955
|
-
apiKey
|
|
956
|
-
}, { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
957
|
-
} catch (error) {
|
|
958
|
-
if (!isMethodNotFoundError(error)) throw error;
|
|
959
|
-
logger.debug("[CodexAppServer] account/login/start is unavailable; continuing with API key env auth");
|
|
960
|
-
}
|
|
961
|
-
await this.warnForTraceExporterOverride(connection, config, env);
|
|
962
|
-
return connection;
|
|
963
|
-
} catch (error) {
|
|
964
|
-
await connection.close().catch((closeError) => {
|
|
965
|
-
logger.debug("[CodexAppServer] Error closing app-server after failed initialization", { error: closeError });
|
|
966
|
-
});
|
|
967
|
-
throw error;
|
|
968
|
-
} finally {
|
|
969
|
-
this.initializingConnections.delete(connection);
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
async warnForTraceExporterOverride(connection, config, env) {
|
|
973
|
-
if (!config.deep_tracing || this.traceExporterOverrideWarningShown) return;
|
|
974
|
-
const requestedExporter = getCodexTraceExporterSettings(this.getResolvedCliConfig(config, env));
|
|
975
|
-
if (!requestedExporter) return;
|
|
976
|
-
let effectiveConfig;
|
|
977
|
-
try {
|
|
978
|
-
effectiveConfig = await connection.request("config/read", { includeLayers: false }, { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
979
|
-
} catch (error) {
|
|
980
|
-
logger.debug("[CodexAppServer] Unable to inspect the effective Codex trace exporter", { error: error instanceof Error ? error.message : String(error) });
|
|
981
|
-
return;
|
|
982
|
-
}
|
|
983
|
-
if (!isPlainObject(effectiveConfig)) return;
|
|
984
|
-
const effectiveExporter = getCodexTraceExporterSettings(effectiveConfig.config);
|
|
985
|
-
const effectiveExporterValue = getCodexTraceExporterValue(effectiveConfig.config);
|
|
986
|
-
if (!effectiveExporter && effectiveExporterValue === void 0 || effectiveExporter && effectiveExporter.endpoint === requestedExporter.endpoint && (!effectiveExporter.protocol || !requestedExporter.protocol || effectiveExporter.protocol === requestedExporter.protocol)) return;
|
|
987
|
-
const configOrigin = (effectiveExporter && (getCodexConfigOriginType(effectiveConfig.origins, effectiveExporter.endpointConfigKey) ?? getCodexConfigOriginType(effectiveConfig.origins, effectiveExporter.protocolConfigKey))) ?? getCodexConfigOriginType(effectiveConfig.origins, "otel.trace_exporter");
|
|
988
|
-
const managedOverride = configOrigin !== void 0 && /managed|mdm/i.test(configOrigin);
|
|
989
|
-
const exporterState = typeof effectiveExporterValue === "string" ? effectiveExporterValue : "unsupported";
|
|
990
|
-
this.traceExporterOverrideWarningShown = true;
|
|
991
|
-
logger.warn(`[CodexAppServer] ${managedOverride ? "Enterprise-managed" : "Effective"} Codex configuration overrides the requested trace exporter. Native spans will not reach the configured trace receiver.`, {
|
|
992
|
-
requestedOrigin: getSafeTraceExporterOrigin(requestedExporter.endpoint),
|
|
993
|
-
...effectiveExporter ? { effectiveOrigin: getSafeTraceExporterOrigin(effectiveExporter.endpoint) } : { effectiveExporter: exporterState },
|
|
994
|
-
requestedProtocol: requestedExporter.protocol,
|
|
995
|
-
effectiveProtocol: effectiveExporter?.protocol,
|
|
996
|
-
...configOrigin && { configOrigin }
|
|
997
|
-
});
|
|
998
|
-
}
|
|
999
|
-
handleConnectionClose(connectionKey, connectionInstanceId, error) {
|
|
1000
|
-
logger.warn("[CodexAppServer] Connection closed", {
|
|
1001
|
-
connectionKey,
|
|
1002
|
-
error: error.message
|
|
1003
|
-
});
|
|
1004
|
-
if (this.connections.get(connectionKey)?.instanceId === connectionInstanceId) {
|
|
1005
|
-
this.connections.delete(connectionKey);
|
|
1006
|
-
this.connectionPromises.delete(connectionKey);
|
|
1007
|
-
for (const [threadCacheKey, handle] of this.threads) if (handle.connectionKey === connectionKey) this.threads.delete(threadCacheKey);
|
|
1008
|
-
for (const [threadCacheKey, pending] of this.threadPromises) if (pending.connectionInstanceId === connectionInstanceId) this.threadPromises.delete(threadCacheKey);
|
|
1009
|
-
}
|
|
1010
|
-
this.resolveActiveTurns(error, (state) => state.connectionInstanceId === connectionInstanceId);
|
|
1011
|
-
}
|
|
1012
|
-
resolveActiveTurns(error, predicate = () => true) {
|
|
1013
|
-
for (const state of new Set(this.activeTurnsByThread.values())) {
|
|
1014
|
-
if (!predicate(state)) continue;
|
|
1015
|
-
state.error = error.message;
|
|
1016
|
-
state.completed.resolve();
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
generateConnectionKey(env, config) {
|
|
1020
|
-
const stableEnv = { ...env };
|
|
1021
|
-
delete stableEnv.TRACEPARENT;
|
|
1022
|
-
const keyData = {
|
|
1023
|
-
env: stableEnv,
|
|
1024
|
-
codex_path_override: config.codex_path_override,
|
|
1025
|
-
cli_config: this.getResolvedCliConfig(config, env),
|
|
1026
|
-
experimental_api: config.experimental_api
|
|
1027
|
-
};
|
|
1028
|
-
return `openai:codex-app-server:connection:${crypto.createHash("sha256").update(JSON.stringify(keyData)).digest("hex")}`;
|
|
1029
|
-
}
|
|
1030
|
-
generateThreadCacheKey(connectionKey, promptCacheBasis, config) {
|
|
1031
|
-
const keyData = {
|
|
1032
|
-
connectionKey,
|
|
1033
|
-
prompt: promptCacheBasis,
|
|
1034
|
-
working_dir: config.working_dir,
|
|
1035
|
-
additional_directories: config.additional_directories,
|
|
1036
|
-
model: config.model,
|
|
1037
|
-
model_provider: config.model_provider,
|
|
1038
|
-
service_tier: config.service_tier,
|
|
1039
|
-
sandbox_mode: config.sandbox_mode,
|
|
1040
|
-
sandbox_policy: config.sandbox_policy,
|
|
1041
|
-
network_access_enabled: config.network_access_enabled,
|
|
1042
|
-
approval_policy: config.approval_policy,
|
|
1043
|
-
approvals_reviewer: config.approvals_reviewer,
|
|
1044
|
-
model_reasoning_effort: config.model_reasoning_effort,
|
|
1045
|
-
reasoning_summary: config.reasoning_summary,
|
|
1046
|
-
personality: config.personality,
|
|
1047
|
-
base_instructions: config.base_instructions,
|
|
1048
|
-
developer_instructions: config.developer_instructions,
|
|
1049
|
-
collaboration_mode: config.collaboration_mode,
|
|
1050
|
-
output_schema: config.output_schema,
|
|
1051
|
-
base_url: config.base_url,
|
|
1052
|
-
ephemeral: config.ephemeral,
|
|
1053
|
-
experimental_raw_events: config.experimental_raw_events,
|
|
1054
|
-
persist_extended_history: config.persist_extended_history
|
|
1055
|
-
};
|
|
1056
|
-
return `openai:codex-app-server:thread:${crypto.createHash("sha256").update(JSON.stringify(keyData)).digest("hex")}`;
|
|
1057
|
-
}
|
|
1058
|
-
generateExplicitThreadCachePrefix(threadId) {
|
|
1059
|
-
return `openai:codex-app-server:thread_id:${crypto.createHash("sha256").update(threadId).digest("hex")}:`;
|
|
1060
|
-
}
|
|
1061
|
-
generateExplicitThreadCacheKey(connectionKey, threadId, config) {
|
|
1062
|
-
const resumeHash = crypto.createHash("sha256").update(JSON.stringify({
|
|
1063
|
-
connectionKey,
|
|
1064
|
-
resume: this.buildThreadResumeParams(threadId, config)
|
|
1065
|
-
})).digest("hex");
|
|
1066
|
-
return `${this.generateExplicitThreadCachePrefix(threadId)}${resumeHash}`;
|
|
1067
|
-
}
|
|
1068
|
-
async discardOtherExplicitThreadVariants(prefix, keepKey, connection, connectionKey, timeoutMs) {
|
|
1069
|
-
const staleKeys = Array.from(this.threads.keys()).filter((key) => key.startsWith(prefix) && key !== keepKey);
|
|
1070
|
-
for (const key of staleKeys) {
|
|
1071
|
-
const stale = this.threads.get(key);
|
|
1072
|
-
this.threads.delete(key);
|
|
1073
|
-
if (!stale) continue;
|
|
1074
|
-
const staleConnection = this.connections.get(stale.connectionKey) ?? (stale.connectionKey === connectionKey ? connection : void 0);
|
|
1075
|
-
if (staleConnection) try {
|
|
1076
|
-
await staleConnection.request("thread/unsubscribe", { threadId: stale.threadId }, { timeoutMs });
|
|
1077
|
-
} catch (error) {
|
|
1078
|
-
logger.warn("[CodexAppServer] Failed to unsubscribe stale explicit thread variant", {
|
|
1079
|
-
error,
|
|
1080
|
-
threadId: stale.threadId
|
|
1081
|
-
});
|
|
1082
|
-
if (staleConnection === connection && connection.isClosed()) throw new StaleExplicitThreadConnectionClosedError();
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
async settleOtherExplicitThreadVariants(prefix, keepKey, abortSignal) {
|
|
1087
|
-
const pending = Array.from(this.threadPromises.entries()).filter(([key]) => key.startsWith(prefix) && key !== keepKey).map(([, entry]) => entry.promise);
|
|
1088
|
-
const abortCleanups = Array.from(this.explicitThreadAbortCleanups.entries()).filter(([key]) => key.startsWith(prefix)).map(([, promise]) => promise);
|
|
1089
|
-
pending.push(...abortCleanups);
|
|
1090
|
-
if (pending.length > 0) await this.threadRunQueues.wait(Promise.allSettled(pending).then(() => void 0), abortSignal);
|
|
1091
|
-
}
|
|
1092
|
-
async getOrCreateThread(connection, connectionKey, promptCacheBasis, config, allowThreadPersistence, callOptions) {
|
|
1093
|
-
const canPersistThread = allowThreadPersistence && config.persist_threads === true;
|
|
1094
|
-
if (config.thread_id) {
|
|
1095
|
-
const variantKey = this.generateExplicitThreadCacheKey(connectionKey, config.thread_id, config);
|
|
1096
|
-
const cacheKey = canPersistThread ? variantKey : void 0;
|
|
1097
|
-
await this.settleOtherExplicitThreadVariants(this.generateExplicitThreadCachePrefix(config.thread_id), variantKey, callOptions?.abortSignal);
|
|
1098
|
-
if (cacheKey) await this.discardOtherExplicitThreadVariants(this.generateExplicitThreadCachePrefix(config.thread_id), cacheKey, connection, connectionKey, this.getRequestTimeoutMs(config));
|
|
1099
|
-
const cachedOrPending = (cacheKey ? this.threads.get(cacheKey) : void 0) ?? this.threadPromises.get(variantKey)?.promise;
|
|
1100
|
-
if (cachedOrPending !== void 0) return this.waitForThreadHandle(cachedOrPending, callOptions?.abortSignal);
|
|
1101
|
-
this.throwIfThreadWaitAborted(callOptions?.abortSignal);
|
|
1102
|
-
const threadPromise = this.cacheThreadPromise(variantKey, connection.instanceId, async () => {
|
|
1103
|
-
const response = await connection.request("thread/resume", this.buildThreadResumeParams(config.thread_id, config), { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
1104
|
-
const handle = {
|
|
1105
|
-
connectionKey,
|
|
1106
|
-
threadId: response?.thread?.id ?? config.thread_id,
|
|
1107
|
-
response,
|
|
1108
|
-
cacheKey,
|
|
1109
|
-
persistent: canPersistThread
|
|
1110
|
-
};
|
|
1111
|
-
if (cacheKey) this.threads.set(cacheKey, handle);
|
|
1112
|
-
return handle;
|
|
1113
|
-
});
|
|
1114
|
-
return cacheKey ? this.waitForThreadHandle(threadPromise, callOptions?.abortSignal) : this.waitForThreadHandle(threadPromise, callOptions?.abortSignal, {
|
|
1115
|
-
onAbortResolvedThread: (threadHandle) => this.cleanupThreadAfterTurn(connection, threadHandle, config, { skipIfProtected: true }),
|
|
1116
|
-
onAbortCleanupScheduled: (cleanup) => this.trackExplicitThreadAbortCleanup(variantKey, cleanup)
|
|
1117
|
-
});
|
|
1118
|
-
}
|
|
1119
|
-
const cacheKey = canPersistThread ? this.generateThreadCacheKey(connectionKey, promptCacheBasis, config) : void 0;
|
|
1120
|
-
const cachedOrPending = this.getCachedOrPendingThread(cacheKey);
|
|
1121
|
-
if (cachedOrPending !== void 0) return this.waitForThreadHandle(cachedOrPending, callOptions?.abortSignal);
|
|
1122
|
-
this.throwIfThreadWaitAborted(callOptions?.abortSignal);
|
|
1123
|
-
const threadPromise = this.cacheThreadPromise(cacheKey, connection.instanceId, async () => {
|
|
1124
|
-
const poolSize = config.thread_pool_size ?? 1;
|
|
1125
|
-
if (cacheKey && this.threads.size >= poolSize) await this.evictOldestInactiveCachedThread(connection, connectionKey, this.getRequestTimeoutMs(config));
|
|
1126
|
-
const response = await connection.request("thread/start", this.buildThreadStartParams(config), { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
1127
|
-
const threadId = response?.thread?.id;
|
|
1128
|
-
if (typeof threadId !== "string" || !threadId) throw new Error("codex app-server did not return a thread id");
|
|
1129
|
-
const handle = {
|
|
1130
|
-
connectionKey,
|
|
1131
|
-
threadId,
|
|
1132
|
-
response,
|
|
1133
|
-
cacheKey,
|
|
1134
|
-
persistent: canPersistThread
|
|
1135
|
-
};
|
|
1136
|
-
if (cacheKey) this.threads.set(cacheKey, handle);
|
|
1137
|
-
return handle;
|
|
1138
|
-
});
|
|
1139
|
-
return cacheKey ? this.waitForThreadHandle(threadPromise, callOptions?.abortSignal) : this.waitForThreadHandle(threadPromise, callOptions?.abortSignal, { onAbortResolvedThread: (threadHandle) => this.cleanupThreadAfterTurn(connection, threadHandle, config, { skipIfProtected: true }) });
|
|
1140
|
-
}
|
|
1141
|
-
getCachedOrPendingThread(cacheKey) {
|
|
1142
|
-
if (!cacheKey) return;
|
|
1143
|
-
return this.threads.get(cacheKey) ?? this.threadPromises.get(cacheKey)?.promise;
|
|
1144
|
-
}
|
|
1145
|
-
cacheThreadPromise(cacheKey, connectionInstanceId, createThread) {
|
|
1146
|
-
if (!cacheKey) return createThread();
|
|
1147
|
-
let threadPromise;
|
|
1148
|
-
threadPromise = createThread().finally(() => {
|
|
1149
|
-
if (this.threadPromises.get(cacheKey)?.promise === threadPromise) this.threadPromises.delete(cacheKey);
|
|
1150
|
-
});
|
|
1151
|
-
this.threadPromises.set(cacheKey, {
|
|
1152
|
-
promise: threadPromise,
|
|
1153
|
-
connectionInstanceId
|
|
1154
|
-
});
|
|
1155
|
-
return threadPromise;
|
|
1156
|
-
}
|
|
1157
|
-
throwIfThreadWaitAborted(abortSignal) {
|
|
1158
|
-
if (abortSignal?.aborted) throw createAbortError("Codex app-server thread wait aborted");
|
|
1159
|
-
}
|
|
1160
|
-
async waitForThreadHandle(thread, abortSignal, options = {}) {
|
|
1161
|
-
const threadPromise = Promise.resolve(thread);
|
|
1162
|
-
if (!abortSignal) return threadPromise;
|
|
1163
|
-
let abortCleanupScheduled = false;
|
|
1164
|
-
const scheduleAbortCleanup = () => {
|
|
1165
|
-
if (abortCleanupScheduled) return;
|
|
1166
|
-
abortCleanupScheduled = true;
|
|
1167
|
-
const cleanup = threadPromise.then(async (threadHandle) => {
|
|
1168
|
-
if (options.onAbortResolvedThread) await options.onAbortResolvedThread(threadHandle);
|
|
1169
|
-
}).catch((error) => {
|
|
1170
|
-
logger.debug("[CodexAppServer] Thread request finished with error after abort", { error });
|
|
1171
|
-
});
|
|
1172
|
-
options.onAbortCleanupScheduled?.(cleanup);
|
|
1173
|
-
};
|
|
1174
|
-
const createThreadAbortError = () => createAbortError(options.abortMessage ?? "Codex app-server thread wait aborted");
|
|
1175
|
-
if (abortSignal.aborted) {
|
|
1176
|
-
scheduleAbortCleanup();
|
|
1177
|
-
throw createThreadAbortError();
|
|
1178
|
-
}
|
|
1179
|
-
let abortListener;
|
|
1180
|
-
const abortPromise = new Promise((_, reject) => {
|
|
1181
|
-
abortListener = () => {
|
|
1182
|
-
scheduleAbortCleanup();
|
|
1183
|
-
reject(createThreadAbortError());
|
|
1184
|
-
};
|
|
1185
|
-
abortSignal.addEventListener("abort", abortListener, { once: true });
|
|
1186
|
-
});
|
|
1187
|
-
try {
|
|
1188
|
-
return await Promise.race([threadPromise, abortPromise]);
|
|
1189
|
-
} finally {
|
|
1190
|
-
if (abortListener) abortSignal.removeEventListener("abort", abortListener);
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
|
-
trackExplicitThreadAbortCleanup(cacheKey, cleanup) {
|
|
1194
|
-
this.explicitThreadAbortCleanups.set(cacheKey, cleanup);
|
|
1195
|
-
cleanup.finally(() => {
|
|
1196
|
-
if (this.explicitThreadAbortCleanups.get(cacheKey) === cleanup) this.explicitThreadAbortCleanups.delete(cacheKey);
|
|
1197
|
-
});
|
|
1198
|
-
}
|
|
1199
|
-
scheduleThreadPoolEnforcement(fallbackConnection, fallbackConnectionKey, config) {
|
|
1200
|
-
if (!config.persist_threads || config.thread_id) return;
|
|
1201
|
-
this.enforceThreadPoolLimit(fallbackConnection, fallbackConnectionKey, config).catch((error) => {
|
|
1202
|
-
logger.debug("[CodexAppServer] Error enforcing thread pool limit", { error });
|
|
1203
|
-
});
|
|
1204
|
-
}
|
|
1205
|
-
async enforceThreadPoolLimit(fallbackConnection, fallbackConnectionKey, config) {
|
|
1206
|
-
const poolSize = config.thread_pool_size ?? 1;
|
|
1207
|
-
while (this.threads.size > poolSize) if (!await this.evictOldestInactiveCachedThread(fallbackConnection, fallbackConnectionKey, this.getRequestTimeoutMs(config))) return;
|
|
1208
|
-
}
|
|
1209
|
-
async evictOldestInactiveCachedThread(fallbackConnection, fallbackConnectionKey, timeoutMs) {
|
|
1210
|
-
for (const [cacheKey, handle] of this.threads) {
|
|
1211
|
-
if (this.isThreadProtected(handle.threadId)) continue;
|
|
1212
|
-
await this.evictCachedThread(fallbackConnection, fallbackConnectionKey, cacheKey, timeoutMs);
|
|
1213
|
-
return true;
|
|
1214
|
-
}
|
|
1215
|
-
logger.debug("[CodexAppServer] Thread pool is full, but all cached threads are active");
|
|
1216
|
-
return false;
|
|
1217
|
-
}
|
|
1218
|
-
async evictCachedThread(fallbackConnection, fallbackConnectionKey, cacheKey, timeoutMs) {
|
|
1219
|
-
const evicted = this.threads.get(cacheKey);
|
|
1220
|
-
this.threads.delete(cacheKey);
|
|
1221
|
-
if (!evicted) return;
|
|
1222
|
-
const connection = this.connections.get(evicted.connectionKey) ?? (evicted.connectionKey === fallbackConnectionKey ? fallbackConnection : void 0);
|
|
1223
|
-
if (!connection) {
|
|
1224
|
-
logger.debug("[CodexAppServer] Evicted cached thread without an active connection", { threadId: evicted.threadId });
|
|
1225
|
-
return;
|
|
1226
|
-
}
|
|
1227
|
-
try {
|
|
1228
|
-
await connection.request("thread/unsubscribe", { threadId: evicted.threadId }, { timeoutMs });
|
|
1229
|
-
} catch (error) {
|
|
1230
|
-
logger.warn("[CodexAppServer] Failed to unsubscribe evicted cached thread", {
|
|
1231
|
-
error,
|
|
1232
|
-
threadId: evicted.threadId
|
|
1233
|
-
});
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
buildThreadStartParams(config) {
|
|
1237
|
-
return {
|
|
1238
|
-
...config.model ? { model: config.model } : {},
|
|
1239
|
-
...config.model_provider ? { modelProvider: config.model_provider } : {},
|
|
1240
|
-
...config.service_tier ? { serviceTier: config.service_tier } : {},
|
|
1241
|
-
...config.working_dir ? { cwd: config.working_dir } : {},
|
|
1242
|
-
approvalPolicy: config.approval_policy ?? "never",
|
|
1243
|
-
...config.approvals_reviewer ? { approvalsReviewer: config.approvals_reviewer } : {},
|
|
1244
|
-
sandbox: config.sandbox_mode ?? "read-only",
|
|
1245
|
-
...Object.keys(config.cli_config ?? {}).length > 0 ? { config: config.cli_config } : {},
|
|
1246
|
-
serviceName: "promptfoo",
|
|
1247
|
-
...config.base_instructions ? { baseInstructions: config.base_instructions } : {},
|
|
1248
|
-
...config.developer_instructions ? { developerInstructions: config.developer_instructions } : {},
|
|
1249
|
-
...config.personality ? { personality: config.personality } : {},
|
|
1250
|
-
...config.base_url ? { config: {
|
|
1251
|
-
...config.cli_config ?? {},
|
|
1252
|
-
openai_base_url: config.base_url
|
|
1253
|
-
} } : {},
|
|
1254
|
-
ephemeral: config.ephemeral ?? true,
|
|
1255
|
-
experimentalRawEvents: config.experimental_raw_events ?? false,
|
|
1256
|
-
persistExtendedHistory: config.persist_extended_history ?? false
|
|
1257
|
-
};
|
|
1258
|
-
}
|
|
1259
|
-
buildThreadResumeParams(threadId, config) {
|
|
1260
|
-
return {
|
|
1261
|
-
threadId,
|
|
1262
|
-
...config.model ? { model: config.model } : {},
|
|
1263
|
-
...config.model_provider ? { modelProvider: config.model_provider } : {},
|
|
1264
|
-
...config.service_tier ? { serviceTier: config.service_tier } : {},
|
|
1265
|
-
...config.working_dir ? { cwd: config.working_dir } : {},
|
|
1266
|
-
approvalPolicy: config.approval_policy ?? "never",
|
|
1267
|
-
...config.approvals_reviewer ? { approvalsReviewer: config.approvals_reviewer } : {},
|
|
1268
|
-
sandbox: config.sandbox_mode ?? "read-only",
|
|
1269
|
-
...Object.keys(config.cli_config ?? {}).length > 0 ? { config: config.cli_config } : {},
|
|
1270
|
-
...config.base_instructions ? { baseInstructions: config.base_instructions } : {},
|
|
1271
|
-
...config.developer_instructions ? { developerInstructions: config.developer_instructions } : {},
|
|
1272
|
-
...config.personality ? { personality: config.personality } : {},
|
|
1273
|
-
...config.base_url ? { config: {
|
|
1274
|
-
...config.cli_config ?? {},
|
|
1275
|
-
openai_base_url: config.base_url
|
|
1276
|
-
} } : {},
|
|
1277
|
-
persistExtendedHistory: config.persist_extended_history ?? false
|
|
1278
|
-
};
|
|
1279
|
-
}
|
|
1280
|
-
buildTurnStartParams(threadId, input, config) {
|
|
1281
|
-
return {
|
|
1282
|
-
threadId,
|
|
1283
|
-
input,
|
|
1284
|
-
...config.working_dir ? { cwd: config.working_dir } : {},
|
|
1285
|
-
approvalPolicy: config.approval_policy ?? "never",
|
|
1286
|
-
...config.approvals_reviewer ? { approvalsReviewer: config.approvals_reviewer } : {},
|
|
1287
|
-
...config.sandbox_policy || config.network_access_enabled !== void 0 ? { sandboxPolicy: this.buildSandboxPolicy(config) } : {},
|
|
1288
|
-
...config.model ? { model: config.model } : {},
|
|
1289
|
-
...config.service_tier ? { serviceTier: config.service_tier } : {},
|
|
1290
|
-
...config.model_reasoning_effort ? { effort: config.model_reasoning_effort } : {},
|
|
1291
|
-
...config.reasoning_summary ? { summary: config.reasoning_summary } : {},
|
|
1292
|
-
...config.personality ? { personality: config.personality } : {},
|
|
1293
|
-
...config.collaboration_mode ? { collaborationMode: config.collaboration_mode } : {},
|
|
1294
|
-
...config.output_schema ? { outputSchema: config.output_schema } : {}
|
|
1295
|
-
};
|
|
1296
|
-
}
|
|
1297
|
-
buildSandboxPolicy(config) {
|
|
1298
|
-
if (config.sandbox_policy) return config.sandbox_policy;
|
|
1299
|
-
const networkAccess = config.network_access_enabled === true;
|
|
1300
|
-
switch (config.sandbox_mode ?? "read-only") {
|
|
1301
|
-
case "danger-full-access": return { type: "dangerFullAccess" };
|
|
1302
|
-
case "workspace-write": return {
|
|
1303
|
-
type: "workspaceWrite",
|
|
1304
|
-
writableRoots: [config.working_dir, ...config.additional_directories ?? []].filter(Boolean),
|
|
1305
|
-
readOnlyAccess: { type: "fullAccess" },
|
|
1306
|
-
networkAccess,
|
|
1307
|
-
excludeTmpdirEnvVar: false,
|
|
1308
|
-
excludeSlashTmp: false
|
|
1309
|
-
};
|
|
1310
|
-
default: return {
|
|
1311
|
-
type: "readOnly",
|
|
1312
|
-
access: { type: "fullAccess" },
|
|
1313
|
-
networkAccess
|
|
1314
|
-
};
|
|
1315
|
-
}
|
|
1316
|
-
}
|
|
1317
|
-
parsePromptInput(prompt) {
|
|
1318
|
-
let parsedPrompt;
|
|
1319
|
-
try {
|
|
1320
|
-
parsedPrompt = JSON.parse(prompt);
|
|
1321
|
-
} catch {
|
|
1322
|
-
return [{
|
|
1323
|
-
type: "text",
|
|
1324
|
-
text: prompt,
|
|
1325
|
-
text_elements: []
|
|
1326
|
-
}];
|
|
1327
|
-
}
|
|
1328
|
-
if (!Array.isArray(parsedPrompt) || parsedPrompt.length === 0) return [{
|
|
1329
|
-
type: "text",
|
|
1330
|
-
text: prompt,
|
|
1331
|
-
text_elements: []
|
|
1332
|
-
}];
|
|
1333
|
-
const input = [];
|
|
1334
|
-
for (const item of parsedPrompt) {
|
|
1335
|
-
if (!this.isPromptInputItem(item)) return [{
|
|
1336
|
-
type: "text",
|
|
1337
|
-
text: prompt,
|
|
1338
|
-
text_elements: []
|
|
1339
|
-
}];
|
|
1340
|
-
input.push(this.normalizePromptInputItem(item));
|
|
1341
|
-
}
|
|
1342
|
-
return input;
|
|
1343
|
-
}
|
|
1344
|
-
isPromptInputItem(item) {
|
|
1345
|
-
if (!item || typeof item !== "object" || Array.isArray(item)) return false;
|
|
1346
|
-
if ("type" in item && item.type === "text") return "text" in item && typeof item.text === "string";
|
|
1347
|
-
if ("type" in item && item.type === "image") return "url" in item && typeof item.url === "string";
|
|
1348
|
-
if ("type" in item && (item.type === "local_image" || item.type === "localImage")) return "path" in item && typeof item.path === "string";
|
|
1349
|
-
if ("type" in item && (item.type === "skill" || item.type === "mention")) return "name" in item && typeof item.name === "string" && "path" in item && typeof item.path === "string";
|
|
1350
|
-
return false;
|
|
1351
|
-
}
|
|
1352
|
-
normalizePromptInputItem(item) {
|
|
1353
|
-
switch (item.type) {
|
|
1354
|
-
case "text": return {
|
|
1355
|
-
type: "text",
|
|
1356
|
-
text: item.text,
|
|
1357
|
-
text_elements: []
|
|
1358
|
-
};
|
|
1359
|
-
case "image": return {
|
|
1360
|
-
type: "image",
|
|
1361
|
-
url: item.url
|
|
1362
|
-
};
|
|
1363
|
-
case "local_image":
|
|
1364
|
-
case "localImage": return {
|
|
1365
|
-
type: "localImage",
|
|
1366
|
-
path: item.path
|
|
1367
|
-
};
|
|
1368
|
-
case "skill": return {
|
|
1369
|
-
type: "skill",
|
|
1370
|
-
name: item.name,
|
|
1371
|
-
path: item.path
|
|
1372
|
-
};
|
|
1373
|
-
case "mention": return {
|
|
1374
|
-
type: "mention",
|
|
1375
|
-
name: item.name,
|
|
1376
|
-
path: item.path
|
|
1377
|
-
};
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1380
|
-
formatPromptInputForTrace(input) {
|
|
1381
|
-
return input.map((item) => {
|
|
1382
|
-
switch (item.type) {
|
|
1383
|
-
case "text": return item.text;
|
|
1384
|
-
case "image": return `[image: ${item.url}]`;
|
|
1385
|
-
case "localImage": return `[local_image: ${item.path}]`;
|
|
1386
|
-
case "skill": return `[skill: ${item.name} ${item.path}]`;
|
|
1387
|
-
case "mention": return `[mention: ${item.name} ${item.path}]`;
|
|
1388
|
-
}
|
|
1389
|
-
}).join("\n");
|
|
1390
|
-
}
|
|
1391
|
-
createTurnState(connection, connectionKey, connectionInstanceId, threadId, promptInput, config, appServerEnv) {
|
|
1392
|
-
return {
|
|
1393
|
-
connection,
|
|
1394
|
-
connectionKey,
|
|
1395
|
-
connectionInstanceId,
|
|
1396
|
-
threadId,
|
|
1397
|
-
config,
|
|
1398
|
-
appServerEnv,
|
|
1399
|
-
promptInput,
|
|
1400
|
-
items: [],
|
|
1401
|
-
itemStarts: [],
|
|
1402
|
-
notifications: [],
|
|
1403
|
-
notificationCount: 0,
|
|
1404
|
-
bufferedEventChars: 0,
|
|
1405
|
-
serverRequests: [],
|
|
1406
|
-
agentMessageDeltas: [],
|
|
1407
|
-
agentMessageDeltasByItemId: /* @__PURE__ */ new Map(),
|
|
1408
|
-
commandExecutionOutputDeltasByItemId: /* @__PURE__ */ new Map(),
|
|
1409
|
-
completed: createDeferred(),
|
|
1410
|
-
activeSpans: /* @__PURE__ */ new Map(),
|
|
1411
|
-
itemStartTimes: /* @__PURE__ */ new Map(),
|
|
1412
|
-
lastEventTime: Date.now(),
|
|
1413
|
-
turnCount: 0,
|
|
1414
|
-
activeTurnSpan: void 0,
|
|
1415
|
-
activeTurnIndex: 0
|
|
1416
|
-
};
|
|
1417
|
-
}
|
|
1418
|
-
registerTurnState(state) {
|
|
1419
|
-
this.activeTurnsByThread.set(state.threadId, state);
|
|
1420
|
-
if (state.turnId) this.activeTurnsByTurn.set(state.turnId, state);
|
|
1421
|
-
}
|
|
1422
|
-
updateTurnStateId(state, turnId) {
|
|
1423
|
-
if (state.turnId && state.turnId !== turnId) this.activeTurnsByTurn.delete(state.turnId);
|
|
1424
|
-
state.turnId = turnId;
|
|
1425
|
-
this.activeTurnsByTurn.set(turnId, state);
|
|
1426
|
-
}
|
|
1427
|
-
unregisterTurnState(state) {
|
|
1428
|
-
this.activeTurnsByThread.delete(state.threadId);
|
|
1429
|
-
if (state.turnId) this.activeTurnsByTurn.delete(state.turnId);
|
|
1430
|
-
this.endUnclosedItemSpans(state);
|
|
1431
|
-
}
|
|
1432
|
-
protectThread(threadId) {
|
|
1433
|
-
this.protectedThreadCounts.set(threadId, (this.protectedThreadCounts.get(threadId) ?? 0) + 1);
|
|
1434
|
-
}
|
|
1435
|
-
unprotectThread(threadId) {
|
|
1436
|
-
const count = this.protectedThreadCounts.get(threadId);
|
|
1437
|
-
if (!count || count <= 1) {
|
|
1438
|
-
this.protectedThreadCounts.delete(threadId);
|
|
1439
|
-
return;
|
|
1440
|
-
}
|
|
1441
|
-
this.protectedThreadCounts.set(threadId, count - 1);
|
|
1442
|
-
}
|
|
1443
|
-
isThreadProtected(threadId) {
|
|
1444
|
-
return this.activeTurnsByThread.has(threadId) || (this.protectedThreadCounts.get(threadId) ?? 0) > 0;
|
|
1445
|
-
}
|
|
1446
|
-
getTurnState(threadId, turnId) {
|
|
1447
|
-
if (turnId) return this.activeTurnsByTurn.get(turnId);
|
|
1448
|
-
if (threadId) return this.activeTurnsByThread.get(threadId);
|
|
1449
|
-
}
|
|
1450
|
-
handleNotification(message) {
|
|
1451
|
-
const params = message.params ?? {};
|
|
1452
|
-
const state = this.getTurnState(params.threadId, params.turnId);
|
|
1453
|
-
if (!state) {
|
|
1454
|
-
logger.debug("[CodexAppServer] Notification without active turn", { method: message.method });
|
|
1455
|
-
return;
|
|
1456
|
-
}
|
|
1457
|
-
if (!this.reserveTurnEvent(state, message)) return;
|
|
1458
|
-
state.notificationCount += 1;
|
|
1459
|
-
if (state.config.include_raw_events) state.notifications.push(message);
|
|
1460
|
-
const eventTime = Date.now();
|
|
1461
|
-
switch (message.method) {
|
|
1462
|
-
case "turn/started":
|
|
1463
|
-
if (typeof params.turn?.id === "string") this.updateTurnStateId(state, params.turn.id);
|
|
1464
|
-
this.startTurnSpan(state, eventTime, true);
|
|
1465
|
-
break;
|
|
1466
|
-
case "item/started":
|
|
1467
|
-
if (!state.activeTurnSpan) this.startTurnSpan(state, eventTime);
|
|
1468
|
-
this.handleItemStarted(state, params.item, eventTime);
|
|
1469
|
-
break;
|
|
1470
|
-
case "item/completed":
|
|
1471
|
-
if (!state.activeTurnSpan) this.startTurnSpan(state, eventTime);
|
|
1472
|
-
this.handleItemCompleted(state, params.item, eventTime);
|
|
1473
|
-
break;
|
|
1474
|
-
case "item/agentMessage/delta":
|
|
1475
|
-
this.handleAgentMessageDelta(state, params);
|
|
1476
|
-
break;
|
|
1477
|
-
case "item/commandExecution/outputDelta":
|
|
1478
|
-
this.handleCommandExecutionOutputDelta(state, params);
|
|
1479
|
-
break;
|
|
1480
|
-
case "thread/tokenUsage/updated":
|
|
1481
|
-
state.rawTokenUsage = params.tokenUsage;
|
|
1482
|
-
state.tokenUsage = this.buildTokenUsage(params.tokenUsage);
|
|
1483
|
-
break;
|
|
1484
|
-
case "turn/completed":
|
|
1485
|
-
state.turn = params.turn;
|
|
1486
|
-
if (params.turn?.status === "failed") state.error = params.turn?.error?.message ?? "Codex app-server turn failed";
|
|
1487
|
-
if (!state.activeTurnSpan) this.startTurnSpan(state, state.lastEventTime);
|
|
1488
|
-
this.endTurnSpan(state, eventTime, state.error);
|
|
1489
|
-
state.completed.resolve();
|
|
1490
|
-
break;
|
|
1491
|
-
case "error":
|
|
1492
|
-
if (params.willRetry === true) {
|
|
1493
|
-
logger.debug("[CodexAppServer] Retryable error received", {
|
|
1494
|
-
error: params.error?.message,
|
|
1495
|
-
threadId: params.threadId,
|
|
1496
|
-
turnId: params.turnId
|
|
1497
|
-
});
|
|
1498
|
-
break;
|
|
1499
|
-
}
|
|
1500
|
-
state.error = params.error?.message ?? "Codex app-server error";
|
|
1501
|
-
if (!state.activeTurnSpan) this.startTurnSpan(state, state.lastEventTime);
|
|
1502
|
-
this.endTurnSpan(state, eventTime, state.error);
|
|
1503
|
-
state.completed.resolve();
|
|
1504
|
-
}
|
|
1505
|
-
state.lastEventTime = eventTime;
|
|
1506
|
-
}
|
|
1507
|
-
handleItemStarted(state, item, eventTime) {
|
|
1508
|
-
if (!item) return;
|
|
1509
|
-
state.itemStarts.push(item);
|
|
1510
|
-
if (!item.id) return;
|
|
1511
|
-
const itemId = String(item.id);
|
|
1512
|
-
const span = this.startItemSpan(item, itemId, void 0, state.activeTurnIndex > 0 ? state.activeTurnIndex : void 0);
|
|
1513
|
-
state.activeSpans.set(itemId, span);
|
|
1514
|
-
state.itemStartTimes.set(itemId, eventTime);
|
|
1515
|
-
}
|
|
1516
|
-
handleItemCompleted(state, item, eventTime) {
|
|
1517
|
-
if (!item) return;
|
|
1518
|
-
const completedItem = this.withCommandExecutionOutput(state, item);
|
|
1519
|
-
if (completedItem?.type === "commandExecution" && typeof completedItem.id === "string" && typeof completedItem.aggregatedOutput === "string") {
|
|
1520
|
-
const existingOutput = state.commandExecutionOutputDeltasByItemId.get(completedItem.id);
|
|
1521
|
-
if (typeof existingOutput !== "string" || completedItem.aggregatedOutput.startsWith(existingOutput)) state.commandExecutionOutputDeltasByItemId.set(completedItem.id, completedItem.aggregatedOutput);
|
|
1522
|
-
}
|
|
1523
|
-
state.items.push(completedItem);
|
|
1524
|
-
const itemId = completedItem.id ? String(completedItem.id) : crypto.randomUUID();
|
|
1525
|
-
const span = state.activeSpans.get(itemId) ?? this.startItemSpan(completedItem, itemId, state.lastEventTime, state.activeTurnIndex > 0 ? state.activeTurnIndex : void 0);
|
|
1526
|
-
const startTime = state.itemStartTimes.get(itemId) ?? state.lastEventTime;
|
|
1527
|
-
this.applyItemCompletionAttributes(span, completedItem, eventTime, startTime);
|
|
1528
|
-
span.end();
|
|
1529
|
-
state.activeSpans.delete(itemId);
|
|
1530
|
-
state.itemStartTimes.delete(itemId);
|
|
1531
|
-
}
|
|
1532
|
-
handleAgentMessageDelta(state, params) {
|
|
1533
|
-
if (typeof params.delta !== "string") return;
|
|
1534
|
-
state.agentMessageDeltas.push(params.delta);
|
|
1535
|
-
if (typeof params.itemId === "string") {
|
|
1536
|
-
const existing = state.agentMessageDeltasByItemId.get(params.itemId) ?? "";
|
|
1537
|
-
state.agentMessageDeltasByItemId.set(params.itemId, existing + params.delta);
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
handleCommandExecutionOutputDelta(state, params) {
|
|
1541
|
-
if (typeof params.itemId !== "string" || typeof params.delta !== "string") return;
|
|
1542
|
-
const existing = state.commandExecutionOutputDeltasByItemId.get(params.itemId) ?? "";
|
|
1543
|
-
const aggregatedOutput = existing + params.delta;
|
|
1544
|
-
state.commandExecutionOutputDeltasByItemId.set(params.itemId, aggregatedOutput);
|
|
1545
|
-
const completedItem = state.items.find((item) => item?.type === "commandExecution" && String(item.id) === params.itemId);
|
|
1546
|
-
if (completedItem && (typeof completedItem.aggregatedOutput !== "string" || completedItem.aggregatedOutput === existing)) completedItem.aggregatedOutput = aggregatedOutput;
|
|
1547
|
-
}
|
|
1548
|
-
withCommandExecutionOutput(state, item) {
|
|
1549
|
-
if (item?.type !== "commandExecution" || typeof item.id !== "string") return item;
|
|
1550
|
-
const aggregatedOutput = state.commandExecutionOutputDeltasByItemId.get(item.id);
|
|
1551
|
-
if (typeof aggregatedOutput !== "string") return item;
|
|
1552
|
-
if (typeof item.aggregatedOutput === "string" && !aggregatedOutput.startsWith(item.aggregatedOutput)) return item;
|
|
1553
|
-
return {
|
|
1554
|
-
...item,
|
|
1555
|
-
aggregatedOutput
|
|
1556
|
-
};
|
|
1557
|
-
}
|
|
1558
|
-
async handleServerRequest(message, config) {
|
|
1559
|
-
const params = message.params ?? {};
|
|
1560
|
-
const state = this.getTurnState(params.threadId ?? params.conversationId, params.turnId);
|
|
1561
|
-
if (state && !this.reserveTurnEvent(state, message)) throw new Error(state.error ?? "Codex app-server turn event limit exceeded");
|
|
1562
|
-
const record = {
|
|
1563
|
-
id: message.id,
|
|
1564
|
-
method: message.method ?? "unknown",
|
|
1565
|
-
params: this.sanitizeForMetadata(params)
|
|
1566
|
-
};
|
|
1567
|
-
try {
|
|
1568
|
-
const response = this.buildServerRequestResponse(message, state?.config ?? config);
|
|
1569
|
-
record.response = this.sanitizeForMetadata(response);
|
|
1570
|
-
state?.serverRequests.push(record);
|
|
1571
|
-
return response;
|
|
1572
|
-
} catch (error) {
|
|
1573
|
-
record.error = error instanceof Error ? error.message : String(error);
|
|
1574
|
-
state?.serverRequests.push(record);
|
|
1575
|
-
throw error;
|
|
1576
|
-
}
|
|
1577
|
-
}
|
|
1578
|
-
reserveTurnEvent(state, message) {
|
|
1579
|
-
state.bufferedEventChars += JSON.stringify(message).length;
|
|
1580
|
-
if (state.bufferedEventChars <= MAX_BUFFERED_TURN_EVENT_CHARS) return true;
|
|
1581
|
-
state.error = `codex app-server turn events exceeded ${MAX_BUFFERED_TURN_EVENT_CHARS} characters`;
|
|
1582
|
-
this.handleConnectionClose(state.connectionKey, state.connectionInstanceId, new Error(state.error));
|
|
1583
|
-
state.connection.close();
|
|
1584
|
-
return false;
|
|
1585
|
-
}
|
|
1586
|
-
buildServerRequestResponse(message, config) {
|
|
1587
|
-
const policy = config.server_request_policy ?? {};
|
|
1588
|
-
switch (message.method) {
|
|
1589
|
-
case "item/commandExecution/requestApproval": return { decision: policy.command_execution ?? "decline" };
|
|
1590
|
-
case "execCommandApproval": return this.buildLegacyApprovalResponse(policy.command_execution);
|
|
1591
|
-
case "item/fileChange/requestApproval": return { decision: policy.file_change ?? "decline" };
|
|
1592
|
-
case "applyPatchApproval": return this.buildLegacyApprovalResponse(policy.file_change);
|
|
1593
|
-
case "item/permissions/requestApproval": return {
|
|
1594
|
-
permissions: policy.permissions?.permissions ?? {},
|
|
1595
|
-
scope: policy.permissions?.scope ?? "turn",
|
|
1596
|
-
...policy.permissions?.strict_auto_review === void 0 ? {} : { strictAutoReview: policy.permissions.strict_auto_review }
|
|
1597
|
-
};
|
|
1598
|
-
case "item/tool/requestUserInput": return this.buildUserInputResponse(message.params, policy.user_input ?? "empty");
|
|
1599
|
-
case "mcpServer/elicitation/request": return this.buildMcpElicitationResponse(policy.mcp_elicitation);
|
|
1600
|
-
case "item/tool/call": return this.buildDynamicToolResponse(message.params, policy.dynamic_tools);
|
|
1601
|
-
case "account/chatgptAuthTokens/refresh": throw new Error("ChatGPT auth token refresh requests are not supported by promptfoo");
|
|
1602
|
-
default: throw new Error(`Unsupported codex app-server request: ${message.method ?? "unknown"}`);
|
|
1603
|
-
}
|
|
1604
|
-
}
|
|
1605
|
-
buildLegacyApprovalResponse(decision = "decline") {
|
|
1606
|
-
if (typeof decision !== "string") return { decision: "denied" };
|
|
1607
|
-
switch (decision) {
|
|
1608
|
-
case "accept": return { decision: "approved" };
|
|
1609
|
-
case "acceptForSession": return { decision: "approved_for_session" };
|
|
1610
|
-
case "cancel": return { decision: "abort" };
|
|
1611
|
-
case "decline": return { decision: "denied" };
|
|
1612
|
-
}
|
|
1613
|
-
}
|
|
1614
|
-
buildMcpElicitationResponse(policy = "decline") {
|
|
1615
|
-
if (typeof policy === "string") return {
|
|
1616
|
-
action: policy,
|
|
1617
|
-
content: null,
|
|
1618
|
-
_meta: null
|
|
1619
|
-
};
|
|
1620
|
-
return {
|
|
1621
|
-
action: policy.action,
|
|
1622
|
-
content: policy.content ?? null,
|
|
1623
|
-
_meta: policy._meta ?? null
|
|
1624
|
-
};
|
|
1625
|
-
}
|
|
1626
|
-
buildUserInputResponse(params, policy) {
|
|
1627
|
-
const answers = Object.create(null);
|
|
1628
|
-
const questions = Array.isArray(params?.questions) ? params.questions : [];
|
|
1629
|
-
for (const question of questions) {
|
|
1630
|
-
if (!question?.id || typeof question.id !== "string") continue;
|
|
1631
|
-
if (policy === "empty") {
|
|
1632
|
-
answers[question.id] = { answers: [] };
|
|
1633
|
-
continue;
|
|
1634
|
-
}
|
|
1635
|
-
if (policy === "first-option") {
|
|
1636
|
-
const firstLabel = Array.isArray(question.options) && typeof question.options[0]?.label === "string" ? question.options[0].label : "";
|
|
1637
|
-
answers[question.id] = { answers: firstLabel ? [firstLabel] : [] };
|
|
1638
|
-
continue;
|
|
1639
|
-
}
|
|
1640
|
-
const configuredAnswer = Object.prototype.hasOwnProperty.call(policy, question.id) ? policy[question.id] : void 0;
|
|
1641
|
-
answers[question.id] = { answers: Array.isArray(configuredAnswer) ? configuredAnswer : configuredAnswer ? [configuredAnswer] : [] };
|
|
1642
|
-
}
|
|
1643
|
-
return { answers };
|
|
1644
|
-
}
|
|
1645
|
-
buildDynamicToolResponse(params, tools) {
|
|
1646
|
-
const configured = typeof params?.tool === "string" && tools && Object.prototype.hasOwnProperty.call(tools, params.tool) ? tools[params.tool] : void 0;
|
|
1647
|
-
if (!configured) return {
|
|
1648
|
-
contentItems: [{
|
|
1649
|
-
type: "inputText",
|
|
1650
|
-
text: "No dynamic tool response configured."
|
|
1651
|
-
}],
|
|
1652
|
-
success: false
|
|
1653
|
-
};
|
|
1654
|
-
return {
|
|
1655
|
-
contentItems: configured.contentItems ?? [{
|
|
1656
|
-
type: "inputText",
|
|
1657
|
-
text: configured.text ?? ""
|
|
1658
|
-
}],
|
|
1659
|
-
success: configured.success ?? true
|
|
1660
|
-
};
|
|
1661
|
-
}
|
|
1662
|
-
async waitForTurnCompletion(connection, state, config, callOptions) {
|
|
1663
|
-
const interruptTurn = () => {
|
|
1664
|
-
if (!state.turnId) return;
|
|
1665
|
-
connection.request("turn/interrupt", {
|
|
1666
|
-
threadId: state.threadId,
|
|
1667
|
-
turnId: state.turnId
|
|
1668
|
-
}, { timeoutMs: 5e3 }).catch((error) => {
|
|
1669
|
-
logger.debug("[CodexAppServer] Error interrupting turn", { error });
|
|
1670
|
-
});
|
|
1671
|
-
};
|
|
1672
|
-
let timeout;
|
|
1673
|
-
let abortListener;
|
|
1674
|
-
const timeoutPromise = config.turn_timeout_ms ? new Promise((_, reject) => {
|
|
1675
|
-
timeout = setTimeout(() => {
|
|
1676
|
-
interruptTurn();
|
|
1677
|
-
reject(/* @__PURE__ */ new Error(`codex app-server turn timed out after ${config.turn_timeout_ms}ms`));
|
|
1678
|
-
}, config.turn_timeout_ms);
|
|
1679
|
-
}) : void 0;
|
|
1680
|
-
const abortPromise = callOptions?.abortSignal ? new Promise((_, reject) => {
|
|
1681
|
-
abortListener = () => {
|
|
1682
|
-
interruptTurn();
|
|
1683
|
-
reject(createAbortError("OpenAI Codex app-server call aborted"));
|
|
1684
|
-
};
|
|
1685
|
-
callOptions.abortSignal?.addEventListener("abort", abortListener, { once: true });
|
|
1686
|
-
}) : void 0;
|
|
1687
|
-
try {
|
|
1688
|
-
await Promise.race([
|
|
1689
|
-
state.completed.promise,
|
|
1690
|
-
timeoutPromise,
|
|
1691
|
-
abortPromise
|
|
1692
|
-
].filter((promise) => Boolean(promise)));
|
|
1693
|
-
} finally {
|
|
1694
|
-
clearTimeout(timeout);
|
|
1695
|
-
if (abortListener && callOptions?.abortSignal) callOptions.abortSignal.removeEventListener("abort", abortListener);
|
|
1696
|
-
}
|
|
1697
|
-
if (state.error) throw new Error(state.error);
|
|
1698
|
-
}
|
|
1699
|
-
async cleanupThreadAfterTurn(connection, threadHandle, config, options = {}) {
|
|
1700
|
-
if (threadHandle.persistent || config.thread_cleanup === "none") return;
|
|
1701
|
-
if (options.skipIfProtected && this.isThreadProtected(threadHandle.threadId)) return;
|
|
1702
|
-
if (options.skipIfActiveTurn && this.activeTurnsByThread.has(threadHandle.threadId)) return;
|
|
1703
|
-
if (config.thread_id && (this.protectedThreadCounts.get(threadHandle.threadId) ?? 0) > 1) return;
|
|
1704
|
-
if (config.thread_id && config.thread_cleanup === "archive") return;
|
|
1705
|
-
try {
|
|
1706
|
-
if (config.thread_cleanup === "archive") await connection.request("thread/archive", { threadId: threadHandle.threadId }, { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
1707
|
-
else await connection.request("thread/unsubscribe", { threadId: threadHandle.threadId }, { timeoutMs: this.getRequestTimeoutMs(config) });
|
|
1708
|
-
} catch (error) {
|
|
1709
|
-
logger.warn("[CodexAppServer] Error cleaning up thread after turn", {
|
|
1710
|
-
threadId: threadHandle.threadId,
|
|
1711
|
-
error
|
|
1712
|
-
});
|
|
1713
|
-
}
|
|
1714
|
-
}
|
|
1715
|
-
getThreadRunQueueKey(config, threadHandle) {
|
|
1716
|
-
if (config.thread_id) return `thread_id:${threadHandle.threadId}`;
|
|
1717
|
-
if (config.deep_tracing) return;
|
|
1718
|
-
if (threadHandle.persistent && threadHandle.cacheKey) return threadHandle.cacheKey;
|
|
1719
|
-
}
|
|
1720
|
-
async runSerializedThreadTurn(queueKey, abortSignal, executeTurn, cleanupGeneration) {
|
|
1721
|
-
if (cleanupGeneration !== this.cleanupGeneration) throw new Error("codex app-server provider cleanup interrupted queued turn");
|
|
1722
|
-
return this.threadRunQueues.run(queueKey, abortSignal, async () => {
|
|
1723
|
-
if (cleanupGeneration !== this.cleanupGeneration) throw new Error("codex app-server provider cleanup interrupted queued turn");
|
|
1724
|
-
return executeTurn();
|
|
1725
|
-
});
|
|
1726
|
-
}
|
|
1727
|
-
buildProviderResponse(state, threadHandle, config) {
|
|
1728
|
-
const output = this.getFinalOutput(state);
|
|
1729
|
-
const normalizedItems = state.items.map((item) => this.normalizeItemForMetadata(item));
|
|
1730
|
-
const rawItems = state.items.map((item) => this.normalizeItemForRaw(item));
|
|
1731
|
-
const rawTokenUsage = this.sanitizeForMetadata(state.rawTokenUsage);
|
|
1732
|
-
const raw = {
|
|
1733
|
-
finalResponse: output,
|
|
1734
|
-
output,
|
|
1735
|
-
thread: this.sanitizeForMetadata(threadHandle.response?.thread),
|
|
1736
|
-
turn: this.sanitizeForMetadata(state.turn),
|
|
1737
|
-
items: rawItems,
|
|
1738
|
-
usage: this.buildSdkUsage(state.rawTokenUsage),
|
|
1739
|
-
tokenUsage: rawTokenUsage,
|
|
1740
|
-
serverRequests: state.serverRequests,
|
|
1741
|
-
...config.include_raw_events ? { notifications: this.sanitizeForMetadata(state.notifications) } : {}
|
|
1742
|
-
};
|
|
1743
|
-
const metadata = this.buildResponseMetadata(state, threadHandle, config, normalizedItems);
|
|
1744
|
-
return {
|
|
1745
|
-
output,
|
|
1746
|
-
tokenUsage: state.tokenUsage,
|
|
1747
|
-
cost: this.calculateResponseCost(state.tokenUsage, config.model),
|
|
1748
|
-
metadata,
|
|
1749
|
-
raw: JSON.stringify(raw),
|
|
1750
|
-
sessionId: threadHandle.threadId
|
|
1751
|
-
};
|
|
1752
|
-
}
|
|
1753
|
-
getFinalOutput(state) {
|
|
1754
|
-
const completedAgentMessages = state.items.filter((item) => item?.type === "agentMessage" && typeof item.text === "string").map((item) => item.text);
|
|
1755
|
-
if (completedAgentMessages.length > 0) return completedAgentMessages[completedAgentMessages.length - 1];
|
|
1756
|
-
const deltaMessages = Array.from(state.agentMessageDeltasByItemId.values()).filter(Boolean);
|
|
1757
|
-
if (deltaMessages.length > 0) return deltaMessages[deltaMessages.length - 1];
|
|
1758
|
-
return state.agentMessageDeltas.join("");
|
|
1759
|
-
}
|
|
1760
|
-
buildResponseMetadata(state, threadHandle, config, normalizedItems) {
|
|
1761
|
-
const skillMetadata = this.buildSkillMetadata(state.items, this.getSkillRootPrefixes(config, state.appServerEnv));
|
|
1762
|
-
return {
|
|
1763
|
-
codexAppServer: {
|
|
1764
|
-
threadId: threadHandle.threadId,
|
|
1765
|
-
turnId: state.turnId,
|
|
1766
|
-
model: config.model,
|
|
1767
|
-
modelProvider: config.model_provider,
|
|
1768
|
-
cwd: config.working_dir,
|
|
1769
|
-
sandboxMode: config.sandbox_mode ?? "read-only",
|
|
1770
|
-
approvalPolicy: config.approval_policy ?? "never",
|
|
1771
|
-
itemCounts: this.getItemCounts(state.items),
|
|
1772
|
-
items: normalizedItems,
|
|
1773
|
-
serverRequests: state.serverRequests,
|
|
1774
|
-
notificationCount: state.notificationCount
|
|
1775
|
-
},
|
|
1776
|
-
...getCodexSkillMetadataFields(skillMetadata)
|
|
1777
|
-
};
|
|
1778
|
-
}
|
|
1779
|
-
normalizeItemForMetadata(item) {
|
|
1780
|
-
const base = {
|
|
1781
|
-
id: item?.id,
|
|
1782
|
-
type: item?.type,
|
|
1783
|
-
status: item?.status
|
|
1784
|
-
};
|
|
1785
|
-
switch (item?.type) {
|
|
1786
|
-
case "commandExecution": return this.sanitizeForMetadata({
|
|
1787
|
-
...base,
|
|
1788
|
-
command: item.command,
|
|
1789
|
-
cwd: item.cwd,
|
|
1790
|
-
exitCode: item.exitCode,
|
|
1791
|
-
durationMs: item.durationMs,
|
|
1792
|
-
aggregatedOutput: item.aggregatedOutput
|
|
1793
|
-
});
|
|
1794
|
-
case "fileChange": return this.sanitizeForMetadata({
|
|
1795
|
-
...base,
|
|
1796
|
-
changes: item.changes
|
|
1797
|
-
});
|
|
1798
|
-
case "mcpToolCall": return this.sanitizeForMetadata({
|
|
1799
|
-
...base,
|
|
1800
|
-
server: item.server,
|
|
1801
|
-
tool: item.tool,
|
|
1802
|
-
arguments: item.arguments,
|
|
1803
|
-
result: item.result,
|
|
1804
|
-
error: item.error,
|
|
1805
|
-
durationMs: item.durationMs
|
|
1806
|
-
});
|
|
1807
|
-
case "dynamicToolCall": return this.sanitizeForMetadata({
|
|
1808
|
-
...base,
|
|
1809
|
-
tool: item.tool,
|
|
1810
|
-
arguments: item.arguments,
|
|
1811
|
-
success: item.success,
|
|
1812
|
-
contentItems: item.contentItems,
|
|
1813
|
-
durationMs: item.durationMs
|
|
1814
|
-
});
|
|
1815
|
-
case "webSearch": return this.sanitizeForMetadata({
|
|
1816
|
-
...base,
|
|
1817
|
-
query: item.query,
|
|
1818
|
-
action: item.action
|
|
1819
|
-
});
|
|
1820
|
-
case "agentMessage": return this.sanitizeForMetadata({
|
|
1821
|
-
...base,
|
|
1822
|
-
text: item.text
|
|
1823
|
-
});
|
|
1824
|
-
case "reasoning": return this.sanitizeForMetadata({
|
|
1825
|
-
...base,
|
|
1826
|
-
summary: item.summary,
|
|
1827
|
-
content: item.content
|
|
1828
|
-
});
|
|
1829
|
-
default: return this.sanitizeForMetadata(base);
|
|
1830
|
-
}
|
|
1831
|
-
}
|
|
1832
|
-
normalizeItemForRaw(item) {
|
|
1833
|
-
const base = {
|
|
1834
|
-
id: item?.id,
|
|
1835
|
-
type: item?.type,
|
|
1836
|
-
status: item?.status
|
|
1837
|
-
};
|
|
1838
|
-
switch (item?.type) {
|
|
1839
|
-
case "commandExecution": return this.sanitizeForMetadata({
|
|
1840
|
-
...base,
|
|
1841
|
-
type: "command_execution",
|
|
1842
|
-
command: item.command,
|
|
1843
|
-
cwd: item.cwd,
|
|
1844
|
-
exit_code: item.exitCode,
|
|
1845
|
-
duration_ms: item.durationMs,
|
|
1846
|
-
aggregated_output: item.aggregatedOutput
|
|
1847
|
-
});
|
|
1848
|
-
case "fileChange": return this.sanitizeForMetadata({
|
|
1849
|
-
...base,
|
|
1850
|
-
type: "file_change",
|
|
1851
|
-
changes: item.changes
|
|
1852
|
-
});
|
|
1853
|
-
case "mcpToolCall": return this.sanitizeForMetadata({
|
|
1854
|
-
...base,
|
|
1855
|
-
type: "mcp_tool_call",
|
|
1856
|
-
server: item.server,
|
|
1857
|
-
tool: item.tool,
|
|
1858
|
-
arguments: item.arguments,
|
|
1859
|
-
result: item.result,
|
|
1860
|
-
error: item.error,
|
|
1861
|
-
duration_ms: item.durationMs
|
|
1862
|
-
});
|
|
1863
|
-
case "dynamicToolCall": return this.sanitizeForMetadata({
|
|
1864
|
-
...base,
|
|
1865
|
-
type: "dynamic_tool_call",
|
|
1866
|
-
tool: item.tool,
|
|
1867
|
-
arguments: item.arguments,
|
|
1868
|
-
success: item.success,
|
|
1869
|
-
content_items: item.contentItems,
|
|
1870
|
-
duration_ms: item.durationMs
|
|
1871
|
-
});
|
|
1872
|
-
case "webSearch": return this.sanitizeForMetadata({
|
|
1873
|
-
...base,
|
|
1874
|
-
type: "web_search",
|
|
1875
|
-
query: item.query,
|
|
1876
|
-
action: item.action
|
|
1877
|
-
});
|
|
1878
|
-
case "agentMessage": return this.sanitizeForMetadata({
|
|
1879
|
-
...base,
|
|
1880
|
-
type: "agent_message",
|
|
1881
|
-
text: item.text
|
|
1882
|
-
});
|
|
1883
|
-
case "reasoning": return this.sanitizeForMetadata({
|
|
1884
|
-
...base,
|
|
1885
|
-
type: "reasoning",
|
|
1886
|
-
text: this.extractReasoningText(item),
|
|
1887
|
-
summary: item.summary,
|
|
1888
|
-
content: item.content
|
|
1889
|
-
});
|
|
1890
|
-
case "todoList": return this.sanitizeForMetadata({
|
|
1891
|
-
...base,
|
|
1892
|
-
type: "todo_list",
|
|
1893
|
-
items: item.items
|
|
1894
|
-
});
|
|
1895
|
-
case "error": return this.sanitizeForMetadata({
|
|
1896
|
-
...base,
|
|
1897
|
-
type: "error",
|
|
1898
|
-
message: item.message
|
|
1899
|
-
});
|
|
1900
|
-
case "userMessage": return this.sanitizeForMetadata({
|
|
1901
|
-
...base,
|
|
1902
|
-
type: "user_message",
|
|
1903
|
-
content: item.content
|
|
1904
|
-
});
|
|
1905
|
-
default: return this.sanitizeForMetadata(base);
|
|
1906
|
-
}
|
|
1907
|
-
}
|
|
1908
|
-
extractReasoningText(item) {
|
|
1909
|
-
if (typeof item?.text === "string") return item.text;
|
|
1910
|
-
const blocks = [item?.summary, item?.content].find(Array.isArray);
|
|
1911
|
-
if (!blocks) return;
|
|
1912
|
-
const parts = blocks.flatMap((block) => {
|
|
1913
|
-
if (typeof block === "string") return [block];
|
|
1914
|
-
const text = block?.text;
|
|
1915
|
-
return typeof text === "string" && text.length > 0 ? [text] : [];
|
|
1916
|
-
});
|
|
1917
|
-
return parts.length > 0 ? parts.join("\n") : void 0;
|
|
1918
|
-
}
|
|
1919
|
-
resolveRawUsage(rawTokenUsage) {
|
|
1920
|
-
const usage = rawTokenUsage?.last ?? rawTokenUsage?.total ?? rawTokenUsage;
|
|
1921
|
-
if (!usage) return;
|
|
1922
|
-
const input = usage.inputTokens ?? usage.input_tokens;
|
|
1923
|
-
const output = usage.outputTokens ?? usage.output_tokens;
|
|
1924
|
-
if (typeof input !== "number" || typeof output !== "number") return;
|
|
1925
|
-
return {
|
|
1926
|
-
input,
|
|
1927
|
-
output,
|
|
1928
|
-
cached: usage.cachedInputTokens ?? usage.cached_input_tokens ?? 0,
|
|
1929
|
-
cacheWrite: typeof (usage.cacheWriteInputTokens ?? usage.cache_write_input_tokens) === "number" ? usage.cacheWriteInputTokens ?? usage.cache_write_input_tokens : void 0,
|
|
1930
|
-
reasoning: usage.reasoningOutputTokens ?? usage.reasoning_output_tokens ?? 0
|
|
1931
|
-
};
|
|
1932
|
-
}
|
|
1933
|
-
buildSdkUsage(rawTokenUsage) {
|
|
1934
|
-
const usage = this.resolveRawUsage(rawTokenUsage);
|
|
1935
|
-
if (!usage) return;
|
|
1936
|
-
return {
|
|
1937
|
-
input_tokens: usage.input,
|
|
1938
|
-
cached_input_tokens: usage.cached,
|
|
1939
|
-
cache_write_input_tokens: usage.cacheWrite ?? 0,
|
|
1940
|
-
output_tokens: usage.output,
|
|
1941
|
-
reasoning_output_tokens: usage.reasoning
|
|
1942
|
-
};
|
|
1943
|
-
}
|
|
1944
|
-
buildTokenUsage(rawTokenUsage) {
|
|
1945
|
-
const usage = this.resolveRawUsage(rawTokenUsage);
|
|
1946
|
-
if (!usage) return;
|
|
1947
|
-
return {
|
|
1948
|
-
prompt: usage.input,
|
|
1949
|
-
completion: usage.output,
|
|
1950
|
-
total: usage.input + usage.output,
|
|
1951
|
-
cached: usage.cached,
|
|
1952
|
-
...typeof usage.cacheWrite === "number" ? { completionDetails: { cacheCreationInputTokens: usage.cacheWrite } } : {}
|
|
1953
|
-
};
|
|
1954
|
-
}
|
|
1955
|
-
calculateResponseCost(tokenUsage, model) {
|
|
1956
|
-
return calculateOpenAIUsageCostFromTokenUsage(model, tokenUsage);
|
|
1957
|
-
}
|
|
1958
|
-
getItemCounts(items) {
|
|
1959
|
-
const counts = {};
|
|
1960
|
-
for (const item of items) {
|
|
1961
|
-
const type = typeof item?.type === "string" ? item.type : "unknown";
|
|
1962
|
-
counts[type] = (counts[type] ?? 0) + 1;
|
|
1963
|
-
}
|
|
1964
|
-
return counts;
|
|
1965
|
-
}
|
|
1966
|
-
validateWorkingDirectory(workingDir, skipGitCheck = false) {
|
|
1967
|
-
const cacheKey = `${workingDir}:${skipGitCheck}`;
|
|
1968
|
-
if (this.validatedWorkingDirs.has(cacheKey)) return;
|
|
1969
|
-
let stats;
|
|
1970
|
-
try {
|
|
1971
|
-
stats = fs.statSync(workingDir);
|
|
1972
|
-
} catch (err) {
|
|
1973
|
-
throw new Error(`Working directory ${workingDir} does not exist or isn't accessible: ${err.message}`);
|
|
1974
|
-
}
|
|
1975
|
-
if (!stats.isDirectory()) throw new Error(`Working directory ${workingDir} is not a directory`);
|
|
1976
|
-
if (!skipGitCheck && !this.isInsideGitRepository(workingDir)) throw new Error(dedent`Working directory ${workingDir} is not inside a Git repository.
|
|
1977
|
-
|
|
1978
|
-
Codex app-server requires a Git repository by default to prevent unrecoverable errors.
|
|
1979
|
-
|
|
1980
|
-
To bypass this check, set skip_git_repo_check: true in your provider config.`);
|
|
1981
|
-
this.validatedWorkingDirs.add(cacheKey);
|
|
1982
|
-
}
|
|
1983
|
-
isInsideGitRepository(workingDir) {
|
|
1984
|
-
return this.findGitRepositoryRoot(workingDir) !== void 0;
|
|
1985
|
-
}
|
|
1986
|
-
findGitRepositoryRoot(workingDir) {
|
|
1987
|
-
return findGitRepositoryRoot(workingDir);
|
|
1988
|
-
}
|
|
1989
|
-
warnOnceForDeepTracingThreadOptions(config) {
|
|
1990
|
-
if (!config.deep_tracing || this.deepTracingWarningShown || !config.persist_threads && (config.thread_pool_size ?? 0) <= 1) return;
|
|
1991
|
-
logger.warn("[CodexAppServer] deep_tracing requires a fresh app-server process per call. Persistent thread pooling options (persist_threads, thread_pool_size) are ignored when deep_tracing is enabled. Explicit thread_id values are still resumed and serialized.");
|
|
1992
|
-
this.deepTracingWarningShown = true;
|
|
1993
|
-
}
|
|
1994
|
-
startItemSpan(item, itemId, startTime, turnIndex) {
|
|
1995
|
-
return trace.getTracer("promptfoo.codex-app-server").startSpan(this.getSpanNameForItem(item), {
|
|
1996
|
-
kind: SpanKind.INTERNAL,
|
|
1997
|
-
...startTime === void 0 ? {} : { startTime },
|
|
1998
|
-
attributes: addActiveSpanRoleAttribute({
|
|
1999
|
-
"codex.app_server.item.id": itemId,
|
|
2000
|
-
"codex.app_server.item.type": item?.type ?? "unknown",
|
|
2001
|
-
...typeof turnIndex === "number" ? { "gen_ai.turn.index": turnIndex } : {},
|
|
2002
|
-
...this.getAttributesForItem(item)
|
|
2003
|
-
})
|
|
2004
|
-
});
|
|
2005
|
-
}
|
|
2006
|
-
startTurnSpan(state, eventTime, clearPreviousUsage = false) {
|
|
2007
|
-
if (clearPreviousUsage && state.turnCount > 0) {
|
|
2008
|
-
state.rawTokenUsage = void 0;
|
|
2009
|
-
state.tokenUsage = void 0;
|
|
2010
|
-
}
|
|
2011
|
-
openTurnSpan(state, {
|
|
2012
|
-
tracer: trace.getTracer("promptfoo.codex-app-server"),
|
|
2013
|
-
eventTime,
|
|
2014
|
-
system: "openai",
|
|
2015
|
-
logLabel: "CodexAppServer"
|
|
2016
|
-
});
|
|
2017
|
-
}
|
|
2018
|
-
endTurnSpan(state, eventTime, errorMessage) {
|
|
2019
|
-
const usage = this.resolveRawUsage(state.rawTokenUsage);
|
|
2020
|
-
const attributes = {};
|
|
2021
|
-
if (usage) {
|
|
2022
|
-
attributes["gen_ai.usage.input_tokens"] = usage.input;
|
|
2023
|
-
attributes["gen_ai.usage.output_tokens"] = usage.output;
|
|
2024
|
-
if (usage.cached) attributes[GenAIAttributes.USAGE_CACHE_READ_INPUT_TOKENS] = usage.cached;
|
|
2025
|
-
if (usage.cacheWrite) attributes[GenAIAttributes.USAGE_CACHE_CREATION_INPUT_TOKENS] = usage.cacheWrite;
|
|
2026
|
-
if (usage.reasoning) attributes[GenAIAttributes.USAGE_REASONING_OUTPUT_TOKENS] = usage.reasoning;
|
|
2027
|
-
}
|
|
2028
|
-
closeTurnSpan(state, {
|
|
2029
|
-
eventTime,
|
|
2030
|
-
attributes,
|
|
2031
|
-
errorMessage,
|
|
2032
|
-
logLabel: "CodexAppServer"
|
|
2033
|
-
});
|
|
2034
|
-
}
|
|
2035
|
-
applyItemCompletionAttributes(span, item, eventTime, startTime) {
|
|
2036
|
-
for (const [key, value] of Object.entries(this.getCompletionAttributesForItem(item))) span.setAttribute(key, value);
|
|
2037
|
-
span.setAttribute("codex.app_server.duration_ms", eventTime - startTime);
|
|
2038
|
-
if (this.isItemError(item)) span.setStatus({
|
|
2039
|
-
code: SpanStatusCode.ERROR,
|
|
2040
|
-
message: this.getItemErrorMessage(item)
|
|
2041
|
-
});
|
|
2042
|
-
else span.setStatus({ code: SpanStatusCode.OK });
|
|
2043
|
-
}
|
|
2044
|
-
endUnclosedItemSpans(state) {
|
|
2045
|
-
for (const [itemId, span] of state.activeSpans) {
|
|
2046
|
-
logger.warn("[CodexAppServer] Item span not properly closed", { itemId });
|
|
2047
|
-
span.setStatus({
|
|
2048
|
-
code: SpanStatusCode.ERROR,
|
|
2049
|
-
message: "Span not properly closed"
|
|
2050
|
-
});
|
|
2051
|
-
span.end();
|
|
2052
|
-
}
|
|
2053
|
-
state.activeSpans.clear();
|
|
2054
|
-
state.itemStartTimes.clear();
|
|
2055
|
-
if (state.activeTurnSpan) {
|
|
2056
|
-
logger.warn("[CodexAppServer] Turn span not properly closed");
|
|
2057
|
-
closeTurnSpan(state, {
|
|
2058
|
-
errorMessage: "Turn span not properly closed",
|
|
2059
|
-
logLabel: "CodexAppServer"
|
|
2060
|
-
});
|
|
2061
|
-
}
|
|
2062
|
-
}
|
|
2063
|
-
getSpanNameForItem(item) {
|
|
2064
|
-
switch (item?.type) {
|
|
2065
|
-
case "commandExecution": return `exec ${typeof item.command === "string" ? item.command.split(" ")[0] || "command" : "command"}`;
|
|
2066
|
-
case "fileChange": return "file change";
|
|
2067
|
-
case "mcpToolCall": return `mcp ${item.server ?? "unknown"}/${item.tool ?? "unknown"}`;
|
|
2068
|
-
case "dynamicToolCall": return `tool ${item.tool ?? "unknown"}`;
|
|
2069
|
-
case "agentMessage": return "agent response";
|
|
2070
|
-
case "reasoning": return "reasoning";
|
|
2071
|
-
case "webSearch": return "web search";
|
|
2072
|
-
default: return `codex.app_server.${item?.type ?? "unknown"}`;
|
|
2073
|
-
}
|
|
2074
|
-
}
|
|
2075
|
-
getAttributesForItem(item) {
|
|
2076
|
-
const attrs = {};
|
|
2077
|
-
if (item?.type === "commandExecution" && typeof item.command === "string") attrs["codex.command"] = this.sanitizeTraceText(item.command, "Codex app-server command trace attribute") ?? "";
|
|
2078
|
-
if (item?.type === "mcpToolCall") {
|
|
2079
|
-
if (typeof item.server === "string") attrs["codex.mcp.server"] = item.server;
|
|
2080
|
-
if (typeof item.tool === "string") {
|
|
2081
|
-
attrs["gen_ai.operation.name"] = "execute_tool";
|
|
2082
|
-
attrs["gen_ai.tool.name"] = item.tool;
|
|
2083
|
-
attrs["codex.mcp.tool"] = item.tool;
|
|
2084
|
-
}
|
|
2085
|
-
}
|
|
2086
|
-
if (item?.type === "dynamicToolCall" && typeof item.tool === "string") {
|
|
2087
|
-
attrs["gen_ai.operation.name"] = "execute_tool";
|
|
2088
|
-
attrs["gen_ai.tool.name"] = item.tool;
|
|
2089
|
-
attrs["codex.tool.name"] = item.tool;
|
|
2090
|
-
}
|
|
2091
|
-
if (item?.type === "webSearch" && typeof item.query === "string") attrs["codex.search.query"] = this.sanitizeTraceText(item.query, "Codex app-server web search trace attribute") ?? "";
|
|
2092
|
-
return attrs;
|
|
2093
|
-
}
|
|
2094
|
-
getCompletionAttributesForItem(item) {
|
|
2095
|
-
const attrs = {};
|
|
2096
|
-
if (typeof item?.status === "string") attrs["codex.status"] = item.status;
|
|
2097
|
-
if (item?.type === "commandExecution") {
|
|
2098
|
-
if (typeof item.exitCode === "number") attrs["codex.exit_code"] = item.exitCode;
|
|
2099
|
-
if (typeof item.aggregatedOutput === "string") attrs["codex.output"] = this.sanitizeTraceText(item.aggregatedOutput, "Codex app-server command output trace attribute") ?? "";
|
|
2100
|
-
}
|
|
2101
|
-
if (item?.type === "agentMessage" && typeof item.text === "string") attrs["codex.message"] = this.sanitizeTraceText(item.text, "Codex app-server message trace attribute") ?? "";
|
|
2102
|
-
return attrs;
|
|
2103
|
-
}
|
|
2104
|
-
isItemError(item) {
|
|
2105
|
-
return item?.status === "failed" || item?.status === "declined" || item?.error !== void 0 || item?.type === "commandExecution" && typeof item.exitCode === "number" && item.exitCode !== 0;
|
|
2106
|
-
}
|
|
2107
|
-
getItemErrorMessage(item) {
|
|
2108
|
-
return (typeof item?.error?.message === "string" ? item.error.message : null) || (item?.type === "commandExecution" && item.exitCode !== 0 ? `Command exited with code ${item.exitCode}` : null) || "Item failed";
|
|
2109
|
-
}
|
|
2110
|
-
getSkillRootPrefixes(config, appServerEnv) {
|
|
2111
|
-
const resolvedWorkingDir = config.working_dir ? path.resolve(config.working_dir).replace(/\\/g, "/") : void 0;
|
|
2112
|
-
return getCodexSkillRootPrefixes({
|
|
2113
|
-
codexHome: appServerEnv.CODEX_HOME,
|
|
2114
|
-
gitRepositoryRoot: resolvedWorkingDir ? this.findGitRepositoryRoot(resolvedWorkingDir) : void 0,
|
|
2115
|
-
homeDir: appServerEnv.HOME || appServerEnv.USERPROFILE,
|
|
2116
|
-
workingDir: resolvedWorkingDir
|
|
2117
|
-
});
|
|
2118
|
-
}
|
|
2119
|
-
buildSkillMetadata(items, skillRootPrefixes) {
|
|
2120
|
-
return buildCodexSkillMetadata(items, skillRootPrefixes, {
|
|
2121
|
-
getCommand: (item) => item?.type === "commandExecution" && typeof item.command === "string" && item.command.trim() ? item.command : void 0,
|
|
2122
|
-
isSuccessfulCommand: (item) => this.isSuccessfulCommandExecution(item)
|
|
2123
|
-
});
|
|
2124
|
-
}
|
|
2125
|
-
isSuccessfulCommandExecution(item) {
|
|
2126
|
-
if (item?.type !== "commandExecution") return false;
|
|
2127
|
-
if (typeof item.status === "string" && item.status !== "completed") return false;
|
|
2128
|
-
if (typeof item.exitCode === "number" && item.exitCode !== 0) return false;
|
|
2129
|
-
return true;
|
|
2130
|
-
}
|
|
2131
|
-
sanitizeTraceText(value, context) {
|
|
2132
|
-
const sanitized = this.redactTracePii(sanitizeObject(value, { context }));
|
|
2133
|
-
if (typeof sanitized === "string") return sanitized;
|
|
2134
|
-
if (sanitized === void 0 || sanitized === null) return;
|
|
2135
|
-
try {
|
|
2136
|
-
return JSON.stringify(sanitized);
|
|
2137
|
-
} catch (error) {
|
|
2138
|
-
logger.debug("[CodexAppServer] Failed to stringify sanitized trace text", { error });
|
|
2139
|
-
return;
|
|
2140
|
-
}
|
|
2141
|
-
}
|
|
2142
|
-
sanitizeForMetadata(value) {
|
|
2143
|
-
return this.redactTracePii(sanitizeObject(value, { context: "Codex app-server metadata" }));
|
|
2144
|
-
}
|
|
2145
|
-
redactTracePii(value) {
|
|
2146
|
-
if (typeof value === "string") return redactAppServerText(value);
|
|
2147
|
-
if (Array.isArray(value)) return value.map((item) => this.redactTracePii(item));
|
|
2148
|
-
if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [key, normalizeFieldName(key).includes("email") ? REDACTED : this.redactTracePii(entryValue)]));
|
|
2149
|
-
return value;
|
|
2150
|
-
}
|
|
2151
|
-
};
|
|
2152
|
-
//#endregion
|
|
2153
|
-
export { CodexAppServerConfigSchema, OpenAICodexAppServerProvider };
|
|
2154
|
-
|
|
2155
|
-
//# sourceMappingURL=codex-app-server-Dd0A37nO.js.map
|