promptfoo 0.121.3 → 0.121.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/README.md +1 -1
  2. package/dist/src/{ListApp-Du7YVwj5.js → ListApp-BRUsT43Y.js} +1 -1
  3. package/dist/src/{accounts-BPyfpSeU.cjs → accounts-BIFntVWB.cjs} +5 -5
  4. package/dist/src/{accounts-CFLK3mnD.js → accounts-CLJHCDDb.js} +6 -6
  5. package/dist/src/{accounts-B2XmGjty.js → accounts-CaLNYnf7.js} +5 -5
  6. package/dist/src/{accounts-Xatc0RYb.js → accounts-bnyHT7Ju.js} +5 -5
  7. package/dist/src/{agentic-utils-36epdqwB.js → agentic-utils-B5krlibj.js} +3 -3
  8. package/dist/src/{agentic-utils-DIYAAYE7.js → agentic-utils-Ba67xmgs.js} +3 -3
  9. package/dist/src/{agentic-utils-D8yXo5Lm.js → agentic-utils-BclbiXiq.js} +4 -4
  10. package/dist/src/{agentic-utils-DAVsChuB.cjs → agentic-utils-D2x0wGhB.cjs} +3 -3
  11. package/dist/src/{agents-CLQ-P15P.js → agents-BGqaTDnr.js} +5 -7
  12. package/dist/src/{agents-wg3ohknq.js → agents-BV9yFpXX.js} +6 -7
  13. package/dist/src/{agents-CgBniSlI.js → agents-BYdMl1UE.js} +5 -9
  14. package/dist/src/{agents-Bqgfdokm.js → agents-DhxWMCtH.js} +35 -14
  15. package/dist/src/{agents-BBWxKSM0.cjs → agents-DiWmQYH9.cjs} +5 -7
  16. package/dist/src/{agents-CAYbM7qD.cjs → agents-WULPVjbH.cjs} +34 -12
  17. package/dist/src/{agents-DSSTV4bv.js → agents-emVcx3yh.js} +35 -13
  18. package/dist/src/{agents-BBVJCIYr.js → agents-n6vPqV3i.js} +35 -13
  19. package/dist/src/{aimlapi-BwGC1TtS.js → aimlapi-BxqK9HF_.js} +8 -14
  20. package/dist/src/{aimlapi-Bv8Fmc-b.cjs → aimlapi-BzLjZI_m.cjs} +8 -15
  21. package/dist/src/{aimlapi-MgSLdvy7.js → aimlapi-DR4pgeiC.js} +7 -14
  22. package/dist/src/{aimlapi-DaC3qZ-o.js → aimlapi-uPGp0Zdo.js} +7 -16
  23. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -0
  24. package/dist/src/app/assets/Report-vjzrbgce.js +1 -0
  25. package/dist/src/app/assets/index-B3NQ8HTd.js +385 -0
  26. package/dist/src/app/assets/index-Cli2yAXv.css +1 -0
  27. package/dist/src/app/assets/rolldown-runtime-COnpUsM8.js +1 -0
  28. package/dist/src/app/assets/scroll-timeline-D9IT_e8Z.js +1 -0
  29. package/dist/src/app/assets/sync-IjzpWrOE.js +4 -0
  30. package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +36 -0
  31. package/dist/src/app/assets/vendor-markdown-Ch00wnNI.js +29 -0
  32. package/dist/src/app/assets/vendor-react-CVvmk1UB.js +9 -0
  33. package/dist/src/app/assets/vendor-utils-BnEYbx2Q.js +37 -0
  34. package/dist/src/app/index.html +32 -7
  35. package/dist/src/{audio-Bn44pQxv.js → audio-BvpTOArF.js} +4 -4
  36. package/dist/src/{audio-DVFjQ67_.cjs → audio-C0vDeS0j.cjs} +4 -4
  37. package/dist/src/{audio-DjU9GswO.js → audio-CScmnmEB.js} +4 -5
  38. package/dist/src/{audio-DDA5WHdx.js → audio-Da8U9IS5.js} +4 -4
  39. package/dist/src/{base-CKjwebIH.js → base-BOMaNEes.js} +3 -3
  40. package/dist/src/{base-CqzQ4K8j.js → base-BTux96b1.js} +3 -3
  41. package/dist/src/{base-BboXIF_0.cjs → base-Tw6uhH8K.cjs} +3 -3
  42. package/dist/src/{base-Cz2ZC_iA.js → base-dYsl2hmL.js} +3 -3
  43. package/dist/src/{blobs-C6j0bvFz.cjs → blobs-B95F_7vE.cjs} +3 -3
  44. package/dist/src/{blobs-DXTl6J3H.js → blobs-BW4U31ue.js} +3 -3
  45. package/dist/src/{blobs-BUWmKWzo.js → blobs-D_gg8nbm.js} +4 -4
  46. package/dist/src/{blobs-B1JriOyi.js → blobs-DjLby-uP.js} +4 -4
  47. package/dist/src/cache-BI5BY7ey.js +280 -0
  48. package/dist/src/cache-BRkhlH3k.cjs +3 -0
  49. package/dist/src/cache-BlC6aeJ0.js +3 -0
  50. package/dist/src/cache-Bzttsk0X.js +310 -0
  51. package/dist/src/cache-Cr-qWIbP.js +310 -0
  52. package/dist/src/cache-DGg-yTZG.cjs +376 -0
  53. package/dist/src/{chat-BEwdgGEg.js → chat-BLOdH60v.js} +63 -37
  54. package/dist/src/{chat-B0iaWhoh.js → chat-Cx_LkwvZ.js} +63 -37
  55. package/dist/src/{chat-DK1U-eZ-.js → chat-D9nudO9b.js} +5 -14
  56. package/dist/src/{chat-pxmiVpWe.js → chat-DChSH_Es.js} +63 -37
  57. package/dist/src/{chat-B-52XYI1.js → chat-DG2LkwLq.js} +3 -13
  58. package/dist/src/{chat-BtIKkLKx.cjs → chat-DH97tVV9.cjs} +3 -13
  59. package/dist/src/{chat-BE0qTA8e.js → chat-aMQZw6R7.js} +4 -16
  60. package/dist/src/{chat-CM8qWR3_.cjs → chat-vYqqv1gP.cjs} +64 -38
  61. package/dist/src/{chatkit-_8eJqKcD.js → chatkit-B8X34dQc.js} +4 -4
  62. package/dist/src/{chatkit-BYGQlHlV.js → chatkit-BXu42Qwt.js} +4 -4
  63. package/dist/src/{chatkit-a2D6mY6s.js → chatkit-CbMRoeYw.js} +4 -4
  64. package/dist/src/{chatkit-Cx174XI3.cjs → chatkit-D44VyUyB.cjs} +4 -4
  65. package/dist/src/{claude-agent-sdk-8ddRp1L2.cjs → claude-agent-sdk-BRq0bbIK.cjs} +23 -18
  66. package/dist/src/{claude-agent-sdk-CMjh4LFH.js → claude-agent-sdk-BjriSVRZ.js} +20 -15
  67. package/dist/src/{claude-agent-sdk-HgbFioFw.js → claude-agent-sdk-BzNZeZ0N.js} +20 -15
  68. package/dist/src/{claude-agent-sdk-Bq5EArsX.js → claude-agent-sdk-DYv_AJ8u.js} +21 -17
  69. package/dist/src/cloud-CoD5OacT.js +3 -0
  70. package/dist/src/{cloud-z8KZpUoa.js → cloud-Da0bofJd.js} +25 -13
  71. package/dist/src/{cloudflare-ai-Bbp26N0L.js → cloudflare-ai-CXC4b1EU.js} +5 -14
  72. package/dist/src/{cloudflare-ai-BGyXlpXJ.js → cloudflare-ai-CyBoIs1Q.js} +7 -15
  73. package/dist/src/{cloudflare-ai-DdKP9TKT.js → cloudflare-ai-DGOwgexC.js} +6 -17
  74. package/dist/src/{cloudflare-ai-C62x6MQG.cjs → cloudflare-ai-DJv5qnyb.cjs} +6 -15
  75. package/dist/src/{cloudflare-gateway-DXhtXDRb.js → cloudflare-gateway-1sAoOyft.js} +6 -16
  76. package/dist/src/{cloudflare-gateway-D-e9i1Sn.js → cloudflare-gateway-D-dnkzCF.js} +5 -18
  77. package/dist/src/{cloudflare-gateway-Dx36ftqF.cjs → cloudflare-gateway-DKVjkDav.cjs} +4 -15
  78. package/dist/src/{cloudflare-gateway-BwAaUgeW.js → cloudflare-gateway-TJkVrZlB.js} +4 -15
  79. package/dist/src/codex-app-server-CCLjqCh9.js +1915 -0
  80. package/dist/src/codex-app-server-CCe0TiDc.js +1915 -0
  81. package/dist/src/codex-app-server-CPW1LFwh.js +1916 -0
  82. package/dist/src/codex-app-server-VMRnjZ68.cjs +1920 -0
  83. package/dist/src/codex-sdk-1jm_qPHf.js +3 -0
  84. package/dist/src/codex-sdk-Bd8UbO9q.cjs +1172 -0
  85. package/dist/src/codex-sdk-BgEFQ70r.js +1164 -0
  86. package/dist/src/codex-sdk-Bzb_TqX9.js +1165 -0
  87. package/dist/src/codex-sdk-Danroptg.cjs +2 -0
  88. package/dist/src/codex-sdk-DfvDTN33.js +1165 -0
  89. package/dist/src/{cometapi-BDyV-NNm.js → cometapi-B5ImDlSm.js} +9 -15
  90. package/dist/src/{cometapi-C3hOlM7-.cjs → cometapi-BgAkuYCw.cjs} +9 -16
  91. package/dist/src/{cometapi-hhL4TAh3.js → cometapi-CC7hWxmX.js} +8 -15
  92. package/dist/src/{cometapi-sp7sJpBD.js → cometapi-CCbpHkuF.js} +8 -17
  93. package/dist/src/{completion-DoYy49ti.js → completion-2iuYVxwi.js} +8 -57
  94. package/dist/src/{completion-BCimtq-h.js → completion-CrD6MQ93.js} +8 -57
  95. package/dist/src/{completion-DlXUhj5c.cjs → completion-DtQ72Bm3.cjs} +7 -62
  96. package/dist/src/{completion-DCjv7RZ3.js → completion-Vq_ad618.js} +8 -57
  97. package/dist/src/{createHash-CTQmL3G2.js → createHash-4gFQpDDv.js} +3 -3
  98. package/dist/src/{createHash-Da8fMwqB.js → createHash-DPpsZgFF.js} +3 -3
  99. package/dist/src/{createHash-DmPQkvBh.js → createHash-Un4Q_huE.js} +3 -3
  100. package/dist/src/{createHash-BYwImsYv.cjs → createHash-VvBIc-AW.cjs} +4 -4
  101. package/dist/src/{docker-CxCkwMzc.js → docker--3qzPa-6.js} +6 -14
  102. package/dist/src/{docker-Cqj2-QVi.cjs → docker-D3AY-5F5.cjs} +7 -15
  103. package/dist/src/{docker-FeBni2dw.js → docker-DCsCDvwM.js} +7 -14
  104. package/dist/src/{docker-DpguQj-w.js → docker-Dorv4_Dg.js} +6 -16
  105. package/dist/src/embedding-BXhN5lCH.cjs +63 -0
  106. package/dist/src/embedding-ChS1ivFS.js +58 -0
  107. package/dist/src/embedding-DNRvZwRN.js +59 -0
  108. package/dist/src/embedding-D_bI4NDq.js +58 -0
  109. package/dist/src/entrypoint.js +69 -6
  110. package/dist/src/{errors-P6ll7XSJ.js → errors-DFHe4L-n.js} +1 -1
  111. package/dist/src/{esm-SUNIX1x3.js → esm-B6whoAcf.js} +15 -6
  112. package/dist/src/{esm-CKWP3u_P.js → esm-BRkfNsYs.js} +16 -7
  113. package/dist/src/{esm-7UIl0pPM.js → esm-BX8fwlAO.js} +27 -18
  114. package/dist/src/{esm-CipptfDu.cjs → esm-B_rGuPTo.cjs} +15 -6
  115. package/dist/src/eval-BQPLBJbw.js +3 -0
  116. package/dist/src/{eval-BTqTn7lb.js → eval-DJ_4A-tr.js} +50 -21
  117. package/dist/src/evalResult-BBJAHAtw.cjs +2 -0
  118. package/dist/src/evalResult-BBK58h2B.js +3 -0
  119. package/dist/src/{evalResult-DpARzUCb.cjs → evalResult-Cx-8OWkb.cjs} +29 -11
  120. package/dist/src/{evalResult-DUDShQrm.js → evalResult-D6P5I5il.js} +29 -11
  121. package/dist/src/{evalResult-BkIhRdTe.js → evalResult-pSvGWFMo.js} +29 -11
  122. package/dist/src/evalResult-spPqh1G_.js +2 -0
  123. package/dist/src/{evaluator-BcvOGaam.js → evaluator-D-UIbbYq.js} +3975 -2152
  124. package/dist/src/evaluator-DgLKaZk8.js +3 -0
  125. package/dist/src/{extractor-D_wd8jxt.js → extractor-BM3jRERL.js} +6 -6
  126. package/dist/src/{extractor-DG3sSfXE.cjs → extractor-Dxr2J_wK.cjs} +6 -6
  127. package/dist/src/{extractor-CAZ2G3Kh.js → extractor-DxyiFhPk.js} +6 -6
  128. package/dist/src/{extractor-C8XwivI9.js → extractor-YlZbUMsL.js} +6 -6
  129. package/dist/src/fetch-8viavNv8.js +3 -0
  130. package/dist/src/{fetch-DoVRJZhJ.js → fetch-B6ch2nU2.js} +199 -60
  131. package/dist/src/{fetch-CVAtKnI3.js → fetch-D9xxyC1p.js} +404 -252
  132. package/dist/src/{fetch-BnR9wSnm.cjs → fetch-NuqXW1Xb.cjs} +415 -263
  133. package/dist/src/{fetch-BiYv2BZc.js → fetch-Y5qX_kST.js} +222 -70
  134. package/dist/src/{fileExtensions-LcDYkU4v.js → fileExtensions-8CjoL7vB.js} +1 -1
  135. package/dist/src/{fileExtensions-DnqA1y9x.js → fileExtensions-BGh-W-HT.js} +1 -1
  136. package/dist/src/{fileExtensions-bYh77CN8.cjs → fileExtensions-D9h-8Wxg.cjs} +1 -1
  137. package/dist/src/{fileExtensions-Ds-foDzt.js → fileExtensions-DysCsxNG.js} +1 -1
  138. package/dist/src/{formatDuration-DgBVMN65.js → formatDuration-Ch4A7G3o.js} +1 -1
  139. package/dist/src/{genaiTracer-BfxrvSUb.cjs → genaiTracer-BokHC-MW.cjs} +7 -3
  140. package/dist/src/{genaiTracer-C1rxGO8Q.js → genaiTracer-C3ZPQU60.js} +6 -2
  141. package/dist/src/{genaiTracer-70Z8BIuV.js → genaiTracer-CFny3gOy.js} +6 -2
  142. package/dist/src/{genaiTracer-D3fD9dNV.js → genaiTracer-DxODqT9e.js} +6 -2
  143. package/dist/src/golang/wrapper.go +1 -1
  144. package/dist/src/{graders-DG7mhg-b.js → graders-BoUqsCEm.js} +7402 -5699
  145. package/dist/src/{graders-BElhu9ZY.cjs → graders-Bw1wk_21.cjs} +5220 -3437
  146. package/dist/src/graders-C84JI-m5.js +2 -0
  147. package/dist/src/graders-CBbd0K0Q.cjs +2 -0
  148. package/dist/src/graders-CbQqpHSN.js +3 -0
  149. package/dist/src/{graders-RjHF8VfG.js → graders-CgPn32yp.js} +7400 -5697
  150. package/dist/src/{graders-BXAJ0sbS.js → graders-CwrbifOo.js} +6136 -4433
  151. package/dist/src/graders-DS42d3ZG.js +2 -0
  152. package/dist/src/{image-6WQXK8m8.js → image-BeWaInPF.js} +4 -4
  153. package/dist/src/{image-PoF6DN3x.js → image-BmilRNqO.js} +8 -8
  154. package/dist/src/{image--F58eEIn.cjs → image-CxJoa3aW.cjs} +8 -8
  155. package/dist/src/{image-fza3zuKs.cjs → image-D10dNAav.cjs} +4 -4
  156. package/dist/src/{image-DO0RYnjH.js → image-Dr_3I3nK.js} +4 -5
  157. package/dist/src/{image-B8b6f36E.js → image-DsGRlkh7.js} +8 -8
  158. package/dist/src/{image-CoxZp9PZ.js → image-a_SGUobh.js} +8 -8
  159. package/dist/src/{image-xNbw5ph2.js → image-qjO6FWPs.js} +4 -4
  160. package/dist/src/index.cjs +4835 -2582
  161. package/dist/src/index.d.cts +2782 -31
  162. package/dist/src/index.d.ts +2783 -32
  163. package/dist/src/index.js +4817 -2564
  164. package/dist/src/{interactiveCheck-BnMYOjMu.js → interactiveCheck-CCICw2cy.js} +2 -2
  165. package/dist/src/{invariant-BtWWVVhl.js → invariant-B2Rf6avk.js} +1 -1
  166. package/dist/src/{invariant-vgHWClmd.js → invariant-DIYf9sP1.js} +1 -1
  167. package/dist/src/{knowledgeBase-Bi7CmDbx.js → knowledgeBase-BBETc5-S.js} +6 -8
  168. package/dist/src/{knowledgeBase-DqrLX8fy.cjs → knowledgeBase-C8qOo26M.cjs} +6 -8
  169. package/dist/src/{knowledgeBase-DFRXPZl_.js → knowledgeBase-CzAi2rUI.js} +7 -8
  170. package/dist/src/{knowledgeBase-Ce3ofVan.js → knowledgeBase-Dr3Kib7F.js} +6 -10
  171. package/dist/src/{litellm-CKiAxnoM.js → litellm-BLSiANhk.js} +6 -14
  172. package/dist/src/{litellm-CnHI69aj.cjs → litellm-CaUmV7Mk.cjs} +6 -15
  173. package/dist/src/{litellm-Tc294Jhj.js → litellm-DQGo_juI.js} +5 -14
  174. package/dist/src/{litellm-Bo2gQXpo.js → litellm-DRc4qWfc.js} +5 -16
  175. package/dist/src/{logger-BcJBzSSA.js → logger-BbY6ypFL.js} +41 -12
  176. package/dist/src/{logger-D5iKBpu_.cjs → logger-COuQb2xB.cjs} +51 -10
  177. package/dist/src/{logger-DO8_zM18.js → logger-Ct2S6Yx-.js} +40 -11
  178. package/dist/src/{logger-BnkjG2jt.js → logger-KD8JjCRJ.js} +41 -12
  179. package/dist/src/{luma-ray-C9q8rdQe.js → luma-ray-B-tNZzqW.js} +6 -10
  180. package/dist/src/{luma-ray-DP0QA9qn.js → luma-ray-CtS3OlGq.js} +6 -10
  181. package/dist/src/{luma-ray-0ehMPt5N.js → luma-ray-PJJgUjOc.js} +6 -11
  182. package/dist/src/{luma-ray-m9Ku2meV.cjs → luma-ray-if-Ml4R9.cjs} +6 -10
  183. package/dist/src/main.d.ts +1 -26
  184. package/dist/src/main.js +1188 -679
  185. package/dist/src/messages-B9dSjrNf.js +544 -0
  186. package/dist/src/messages-BnsVHUnm.cjs +558 -0
  187. package/dist/src/messages-CI69Lasb.js +543 -0
  188. package/dist/src/messages-CewuNcNS.js +543 -0
  189. package/dist/src/{meteor-DLZZ3osF.cjs → meteor-BBGcGeCa.cjs} +1 -1
  190. package/dist/src/{meteor-DUiCJRC-.js → meteor-BKTM-7KS.js} +1 -1
  191. package/dist/src/{meteor-44VjEACX.js → meteor-CeGo0Lu2.js} +2 -2
  192. package/dist/src/{meteor-D-SotUw9.js → meteor-Wc_aUVvu.js} +2 -2
  193. package/dist/src/{modelslab-B5J-ZM5c.js → modelslab-BCLOtfek.js} +8 -10
  194. package/dist/src/{modelslab-IQbNg-r7.cjs → modelslab-BkapYJhh.cjs} +7 -10
  195. package/dist/src/{modelslab-BTOT8FUO.js → modelslab-D73OnKSx.js} +7 -10
  196. package/dist/src/{modelslab-BI458moT.js → modelslab-zpz9JcK0.js} +7 -12
  197. package/dist/src/{nova-reel-BZ9y-Y5s.js → nova-reel-B8F_TK5w.js} +7 -10
  198. package/dist/src/{nova-reel-Xw1SXLpg.js → nova-reel-Bx0NFV2f.js} +6 -10
  199. package/dist/src/{nova-reel-DEeQlnOJ.js → nova-reel-CNGJTLtG.js} +6 -12
  200. package/dist/src/{nova-reel-CE5etkv9.cjs → nova-reel-DkT7tnoB.cjs} +6 -10
  201. package/dist/src/{nova-sonic-Ogqf-csn.js → nova-sonic-BaXRN1cr.js} +5 -7
  202. package/dist/src/{nova-sonic-DXTLpi-r.js → nova-sonic-BeTRaFOh.js} +4 -7
  203. package/dist/src/{nova-sonic-DWswpN1E.js → nova-sonic-CL7Zqv0G.js} +4 -9
  204. package/dist/src/{nova-sonic-N0yCm0vb.cjs → nova-sonic-YT426juD.cjs} +4 -7
  205. package/dist/src/{openai-BcB5KlTk.js → openai-BMHD2Huo.js} +6 -3
  206. package/dist/src/{openai-BMcwgD5C.js → openai-BT-JvDse.js} +6 -3
  207. package/dist/src/{openai-CoxGAQwn.cjs → openai-Cy1XLs0c.cjs} +6 -3
  208. package/dist/src/{openai-D6wITiVn.js → openai-D4fxGvRx.js} +6 -3
  209. package/dist/src/openclaw-Bq7RVR3k.js +1200 -0
  210. package/dist/src/openclaw-DA8U4DsD.js +1201 -0
  211. package/dist/src/openclaw-DObVgpjC.js +1200 -0
  212. package/dist/src/openclaw-DUBZP3GL.cjs +1206 -0
  213. package/dist/src/{opencode-sdk-CHCs7dEb.js → opencode-sdk-BB40Wir1.js} +6 -8
  214. package/dist/src/{opencode-sdk-DDxj4QqH.js → opencode-sdk-BM1UAIv1.js} +6 -8
  215. package/dist/src/{opencode-sdk-WWJhnbKr.cjs → opencode-sdk-CeqiOcOU.cjs} +7 -9
  216. package/dist/src/{opencode-sdk-C71Z0ehR.js → opencode-sdk-ChdK7F7z.js} +6 -9
  217. package/dist/src/{otlpReceiver-CZL48YfC.js → otlpReceiver-C6thJRXi.js} +154 -98
  218. package/dist/src/{otlpReceiver-C9KlUtxh.js → otlpReceiver-CcdIikOu.js} +154 -98
  219. package/dist/src/{otlpReceiver-DHKqJlsz.cjs → otlpReceiver-DNSQj6bf.cjs} +154 -98
  220. package/dist/src/{otlpReceiver-CavGAA6k.js → otlpReceiver-UYMQx3sy.js} +154 -98
  221. package/dist/src/{providerRegistry-BkzVH5Ba.js → providerRegistry-1gB5vtzQ.js} +2 -2
  222. package/dist/src/{providerRegistry-BTDgfV5h.cjs → providerRegistry-BESeALrr.cjs} +2 -2
  223. package/dist/src/{providerRegistry-CUWki5mQ.js → providerRegistry-DoACwqhD.js} +2 -2
  224. package/dist/src/{providerRegistry-B9lh-_tx.js → providerRegistry-PMsleEzs.js} +2 -2
  225. package/dist/src/providers-BuyzKt7C.js +2 -0
  226. package/dist/src/providers-C7lNVBjX.cjs +3 -0
  227. package/dist/src/providers-CCE2COJi2.js +2 -0
  228. package/dist/src/{providers-Cn73d5sr.js → providers-CJh7iriU.js} +17180 -16823
  229. package/dist/src/providers-Ctcc592x.js +3 -0
  230. package/dist/src/{providers-DvddrgxL.js → providers-DRrerKra.js} +1052 -695
  231. package/dist/src/{providers-Ch6Mr0gn.js → providers-DT-GtF2t.js} +16716 -16359
  232. package/dist/src/{providers-CScd1wN6.cjs → providers-eDShy16E.cjs} +19893 -19506
  233. package/dist/src/python/persistent_wrapper.py +0 -5
  234. package/dist/src/{pythonUtils-Cpo0Ez1p.js → pythonUtils-C4tltmIn.js} +4 -4
  235. package/dist/src/{pythonUtils-dAVigVK-.cjs → pythonUtils-CoLaCwNY.cjs} +4 -4
  236. package/dist/src/{pythonUtils-Bzwbgpbg.js → pythonUtils-DMO68Jg7.js} +3 -3
  237. package/dist/src/{pythonUtils-wIqk7zAf.js → pythonUtils-DNqbnRdx.js} +3 -3
  238. package/dist/src/{quiverai-BeofbLVc.js → quiverai-BSS9a7wV.js} +4 -4
  239. package/dist/src/{quiverai-DVSEqJiq.js → quiverai-Bk1KrvL6.js} +4 -4
  240. package/dist/src/{quiverai-CcUhPIBg.cjs → quiverai-Bpx6MZ7T.cjs} +4 -4
  241. package/dist/src/{quiverai-CCQn73lq.js → quiverai-CPKhWgaT.js} +4 -5
  242. package/dist/src/render-7uNJ2V14.js +135 -0
  243. package/dist/src/render-DlscvAUJ.js +135 -0
  244. package/dist/src/render-eui5p5mL.js +136 -0
  245. package/dist/src/{render-BHl6QVq9.js → render-nj-UaPdn.js} +2 -3
  246. package/dist/src/render-tG6ir9_g.cjs +165 -0
  247. package/dist/src/{responses-CgNyTPsY.js → responses-1ztiVYsx.js} +56 -17
  248. package/dist/src/{responses-BKP_WYis.js → responses-B8haB-mD.js} +56 -17
  249. package/dist/src/{responses-CQb1Tj69.js → responses-BiaBguAu.js} +56 -17
  250. package/dist/src/{responses-mo0KQDbu.cjs → responses-CF-ayauu.cjs} +56 -17
  251. package/dist/src/rubyUtils-4hjGxvju.js +3 -0
  252. package/dist/src/{rubyUtils-DECSbsfY.js → rubyUtils-BI0p46eZ.js} +3 -3
  253. package/dist/src/{rubyUtils-CiVfln3g.js → rubyUtils-CIQFnVz4.js} +3 -3
  254. package/dist/src/rubyUtils-CO-tuszQ.cjs +2 -0
  255. package/dist/src/{rubyUtils-PgU-gHmx.js → rubyUtils-DGnoCYL2.js} +4 -4
  256. package/dist/src/{rubyUtils-CGeUtCfW.cjs → rubyUtils-DoifqkiA.cjs} +5 -4
  257. package/dist/src/{sagemaker-CqeASYE5.js → sagemaker-BDLeW29y.js} +14 -18
  258. package/dist/src/{sagemaker-MUbD5V3v.js → sagemaker-C5T60MKf.js} +14 -19
  259. package/dist/src/{sagemaker-CVv8W7so.js → sagemaker-ClS_NB07.js} +14 -18
  260. package/dist/src/{sagemaker-jiw1wQa-.cjs → sagemaker-ljtY12VM.cjs} +14 -18
  261. package/dist/src/{scanner-DVDeUz1r.js → scanner-nOCWNIXa.js} +130 -35
  262. package/dist/src/server/golang/wrapper.go +1 -1
  263. package/dist/src/server/index.js +4829 -2529
  264. package/dist/src/server/python/persistent_wrapper.py +0 -5
  265. package/dist/src/{server-BtoCXeXI.cjs → server-BEECpeGG.cjs} +140 -6
  266. package/dist/src/{server-DZ9MtCn0.js → server-ByiF3qlg.js} +129 -9
  267. package/dist/src/{server-Cns05F1j.js → server-ByxbqAcQ.js} +128 -8
  268. package/dist/src/server-C0XKRNB_.cjs +2 -0
  269. package/dist/src/server-C_15p79-.js +3 -0
  270. package/dist/src/{server-CP9qKM40.js → server-gyd6d4Hc.js} +126 -7
  271. package/dist/src/{signal-C3ZTsUgi.js → signal-DTtUuU3l.js} +3 -3
  272. package/dist/src/{slack-DCEV-vWP.js → slack-4zZX1OKP.js} +2 -2
  273. package/dist/src/{slack-94iG3T0s.cjs → slack-BLlsDpfG.cjs} +2 -2
  274. package/dist/src/{slack-BR0HtO3K.js → slack-BPYLQLgb.js} +2 -2
  275. package/dist/src/{slack-2sdpGzbt.js → slack-Bamy_7te.js} +2 -2
  276. package/dist/src/{store-CLyU7AtI.cjs → store-2K0kDi80.cjs} +3 -3
  277. package/dist/src/{store-VB0GP46K.js → store-2OXm_eBY.js} +3 -3
  278. package/dist/src/store-BELqNwvz.js +3 -0
  279. package/dist/src/{store-Cj258DgL.js → store-BPkzEyFM.js} +3 -3
  280. package/dist/src/{store-P8OKm19S.js → store-CPh25336.js} +3 -3
  281. package/dist/src/store-uQZ4AjPe.cjs +2 -0
  282. package/dist/src/{tables-BEIFz2tM.js → tables-BMSOS2Gg.js} +3 -3
  283. package/dist/src/{tables-BdZQEpRz.cjs → tables-CXbaZ9y1.cjs} +3 -3
  284. package/dist/src/{tables-DmzvLbeZ.js → tables-NlvH23ky.js} +3 -3
  285. package/dist/src/{tables-kC7R5kiK.js → tables-WgdUZ8Ck.js} +3 -3
  286. package/dist/src/{telemetry-DPXLd7UE.js → telemetry--iqaGyaS.js} +5 -4
  287. package/dist/src/{telemetry-re627Lre.cjs → telemetry-CEQxGnMZ.cjs} +8 -7
  288. package/dist/src/{telemetry-BugWqKiu.js → telemetry-CgdVGV8N.js} +5 -4
  289. package/dist/src/{telemetry-BnH5VJAU.js → telemetry-DWdGHvEf.js} +5 -4
  290. package/dist/src/telemetry-DjNoC_n3.cjs +2 -0
  291. package/dist/src/telemetry-ZdPZc0fm.js +3 -0
  292. package/dist/src/{text-CW1cyrwj.cjs → text-BiNME7QG.cjs} +1 -1
  293. package/dist/src/{text-Db-Wt2u2.js → text-D4lz-Jg_.js} +1 -1
  294. package/dist/src/{text-TIv0QYnd.js → text-DDQP0tuQ.js} +1 -1
  295. package/dist/src/{text-B_UCRPp2.js → text-NWvfMfkF.js} +1 -1
  296. package/dist/src/{tokenUsageUtils-DflFMjS0.js → tokenUsageUtils-2wIvAhB3.js} +7 -3
  297. package/dist/src/{tokenUsageUtils-BDGe-iyI.js → tokenUsageUtils-4c780gFd.js} +7 -3
  298. package/dist/src/{tokenUsageUtils-NYT-WKS6.js → tokenUsageUtils-BjVkdk18.js} +7 -3
  299. package/dist/src/{tokenUsageUtils-bVa1ga6f.cjs → tokenUsageUtils-C9odhsbW.cjs} +7 -3
  300. package/dist/src/{transcription-CaMivnjG.js → transcription-84t4ALo2.js} +7 -11
  301. package/dist/src/{transcription-Hb3VnC4M.js → transcription-Bm2emLmJ.js} +8 -11
  302. package/dist/src/{transcription-BvtsrzRG.cjs → transcription-CZ4LG5hQ.cjs} +9 -13
  303. package/dist/src/{transcription-DOMMTu01.js → transcription-D7Q0vJsh.js} +7 -13
  304. package/dist/src/{transform-DrleutM3.js → transform-B-b6Cq-q.js} +8 -6
  305. package/dist/src/transform-BQt0BeAW.js +3 -0
  306. package/dist/src/transform-Bq5oqC0s.cjs +2 -0
  307. package/dist/src/{transform-ZrG2dvlo.cjs → transform-C9izGX54.cjs} +5 -5
  308. package/dist/src/{transform-BzK09Q_9.js → transform-CwbAZ84V.js} +5 -5
  309. package/dist/src/{transform-0BwoBsvO.cjs → transform-Dg4LcO1Y.cjs} +18 -10
  310. package/dist/src/{transform-B2-jIv68.js → transform-DtooZqYY.js} +8 -6
  311. package/dist/src/{transform-ljLYHEPh.js → transform-DzCF-wqV.js} +5 -5
  312. package/dist/src/{transform-DyDAwEpE.js → transform-_DpNB4qp.js} +9 -7
  313. package/dist/src/{transform-BqPkNPYm.js → transform-eGiUAv86.js} +5 -5
  314. package/dist/src/{transformersAvailability-DKoRtQLy.cjs → transformersAvailability-B22swDxr.cjs} +1 -1
  315. package/dist/src/{transformersAvailability-BGkzavwb.js → transformersAvailability-lvCCvuPT.js} +1 -1
  316. package/dist/src/{transformersAvailability-D6c6ROpT.js → transformersAvailability-rJGPccjr.js} +1 -1
  317. package/dist/src/{types-Cd3ygw8W.js → types-BDjGOq4E.js} +354 -24
  318. package/dist/src/{types-CIhFeUC4.js → types-BVH9hjgW.js} +364 -23
  319. package/dist/src/{types-D8cGDZbL.cjs → types-CgG2rKiW.cjs} +534 -167
  320. package/dist/src/{types-q8GXGF65.js → types-DNRZVOue.js} +498 -167
  321. package/dist/src/{util-BLvy9qfE.js → util-3pBZZb_H.js} +151 -149
  322. package/dist/src/{util-CFj4YKIn.cjs → util-A5_ZsQUn.cjs} +66 -44
  323. package/dist/src/{util-BtoGs5Cb.js → util-B9CNhyac.js} +66 -44
  324. package/dist/src/{util-Bm3E9jpK.js → util-BQOCAHQC.js} +692 -690
  325. package/dist/src/{util-vNmDL5DT.js → util-BVXcTwXu.js} +138 -36
  326. package/dist/src/{util-CgDCK4KI.js → util-BlFVL0UF.js} +66 -44
  327. package/dist/src/{util-DM2rTn_6.js → util-C-kmRosx.js} +66 -44
  328. package/dist/src/{util-DbVG-yZU.js → util-DFPeFkiV.js} +138 -36
  329. package/dist/src/{util-DMFeUvLz.js → util-DN0-b81k.js} +138 -36
  330. package/dist/src/{util--9u9UVCt.cjs → util-Dpmm_dAI.cjs} +143 -35
  331. package/dist/src/{util-CMMkIxfU.js → util-Dub0f_ej.js} +693 -691
  332. package/dist/src/{util-CuLo2pMR.cjs → util-DvpHnLt0.cjs} +714 -719
  333. package/dist/src/{utils-DOjD4dTC.js → utils-BUMN8orw.js} +6 -4
  334. package/dist/src/{utils-DKw8mrgr.cjs → utils-DkVeShIB.cjs} +6 -4
  335. package/dist/src/{utils-DEuL4VNB.js → utils-kt7lv30R.js} +6 -4
  336. package/dist/src/{utils-CFxO9KGo.js → utils-o8S5huU2.js} +6 -4
  337. package/dist/src/version-0frU0UTr.js +16 -0
  338. package/dist/src/version-CbpiUINz.js +17 -0
  339. package/dist/src/version-CbuBKu2U.js +16 -0
  340. package/dist/src/version-D9zu9FWB.cjs +27 -0
  341. package/dist/tsconfig.tsbuildinfo +1 -1
  342. package/package.json +57 -46
  343. package/dist/src/app/assets/index-B6l9CVVb.js +0 -439
  344. package/dist/src/app/assets/index-DyZ0Ep37.css +0 -1
  345. package/dist/src/app/assets/scroll-timeline-BdJZVXlz.js +0 -1
  346. package/dist/src/app/assets/sync-CStkzc6u.js +0 -4
  347. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +0 -36
  348. package/dist/src/app/assets/vendor-markdown-Bz7N-ca6.js +0 -29
  349. package/dist/src/app/assets/vendor-react-AtKqiNEf.js +0 -4
  350. package/dist/src/app/assets/vendor-syntax-D06x6TQF.js +0 -2
  351. package/dist/src/app/assets/vendor-utils-BvMHZmO7.js +0 -37
  352. package/dist/src/cache-C5yFZ4gC.cjs +0 -816
  353. package/dist/src/cache-CaT5tPgo.js +0 -756
  354. package/dist/src/cache-CyCanoMu.js +0 -6
  355. package/dist/src/cache-DSqR6ezl.js +0 -726
  356. package/dist/src/cache-Df_QFDNu.cjs +0 -5
  357. package/dist/src/cache-HP0NP4k3.js +0 -756
  358. package/dist/src/cloud-DE3t1-ZI.js +0 -4
  359. package/dist/src/codex-sdk-BQEw16R_.js +0 -834
  360. package/dist/src/codex-sdk-C_07GuVS.js +0 -834
  361. package/dist/src/codex-sdk-DE5G18dx.js +0 -835
  362. package/dist/src/codex-sdk-ZLKfDjqP.cjs +0 -838
  363. package/dist/src/eval-7aEqoMs3.js +0 -15
  364. package/dist/src/evalResult-CYNHkk5A.js +0 -12
  365. package/dist/src/evalResult-CuvJeNiM.js +0 -10
  366. package/dist/src/evalResult-tGdilrWt.cjs +0 -10
  367. package/dist/src/evaluator-BBUqRhz1.js +0 -36
  368. package/dist/src/fetch-UWU706qb.js +0 -5
  369. package/dist/src/graders-BxfEguVY.js +0 -32
  370. package/dist/src/graders-CzVMbEnv.js +0 -34
  371. package/dist/src/graders-DjCXfj0l.cjs +0 -32
  372. package/dist/src/graders-kHzIWOKu.js +0 -32
  373. package/dist/src/messages-DJNo37Ko.js +0 -246
  374. package/dist/src/messages-Dy9QecMs.js +0 -245
  375. package/dist/src/messages-HJsyEh4o.cjs +0 -257
  376. package/dist/src/messages-biC_ex-p.js +0 -245
  377. package/dist/src/openclaw-0Sv7AK3O.js +0 -580
  378. package/dist/src/openclaw-CXxbKgDH.cjs +0 -586
  379. package/dist/src/openclaw-D1FSCps-.js +0 -580
  380. package/dist/src/openclaw-D2ENvu7a.js +0 -582
  381. package/dist/src/providers-BSLEaIQG.js +0 -32
  382. package/dist/src/providers-D-FnDg8k.cjs +0 -31
  383. package/dist/src/providers-DEYiFVAo.js +0 -30
  384. package/dist/src/providers-sS2WI8YD.js +0 -30
  385. package/dist/src/rubyUtils-B1HXG4ej.cjs +0 -4
  386. package/dist/src/rubyUtils-Rt6pKA96.js +0 -5
  387. package/dist/src/server-B0Xh1Gx-.js +0 -7
  388. package/dist/src/server-DJTKu9IR.cjs +0 -5
  389. package/dist/src/store-C5u6MgC8.js +0 -6
  390. package/dist/src/store-CNHk-De4.cjs +0 -5
  391. package/dist/src/telemetry-Yig0Tino.js +0 -7
  392. package/dist/src/telemetry-p8Pwqm1i.cjs +0 -5
  393. package/dist/src/transform-ChNIpHz7.js +0 -6
  394. package/dist/src/transform-PtQ6rAE3.cjs +0 -5
@@ -0,0 +1,1206 @@
1
+ const require_logger = require("./logger-COuQb2xB.cjs");
2
+ const require_fetch = require("./fetch-NuqXW1Xb.cjs");
3
+ const require_version = require("./version-D9zu9FWB.cjs");
4
+ const require_chat = require("./chat-vYqqv1gP.cjs");
5
+ const require_embedding = require("./embedding-BXhN5lCH.cjs");
6
+ const require_responses = require("./responses-CF-ayauu.cjs");
7
+ const require_createHash = require("./createHash-VvBIc-AW.cjs");
8
+ let fs = require("fs");
9
+ fs = require_logger.__toESM(fs);
10
+ let path = require("path");
11
+ path = require_logger.__toESM(path);
12
+ let os = require("os");
13
+ os = require_logger.__toESM(os);
14
+ let crypto = require("crypto");
15
+ crypto = require_logger.__toESM(crypto);
16
+ let ws = require("ws");
17
+ ws = require_logger.__toESM(ws);
18
+ let json5 = require("json5");
19
+ json5 = require_logger.__toESM(json5);
20
+ //#region src/providers/openclaw/device-auth.ts
21
+ const DEFAULT_CLIENT_DIR = "openclaw";
22
+ const DEFAULT_DEVICE_IDENTITY_FILE = "device-identity.json";
23
+ const DEFAULT_DEVICE_AUTH_FILE = "device-auth.json";
24
+ function defaultOpenClawClientPath(fileName) {
25
+ return path.default.join(require_logger.getConfigDirectoryPath(true), DEFAULT_CLIENT_DIR, fileName);
26
+ }
27
+ function getDefaultOpenClawDeviceIdentityPath() {
28
+ return defaultOpenClawClientPath(DEFAULT_DEVICE_IDENTITY_FILE);
29
+ }
30
+ function getDefaultOpenClawDeviceAuthPath() {
31
+ return defaultOpenClawClientPath(DEFAULT_DEVICE_AUTH_FILE);
32
+ }
33
+ function ensureParentDirectory(filePath) {
34
+ fs.default.mkdirSync(path.default.dirname(filePath), {
35
+ recursive: true,
36
+ mode: 448
37
+ });
38
+ }
39
+ function writeJsonSecure(filePath, value) {
40
+ ensureParentDirectory(filePath);
41
+ fs.default.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, {
42
+ encoding: "utf-8",
43
+ mode: 384
44
+ });
45
+ fs.default.chmodSync(filePath, 384);
46
+ }
47
+ function parseJsonObject(raw) {
48
+ try {
49
+ const parsed = JSON.parse(raw);
50
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : void 0;
51
+ } catch (err) {
52
+ require_logger.logger.debug("[OpenClaw Device Auth] Failed to parse JSON", {
53
+ err,
54
+ rawLength: raw.length,
55
+ rawPreview: raw.slice(0, 100)
56
+ });
57
+ return;
58
+ }
59
+ }
60
+ function normalizeDeviceMetadataValue(value) {
61
+ const trimmed = value?.trim();
62
+ if (!trimmed) return "";
63
+ return trimmed.replace(/[A-Z]/g, (letter) => letter.toLowerCase());
64
+ }
65
+ function normalizeScopes$1(scopes) {
66
+ const seen = /* @__PURE__ */ new Set();
67
+ for (const scope of scopes || []) {
68
+ const trimmed = scope.trim();
69
+ if (trimmed) seen.add(trimmed);
70
+ }
71
+ if (seen.has("operator.admin")) {
72
+ seen.add("operator.read");
73
+ seen.add("operator.write");
74
+ } else if (seen.has("operator.write")) seen.add("operator.read");
75
+ return Array.from(seen).sort();
76
+ }
77
+ function publicKeyBase64UrlFromPem(publicKeyPem) {
78
+ const publicKey = crypto.default.createPublicKey(publicKeyPem);
79
+ const jwk = publicKey.export({ format: "jwk" });
80
+ if (typeof jwk.x === "string" && jwk.x.trim()) return jwk.x;
81
+ const der = publicKey.export({
82
+ type: "spki",
83
+ format: "der"
84
+ });
85
+ return Buffer.from(der.subarray(Math.max(0, der.length - 32))).toString("base64url");
86
+ }
87
+ function deriveDeviceId(publicKeyPem) {
88
+ return require_createHash.sha256(Buffer.from(publicKeyBase64UrlFromPem(publicKeyPem), "base64url"));
89
+ }
90
+ function isValidIdentity(identity) {
91
+ try {
92
+ const publicKeyFromPrivateKey = crypto.default.createPublicKey(identity.privateKeyPem).export({
93
+ type: "spki",
94
+ format: "pem"
95
+ });
96
+ return identity.deviceId === deriveDeviceId(identity.publicKeyPem) && publicKeyBase64UrlFromPem(identity.publicKeyPem) === publicKeyBase64UrlFromPem(publicKeyFromPrivateKey);
97
+ } catch {
98
+ return false;
99
+ }
100
+ }
101
+ function parseIdentity(raw) {
102
+ const parsed = parseJsonObject(raw);
103
+ const identity = {
104
+ deviceId: typeof parsed?.deviceId === "string" ? parsed.deviceId : "",
105
+ publicKeyPem: typeof parsed?.publicKeyPem === "string" ? parsed.publicKeyPem : "",
106
+ privateKeyPem: typeof parsed?.privateKeyPem === "string" ? parsed.privateKeyPem : ""
107
+ };
108
+ return isValidIdentity(identity) ? identity : void 0;
109
+ }
110
+ function createDeviceIdentity() {
111
+ const keyPair = crypto.default.generateKeyPairSync("ed25519", {
112
+ publicKeyEncoding: {
113
+ type: "spki",
114
+ format: "pem"
115
+ },
116
+ privateKeyEncoding: {
117
+ type: "pkcs8",
118
+ format: "pem"
119
+ }
120
+ });
121
+ const publicKeyPem = keyPair.publicKey;
122
+ return {
123
+ deviceId: deriveDeviceId(publicKeyPem),
124
+ publicKeyPem,
125
+ privateKeyPem: keyPair.privateKey
126
+ };
127
+ }
128
+ function loadOrCreateOpenClawDeviceIdentity(filePath) {
129
+ const identityPath = filePath || getDefaultOpenClawDeviceIdentityPath();
130
+ try {
131
+ if (fs.default.existsSync(identityPath)) {
132
+ const identity = parseIdentity(fs.default.readFileSync(identityPath, "utf-8"));
133
+ if (identity) return identity;
134
+ }
135
+ } catch (err) {
136
+ require_logger.logger.warn("[OpenClaw Device Auth] Failed to read device identity; generating new identity", {
137
+ err,
138
+ identityPath
139
+ });
140
+ }
141
+ const identity = createDeviceIdentity();
142
+ try {
143
+ writeJsonSecure(identityPath, identity);
144
+ } catch (err) {
145
+ require_logger.logger.warn("[OpenClaw Device Auth] Failed to persist device identity", {
146
+ err,
147
+ identityPath
148
+ });
149
+ }
150
+ return identity;
151
+ }
152
+ function buildOpenClawDeviceAuthPayloadV3(params) {
153
+ return [
154
+ "v3",
155
+ params.deviceId,
156
+ params.clientId,
157
+ params.clientMode,
158
+ params.role,
159
+ params.scopes.join(","),
160
+ String(params.signedAtMs),
161
+ params.token ?? "",
162
+ params.nonce,
163
+ normalizeDeviceMetadataValue(params.platform),
164
+ normalizeDeviceMetadataValue(params.deviceFamily)
165
+ ].join("|");
166
+ }
167
+ function signOpenClawDevicePayload(privateKeyPem, payload) {
168
+ return crypto.default.sign(null, Buffer.from(payload), privateKeyPem).toString("base64url");
169
+ }
170
+ function buildSignedOpenClawDevice(params) {
171
+ const signedAt = params.nowMs ?? Date.now();
172
+ const payload = buildOpenClawDeviceAuthPayloadV3({
173
+ deviceId: params.identity.deviceId,
174
+ clientId: params.clientId,
175
+ clientMode: params.clientMode,
176
+ role: params.role,
177
+ scopes: params.scopes,
178
+ signedAtMs: signedAt,
179
+ token: params.token,
180
+ nonce: params.nonce,
181
+ platform: params.platform,
182
+ deviceFamily: params.deviceFamily
183
+ });
184
+ return {
185
+ id: params.identity.deviceId,
186
+ publicKey: publicKeyBase64UrlFromPem(params.identity.publicKeyPem),
187
+ signature: signOpenClawDevicePayload(params.identity.privateKeyPem, payload),
188
+ signedAt,
189
+ nonce: params.nonce
190
+ };
191
+ }
192
+ function parseDeviceAuthStore(raw) {
193
+ const parsed = parseJsonObject(raw);
194
+ if (!parsed || parsed.version !== 1 || typeof parsed.deviceId !== "string") return;
195
+ const tokens = {};
196
+ const rawTokens = parsed.tokens && typeof parsed.tokens === "object" && !Array.isArray(parsed.tokens) ? parsed.tokens : {};
197
+ for (const [role, tokenRecord] of Object.entries(rawTokens)) {
198
+ if (!tokenRecord || typeof tokenRecord !== "object" || Array.isArray(tokenRecord)) continue;
199
+ const record = tokenRecord;
200
+ if (typeof record.token !== "string" || !record.token.trim()) continue;
201
+ tokens[role] = {
202
+ token: record.token,
203
+ role: typeof record.role === "string" ? record.role : role,
204
+ scopes: Array.isArray(record.scopes) ? normalizeScopes$1(record.scopes.filter((scope) => typeof scope === "string")) : [],
205
+ updatedAtMs: typeof record.updatedAtMs === "number" ? record.updatedAtMs : 0
206
+ };
207
+ }
208
+ return {
209
+ version: 1,
210
+ deviceId: parsed.deviceId,
211
+ tokens
212
+ };
213
+ }
214
+ function readDeviceAuthStore(filePath) {
215
+ try {
216
+ if (!fs.default.existsSync(filePath)) return;
217
+ return parseDeviceAuthStore(fs.default.readFileSync(filePath, "utf-8"));
218
+ } catch (err) {
219
+ require_logger.logger.debug("[OpenClaw Device Auth] Failed to read device auth store", {
220
+ err,
221
+ filePath
222
+ });
223
+ return;
224
+ }
225
+ }
226
+ function loadOpenClawDeviceAuthToken(params) {
227
+ const store = readDeviceAuthStore(params.filePath || getDefaultOpenClawDeviceAuthPath());
228
+ if (!store || store.deviceId !== params.deviceId) return;
229
+ const role = params.role.trim();
230
+ const tokenRecord = store.tokens[role];
231
+ const token = tokenRecord?.token.trim();
232
+ return token ? {
233
+ ...tokenRecord,
234
+ token
235
+ } : void 0;
236
+ }
237
+ function storeOpenClawDeviceAuthToken(params) {
238
+ const token = params.token.trim();
239
+ const role = params.role.trim();
240
+ if (!token || !role) return;
241
+ const authPath = params.filePath || getDefaultOpenClawDeviceAuthPath();
242
+ const existing = readDeviceAuthStore(authPath);
243
+ const store = existing && existing.deviceId === params.deviceId ? existing : {
244
+ version: 1,
245
+ deviceId: params.deviceId,
246
+ tokens: {}
247
+ };
248
+ store.tokens[role] = {
249
+ token,
250
+ role,
251
+ scopes: normalizeScopes$1(params.scopes),
252
+ updatedAtMs: Date.now()
253
+ };
254
+ try {
255
+ writeJsonSecure(authPath, store);
256
+ } catch (err) {
257
+ require_logger.logger.warn("[OpenClaw Device Auth] Failed to persist device auth token", {
258
+ err,
259
+ authPath
260
+ });
261
+ }
262
+ }
263
+ function clearOpenClawDeviceAuthToken(params) {
264
+ const authPath = params.filePath || getDefaultOpenClawDeviceAuthPath();
265
+ const store = readDeviceAuthStore(authPath);
266
+ if (!store || store.deviceId !== params.deviceId) return;
267
+ delete store.tokens[params.role.trim()];
268
+ try {
269
+ writeJsonSecure(authPath, store);
270
+ } catch (err) {
271
+ require_logger.logger.warn("[OpenClaw Device Auth] Failed to clear device auth token", {
272
+ err,
273
+ authPath
274
+ });
275
+ }
276
+ }
277
+ //#endregion
278
+ //#region src/providers/openclaw/shared.ts
279
+ const DEFAULT_GATEWAY_PORT = 18789;
280
+ const DEFAULT_GATEWAY_HOST = "127.0.0.1";
281
+ /**
282
+ * Cached config to avoid re-reading the file multiple times during provider init.
283
+ */
284
+ let cachedConfig;
285
+ let cachedConfigPath;
286
+ function resolveConfigPath(env) {
287
+ return env?.OPENCLAW_CONFIG_PATH || require_logger.getEnvString("OPENCLAW_CONFIG_PATH") || path.default.join(os.default.homedir(), ".openclaw", "openclaw.json");
288
+ }
289
+ function normalizeGatewayUrl(url, transport) {
290
+ const trimmed = url.trim();
291
+ if (!trimmed) return;
292
+ if (transport === "http") {
293
+ if (trimmed.startsWith("wss://")) return `https://${trimmed.slice(6)}`;
294
+ if (trimmed.startsWith("ws://")) return `http://${trimmed.slice(5)}`;
295
+ return trimmed;
296
+ }
297
+ if (trimmed.startsWith("https://")) return `wss://${trimmed.slice(8)}`;
298
+ if (trimmed.startsWith("http://")) return `ws://${trimmed.slice(7)}`;
299
+ return trimmed;
300
+ }
301
+ function resolveGatewayHost(gatewayConfig) {
302
+ const bind = gatewayConfig?.bind?.trim();
303
+ const customBindHost = gatewayConfig?.customBindHost?.trim();
304
+ if (!bind || bind === "auto" || bind === "loopback" || bind === "lan" || bind === "tailnet" || bind === "0.0.0.0" || bind === "::" || bind === "127.0.0.1" || bind === "localhost" || bind === "::1") return DEFAULT_GATEWAY_HOST;
305
+ if (bind === "custom") {
306
+ if (!customBindHost || customBindHost === "0.0.0.0" || customBindHost === "::" || customBindHost === "127.0.0.1" || customBindHost === "localhost" || customBindHost === "::1") return DEFAULT_GATEWAY_HOST;
307
+ return customBindHost;
308
+ }
309
+ return bind;
310
+ }
311
+ function buildLocalGatewayUrl(gatewayConfig, transport, portOverride) {
312
+ const scheme = transport === "ws" ? gatewayConfig?.tls?.enabled ? "wss" : "ws" : gatewayConfig?.tls?.enabled ? "https" : "http";
313
+ const port = portOverride ?? gatewayConfig?.port ?? 18789;
314
+ return `${scheme}://${resolveGatewayHost(gatewayConfig)}:${port}`;
315
+ }
316
+ function resolveGatewayUrlFromConfig(openclawConfig, transport, portOverride) {
317
+ const gatewayConfig = openclawConfig?.gateway;
318
+ if (!gatewayConfig) return;
319
+ if (gatewayConfig.mode === "remote") {
320
+ const remoteUrl = normalizeGatewayUrl(gatewayConfig.remote?.url ?? "", transport);
321
+ if (remoteUrl) return remoteUrl;
322
+ }
323
+ return buildLocalGatewayUrl(gatewayConfig, transport, portOverride);
324
+ }
325
+ function resolveGatewayPortOverride(env) {
326
+ const trimmedPort = (env?.OPENCLAW_GATEWAY_PORT || require_logger.getEnvString("OPENCLAW_GATEWAY_PORT"))?.trim();
327
+ if (!trimmedPort || !/^\d+$/.test(trimmedPort)) return;
328
+ const parsedPort = Number(trimmedPort);
329
+ return Number.isInteger(parsedPort) && parsedPort > 0 && parsedPort <= 65535 ? parsedPort : void 0;
330
+ }
331
+ function toAuthSecret(kind, value) {
332
+ const trimmed = value?.trim();
333
+ return trimmed ? {
334
+ kind,
335
+ value: trimmed
336
+ } : void 0;
337
+ }
338
+ function resolveAuthSecretFromConfig(openclawConfig) {
339
+ const gatewayConfig = openclawConfig?.gateway;
340
+ const authMode = gatewayConfig?.auth?.mode?.trim();
341
+ const preferRemoteCredentials = gatewayConfig?.mode === "remote";
342
+ const localToken = toAuthSecret("token", gatewayConfig?.auth?.token);
343
+ const localPassword = toAuthSecret("password", gatewayConfig?.auth?.password);
344
+ const remoteToken = toAuthSecret("token", gatewayConfig?.remote?.token);
345
+ const remotePassword = toAuthSecret("password", gatewayConfig?.remote?.password);
346
+ if (preferRemoteCredentials) {
347
+ if (authMode === "password") return remotePassword || localPassword || remoteToken || localToken;
348
+ if (authMode === "token") return remoteToken || localToken || remotePassword || localPassword;
349
+ return remoteToken || remotePassword || localToken || localPassword;
350
+ }
351
+ if (authMode === "password") return localPassword || remotePassword || localToken || remoteToken;
352
+ if (authMode === "token") return localToken || remoteToken || localPassword || remotePassword;
353
+ return localToken || localPassword || remoteToken || remotePassword;
354
+ }
355
+ /**
356
+ * Read and parse the active OpenClaw configuration file.
357
+ * Results are cached based on file modification time.
358
+ * Returns undefined if the file doesn't exist or can't be parsed.
359
+ */
360
+ function readOpenClawConfig(env) {
361
+ const configPath = resolveConfigPath(env);
362
+ try {
363
+ if (!fs.default.existsSync(configPath)) return;
364
+ const mtime = fs.default.statSync(configPath).mtimeMs;
365
+ if (cachedConfig && cachedConfigPath === configPath && cachedConfig.mtime === mtime) return cachedConfig.config;
366
+ const raw = fs.default.readFileSync(configPath, "utf-8");
367
+ const config = json5.default.parse(raw);
368
+ cachedConfig = {
369
+ config,
370
+ mtime
371
+ };
372
+ cachedConfigPath = configPath;
373
+ return config;
374
+ } catch (err) {
375
+ require_logger.logger.warn(`Failed to read OpenClaw config at ${configPath}`, { err });
376
+ return;
377
+ }
378
+ }
379
+ /**
380
+ * Auto-detect the OpenClaw gateway URL from config, env overrides, or the active config file.
381
+ */
382
+ function resolveGatewayUrl(config, env) {
383
+ return resolveGatewayTransportUrl(config, env, "http");
384
+ }
385
+ function resolveGatewayWsUrl(config, env) {
386
+ return resolveGatewayTransportUrl(config, env, "ws");
387
+ }
388
+ function resolveGatewayTransportUrl(config, env, transport) {
389
+ const configUrl = config?.gateway_url?.trim();
390
+ if (configUrl) return normalizeGatewayUrl(configUrl, transport) || configUrl;
391
+ const trimmedEnvUrl = (env?.OPENCLAW_GATEWAY_URL || require_logger.getEnvString("OPENCLAW_GATEWAY_URL") || env?.CLAWDBOT_GATEWAY_URL || require_logger.getEnvString("CLAWDBOT_GATEWAY_URL"))?.trim();
392
+ if (trimmedEnvUrl) return normalizeGatewayUrl(trimmedEnvUrl, transport) || trimmedEnvUrl;
393
+ const portOverride = resolveGatewayPortOverride(env);
394
+ const resolvedUrl = resolveGatewayUrlFromConfig(readOpenClawConfig(env), transport, portOverride);
395
+ if (resolvedUrl) return resolvedUrl;
396
+ return `${transport === "ws" ? "ws" : "http"}://${DEFAULT_GATEWAY_HOST}:${portOverride ?? 18789}`;
397
+ }
398
+ function resolveAuthSecret(config, env) {
399
+ if (config?.auth_token) return {
400
+ kind: "token",
401
+ value: config.auth_token
402
+ };
403
+ if (config?.auth_password) return {
404
+ kind: "password",
405
+ value: config.auth_password
406
+ };
407
+ const envToken = env?.OPENCLAW_GATEWAY_TOKEN || require_logger.getEnvString("OPENCLAW_GATEWAY_TOKEN") || env?.CLAWDBOT_GATEWAY_TOKEN || require_logger.getEnvString("CLAWDBOT_GATEWAY_TOKEN");
408
+ if (envToken) return {
409
+ kind: "token",
410
+ value: envToken
411
+ };
412
+ const envPassword = env?.OPENCLAW_GATEWAY_PASSWORD || require_logger.getEnvString("OPENCLAW_GATEWAY_PASSWORD") || env?.CLAWDBOT_GATEWAY_PASSWORD || require_logger.getEnvString("CLAWDBOT_GATEWAY_PASSWORD");
413
+ if (envPassword) return {
414
+ kind: "password",
415
+ value: envPassword
416
+ };
417
+ return resolveAuthSecretFromConfig(readOpenClawConfig(env));
418
+ }
419
+ /**
420
+ * Auto-detect the OpenClaw gateway bearer secret from config, env overrides, or the active
421
+ * config file. OpenClaw accepts either a token or password as the HTTP bearer secret.
422
+ */
423
+ function resolveAuthToken(config, env) {
424
+ return resolveAuthSecret(config, env)?.value;
425
+ }
426
+ /**
427
+ * Build the canonical OpenClaw model id for OpenAI-compatible endpoints.
428
+ */
429
+ function buildOpenClawModelName(agentId) {
430
+ const trimmedAgentId = agentId.trim();
431
+ if (!trimmedAgentId || trimmedAgentId === "default" || trimmedAgentId === "openclaw") return "openclaw/default";
432
+ if (trimmedAgentId.startsWith("openclaw/")) {
433
+ const targetAgentId = trimmedAgentId.slice(9).trim();
434
+ return targetAgentId ? `openclaw/${targetAgentId}` : "openclaw/default";
435
+ }
436
+ if (trimmedAgentId.startsWith("openclaw:")) {
437
+ const targetAgentId = trimmedAgentId.slice(9).trim();
438
+ return targetAgentId ? `openclaw/${targetAgentId}` : "openclaw/default";
439
+ }
440
+ if (trimmedAgentId.startsWith("agent:")) {
441
+ const targetAgentId = trimmedAgentId.slice(6).trim();
442
+ return targetAgentId ? `openclaw/${targetAgentId}` : "openclaw/default";
443
+ }
444
+ return `openclaw/${trimmedAgentId}`;
445
+ }
446
+ function normalizeHeaderValue(value) {
447
+ return value?.trim() || void 0;
448
+ }
449
+ /**
450
+ * Build OpenClaw request context headers shared by HTTP-compatible endpoints.
451
+ */
452
+ function buildOpenClawContextHeaders(config) {
453
+ const headers = {};
454
+ const backendModel = normalizeHeaderValue(config?.backend_model || config?.model_override);
455
+ const messageChannel = normalizeHeaderValue(config?.message_channel);
456
+ const accountId = normalizeHeaderValue(config?.account_id);
457
+ const scopes = config?.scopes?.map((scope) => scope.trim()).filter(Boolean).join(",");
458
+ if (backendModel) headers["x-openclaw-model"] = backendModel;
459
+ if (messageChannel) headers["x-openclaw-message-channel"] = messageChannel;
460
+ if (accountId) headers["x-openclaw-account-id"] = accountId;
461
+ if (scopes) headers["x-openclaw-scopes"] = scopes;
462
+ return headers;
463
+ }
464
+ /**
465
+ * Build common OpenClaw headers for agent-id, session-key, and request context.
466
+ * Note: thinking_level is only supported by the WS Agent provider and is
467
+ * passed as an RPC param there, not as an HTTP header.
468
+ */
469
+ function buildOpenClawHeaders(agentId, config) {
470
+ const headers = { "x-openclaw-agent-id": agentId };
471
+ if (config?.session_key) headers["x-openclaw-session-key"] = config.session_key;
472
+ return {
473
+ ...headers,
474
+ ...buildOpenClawContextHeaders(config)
475
+ };
476
+ }
477
+ /**
478
+ * Build provider options for OpenAI-compatible OpenClaw providers (chat, responses).
479
+ * Resolves gateway URL, auth token, and merges OpenClaw-specific headers.
480
+ */
481
+ function buildOpenClawProviderOptions(agentId, providerOptions) {
482
+ const config = providerOptions.config || {};
483
+ const env = providerOptions.env;
484
+ const gatewayUrl = resolveGatewayUrl(config, env);
485
+ const authToken = resolveAuthToken(config, env);
486
+ return {
487
+ ...providerOptions,
488
+ config: {
489
+ ...config,
490
+ apiBaseUrl: `${gatewayUrl}/v1`,
491
+ ...authToken && { apiKey: authToken },
492
+ apiKeyRequired: false,
493
+ headers: {
494
+ ...config.headers,
495
+ ...buildOpenClawHeaders(agentId, config)
496
+ }
497
+ }
498
+ };
499
+ }
500
+ //#endregion
501
+ //#region src/providers/openclaw/agent.ts
502
+ const OPENCLAW_PROTOCOL_VERSION = 3;
503
+ const CLIENT_ID = "gateway-client";
504
+ const CLIENT_MODE = "cli";
505
+ const CLIENT_ROLE = "operator";
506
+ const DEFAULT_SCOPES = ["operator.read", "operator.write"];
507
+ function normalizeScopes(scopes) {
508
+ const seen = /* @__PURE__ */ new Set();
509
+ const normalized = [];
510
+ for (const scope of scopes || []) {
511
+ const trimmed = scope.trim();
512
+ if (trimmed && !seen.has(trimmed)) {
513
+ seen.add(trimmed);
514
+ normalized.push(trimmed);
515
+ }
516
+ }
517
+ return normalized;
518
+ }
519
+ function getStringArray(value) {
520
+ if (!Array.isArray(value)) return;
521
+ const strings = value.filter((item) => typeof item === "string");
522
+ return strings.length > 0 ? strings : void 0;
523
+ }
524
+ function stripRetryMarker(result) {
525
+ const { retryWithDeviceToken: _retryWithDeviceToken, ...providerResponse } = result;
526
+ return providerResponse;
527
+ }
528
+ function buildOpenClawAgentSessionKey(agentId, sessionKey) {
529
+ const trimmedSessionKey = sessionKey.trim();
530
+ if (!trimmedSessionKey || trimmedSessionKey.toLowerCase().startsWith("agent:")) return trimmedSessionKey;
531
+ const trimmedAgentId = agentId.trim();
532
+ if (!trimmedAgentId || trimmedAgentId.toLowerCase() === "main") return trimmedSessionKey;
533
+ return `agent:${trimmedAgentId}:${trimmedSessionKey}`;
534
+ }
535
+ /**
536
+ * OpenClaw WebSocket Agent Provider
537
+ *
538
+ * Custom provider that uses the native OpenClaw WS RPC protocol to invoke agents.
539
+ * Supports full streaming with event accumulation.
540
+ *
541
+ * Protocol flow:
542
+ * 1. Open WS connection to gateway
543
+ * 2. Receive connect.challenge event → send signed connect request
544
+ * 3. Receive connect response → persist device token and send agent request
545
+ * 4. Receive agent accepted response → send agent.wait
546
+ * 5. Accumulate streaming "agent" events (assistant text/delta, lifecycle errors, error streams)
547
+ * 6. Resolve on agent.wait response
548
+ *
549
+ * Usage:
550
+ * openclaw:agent - default agent (main)
551
+ * openclaw:agent:main - explicit agent ID
552
+ * openclaw:agent:my-agent - custom agent ID
553
+ */
554
+ var OpenClawAgentProvider = class {
555
+ agentId;
556
+ gatewayUrl;
557
+ authKind;
558
+ authSecret;
559
+ openclawConfig;
560
+ timeoutMs;
561
+ scopes;
562
+ hasExplicitScopes;
563
+ activeConnections = /* @__PURE__ */ new Set();
564
+ constructor(agentId, providerOptions = {}) {
565
+ this.agentId = agentId;
566
+ this.openclawConfig = providerOptions.config || {};
567
+ const env = providerOptions.env;
568
+ this.gatewayUrl = resolveGatewayWsUrl(this.openclawConfig, env);
569
+ const authSecret = resolveAuthSecret(this.openclawConfig, env);
570
+ this.authKind = authSecret?.kind;
571
+ this.authSecret = authSecret?.value;
572
+ this.timeoutMs = this.openclawConfig.timeoutMs ?? require_fetch.REQUEST_TIMEOUT_MS;
573
+ this.scopes = normalizeScopes(this.openclawConfig.scopes);
574
+ this.hasExplicitScopes = this.scopes.length > 0;
575
+ if (!this.hasExplicitScopes) this.scopes = [...DEFAULT_SCOPES];
576
+ }
577
+ id() {
578
+ return `openclaw:agent:${this.agentId}`;
579
+ }
580
+ toString() {
581
+ return `[OpenClaw Agent Provider ${this.agentId}]`;
582
+ }
583
+ toJSON() {
584
+ return { provider: this.id() };
585
+ }
586
+ async cleanup() {
587
+ for (const ws$1 of this.activeConnections) ws$1.close();
588
+ this.activeConnections.clear();
589
+ }
590
+ async callApi(prompt) {
591
+ const sessionKey = buildOpenClawAgentSessionKey(this.agentId, this.openclawConfig.session_key || `promptfoo-${crypto.default.randomUUID()}`);
592
+ const firstResult = await this.callApiOnce(prompt, sessionKey);
593
+ if (firstResult.retryWithDeviceToken) {
594
+ const retryDeviceToken = this.resolveDeviceTokenForRetry();
595
+ if (retryDeviceToken) return stripRetryMarker(await this.callApiOnce(prompt, sessionKey, retryDeviceToken));
596
+ }
597
+ return stripRetryMarker(firstResult);
598
+ }
599
+ callApiOnce(prompt, sessionKey, retryDeviceToken) {
600
+ return new Promise((resolve) => {
601
+ const wsHeaders = this.buildWebSocketHeaders();
602
+ const ws$2 = wsHeaders ? new ws.default(this.gatewayUrl, { headers: wsHeaders }) : new ws.default(this.gatewayUrl);
603
+ this.activeConnections.add(ws$2);
604
+ let resolved = false;
605
+ let timeout;
606
+ const finish = (result, closeSocket = true) => {
607
+ if (resolved) return;
608
+ resolved = true;
609
+ clearTimeout(timeout);
610
+ this.activeConnections.delete(ws$2);
611
+ if (closeSocket) ws$2.close();
612
+ resolve(result);
613
+ };
614
+ const state = {
615
+ agentRequestId: crypto.default.randomUUID(),
616
+ waitRequestId: crypto.default.randomUUID(),
617
+ idempotencyKey: crypto.default.randomUUID(),
618
+ lastText: "",
619
+ lastError: "",
620
+ connected: false,
621
+ prompt,
622
+ sessionKey,
623
+ ws: ws$2,
624
+ finish,
625
+ retryDeviceToken
626
+ };
627
+ timeout = setTimeout(() => {
628
+ finish({ error: `OpenClaw agent request timed out after ${this.timeoutMs}ms` });
629
+ }, this.timeoutMs);
630
+ ws$2.on("error", (err) => {
631
+ finish({ error: `OpenClaw WebSocket error: ${err.message}` });
632
+ });
633
+ ws$2.on("close", () => {
634
+ this.activeConnections.delete(ws$2);
635
+ if (!resolved) finish({ error: "OpenClaw WebSocket connection closed unexpectedly" }, false);
636
+ });
637
+ ws$2.on("message", (data) => {
638
+ const frame = this.parseFrame(data);
639
+ if (frame) this.handleFrame(frame, state);
640
+ });
641
+ });
642
+ }
643
+ parseFrame(data) {
644
+ try {
645
+ const frame = JSON.parse(data.toString());
646
+ require_logger.logger.debug("[OpenClaw Agent] Frame received", {
647
+ type: frame.type,
648
+ event: frame.event,
649
+ id: frame.id,
650
+ ok: frame.ok,
651
+ payloadStatus: frame.payload && typeof frame.payload.status === "string" ? frame.payload.status : void 0,
652
+ payloadStream: frame.payload && typeof frame.payload.stream === "string" ? frame.payload.stream : void 0
653
+ });
654
+ return frame;
655
+ } catch {
656
+ require_logger.logger.debug("[OpenClaw Agent] Failed to parse WS frame");
657
+ return;
658
+ }
659
+ }
660
+ handleFrame(frame, state) {
661
+ try {
662
+ if (frame.type === "event" && frame.event === "connect.challenge") {
663
+ this.handleConnectChallenge(frame, state);
664
+ return;
665
+ }
666
+ if (frame.type === "res" && !state.connected) {
667
+ this.handleConnectResponse(frame, state);
668
+ return;
669
+ }
670
+ if (frame.type === "res" && frame.id === state.agentRequestId) {
671
+ this.handleAgentAccepted(frame, state);
672
+ return;
673
+ }
674
+ if (frame.type === "event" && frame.event === "agent") {
675
+ this.handleAgentEvent(frame, state);
676
+ return;
677
+ }
678
+ if (frame.type === "res" && frame.id === state.waitRequestId) this.handleAgentWaitResponse(frame, state);
679
+ } catch (err) {
680
+ state.finish({ error: `OpenClaw WebSocket error: ${err instanceof Error ? err.message : String(err)}` });
681
+ }
682
+ }
683
+ handleConnectChallenge(frame, state) {
684
+ state.connectAuthState = this.buildConnectAuthState(state.retryDeviceToken);
685
+ this.sendJson(state.ws, {
686
+ type: "req",
687
+ id: crypto.default.randomUUID(),
688
+ method: "connect",
689
+ params: this.buildConnectParams(frame, state.connectAuthState)
690
+ });
691
+ }
692
+ handleConnectResponse(frame, state) {
693
+ if (!frame.ok) {
694
+ this.clearStoredDeviceTokenOnFailure(state.connectAuthState, frame.error);
695
+ state.finish({
696
+ error: this.formatConnectError(frame.error),
697
+ retryWithDeviceToken: !state.retryDeviceToken && this.shouldRetryConnectWithDeviceToken(frame.error)
698
+ });
699
+ return;
700
+ }
701
+ state.connected = true;
702
+ this.storeDeviceTokenFromHello(frame.payload, state.connectAuthState);
703
+ this.sendJson(state.ws, {
704
+ type: "req",
705
+ id: state.agentRequestId,
706
+ method: "agent",
707
+ params: this.buildAgentRequestParams(state)
708
+ });
709
+ }
710
+ buildAgentRequestParams(state) {
711
+ return {
712
+ message: state.prompt,
713
+ agentId: this.agentId,
714
+ idempotencyKey: state.idempotencyKey,
715
+ sessionKey: state.sessionKey,
716
+ ...this.openclawConfig.message_channel && { channel: this.openclawConfig.message_channel },
717
+ ...this.openclawConfig.account_id && { accountId: this.openclawConfig.account_id },
718
+ ...this.openclawConfig.thinking_level && { thinking: this.openclawConfig.thinking_level },
719
+ ...this.openclawConfig.extra_system_prompt && { extraSystemPrompt: this.openclawConfig.extra_system_prompt }
720
+ };
721
+ }
722
+ handleAgentAccepted(frame, state) {
723
+ if (!frame.ok) {
724
+ state.finish({ error: `OpenClaw agent error: ${frame.error?.message || "unknown error"}` });
725
+ return;
726
+ }
727
+ const payload = frame.payload;
728
+ state.runId = typeof payload?.runId === "string" && payload.runId.trim() ? payload.runId : void 0;
729
+ if (!state.runId) {
730
+ require_logger.logger.warn("[OpenClaw Agent] Missing runId in accepted response", {
731
+ agentId: this.agentId,
732
+ payload
733
+ });
734
+ state.finish({ error: "OpenClaw agent error: gateway accepted request without a runId" });
735
+ return;
736
+ }
737
+ this.sendJson(state.ws, {
738
+ type: "req",
739
+ id: state.waitRequestId,
740
+ method: "agent.wait",
741
+ params: {
742
+ runId: state.runId,
743
+ timeoutMs: this.timeoutMs
744
+ }
745
+ });
746
+ }
747
+ handleAgentEvent(frame, state) {
748
+ const payload = frame.payload;
749
+ if (payload?.runId && state.runId && payload.runId !== state.runId) return;
750
+ if (payload?.stream === "lifecycle" && payload.data?.phase === "error") {
751
+ state.lastError = payload.data.error || "OpenClaw agent lifecycle error";
752
+ return;
753
+ }
754
+ if (payload?.stream === "error") {
755
+ state.lastError = payload.data?.error || payload.data?.reason || "OpenClaw agent stream error";
756
+ return;
757
+ }
758
+ if (payload?.stream !== "assistant") return;
759
+ if (typeof payload?.data?.text === "string") {
760
+ state.lastText = payload.data.text;
761
+ state.lastError = "";
762
+ return;
763
+ }
764
+ if (typeof payload?.data?.delta === "string") {
765
+ state.lastText += payload.data.delta;
766
+ state.lastError = "";
767
+ }
768
+ }
769
+ handleAgentWaitResponse(frame, state) {
770
+ if (!frame.ok) {
771
+ state.finish({ error: `OpenClaw agent error: ${frame.error?.message || "unknown error"}` });
772
+ return;
773
+ }
774
+ const payload = frame.payload;
775
+ if (payload?.status === "error") {
776
+ state.finish({ error: `OpenClaw agent error: ${payload.error || "unknown error"}` });
777
+ return;
778
+ }
779
+ if (payload?.status === "timeout") {
780
+ state.finish({ error: `OpenClaw agent error: timed out waiting for run ${state.runId}` });
781
+ return;
782
+ }
783
+ const finalText = typeof payload?.output === "string" ? payload.output : typeof payload?.text === "string" ? payload.text : void 0;
784
+ if (state.lastText || finalText) {
785
+ state.finish({ output: state.lastText || finalText });
786
+ return;
787
+ }
788
+ if (state.lastError) {
789
+ state.finish({ error: `OpenClaw agent error: ${state.lastError}` });
790
+ return;
791
+ }
792
+ state.finish({ output: "No output from agent" });
793
+ }
794
+ sendJson(ws$3, payload) {
795
+ ws$3.send(JSON.stringify(payload));
796
+ }
797
+ buildWebSocketHeaders() {
798
+ const headers = {
799
+ ...this.openclawConfig.headers || {},
800
+ ...this.openclawConfig.ws_headers || {}
801
+ };
802
+ return Object.keys(headers).length > 0 ? headers : void 0;
803
+ }
804
+ buildConnectAuthState(retryDeviceToken) {
805
+ const deviceIdentity = this.loadDeviceIdentity();
806
+ const storedOrConfiguredDeviceToken = deviceIdentity ? this.resolveDeviceTokenForConnect(deviceIdentity) : void 0;
807
+ const deviceToken = retryDeviceToken || storedOrConfiguredDeviceToken;
808
+ if (retryDeviceToken) return {
809
+ auth: { deviceToken: retryDeviceToken.token },
810
+ deviceIdentity,
811
+ deviceTokenSource: retryDeviceToken.source,
812
+ kind: "deviceToken",
813
+ scopes: this.resolveScopesForDeviceToken(retryDeviceToken),
814
+ signatureToken: retryDeviceToken.token
815
+ };
816
+ if (this.authSecret && this.authKind) return {
817
+ auth: this.authKind === "password" ? { password: this.authSecret } : { token: this.authSecret },
818
+ deviceIdentity,
819
+ kind: this.authKind,
820
+ scopes: this.scopes,
821
+ signatureToken: this.authKind === "token" ? this.authSecret : null
822
+ };
823
+ if (deviceToken) return {
824
+ auth: { deviceToken: deviceToken.token },
825
+ deviceIdentity,
826
+ deviceTokenSource: deviceToken.source,
827
+ kind: "deviceToken",
828
+ scopes: this.resolveScopesForDeviceToken(deviceToken),
829
+ signatureToken: deviceToken.token
830
+ };
831
+ return {
832
+ deviceIdentity,
833
+ kind: "none",
834
+ scopes: this.scopes,
835
+ signatureToken: null
836
+ };
837
+ }
838
+ buildConnectParams(frame, authState) {
839
+ const nonce = this.extractChallengeNonce(frame);
840
+ const params = {
841
+ minProtocol: OPENCLAW_PROTOCOL_VERSION,
842
+ maxProtocol: OPENCLAW_PROTOCOL_VERSION,
843
+ client: {
844
+ id: CLIENT_ID,
845
+ displayName: "promptfoo",
846
+ version: require_version.VERSION,
847
+ platform: process.platform,
848
+ ...this.openclawConfig.device_family && { deviceFamily: this.openclawConfig.device_family },
849
+ mode: CLIENT_MODE
850
+ },
851
+ role: CLIENT_ROLE,
852
+ scopes: authState.scopes,
853
+ caps: [],
854
+ commands: [],
855
+ permissions: {},
856
+ ...authState.auth && { auth: authState.auth }
857
+ };
858
+ const device = this.buildSignedDevice(authState, nonce);
859
+ if (device) params.device = device;
860
+ return params;
861
+ }
862
+ buildSignedDevice(authState, nonce) {
863
+ if (!authState.deviceIdentity || this.openclawConfig.disable_device_auth) return;
864
+ try {
865
+ return buildSignedOpenClawDevice({
866
+ identity: authState.deviceIdentity,
867
+ clientId: CLIENT_ID,
868
+ clientMode: CLIENT_MODE,
869
+ role: CLIENT_ROLE,
870
+ scopes: authState.scopes,
871
+ nonce,
872
+ token: authState.signatureToken,
873
+ platform: process.platform,
874
+ deviceFamily: this.openclawConfig.device_family
875
+ });
876
+ } catch (err) {
877
+ require_logger.logger.warn("[OpenClaw Agent] Failed to sign device identity; connecting without device auth", { err });
878
+ return;
879
+ }
880
+ }
881
+ loadDeviceIdentity() {
882
+ if (this.openclawConfig.disable_device_auth) return;
883
+ try {
884
+ return loadOrCreateOpenClawDeviceIdentity(this.openclawConfig.device_identity_path);
885
+ } catch (err) {
886
+ require_logger.logger.warn("[OpenClaw Agent] Failed to load device identity", { err });
887
+ return;
888
+ }
889
+ }
890
+ resolveDeviceTokenForConnect(deviceIdentity) {
891
+ const configDeviceToken = this.openclawConfig.device_token?.trim();
892
+ if (configDeviceToken) return {
893
+ token: configDeviceToken,
894
+ scopes: this.scopes,
895
+ source: "config"
896
+ };
897
+ const storedDeviceToken = loadOpenClawDeviceAuthToken({
898
+ deviceId: deviceIdentity.deviceId,
899
+ role: CLIENT_ROLE,
900
+ filePath: this.openclawConfig.device_auth_path
901
+ });
902
+ if (!storedDeviceToken?.token) return;
903
+ return {
904
+ token: storedDeviceToken.token,
905
+ scopes: this.hasExplicitScopes ? this.scopes : storedDeviceToken.scopes,
906
+ source: "stored"
907
+ };
908
+ }
909
+ resolveDeviceTokenForRetry() {
910
+ const identity = this.loadDeviceIdentity();
911
+ if (!identity) return;
912
+ const deviceToken = this.resolveDeviceTokenForConnect(identity);
913
+ return deviceToken ? {
914
+ ...deviceToken,
915
+ source: "retry"
916
+ } : void 0;
917
+ }
918
+ resolveScopesForDeviceToken(deviceToken) {
919
+ if (this.hasExplicitScopes) return this.scopes;
920
+ return deviceToken.scopes && deviceToken.scopes.length > 0 ? deviceToken.scopes : this.scopes;
921
+ }
922
+ storeDeviceTokenFromHello(payload, authState) {
923
+ if (!authState?.deviceIdentity) return;
924
+ const authPayload = payload?.auth && typeof payload.auth === "object" && !Array.isArray(payload.auth) ? payload.auth : void 0;
925
+ const deviceToken = typeof authPayload?.deviceToken === "string" ? authPayload.deviceToken : "";
926
+ if (!deviceToken.trim()) return;
927
+ const scopes = getStringArray(authPayload?.scopes) || authState.scopes;
928
+ const role = typeof authPayload?.role === "string" && authPayload.role.trim() ? authPayload.role : CLIENT_ROLE;
929
+ storeOpenClawDeviceAuthToken({
930
+ deviceId: authState.deviceIdentity.deviceId,
931
+ role,
932
+ token: deviceToken,
933
+ scopes,
934
+ filePath: this.openclawConfig.device_auth_path
935
+ });
936
+ }
937
+ clearStoredDeviceTokenOnFailure(authState, error) {
938
+ if (!authState?.deviceIdentity || authState.kind !== "deviceToken" || authState.deviceTokenSource === "config") return;
939
+ const detailCode = this.getConnectErrorDetailCode(error);
940
+ const topLevelCode = error?.code;
941
+ if (detailCode !== "AUTH_DEVICE_TOKEN_MISMATCH" && topLevelCode !== "AUTH_DEVICE_TOKEN_MISMATCH") return;
942
+ clearOpenClawDeviceAuthToken({
943
+ deviceId: authState.deviceIdentity.deviceId,
944
+ role: CLIENT_ROLE,
945
+ filePath: this.openclawConfig.device_auth_path
946
+ });
947
+ }
948
+ extractChallengeNonce(frame) {
949
+ const nonce = frame.payload?.nonce;
950
+ return typeof nonce === "string" ? nonce : "";
951
+ }
952
+ getConnectErrorDetailCode(error) {
953
+ return error?.details?.code || error?.code;
954
+ }
955
+ shouldRetryConnectWithDeviceToken(error) {
956
+ const detailCode = this.getConnectErrorDetailCode(error);
957
+ const recommendedNextStep = error?.details?.recommendedNextStep;
958
+ return detailCode === "AUTH_TOKEN_MISMATCH" || error?.details?.canRetryWithDeviceToken === true || recommendedNextStep === "retry_with_device_token";
959
+ }
960
+ formatConnectError(error) {
961
+ const message = error?.message || "unknown error";
962
+ const detailCode = this.getConnectErrorDetailCode(error);
963
+ return detailCode && !message.includes(detailCode) ? `OpenClaw connect failed: ${message} (${detailCode})` : `OpenClaw connect failed: ${message}`;
964
+ }
965
+ };
966
+ //#endregion
967
+ //#region src/providers/openclaw/chat.ts
968
+ /**
969
+ * OpenClaw chat provider extends OpenAI chat completion provider.
970
+ *
971
+ * OpenClaw exposes an OpenAI-compatible HTTP API at /v1/chat/completions.
972
+ * This provider auto-detects gateway URL and bearer auth from:
973
+ * 1. Explicit config (gateway_url, auth_token, auth_password)
974
+ * 2. Environment variables (OPENCLAW_GATEWAY_URL, OPENCLAW_GATEWAY_TOKEN, OPENCLAW_GATEWAY_PASSWORD)
975
+ * 3. The active OpenClaw config file (OPENCLAW_CONFIG_PATH or ~/.openclaw/openclaw.json),
976
+ * including gateway.remote.url and gateway.tls.enabled
977
+ *
978
+ * Usage:
979
+ * openclaw - default agent (main)
980
+ * openclaw:main - specific agent
981
+ * openclaw:coding-agent - named agent
982
+ */
983
+ var OpenClawChatProvider = class extends require_chat.OpenAiChatCompletionProvider {
984
+ agentId;
985
+ constructor(agentId, providerOptions = {}) {
986
+ super(buildOpenClawModelName(agentId), buildOpenClawProviderOptions(agentId, providerOptions));
987
+ this.agentId = agentId;
988
+ }
989
+ id() {
990
+ return `openclaw:${this.agentId}`;
991
+ }
992
+ toString() {
993
+ return `[OpenClaw Provider ${this.agentId}]`;
994
+ }
995
+ getApiUrlDefault() {
996
+ return `http://${DEFAULT_GATEWAY_HOST}:${DEFAULT_GATEWAY_PORT}/v1`;
997
+ }
998
+ getApiKey() {
999
+ return this.config.apiKey;
1000
+ }
1001
+ getApiUrl() {
1002
+ return this.config.apiBaseUrl || this.getApiUrlDefault();
1003
+ }
1004
+ };
1005
+ //#endregion
1006
+ //#region src/providers/openclaw/embedding.ts
1007
+ /**
1008
+ * OpenClaw embedding provider extends the OpenAI-compatible embeddings provider.
1009
+ *
1010
+ * The OpenClaw gateway accepts agent-target model ids at /v1/embeddings and
1011
+ * optionally accepts x-openclaw-model as the backend embedding-model override.
1012
+ */
1013
+ var OpenClawEmbeddingProvider = class extends require_embedding.OpenAiEmbeddingProvider {
1014
+ agentId;
1015
+ constructor(agentId, providerOptions = {}) {
1016
+ super(buildOpenClawModelName(agentId), buildOpenClawProviderOptions(agentId, providerOptions));
1017
+ this.agentId = agentId;
1018
+ }
1019
+ id() {
1020
+ return `openclaw:embedding:${this.agentId}`;
1021
+ }
1022
+ toString() {
1023
+ return `[OpenClaw Embedding Provider ${this.agentId}]`;
1024
+ }
1025
+ getApiUrlDefault() {
1026
+ return `http://${DEFAULT_GATEWAY_HOST}:${DEFAULT_GATEWAY_PORT}/v1`;
1027
+ }
1028
+ getApiKey() {
1029
+ return this.config.apiKey;
1030
+ }
1031
+ getApiUrl() {
1032
+ return this.config.apiBaseUrl || this.getApiUrlDefault();
1033
+ }
1034
+ };
1035
+ //#endregion
1036
+ //#region src/providers/openclaw/responses.ts
1037
+ /**
1038
+ * OpenClaw Responses API Provider
1039
+ *
1040
+ * Extends OpenAI Responses API provider with OpenClaw-specific configuration.
1041
+ * Routes through the OpenClaw gateway's /v1/responses endpoint.
1042
+ *
1043
+ * Requires `gateway.http.endpoints.responses.enabled=true` in OpenClaw config.
1044
+ *
1045
+ * Usage:
1046
+ * openclaw:responses - default agent (main)
1047
+ * openclaw:responses:main - explicit agent ID
1048
+ * openclaw:responses:X - custom agent ID
1049
+ */
1050
+ var OpenClawResponsesProvider = class extends require_responses.OpenAiResponsesProvider {
1051
+ agentId;
1052
+ constructor(agentId, providerOptions = {}) {
1053
+ super(buildOpenClawModelName(agentId), buildOpenClawProviderOptions(agentId, providerOptions));
1054
+ this.agentId = agentId;
1055
+ }
1056
+ id() {
1057
+ return `openclaw:responses:${this.agentId}`;
1058
+ }
1059
+ toString() {
1060
+ return `[OpenClaw Responses Provider ${this.agentId}]`;
1061
+ }
1062
+ getApiUrlDefault() {
1063
+ return `http://${DEFAULT_GATEWAY_HOST}:${DEFAULT_GATEWAY_PORT}/v1`;
1064
+ }
1065
+ getApiKey() {
1066
+ return this.config.apiKey;
1067
+ }
1068
+ getApiUrl() {
1069
+ return this.config.apiBaseUrl || this.getApiUrlDefault();
1070
+ }
1071
+ async getOpenAiBody(prompt, context, callApiOptions) {
1072
+ const result = await super.getOpenAiBody(prompt, context, callApiOptions);
1073
+ if ("text" in result.body) delete result.body.text;
1074
+ return result;
1075
+ }
1076
+ };
1077
+ //#endregion
1078
+ //#region src/providers/openclaw/tools.ts
1079
+ /**
1080
+ * OpenClaw Tool Invoke Provider
1081
+ *
1082
+ * Simple HTTP provider for direct tool invocation via POST /tools/invoke.
1083
+ * The tool name is extracted from the provider path:
1084
+ * openclaw:tools:sessions_list → tool="sessions_list"
1085
+ *
1086
+ * The prompt is parsed as JSON for tool arguments. If it's not valid JSON,
1087
+ * it's passed as a single `input` argument.
1088
+ *
1089
+ * Usage:
1090
+ * openclaw:tools:sessions_list - invoke the sessions_list tool
1091
+ * openclaw:tools:session_status - invoke the session_status tool
1092
+ *
1093
+ * Optional config:
1094
+ * action - tool sub-action, forwarded as body.action
1095
+ * dry_run - dry-run hint, forwarded as body.dryRun
1096
+ */
1097
+ var OpenClawToolInvokeProvider = class {
1098
+ toolName;
1099
+ gatewayUrl;
1100
+ authToken;
1101
+ openclawConfig;
1102
+ timeoutMs;
1103
+ constructor(toolName, providerOptions = {}) {
1104
+ this.toolName = toolName;
1105
+ this.openclawConfig = providerOptions.config || {};
1106
+ const env = providerOptions.env;
1107
+ this.gatewayUrl = resolveGatewayUrl(this.openclawConfig, env);
1108
+ this.authToken = resolveAuthToken(this.openclawConfig, env);
1109
+ this.timeoutMs = this.openclawConfig.timeoutMs ?? require_fetch.REQUEST_TIMEOUT_MS;
1110
+ }
1111
+ id() {
1112
+ return `openclaw:tools:${this.toolName}`;
1113
+ }
1114
+ toString() {
1115
+ return `[OpenClaw Tool Provider ${this.toolName}]`;
1116
+ }
1117
+ toJSON() {
1118
+ return { provider: this.id() };
1119
+ }
1120
+ async callApi(prompt) {
1121
+ let args;
1122
+ try {
1123
+ args = JSON.parse(prompt);
1124
+ } catch {
1125
+ args = { input: prompt };
1126
+ }
1127
+ const url = `${this.gatewayUrl}/tools/invoke`;
1128
+ const headers = {
1129
+ "Content-Type": "application/json",
1130
+ ...this.openclawConfig.headers || {},
1131
+ ...buildOpenClawContextHeaders(this.openclawConfig)
1132
+ };
1133
+ if (this.authToken) headers["Authorization"] = `Bearer ${this.authToken}`;
1134
+ const body = {
1135
+ tool: this.toolName,
1136
+ ...this.openclawConfig.action && { action: this.openclawConfig.action },
1137
+ args,
1138
+ ...typeof this.openclawConfig.dry_run === "boolean" && { dryRun: this.openclawConfig.dry_run },
1139
+ ...this.openclawConfig.session_key && { sessionKey: this.openclawConfig.session_key }
1140
+ };
1141
+ require_logger.logger.debug(`[OpenClaw Tool] POST ${url}`, {
1142
+ tool: this.toolName,
1143
+ args
1144
+ });
1145
+ try {
1146
+ const controller = new AbortController();
1147
+ const fetchTimeout = setTimeout(() => controller.abort(), this.timeoutMs);
1148
+ const response = await require_fetch.fetchWithProxy(url, {
1149
+ method: "POST",
1150
+ headers,
1151
+ body: JSON.stringify(body),
1152
+ signal: controller.signal
1153
+ }).finally(() => clearTimeout(fetchTimeout));
1154
+ if (!response.ok) {
1155
+ const text = await response.text();
1156
+ return { error: `OpenClaw tool invoke failed (${response.status}): ${text}` };
1157
+ }
1158
+ const data = await response.json();
1159
+ if (data.ok) return { output: typeof data.result === "string" ? data.result : JSON.stringify(data.result) };
1160
+ if (typeof data.error === "string") return { error: data.error };
1161
+ return { error: data.error?.message || data.error?.type || data.error?.code || "Unknown tool error" };
1162
+ } catch (err) {
1163
+ return { error: `OpenClaw tool invoke error: ${err instanceof Error ? err.message : String(err)}` };
1164
+ }
1165
+ }
1166
+ };
1167
+ //#endregion
1168
+ //#region src/providers/openclaw/index.ts
1169
+ /**
1170
+ * Create an OpenClaw provider from a provider path string.
1171
+ *
1172
+ * Routing:
1173
+ * openclaw → OpenClawChatProvider('main')
1174
+ * openclaw:main → OpenClawChatProvider('main')
1175
+ * openclaw:my-agent → OpenClawChatProvider('my-agent')
1176
+ * openclaw:responses → OpenClawResponsesProvider('main')
1177
+ * openclaw:responses:X → OpenClawResponsesProvider('X')
1178
+ * openclaw:embedding → OpenClawEmbeddingProvider('main')
1179
+ * openclaw:embedding:X → OpenClawEmbeddingProvider('X')
1180
+ * openclaw:embeddings → OpenClawEmbeddingProvider('main')
1181
+ * openclaw:embeddings:X → OpenClawEmbeddingProvider('X')
1182
+ * openclaw:agent → OpenClawAgentProvider('main')
1183
+ * openclaw:agent:X → OpenClawAgentProvider('X')
1184
+ * openclaw:tools:sessions_list → OpenClawToolInvokeProvider('sessions_list')
1185
+ */
1186
+ function createOpenClawProvider(providerPath, providerOptions = {}, env) {
1187
+ const splits = providerPath.split(":");
1188
+ const keyword = splits[1];
1189
+ const opts = {
1190
+ ...providerOptions,
1191
+ env
1192
+ };
1193
+ if (keyword === "responses") return new OpenClawResponsesProvider(splits[2] || "main", opts);
1194
+ if (keyword === "embedding" || keyword === "embeddings") return new OpenClawEmbeddingProvider(splits[2] || "main", opts);
1195
+ if (keyword === "agent") return new OpenClawAgentProvider(splits[2] || "main", opts);
1196
+ if (keyword === "tools") {
1197
+ const toolName = splits.slice(2).join(":");
1198
+ if (!toolName) throw new Error("OpenClaw tools provider requires a tool name: openclaw:tools:<tool-name>");
1199
+ return new OpenClawToolInvokeProvider(toolName, opts);
1200
+ }
1201
+ return new OpenClawChatProvider(splits.length > 1 ? splits.slice(1).join(":") : "main", opts);
1202
+ }
1203
+ //#endregion
1204
+ exports.createOpenClawProvider = createOpenClawProvider;
1205
+
1206
+ //# sourceMappingURL=openclaw-DUBZP3GL.cjs.map