@openhands/agent-canvas 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (766) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BkL3HWa3.js → acp-providers-D1PORKc0.js} +1 -1
  4. package/build/assets/active-backend-context-IqOjobNK.js +2 -0
  5. package/build/assets/{agent-context-settings-Bno1nwPL.js → agent-context-settings-DMrObcIS.js} +1 -1
  6. package/build/assets/agent-profiles-settings-DororXN5.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +86 -0
  8. package/build/assets/{agent-settings-h8hQz-IU.js → agent-settings-BJVk92PU.js} +1 -1
  9. package/build/assets/agent-settings-COfJsQ1d.js +1 -0
  10. package/build/assets/{alert-banner-lrK-2_0Y.js → alert-banner-CzZsm7ms.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Qsb83VX1.js → api-key-entry-screen-D8Fade_-.js} +1 -1
  12. package/build/assets/app-settings-CpyGB3AT.js +1 -0
  13. package/build/assets/{automation-detail-7LkL91j9.js → automation-detail-B-jQ39Mm.js} +1 -1
  14. package/build/assets/{automation-export-U2QNyNy6.js → automation-export-B1dywoqk.js} +1 -1
  15. package/build/assets/{automation-setup-route-Bel9_Lue.js → automation-setup-route-C-bWUZBi.js} +1 -1
  16. package/build/assets/{automation-templates-CRLDssaI.js → automation-templates-DgpCGOJV.js} +1 -1
  17. package/build/assets/{automations-list-B2iV3ZKW.js → automations-list-DnMxlxsL.js} +1 -1
  18. package/build/assets/{back-nav-button-B3pYwmUJ.js → back-nav-button-HHEneWMw.js} +1 -1
  19. package/build/assets/backend-form-modal-DiVrD4Cm.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-DB4717Iu.js → backend-synced-settings-badge-7MIjpr8M.js} +1 -1
  21. package/build/assets/{badge-yR53enbU.js → badge-CpYmcVZV.js} +1 -1
  22. package/build/assets/{base-modal-3NmIOKDm.js → base-modal-Fnh6Uln9.js} +1 -1
  23. package/build/assets/bot-BQZx8e2i.js +1 -0
  24. package/build/assets/{brand-button-CJcwjnfb.js → brand-button-swT1RyO0.js} +1 -1
  25. package/build/assets/browser-B9AbV6kG.js +7 -0
  26. package/build/assets/{browser-tab-A94o33Vn.js → browser-tab-zAY12m_i.js} +1 -1
  27. package/build/assets/{chat-send-button-B8n6-DQA.js → chat-send-button-DsJtivmL.js} +1 -1
  28. package/build/assets/check-WAFXrrs_.js +1 -0
  29. package/build/assets/chevron-down-CifNWzme.js +1 -0
  30. package/build/assets/circle-check-CtnimJa8.js +1 -0
  31. package/build/assets/{circle-plus-check-toggle-BVzv5EkZ.js → circle-plus-check-toggle-Cuzx55bo.js} +1 -1
  32. package/build/assets/{cloud-funnel-analytics-CBQdPZl_.js → cloud-funnel-analytics-86CwNdSh.js} +1 -1
  33. package/build/assets/{combobox-caret-BlmRwiM8.js → combobox-caret-D0fRotFi.js} +1 -1
  34. package/build/assets/{command-menu-PsRXVBz2.js → command-menu-BXy03FBl.js} +1 -1
  35. package/build/assets/{condenser-settings-w7L3EFvm.js → condenser-settings-BmZa0ui_.js} +1 -1
  36. package/build/assets/{confirmation-modal-DAH0XtOp.js → confirmation-modal-BgoN6lbN.js} +1 -1
  37. package/build/assets/{context-menu-list-item-BQhmFVEK.js → context-menu-list-item-Bq02tc-P.js} +1 -1
  38. package/build/assets/conversation-BPo8SvLN.js +1 -0
  39. package/build/assets/conversation-CPCVsCUY.js +90 -0
  40. package/build/assets/conversation-panel-BPo8SvLN.js +1 -0
  41. package/build/assets/{conversation-state-store-Bs8gA263.js → conversation-state-store-C5YpjMNy.js} +1 -1
  42. package/build/assets/conversation-store-Blc5xysY.js +6 -0
  43. package/build/assets/{conversation-tab-empty-state-C9sfDOlt.js → conversation-tab-empty-state-CMqo_0Bd.js} +1 -1
  44. package/build/assets/{copy-to-clipboard-button-DatoElj8.js → copy-to-clipboard-button-Cg1pF0xn.js} +1 -1
  45. package/build/assets/{device-verify-BIjXeW9N.js → device-verify-BfQLgNyq.js} +1 -1
  46. package/build/assets/{dropdown-classes-zFW7qPSK.js → dropdown-classes-BIqQr5mx.js} +1 -1
  47. package/build/assets/{entry.client-DzbDyLkV.js → entry.client-CxFjRYqH.js} +2 -2
  48. package/build/assets/{enum-filter-dropdown-CctILg5t.js → enum-filter-dropdown-C_yV4_bo.js} +1 -1
  49. package/build/assets/{environment-switch-overlay-Cvmo6clk.js → environment-switch-overlay-Bi4qbh2g.js} +1 -1
  50. package/build/assets/{extensions-hub-DOmHPGTA.js → extensions-hub-BqUINAhp.js} +1 -1
  51. package/build/assets/{extensions-navigation-6zU5M1pa.js → extensions-navigation-lraj88Wk.js} +1 -1
  52. package/build/assets/external-link-CgtpA_a1.js +1 -0
  53. package/build/assets/{file-text-RecuaId_.js → file-text-DEK4LSVw.js} +1 -1
  54. package/build/assets/files-tab-DV0L-lFE.js +1 -0
  55. package/build/assets/{form-control-classes-DLN3Qgub.js → form-control-classes-7yFSQJq_.js} +1 -1
  56. package/build/assets/format-model-name-BN_rx1Y3.js +1 -0
  57. package/build/assets/{format-relative-time-DGPQlPx0.js → format-relative-time-DSErAuVr.js} +1 -1
  58. package/build/assets/git-provider-icon-BvlLAche.js +1 -0
  59. package/build/assets/{git-repo-dropdown-B7RvO70z.js → git-repo-dropdown-ByMzpNko.js} +1 -1
  60. package/build/assets/git-repo-dropdown-C6R7hgM8.js +1 -0
  61. package/build/assets/{highlighted-source-view-CgJfD5VT.js → highlighted-source-view-C_sfncLZ.js} +1 -1
  62. package/build/assets/{home-DEZaZqYv.js → home-BOrlwLqG.js} +1 -1
  63. package/build/assets/home-BvMNC6E-.js +1 -0
  64. package/build/assets/{home-store-D7CjMN_-.js → home-store-CxqsY9Fi.js} +1 -1
  65. package/build/assets/index-home-BvMNC6E-.js +1 -0
  66. package/build/assets/info-BRVcJAUg.js +1 -0
  67. package/build/assets/{install-server-modal-BTwK5lbi.js → install-server-modal-Bl4G1zF4.js} +1 -1
  68. package/build/assets/{kebab-menu-item-content-C4CkeiJO.js → kebab-menu-item-content-BGoGFEAg.js} +1 -1
  69. package/build/assets/{launch-DVlx4v9o.js → launch-CkqiSCqi.js} +1 -1
  70. package/build/assets/{list-todo-CheUtB7F.js → list-todo-DNWlzfaM.js} +1 -1
  71. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +27 -0
  72. package/build/assets/llm-settings-B-pkVCrt.js +1 -0
  73. package/build/assets/llm-settings-DSC0-IQ7.js +1 -0
  74. package/build/assets/llm-subscription-service-BAdOl5Xx.js +1 -0
  75. package/build/assets/loader-circle-B47W9XqT.js +1 -0
  76. package/build/assets/{loading-spinner-CN3riY7k.js → loading-spinner-xhnrGP4Y.js} +1 -1
  77. package/build/assets/{manage-backends-modal-HNWKLYhq.js → manage-backends-modal-DhGk5mJt.js} +1 -1
  78. package/build/assets/manifest-653b89aa.js +1 -0
  79. package/build/assets/{manifest-subpage-layout-D-m-h8_t.js → manifest-subpage-layout-CKWvL2ig.js} +1 -1
  80. package/build/assets/{map-provider-7Bp2aih5.js → map-provider-Mx8mZuE-.js} +1 -1
  81. package/build/assets/markdown-renderer-DUmk7pFc.js +8 -0
  82. package/build/assets/{mcp-gLgPP7AS.js → mcp-DCkvl6K0.js} +2 -2
  83. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +1 -0
  84. package/build/assets/messages-DSXvyc21.js +40 -0
  85. package/build/assets/{modal-body-duRaxj_K.js → modal-body-gIe21fDv.js} +1 -1
  86. package/build/assets/{modal-classes-CLEXO6dj.js → modal-classes-D66dlgZ7.js} +1 -1
  87. package/build/assets/{modal-close-button-D0aT02hs.js → modal-close-button-B6iOGYpI.js} +1 -1
  88. package/build/assets/{mouse-pointer-click-Px-dXWcS.js → mouse-pointer-click-BYX1Pw5W.js} +1 -1
  89. package/build/assets/{npm-DRzJF5Zn.js → npm-DLckoeJc.js} +1 -1
  90. package/build/assets/{onboarding-DSr8hOpk.js → onboarding-D7WDG66N.js} +1 -1
  91. package/build/assets/{onboarding-modal-C6Euf7N4.js → onboarding-modal-C_xVrFNv.js} +1 -1
  92. package/build/assets/{organization-service.api-C4GYWwj9.js → organization-service.api-D-s9z18a.js} +1 -1
  93. package/build/assets/pencil-BGOCPRyu.js +1 -0
  94. package/build/assets/{planner-tab-CZcguxTK.js → planner-tab-AKaXIIfg.js} +1 -1
  95. package/build/assets/{plugins-management-service-BmDzOQsd.js → plugins-management-service-wtmY4QQw.js} +1 -1
  96. package/build/assets/plus-zNEL8rcX.js +1 -0
  97. package/build/assets/{profiles-service.api-CoLTwjc1.js → profiles-service.api-DCMYxHMi.js} +1 -1
  98. package/build/assets/{providers-tBzTpz1w.js → providers-BjrtjX4L.js} +1 -1
  99. package/build/assets/{proxy-DCI9S-LA.js → proxy-9Z_WZggZ.js} +1 -1
  100. package/build/assets/{puzzle-B3v361yY.js → puzzle-BWLmN8z4.js} +1 -1
  101. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +1 -0
  102. package/build/assets/refresh-cw-CXtFWpwv.js +1 -0
  103. package/build/assets/root-CanxKlNV.css +1 -0
  104. package/build/assets/root-DkfG_UWR.js +2 -0
  105. package/build/assets/root-layout-D75LHYhh.js +2 -0
  106. package/build/assets/{schema-field-zhsVDllR.js → schema-field-OnM5Uob_.js} +1 -1
  107. package/build/assets/{sdk-section-page-CS4GWn0y.js → sdk-section-page-m5WQm2sy.js} +1 -1
  108. package/build/assets/search-CycosyjN.js +1 -0
  109. package/build/assets/{secrets-service-DjgGduXk.js → secrets-service-B26R61C1.js} +1 -1
  110. package/build/assets/{secrets-settings-f-qahfbi.js → secrets-settings-CbLYCKOX.js} +1 -1
  111. package/build/assets/{segmented-toggle-SmvsR3jW.js → segmented-toggle-DCspm2U5.js} +1 -1
  112. package/build/assets/{settings-DQd0xLEw.js → settings-BJQI_iBM.js} +1 -1
  113. package/build/assets/{settings-dropdown-input-TWIeiG02.js → settings-dropdown-input-BI8V_Nov.js} +1 -1
  114. package/build/assets/{settings-index-BVwy9JEp.js → settings-index-BiTqJoH7.js} +1 -1
  115. package/build/assets/{settings-input-D61Vzp9e.js → settings-input-Cz62hWVW.js} +1 -1
  116. package/build/assets/{settings-list-classes-sE0ASr1s.js → settings-list-classes-z_3FW5H3.js} +1 -1
  117. package/build/assets/{settings-modal-D6D5ngET.js → settings-modal-BIrIVn97.js} +1 -1
  118. package/build/assets/{settings-service.api-DZp7E7A9.js → settings-service.api--rJmnuLa.js} +1 -1
  119. package/build/assets/{settings-switch-Drt-rF5s.js → settings-switch-BRsSI8Vs.js} +1 -1
  120. package/build/assets/{settings-utils-gw2ppAvw.js → settings-utils-Ba7vel6T.js} +1 -1
  121. package/build/assets/shared-conversation-CQK_PqHx.js +1 -0
  122. package/build/assets/shield-check-T3JsDJiM.js +1 -0
  123. package/build/assets/{sidebar-layout-Dxg6zc2K.js → sidebar-layout-Bhi3hVcu.js} +1 -1
  124. package/build/assets/{sidebar-mobile-menu-toggle-OoZBHxaT.js → sidebar-mobile-menu-toggle-YWJNRN4p.js} +1 -1
  125. package/build/assets/{sidebar-nav-link-CxLoG-dG.js → sidebar-nav-link-BSUlY5Ml.js} +1 -1
  126. package/build/assets/{sidebar-store-BJeYY-E9.js → sidebar-store-Cl1cUv_F.js} +1 -1
  127. package/build/assets/{skill-card-pill-row-B_BYBONu.js → skill-card-pill-row-BXz8L8Rn.js} +1 -1
  128. package/build/assets/{skill-icon-badge-CN41Hy9l.js → skill-icon-badge-QgfKv31M.js} +1 -1
  129. package/build/assets/{skill-scope-B1Per5XI.js → skill-scope-Dc3JPW-8.js} +1 -1
  130. package/build/assets/{skills-plugins-B3AO6sMz.js → skills-plugins-CpTV27n3.js} +1 -1
  131. package/build/assets/{skills-settings-DmmgJ6CT.js → skills-settings-CSW__IW4.js} +1 -1
  132. package/build/assets/{sparkles-g7y3r-Ut.js → sparkles-TJ0mdECe.js} +1 -1
  133. package/build/assets/{styled-tooltip-C5C07RQC.js → styled-tooltip-BUMSbgrF.js} +1 -1
  134. package/build/assets/{task-list-tab-C19Q_JNf.js → task-list-tab-mAHMOkUz.js} +1 -1
  135. package/build/assets/{terminal-CbuMRYal.js → terminal-BzxBaHx2.js} +1 -1
  136. package/build/assets/{toggle-switch-CIioisto.js → toggle-switch-O5v1FgxW.js} +1 -1
  137. package/build/assets/trash-2-C0xNVp9c.js +1 -0
  138. package/build/assets/{typography-D9tiHct7.js → typography-NOKSk9_R.js} +1 -1
  139. package/build/assets/usage-tab-tEmVN0KD.js +1 -0
  140. package/build/assets/{use-acp-credential-form-DJmmJKMo.js → use-acp-credential-form-BPNi0Zbm.js} +1 -1
  141. package/build/assets/{use-activate-agent-profile-CeFfYwu_.js → use-activate-agent-profile-D9YRQPTF.js} +1 -1
  142. package/build/assets/{use-agent-profiles-BHLkLbRR.js → use-agent-profiles-Cb2zUW3l.js} +1 -1
  143. package/build/assets/{use-can-manage-org-profiles-Bu4y8gSx.js → use-can-manage-org-profiles-Dxzq2AEd.js} +1 -1
  144. package/build/assets/{use-cloud-current-user-id-QD9x3ySO.js → use-cloud-current-user-id-Co2eJk2A.js} +1 -1
  145. package/build/assets/{use-config-CPwqciXN.js → use-config-DKAMiI5R.js} +1 -1
  146. package/build/assets/use-create-conversation-CoHTiCbI.js +1 -0
  147. package/build/assets/{use-create-secret-BsOfOLvg.js → use-create-secret-2zBlCDsF.js} +1 -1
  148. package/build/assets/use-is-authed-C52-ivnB.js +1 -0
  149. package/build/assets/{use-is-creating-conversation-CVefC9Ns.js → use-is-creating-conversation-DdaAE6jV.js} +1 -1
  150. package/build/assets/{use-launch-skill-in-chat-BcKNjxxd.js → use-launch-skill-in-chat-COnDpxCQ.js} +1 -1
  151. package/build/assets/use-llm-profiles-C_BHue65.js +1 -0
  152. package/build/assets/{use-manifest-capabilities-DBYPjyV6.js → use-manifest-capabilities-DPrQsaPP.js} +1 -1
  153. package/build/assets/{use-onboarding-completion-CtNJxkXG.js → use-onboarding-completion-CCE8OQgV.js} +1 -1
  154. package/build/assets/{use-plugins-marketplace-ZEA-gyM9.js → use-plugins-marketplace-CEiak69h.js} +1 -1
  155. package/build/assets/use-save-agent-profile-DK9idD6a.js +1 -0
  156. package/build/assets/{use-save-settings-pSjRhD_m.js → use-save-settings-DNmnbG6f.js} +1 -1
  157. package/build/assets/{use-settings-nav-items-CQgkxUbV.js → use-settings-nav-items-BlFL7YhM.js} +1 -1
  158. package/build/assets/{use-settings-BHWsOcIG.js → use-settings-wCwPaSIv.js} +1 -1
  159. package/build/assets/{use-tracking-CGCsBWhg.js → use-tracking-CVwPmhlX.js} +1 -1
  160. package/build/assets/{use-user-conversation-DRfEU8x0.js → use-user-conversation-DVtfg0B_.js} +1 -1
  161. package/build/assets/{useInfiniteQuery-DbCv0Jzd.js → useInfiniteQuery-p1xq35r2.js} +1 -1
  162. package/build/assets/{useMutation-ChpkYxI5.js → useMutation-BFDQmgk9.js} +1 -1
  163. package/build/assets/{useQueries-Cjv3E8_1.js → useQueries-DF1NAAeC.js} +1 -1
  164. package/build/assets/{useQuery-BCnzy4LX.js → useQuery-DRv--6bK.js} +1 -1
  165. package/build/assets/utils-zxEjKE70.js +1 -0
  166. package/build/assets/{vendor~browser-DJ1pl_wn.js → vendor~browser-B-fae1JU.js} +14 -14
  167. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js} +3 -3
  168. package/build/assets/{vendor~files-tab-C87pjSpi.js → vendor~files-tab-D9wR9yM2.js} +1 -1
  169. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +13 -0
  170. package/build/assets/vendor~root-layout-C-IgVx6e.js +1 -0
  171. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js → vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js} +1 -1
  172. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js} +1 -1
  173. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js} +1 -1
  174. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js} +1 -1
  175. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js} +2 -2
  176. package/build/assets/{verification-settings-BItwt998.js → verification-settings-B8UMQ7MG.js} +1 -1
  177. package/build/assets/{wrench-B1_H-tL1.js → wrench-DIka3hCq.js} +1 -1
  178. package/build/assets/x-BWKA2Ver.js +1 -0
  179. package/build/assets/zap-DHddTPc0.js +1 -0
  180. package/build/index.html +4 -4
  181. package/build/locales/ar/openhands.json +28 -1
  182. package/build/locales/ca/openhands.json +28 -1
  183. package/build/locales/de/openhands.json +28 -1
  184. package/build/locales/en/openhands.json +28 -1
  185. package/build/locales/es/openhands.json +28 -1
  186. package/build/locales/fr/openhands.json +28 -1
  187. package/build/locales/it/openhands.json +28 -1
  188. package/build/locales/ja/openhands.json +28 -1
  189. package/build/locales/ko-KR/openhands.json +28 -1
  190. package/build/locales/no/openhands.json +28 -1
  191. package/build/locales/pt/openhands.json +28 -1
  192. package/build/locales/tr/openhands.json +28 -1
  193. package/build/locales/uk/openhands.json +28 -1
  194. package/build/locales/zh-CN/openhands.json +28 -1
  195. package/build/locales/zh-TW/openhands.json +28 -1
  196. package/config/defaults.json +3 -3
  197. package/dist/api/agent-server-compatibility.cjs +1 -1
  198. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  199. package/dist/api/agent-server-compatibility.js +1 -1
  200. package/dist/api/agent-server-compatibility.js.map +1 -1
  201. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  202. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  203. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +24 -1
  204. package/dist/api/conversation-service/agent-server-conversation-service.api.js +116 -97
  205. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  206. package/dist/api/llm-balance-service.cjs +2 -0
  207. package/dist/api/llm-balance-service.cjs.map +1 -0
  208. package/dist/api/llm-balance-service.d.ts +33 -0
  209. package/dist/api/llm-balance-service.js +53 -0
  210. package/dist/api/llm-balance-service.js.map +1 -0
  211. package/dist/api/llm-subscription-service.cjs +1 -1
  212. package/dist/api/llm-subscription-service.cjs.map +1 -1
  213. package/dist/api/llm-subscription-service.js +42 -34
  214. package/dist/api/llm-subscription-service.js.map +1 -1
  215. package/dist/components/conversation/index.cjs +1 -1
  216. package/dist/components/conversation/index.d.ts +0 -1
  217. package/dist/components/conversation/index.js +0 -1
  218. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  219. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +1 -1
  221. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  222. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  223. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  224. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +24 -23
  225. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  226. package/dist/components/conversation-events/chat/group-events.cjs +1 -1
  227. package/dist/components/conversation-events/chat/group-events.cjs.map +1 -1
  228. package/dist/components/conversation-events/chat/group-events.d.ts +3 -3
  229. package/dist/components/conversation-events/chat/group-events.js +27 -26
  230. package/dist/components/conversation-events/chat/group-events.js.map +1 -1
  231. package/dist/components/features/automations/recommended-automations-section.d.ts +7 -0
  232. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  233. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  234. package/dist/components/features/chat/components/chat-input-actions.js +123 -118
  235. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  236. package/dist/components/features/chat/components/chat-input-grip.cjs +1 -1
  237. package/dist/components/features/chat/components/chat-input-grip.cjs.map +1 -1
  238. package/dist/components/features/chat/components/chat-input-grip.d.ts +2 -1
  239. package/dist/components/features/chat/components/chat-input-grip.js +7 -7
  240. package/dist/components/features/chat/components/chat-input-grip.js.map +1 -1
  241. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  242. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  243. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +61 -60
  244. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  245. package/dist/components/features/chat/components/context-window-meter.cjs +2 -0
  246. package/dist/components/features/chat/components/context-window-meter.cjs.map +1 -0
  247. package/dist/components/features/chat/components/context-window-meter.d.ts +2 -0
  248. package/dist/components/features/chat/components/context-window-meter.js +131 -0
  249. package/dist/components/features/chat/components/context-window-meter.js.map +1 -0
  250. package/dist/components/features/chat/components/context-window-ring.cjs +2 -0
  251. package/dist/components/features/chat/components/context-window-ring.cjs.map +1 -0
  252. package/dist/components/features/chat/components/context-window-ring.d.ts +26 -0
  253. package/dist/components/features/chat/components/context-window-ring.js +45 -0
  254. package/dist/components/features/chat/components/context-window-ring.js.map +1 -0
  255. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  256. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  257. package/dist/components/features/chat/custom-chat-input.js +68 -67
  258. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  259. package/dist/components/features/chat/model-messages.cjs +1 -1
  260. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  261. package/dist/components/features/chat/model-messages.js +26 -25
  262. package/dist/components/features/chat/model-messages.js.map +1 -1
  263. package/dist/components/features/chat/path-component.cjs +1 -1
  264. package/dist/components/features/chat/path-component.cjs.map +1 -1
  265. package/dist/components/features/chat/path-component.js +9 -6
  266. package/dist/components/features/chat/path-component.js.map +1 -1
  267. package/dist/components/features/chat/plan-preview.cjs +1 -1
  268. package/dist/components/features/chat/plan-preview.js +4 -4
  269. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  270. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  271. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.d.ts +0 -8
  272. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +92 -50
  273. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  274. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  275. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  276. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +7 -2
  277. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +15 -9
  278. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  279. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs +2 -0
  280. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.cjs.map +1 -0
  281. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.d.ts +20 -0
  282. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js +76 -0
  283. package/dist/components/features/chat/tool-visualizers/primitives/markdown-file-preview.js.map +1 -0
  284. package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
  285. package/dist/components/features/controls/server-status-context-menu.cjs.map +1 -1
  286. package/dist/components/features/controls/server-status-context-menu.d.ts +5 -3
  287. package/dist/components/features/controls/server-status-context-menu.js +8 -8
  288. package/dist/components/features/controls/server-status-context-menu.js.map +1 -1
  289. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  290. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  291. package/dist/components/features/conversation/conversation-name-context-menu.js +58 -61
  292. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  293. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  294. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  295. package/dist/components/features/conversation/conversation-name-with-status.js +74 -46
  296. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  297. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  298. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  299. package/dist/components/features/conversation/conversation-name.js +69 -71
  300. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  301. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  302. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  303. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +7 -6
  304. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  305. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  306. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  307. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +92 -86
  308. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  309. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  310. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  311. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +81 -71
  312. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  313. package/dist/components/features/conversation/metrics-modal/cost-section.cjs +1 -1
  314. package/dist/components/features/conversation/metrics-modal/cost-section.cjs.map +1 -1
  315. package/dist/components/features/conversation/metrics-modal/cost-section.js +6 -6
  316. package/dist/components/features/conversation/metrics-modal/cost-section.js.map +1 -1
  317. package/dist/components/features/conversation/metrics-modal/metric-row.cjs +1 -1
  318. package/dist/components/features/conversation/metrics-modal/metric-row.cjs.map +1 -1
  319. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +2 -1
  320. package/dist/components/features/conversation/metrics-modal/metric-row.js +10 -9
  321. package/dist/components/features/conversation/metrics-modal/metric-row.js.map +1 -1
  322. package/dist/components/features/conversation/metrics-modal/usage-section.cjs +1 -1
  323. package/dist/components/features/conversation/metrics-modal/usage-section.cjs.map +1 -1
  324. package/dist/components/features/conversation/metrics-modal/usage-section.js +2 -1
  325. package/dist/components/features/conversation/metrics-modal/usage-section.js.map +1 -1
  326. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs +2 -0
  327. package/dist/components/features/conversation/usage-panel/compact-context-button.cjs.map +1 -0
  328. package/dist/components/features/conversation/usage-panel/compact-context-button.d.ts +16 -0
  329. package/dist/components/features/conversation/usage-panel/compact-context-button.js +59 -0
  330. package/dist/components/features/conversation/usage-panel/compact-context-button.js.map +1 -0
  331. package/dist/components/features/conversation/usage-panel/context-meter.cjs +2 -0
  332. package/dist/components/features/conversation/usage-panel/context-meter.cjs.map +1 -0
  333. package/dist/components/features/conversation/usage-panel/context-meter.d.ts +19 -0
  334. package/dist/components/features/conversation/usage-panel/context-meter.js +46 -0
  335. package/dist/components/features/conversation/usage-panel/context-meter.js.map +1 -0
  336. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs +2 -0
  337. package/dist/components/features/conversation/usage-panel/provider-balance-card.cjs.map +1 -0
  338. package/dist/components/features/conversation/usage-panel/provider-balance-card.d.ts +7 -0
  339. package/dist/components/features/conversation/usage-panel/provider-balance-card.js +57 -0
  340. package/dist/components/features/conversation/usage-panel/provider-balance-card.js.map +1 -0
  341. package/dist/components/features/conversation/usage-panel/usage-panel.cjs +2 -0
  342. package/dist/components/features/conversation/usage-panel/usage-panel.cjs.map +1 -0
  343. package/dist/components/features/conversation/usage-panel/usage-panel.d.ts +9 -0
  344. package/dist/components/features/conversation/usage-panel/usage-panel.js +68 -0
  345. package/dist/components/features/conversation/usage-panel/usage-panel.js.map +1 -0
  346. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  347. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  348. package/dist/components/features/conversation-panel/budget-display.js +10 -13
  349. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  350. package/dist/components/features/conversation-panel/budget-progress-bar.cjs +1 -1
  351. package/dist/components/features/conversation-panel/budget-progress-bar.cjs.map +1 -1
  352. package/dist/components/features/conversation-panel/budget-progress-bar.js +2 -2
  353. package/dist/components/features/conversation-panel/budget-progress-bar.js.map +1 -1
  354. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs +2 -0
  355. package/dist/components/features/conversation-panel/confirm-archive-modal.cjs.map +1 -0
  356. package/dist/components/features/conversation-panel/confirm-archive-modal.d.ts +8 -0
  357. package/dist/components/features/conversation-panel/confirm-archive-modal.js +48 -0
  358. package/dist/components/features/conversation-panel/confirm-archive-modal.js.map +1 -0
  359. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  360. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  361. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +3 -1
  362. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +39 -34
  363. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  364. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  365. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  366. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +3 -1
  367. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +104 -80
  368. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  369. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  370. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  371. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +7 -1
  372. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +28 -20
  373. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  374. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  375. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  376. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +9 -1
  377. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +94 -84
  378. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  379. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs +1 -1
  380. package/dist/components/features/conversation-panel/conversation-group-folder-list.cjs.map +1 -1
  381. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +2 -1
  382. package/dist/components/features/conversation-panel/conversation-group-folder-list.js +32 -31
  383. package/dist/components/features/conversation-panel/conversation-group-folder-list.js.map +1 -1
  384. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs +1 -1
  385. package/dist/components/features/conversation-panel/conversation-group-folder-row.cjs.map +1 -1
  386. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +2 -1
  387. package/dist/components/features/conversation-panel/conversation-group-folder-row.js +27 -26
  388. package/dist/components/features/conversation-panel/conversation-group-folder-row.js.map +1 -1
  389. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  390. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  391. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +3 -1
  392. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +116 -106
  393. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  394. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  395. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  396. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +27 -0
  397. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +69 -46
  398. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  399. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  400. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  401. package/dist/components/features/conversation-panel/conversation-panel.js +230 -165
  402. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  403. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  404. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  405. package/dist/components/features/files-tab/file-content-viewer.js +22 -25
  406. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  407. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  408. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  409. package/dist/components/features/markdown/markdown-table-scroll.js +2 -2
  410. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  411. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  412. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -0
  413. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  414. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  415. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +2 -2
  416. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  417. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
  418. package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
  419. package/dist/components/shared/modals/confirmation-modals/base-modal.js +1 -1
  420. package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
  421. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  422. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  423. package/dist/components/shared/modals/settings/model-selector.js +154 -98
  424. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  425. package/dist/config/defaults.cjs +1 -1
  426. package/dist/config/defaults.cjs.map +1 -1
  427. package/dist/config/defaults.js +3 -3
  428. package/dist/config/defaults.js.map +1 -1
  429. package/dist/constants/llm-balance.cjs +2 -0
  430. package/dist/constants/llm-balance.cjs.map +1 -0
  431. package/dist/constants/llm-balance.d.ts +13 -0
  432. package/dist/constants/llm-balance.js +6 -0
  433. package/dist/constants/llm-balance.js.map +1 -0
  434. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  435. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  436. package/dist/contexts/conversation-websocket-context.js +217 -209
  437. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  438. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  439. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  440. package/dist/hooks/chat/use-grip-resize.d.ts +1 -0
  441. package/dist/hooks/chat/use-grip-resize.js +39 -30
  442. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  443. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  444. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  445. package/dist/hooks/chat/use-slash-command.js +61 -60
  446. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  447. package/dist/hooks/mutation/use-condense-conversation.cjs +2 -0
  448. package/dist/hooks/mutation/use-condense-conversation.cjs.map +1 -0
  449. package/dist/hooks/mutation/use-condense-conversation.d.ts +12 -0
  450. package/dist/hooks/mutation/use-condense-conversation.js +17 -0
  451. package/dist/hooks/mutation/use-condense-conversation.js.map +1 -0
  452. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  453. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  454. package/dist/hooks/mutation/use-create-conversation.js +30 -21
  455. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  456. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  457. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  458. package/dist/hooks/mutation/use-new-conversation-command.js +1 -1
  459. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  460. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  461. package/dist/hooks/query/use-conversation-metrics.cjs.map +1 -1
  462. package/dist/hooks/query/use-conversation-metrics.js +1 -1
  463. package/dist/hooks/query/use-conversation-metrics.js.map +1 -1
  464. package/dist/hooks/query/use-llm-balance.cjs +2 -0
  465. package/dist/hooks/query/use-llm-balance.cjs.map +1 -0
  466. package/dist/hooks/query/use-llm-balance.d.ts +10 -0
  467. package/dist/hooks/query/use-llm-balance.js +24 -0
  468. package/dist/hooks/query/use-llm-balance.js.map +1 -0
  469. package/dist/hooks/query/use-search-providers.cjs +1 -1
  470. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  471. package/dist/hooks/query/use-search-providers.js +1 -1
  472. package/dist/hooks/query/use-search-providers.js.map +1 -1
  473. package/dist/hooks/use-await-context-compaction.cjs +2 -0
  474. package/dist/hooks/use-await-context-compaction.cjs.map +1 -0
  475. package/dist/hooks/use-await-context-compaction.d.ts +38 -0
  476. package/dist/hooks/use-await-context-compaction.js +61 -0
  477. package/dist/hooks/use-await-context-compaction.js.map +1 -0
  478. package/dist/hooks/use-compact-context-action.cjs +2 -0
  479. package/dist/hooks/use-compact-context-action.cjs.map +1 -0
  480. package/dist/hooks/use-compact-context-action.d.ts +10 -0
  481. package/dist/hooks/use-compact-context-action.js +61 -0
  482. package/dist/hooks/use-compact-context-action.js.map +1 -0
  483. package/dist/hooks/use-context-window-usage.cjs +2 -0
  484. package/dist/hooks/use-context-window-usage.cjs.map +1 -0
  485. package/dist/hooks/use-context-window-usage.d.ts +5 -0
  486. package/dist/hooks/use-context-window-usage.js +20 -0
  487. package/dist/hooks/use-context-window-usage.js.map +1 -0
  488. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  489. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  490. package/dist/hooks/use-conversation-name-context-menu.d.ts +0 -3
  491. package/dist/hooks/use-conversation-name-context-menu.js +54 -57
  492. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  493. package/dist/hooks/use-drag-resize.cjs +1 -1
  494. package/dist/hooks/use-drag-resize.cjs.map +1 -1
  495. package/dist/hooks/use-drag-resize.d.ts +8 -0
  496. package/dist/hooks/use-drag-resize.js +21 -18
  497. package/dist/hooks/use-drag-resize.js.map +1 -1
  498. package/dist/hooks/use-live-conversation-metrics.cjs +2 -0
  499. package/dist/hooks/use-live-conversation-metrics.cjs.map +1 -0
  500. package/dist/hooks/use-live-conversation-metrics.d.ts +18 -0
  501. package/dist/hooks/use-live-conversation-metrics.js +37 -0
  502. package/dist/hooks/use-live-conversation-metrics.js.map +1 -0
  503. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  504. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  505. package/dist/hooks/use-select-conversation-tab.js +2 -2
  506. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  507. package/dist/i18n/declaration.cjs +1 -1
  508. package/dist/i18n/declaration.cjs.map +1 -1
  509. package/dist/i18n/declaration.d.ts +27 -0
  510. package/dist/i18n/declaration.js +1 -1
  511. package/dist/i18n/declaration.js.map +1 -1
  512. package/dist/i18n/translation.cjs +2 -2
  513. package/dist/i18n/translation.cjs.map +1 -1
  514. package/dist/i18n/translation.js +474 -15
  515. package/dist/i18n/translation.js.map +1 -1
  516. package/dist/index.cjs +1 -1
  517. package/dist/index.js +28 -29
  518. package/dist/lib/index.cjs +1 -1
  519. package/dist/lib/index.js +0 -1
  520. package/dist/locales/ar/openhands.json +28 -1
  521. package/dist/locales/ca/openhands.json +28 -1
  522. package/dist/locales/de/openhands.json +28 -1
  523. package/dist/locales/en/openhands.json +28 -1
  524. package/dist/locales/es/openhands.json +28 -1
  525. package/dist/locales/fr/openhands.json +28 -1
  526. package/dist/locales/it/openhands.json +28 -1
  527. package/dist/locales/ja/openhands.json +28 -1
  528. package/dist/locales/ko-KR/openhands.json +28 -1
  529. package/dist/locales/no/openhands.json +28 -1
  530. package/dist/locales/pt/openhands.json +28 -1
  531. package/dist/locales/tr/openhands.json +28 -1
  532. package/dist/locales/uk/openhands.json +28 -1
  533. package/dist/locales/zh-CN/openhands.json +28 -1
  534. package/dist/locales/zh-TW/openhands.json +28 -1
  535. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs +5 -5
  536. package/dist/node_modules/@microlink/react-json-view/dist/main.cjs.map +1 -1
  537. package/dist/node_modules/@microlink/react-json-view/dist/main.js +5194 -5187
  538. package/dist/node_modules/@microlink/react-json-view/dist/main.js.map +1 -1
  539. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +2 -1
  540. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -0
  541. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +21 -1
  542. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -0
  543. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +2 -1
  544. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs.map +1 -0
  545. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +22 -1
  546. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js.map +1 -0
  547. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +2 -1
  548. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs.map +1 -0
  549. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +33 -1
  550. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js.map +1 -0
  551. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
  552. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
  553. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +56 -22
  554. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs.map +1 -1
  557. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js +3 -0
  558. package/dist/node_modules/@openhands/typescript-client/dist/client/profiles-client.js.map +1 -1
  559. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +2 -1
  560. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs.map +1 -0
  561. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +31 -1
  562. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js.map +1 -0
  563. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +2 -1
  564. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs.map +1 -0
  565. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +21 -1
  566. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js.map +1 -0
  567. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +2 -1
  568. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs.map +1 -0
  569. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +21 -1
  570. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js.map +1 -0
  571. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.cjs.map +1 -1
  572. package/dist/node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js.map +1 -1
  573. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  574. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  575. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +9 -5
  576. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  577. package/dist/node_modules/i18next-http-backend/esm/index.cjs +1 -1
  578. package/dist/node_modules/i18next-http-backend/esm/index.cjs.map +1 -1
  579. package/dist/node_modules/i18next-http-backend/esm/index.js +2 -2
  580. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -1
  581. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs +2 -0
  582. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.cjs.map +1 -0
  583. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js +31 -0
  584. package/dist/node_modules/lucide-react/dist/esm/icons/archive-restore.js.map +1 -0
  585. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs +2 -0
  586. package/dist/node_modules/lucide-react/dist/esm/icons/archive.cjs.map +1 -0
  587. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js +23 -0
  588. package/dist/node_modules/lucide-react/dist/esm/icons/archive.js.map +1 -0
  589. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs +2 -0
  590. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.cjs.map +1 -0
  591. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js +12 -0
  592. package/dist/node_modules/lucide-react/dist/esm/icons/gauge.js.map +1 -0
  593. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs +2 -0
  594. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.cjs.map +1 -0
  595. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js +23 -0
  596. package/dist/node_modules/lucide-react/dist/esm/icons/minimize.js.map +1 -0
  597. package/dist/node_modules/zustand/esm/middleware.cjs +3 -3
  598. package/dist/node_modules/zustand/esm/middleware.cjs.map +1 -1
  599. package/dist/node_modules/zustand/esm/middleware.js +33 -31
  600. package/dist/node_modules/zustand/esm/middleware.js.map +1 -1
  601. package/dist/package.cjs +1 -1
  602. package/dist/package.cjs.map +1 -1
  603. package/dist/package.js +17 -16
  604. package/dist/package.js.map +1 -1
  605. package/dist/routes/app-settings.cjs +1 -1
  606. package/dist/routes/app-settings.cjs.map +1 -1
  607. package/dist/routes/app-settings.js +94 -93
  608. package/dist/routes/app-settings.js.map +1 -1
  609. package/dist/routes/llm-settings.cjs +1 -1
  610. package/dist/routes/llm-settings.cjs.map +1 -1
  611. package/dist/routes/llm-settings.js +131 -119
  612. package/dist/routes/llm-settings.js.map +1 -1
  613. package/dist/routes/usage-tab.cjs +2 -0
  614. package/dist/routes/usage-tab.cjs.map +1 -0
  615. package/dist/routes/usage-tab.d.ts +2 -0
  616. package/dist/routes/usage-tab.js +10 -0
  617. package/dist/routes/usage-tab.js.map +1 -0
  618. package/dist/services/child-conversation-launch.cjs +1 -1
  619. package/dist/services/child-conversation-launch.cjs.map +1 -1
  620. package/dist/services/child-conversation-launch.js +11 -5
  621. package/dist/services/child-conversation-launch.js.map +1 -1
  622. package/dist/stores/archived-conversations-store.cjs +2 -0
  623. package/dist/stores/archived-conversations-store.cjs.map +1 -0
  624. package/dist/stores/archived-conversations-store.d.ts +24 -0
  625. package/dist/stores/archived-conversations-store.js +33 -0
  626. package/dist/stores/archived-conversations-store.js.map +1 -0
  627. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  628. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  629. package/dist/stores/conversation-panel-preferences-store.d.ts +3 -0
  630. package/dist/stores/conversation-panel-preferences-store.js +4 -0
  631. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  632. package/dist/stores/conversation-store.cjs.map +1 -1
  633. package/dist/stores/conversation-store.d.ts +1 -1
  634. package/dist/stores/conversation-store.js.map +1 -1
  635. package/dist/stores/metrics-store.cjs +1 -1
  636. package/dist/stores/metrics-store.cjs.map +1 -1
  637. package/dist/stores/metrics-store.d.ts +1 -0
  638. package/dist/stores/metrics-store.js +7 -4
  639. package/dist/stores/metrics-store.js.map +1 -1
  640. package/dist/types/agent-server/core/events/condensation-event.d.ts +3 -0
  641. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +4 -6
  642. package/dist/types/agent-server/type-guards.cjs +1 -1
  643. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  644. package/dist/types/agent-server/type-guards.d.ts +5 -0
  645. package/dist/types/agent-server/type-guards.js +3 -3
  646. package/dist/types/agent-server/type-guards.js.map +1 -1
  647. package/dist/utils/conversation-local-storage.cjs +1 -1
  648. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  649. package/dist/utils/conversation-local-storage.js +2 -1
  650. package/dist/utils/conversation-local-storage.js.map +1 -1
  651. package/dist/utils/format-model-name.cjs +1 -1
  652. package/dist/utils/format-model-name.cjs.map +1 -1
  653. package/dist/utils/format-model-name.d.ts +11 -0
  654. package/dist/utils/format-model-name.js +11 -3
  655. package/dist/utils/format-model-name.js.map +1 -1
  656. package/dist/utils/format-token-count.cjs +2 -0
  657. package/dist/utils/format-token-count.cjs.map +1 -0
  658. package/dist/utils/format-token-count.d.ts +3 -0
  659. package/dist/utils/format-token-count.js +19 -0
  660. package/dist/utils/format-token-count.js.map +1 -0
  661. package/dist/utils/hover-reveal-classes.cjs +2 -0
  662. package/dist/utils/hover-reveal-classes.cjs.map +1 -0
  663. package/dist/utils/hover-reveal-classes.d.ts +34 -0
  664. package/dist/utils/hover-reveal-classes.js +41 -0
  665. package/dist/utils/hover-reveal-classes.js.map +1 -0
  666. package/dist/utils/is-markdown-file-path.cjs +2 -0
  667. package/dist/utils/is-markdown-file-path.cjs.map +1 -0
  668. package/dist/utils/is-markdown-file-path.d.ts +4 -0
  669. package/dist/utils/is-markdown-file-path.js +14 -0
  670. package/dist/utils/is-markdown-file-path.js.map +1 -0
  671. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  672. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  673. package/dist/utils/mcp-marketplace-utils.d.ts +7 -0
  674. package/dist/utils/mcp-marketplace-utils.js +19 -16
  675. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  676. package/dist/utils/transcript-export/index.cjs +3 -3
  677. package/dist/utils/transcript-export/index.cjs.map +1 -1
  678. package/dist/utils/transcript-export/index.js +12 -12
  679. package/dist/utils/transcript-export/index.js.map +1 -1
  680. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  681. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  682. package/dist/utils/transcript-export/load-complete-events.js +4 -4
  683. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  684. package/dist/utils/workspace-relative-path.cjs +2 -0
  685. package/dist/utils/workspace-relative-path.cjs.map +1 -0
  686. package/dist/utils/workspace-relative-path.d.ts +10 -0
  687. package/dist/utils/workspace-relative-path.js +22 -0
  688. package/dist/utils/workspace-relative-path.js.map +1 -0
  689. package/package.json +17 -16
  690. package/scripts/check-sdk-version-sync.mjs +6 -6
  691. package/scripts/dev-process-utils.mjs +6 -1
  692. package/scripts/dev-safe.mjs +57 -2
  693. package/build/assets/active-backend-context-BBvP-bI2.js +0 -2
  694. package/build/assets/agent-profiles-settings-DqoS7RL3.js +0 -1
  695. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +0 -86
  696. package/build/assets/agent-settings-BJHryp65.js +0 -1
  697. package/build/assets/app-settings-r1RUbgGi.js +0 -1
  698. package/build/assets/backend-form-modal-OroTqnAv.js +0 -1
  699. package/build/assets/bot-DuN83i3p.js +0 -1
  700. package/build/assets/browser--eoQOo4M.js +0 -6
  701. package/build/assets/check-DLOKoFU9.js +0 -1
  702. package/build/assets/chevron-down-CnIbtM6i.js +0 -1
  703. package/build/assets/circle-check-CxCYJrpZ.js +0 -1
  704. package/build/assets/conversation-BUzBZAc-.js +0 -90
  705. package/build/assets/conversation-panel-pzAKsSDb.js +0 -1
  706. package/build/assets/conversation-pzAKsSDb.js +0 -1
  707. package/build/assets/conversation-store-B8Eahyeg.js +0 -6
  708. package/build/assets/external-link-zWbg5KXS.js +0 -1
  709. package/build/assets/files-tab-BzofBmF4.js +0 -1
  710. package/build/assets/git-provider-icon-BLMlwy02.js +0 -1
  711. package/build/assets/git-repo-dropdown-B_PTq4ol.js +0 -1
  712. package/build/assets/home-r89Vj2td.js +0 -1
  713. package/build/assets/index-home-r89Vj2td.js +0 -1
  714. package/build/assets/llm-not-configured-banner-CwKu8C6g.js +0 -27
  715. package/build/assets/llm-settings-BJotLQND.js +0 -1
  716. package/build/assets/llm-settings-CDM-5H2A.js +0 -1
  717. package/build/assets/llm-subscription-service-7eVfDIE1.js +0 -1
  718. package/build/assets/loader-circle-C5AnEN8r.js +0 -1
  719. package/build/assets/manifest-2a36a8f8.js +0 -1
  720. package/build/assets/markdown-renderer-BiiiIznl.js +0 -8
  721. package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +0 -1
  722. package/build/assets/messages-D1cbVhRK.js +0 -40
  723. package/build/assets/pencil-Bl3GWhgq.js +0 -1
  724. package/build/assets/plus-CtzlyAoF.js +0 -1
  725. package/build/assets/recommended-automations-launcher-BbJAJVED.js +0 -1
  726. package/build/assets/refresh-cw-B9GhC3QC.js +0 -1
  727. package/build/assets/root-BfM_kC_d.css +0 -1
  728. package/build/assets/root-gstBEjty.js +0 -2
  729. package/build/assets/root-layout-BIAFLP9p.js +0 -2
  730. package/build/assets/search-CYaiKHRp.js +0 -1
  731. package/build/assets/shared-conversation-DIxZjElr.js +0 -1
  732. package/build/assets/shield-check-D2cpEpv3.js +0 -1
  733. package/build/assets/trash-2-CzDVN-Iw.js +0 -1
  734. package/build/assets/use-create-conversation-DWaSVUOB.js +0 -1
  735. package/build/assets/use-is-authed-Bka89Xmm.js +0 -1
  736. package/build/assets/use-llm-profiles-CU8ah1pz.js +0 -1
  737. package/build/assets/use-save-agent-profile-DgI_Uz9a.js +0 -1
  738. package/build/assets/utils-DPQfkd-7.js +0 -1
  739. package/build/assets/vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js +0 -13
  740. package/build/assets/x-RYDBg-e2.js +0 -1
  741. package/build/assets/zap-tbKDzCe3.js +0 -1
  742. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs +0 -2
  743. package/dist/components/features/conversation/metrics-modal/context-window-section.cjs.map +0 -1
  744. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +0 -6
  745. package/dist/components/features/conversation/metrics-modal/context-window-section.js +0 -46
  746. package/dist/components/features/conversation/metrics-modal/context-window-section.js.map +0 -1
  747. package/dist/components/features/conversation/metrics-modal/empty-state.cjs +0 -2
  748. package/dist/components/features/conversation/metrics-modal/empty-state.cjs.map +0 -1
  749. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +0 -1
  750. package/dist/components/features/conversation/metrics-modal/empty-state.js +0 -18
  751. package/dist/components/features/conversation/metrics-modal/empty-state.js.map +0 -1
  752. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs +0 -2
  753. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.cjs.map +0 -1
  754. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +0 -5
  755. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js +0 -20
  756. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.js.map +0 -1
  757. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs +0 -2
  758. package/dist/components/features/conversation/metrics-modal/metrics-modal.cjs.map +0 -1
  759. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +0 -6
  760. package/dist/components/features/conversation/metrics-modal/metrics-modal.js +0 -57
  761. package/dist/components/features/conversation/metrics-modal/metrics-modal.js.map +0 -1
  762. package/dist/icons/u-credit-card.cjs +0 -2
  763. package/dist/icons/u-credit-card.cjs.map +0 -1
  764. package/dist/icons/u-credit-card.js +0 -21
  765. package/dist/icons/u-credit-card.js.map +0 -1
  766. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"local-conversation.cjs","names":["TOOL_DESCRIPTIONS"],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js"],"sourcesContent":["/**\n * Local conversation implementation\n *\n * This implements the IConversation interface for local execution. Unlike RemoteConversation,\n * LocalConversation runs the agent loop locally without connecting to a remote server.\n *\n * This mirrors the Python SDK's LocalConversation class.\n */\nimport { LocalWorkspace } from '../workspace/local-workspace.js';\nimport { generateSystemPrompt, TOOL_DESCRIPTIONS } from '../prompts/index.js';\nimport { SecretRegistry } from './secret-registry.js';\nimport { StuckDetector } from './stuck-detector.js';\nimport { generateEventId, } from '../events/types.js';\nimport { NeverConfirm } from '../security/confirmation-policy.js';\n/**\n * Implementation of events list for local conversations.\n * Stores typed events and provides indexing and search capabilities.\n */\nclass LocalEventsList {\n constructor() {\n this.events = [];\n this.idToIndex = new Map();\n }\n async addEvent(event) {\n const index = this.events.length;\n this.events.push(event);\n this.idToIndex.set(event.id, index);\n }\n async getEvents() {\n return [...this.events];\n }\n /**\n * Get all events as an array (synchronous access).\n */\n getEventsSync() {\n return [...this.events];\n }\n /**\n * Get an event by index.\n */\n getByIndex(index) {\n if (index < 0) {\n index = this.events.length + index;\n }\n return this.events[index];\n }\n /**\n * Get an event by ID.\n */\n getById(id) {\n const index = this.idToIndex.get(id);\n return index !== undefined ? this.events[index] : undefined;\n }\n /**\n * Get the index of an event by ID.\n */\n getIndex(id) {\n return this.idToIndex.get(id);\n }\n /**\n * Get the number of events.\n */\n get length() {\n return this.events.length;\n }\n /**\n * Iterate over events.\n */\n [Symbol.iterator]() {\n return this.events[Symbol.iterator]();\n }\n getEventCounts() {\n let messages = 0;\n let actions = 0;\n let observations = 0;\n let errors = 0;\n for (const event of this.events) {\n if (event.kind === 'MessageEvent')\n messages++;\n else if (event.kind === 'ActionEvent')\n actions++;\n else if (event.kind === 'ObservationEvent')\n observations++;\n else if (event.kind === 'AgentErrorEvent')\n errors++;\n }\n return { total: this.events.length, messages, actions, observations, errors };\n }\n}\n/**\n * Implementation of conversation state for local conversations.\n */\nclass LocalConversationState {\n constructor(id) {\n this.executionStatus = 'idle';\n this.confirmationPolicy = new NeverConfirm();\n /** Actions waiting for confirmation: action_id -> ActionEvent */\n this.pendingActions = new Map();\n this.id = id;\n this.events = new LocalEventsList();\n }\n}\n/**\n * Built-in tools that require a functional workspace (execute_command, read_file, write_file).\n * These are only registered when the workspace supports them (i.e., not a stub LocalWorkspace).\n */\nconst WORKSPACE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'execute_command',\n description: TOOL_DESCRIPTIONS.execute_command,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The bash command to execute. You can only execute one bash command at a time. If you need to run multiple commands sequentially, use `&&` or `;` to chain them together.',\n },\n cwd: {\n type: 'string',\n description: 'Working directory for the command (optional, defaults to workspace root)',\n },\n timeout: {\n type: 'number',\n description: 'Optional timeout in seconds for the command (default: 30)',\n },\n },\n required: ['command'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'read_file',\n description: TOOL_DESCRIPTIONS.read_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to read (relative to workspace or absolute)',\n },\n },\n required: ['path'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'write_file',\n description: TOOL_DESCRIPTIONS.write_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to write (relative to workspace or absolute)',\n },\n content: {\n type: 'string',\n description: 'Content to write to the file',\n },\n },\n required: ['path', 'content'],\n },\n },\n },\n];\n/**\n * Built-in tools that work without a functional workspace.\n * These are always available when built-in tools are enabled.\n */\nconst STANDALONE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'think',\n description: TOOL_DESCRIPTIONS.think,\n parameters: {\n type: 'object',\n properties: {\n thought: {\n type: 'string',\n description: 'The thought to log',\n },\n },\n required: ['thought'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'finish',\n description: TOOL_DESCRIPTIONS.finish,\n parameters: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Final message or summary to present to the user',\n },\n },\n required: ['message'],\n },\n },\n },\n];\n/**\n * Local conversation implementation that runs the agent loop locally.\n *\n * LocalConversation provides direct agent execution on the local system without\n * requiring a remote server. It integrates with an LLM (via ILLM interface) to\n * process messages and execute tool calls through the LocalWorkspace.\n *\n * Example:\n * ```typescript\n * const workspace = new LocalWorkspace({ workingDir: '/path/to/project' });\n * const llm = new OpenRouterLLM({ apiKey: 'your-key', defaultModel: 'anthropic/claude-3.5-sonnet' });\n * const conversation = new LocalConversation(agent, workspace, {\n * llm,\n * maxIterations: 500,\n * systemPrompt: 'You are a helpful assistant...'\n * });\n * await conversation.start({ initialMessage: 'Hello!' });\n * await conversation.run();\n * await conversation.close();\n * ```\n */\nexport class LocalConversation {\n constructor(agent, workspace, options) {\n this.maxIterations = 500;\n this.messages = [];\n this._isPaused = false;\n this._isFinished = false;\n this._isWaitingForConfirmation = false;\n this.agent = agent;\n this.workspace = workspace;\n this.llm = options.llm;\n this.callback = options.callback;\n this.tokenCallback = options.tokenCallback;\n this._conversationId = options.conversationId;\n this.persistenceDir = options.persistenceDir;\n this.customTools = options.tools;\n this.toolExecutor = options.toolExecutor;\n // Include built-in tools by default only if no custom tools are provided\n this.includeBuiltinTools = options.includeBuiltinTools ?? !options.tools;\n // Initialize secret registry\n this.secretRegistry = new SecretRegistry();\n if (options.secrets) {\n this.secretRegistry.updateSecrets(options.secrets);\n }\n // Initialize stuck detection\n this.stuckDetectionEnabled = options.stuckDetection ?? true;\n if (this.stuckDetectionEnabled) {\n this.stuckDetector = new StuckDetector(options.stuckDetectionThresholds);\n }\n // Initialize security analyzer\n this.securityAnalyzer = options.securityAnalyzer;\n // Generate system prompt - use custom if provided, otherwise generate default\n this.systemPrompt =\n options.systemPrompt ||\n generateSystemPrompt({\n workingDir: workspace.workingDir,\n });\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n }\n /**\n * Check whether the workspace supports actual operations.\n * LocalWorkspace is a stub that throws on all operations.\n */\n workspaceIsStub() {\n return this.workspace instanceof LocalWorkspace;\n }\n /**\n * Get the tools available to the agent.\n * Workspace-dependent tools (execute_command, read_file, write_file) are only\n * included when the workspace supports actual operations.\n */\n getTools() {\n const tools = [];\n if (this.includeBuiltinTools) {\n tools.push(...STANDALONE_TOOLS);\n if (!this.workspaceIsStub()) {\n tools.push(...WORKSPACE_TOOLS);\n }\n }\n if (this.customTools) {\n tools.push(...this.customTools);\n }\n return tools;\n }\n get id() {\n if (!this._conversationId) {\n throw new Error('Conversation ID not set. Call start() to initialize the conversation.');\n }\n return this._conversationId;\n }\n get state() {\n if (!this._state) {\n if (!this._conversationId) {\n throw new Error('Conversation not initialized. Call start() to initialize the conversation.');\n }\n this._state = new LocalConversationState(this._conversationId);\n }\n return this._state;\n }\n /**\n * Start or resume a conversation.\n */\n async start(options = {}) {\n // Generate a conversation ID if not provided\n if (!this._conversationId) {\n this._conversationId = this.generateConversationId();\n }\n // Initialize state\n this._state = new LocalConversationState(this._conversationId);\n // Set max iterations if provided\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n // Initialize message history with system prompt\n this.messages = [{ role: 'system', content: this.systemPrompt }];\n // Add initial message if provided\n if (options.initialMessage) {\n await this.sendMessage(options.initialMessage);\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'conversation_started', conversationId: this._conversationId },\n });\n }\n /**\n * Get conversation statistics.\n */\n async conversationStats() {\n if (!this._state) {\n return { total_events: 0, message_events: 0, action_events: 0, observation_events: 0 };\n }\n const counts = this._state.events.getEventCounts();\n return {\n total_events: counts.total,\n message_events: counts.messages,\n action_events: counts.actions,\n observation_events: counts.observations,\n };\n }\n /**\n * Send a message to the agent.\n */\n async sendMessage(message) {\n const content = typeof message === 'string' ? message : JSON.stringify(message);\n // Add user message to history\n this.messages.push({ role: 'user', content });\n // Record the event\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'user_message', content },\n });\n }\n /**\n * Execute the agent loop to process messages.\n *\n * This runs the agent until:\n * - The agent calls the finish() tool\n * - Maximum iterations reached\n * - pause() is called\n * - An error occurs\n */\n async run() {\n if (!this._state) {\n throw new Error('Conversation not started. Call start() first.');\n }\n this._state.executionStatus = 'running';\n this._isPaused = false;\n this._isFinished = false;\n let iterations = 0;\n const tools = this.getTools();\n while (iterations < this.maxIterations && !this._isPaused && !this._isFinished) {\n iterations++;\n try {\n // Get LLM response\n const response = await this.llm.chatCompletion({\n messages: this.messages,\n tools: tools.length > 0 ? tools : undefined,\n toolChoice: tools.length > 0 ? 'auto' : undefined,\n });\n const choice = response.choices[0];\n if (!choice) {\n throw new Error('No response from LLM');\n }\n const assistantMessage = choice.message;\n // Add assistant message to history\n this.messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n tool_calls: assistantMessage.tool_calls,\n });\n // Emit the assistant's response\n if (assistantMessage.content) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'assistant_message', content: assistantMessage.content },\n });\n }\n // Handle tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (this._isPaused || this._isFinished)\n break;\n await this.handleToolCall(toolCall);\n }\n }\n else if (choice.finish_reason === 'stop') {\n // No tool calls and stop reason - agent is done\n this._isFinished = true;\n }\n }\n catch (error) {\n this.emitEvent({\n type: 'error',\n timestamp: Date.now(),\n data: {\n kind: 'agent_error',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n this._state.executionStatus = 'finished';\n throw error;\n }\n }\n this._state.executionStatus = this._isPaused ? 'paused' : 'finished';\n if (iterations >= this.maxIterations && !this._isFinished) {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'max_iterations_reached', iterations },\n });\n }\n }\n /**\n * Handle a tool call from the LLM.\n */\n async handleToolCall(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n this.emitEvent({\n type: 'action',\n timestamp: Date.now(),\n data: { kind: 'tool_call', tool: name, arguments: argsString },\n });\n let result;\n try {\n // If a custom tool executor is provided, use it for all tool calls\n if (this.toolExecutor) {\n result = await this.toolExecutor(toolCall);\n // Check if this was a finish tool call\n if (name === 'finish') {\n this._isFinished = true;\n }\n }\n else {\n // Use built-in tool handling\n result = await this.executeBuiltinTool(toolCall);\n }\n }\n catch (error) {\n result = `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`;\n }\n // Add tool result to messages\n this.messages.push({\n role: 'tool',\n content: result,\n tool_call_id: toolCall.id,\n });\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'tool_result', tool: name, result },\n });\n }\n /**\n * Execute a built-in tool.\n */\n async executeBuiltinTool(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n const args = JSON.parse(argsString);\n switch (name) {\n case 'execute_command': {\n const cmdResult = await this.workspace.executeCommand(args.command, args.cwd);\n let result = `Exit code: ${cmdResult.exit_code}\\n`;\n if (cmdResult.stdout)\n result += `stdout:\\n${cmdResult.stdout}\\n`;\n if (cmdResult.stderr)\n result += `stderr:\\n${cmdResult.stderr}`;\n if (cmdResult.timeout_occurred)\n result += '\\n(Command timed out)';\n return result;\n }\n case 'read_file': {\n const content = await this.workspace.downloadAsText(args.path);\n return content;\n }\n case 'write_file': {\n const uploadResult = await this.workspace.fileUpload(args.content, args.path);\n if (uploadResult.success) {\n return `Successfully wrote ${uploadResult.file_size} bytes to ${args.path}`;\n }\n else {\n return `Failed to write file: ${uploadResult.error}`;\n }\n }\n case 'think': {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'think', thought: args.thought },\n });\n return 'Your thought has been logged.';\n }\n case 'finish': {\n this._isFinished = true;\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'finish', message: args.message },\n });\n return 'Task completed.';\n }\n default:\n return `Unknown tool: ${name}`;\n }\n }\n /**\n * Pause agent execution.\n */\n async pause() {\n this._isPaused = true;\n if (this._state) {\n this._state.executionStatus = 'paused';\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'paused' },\n });\n }\n /**\n * Set the confirmation policy.\n */\n async setConfirmationPolicy(policy) {\n if (this._state) {\n // If it's a ConfirmationPolicyBase (old interface), wrap it\n if ('requiresConfirmation' in policy) {\n this._state.confirmationPolicy = policy;\n }\n else {\n // Create a simple wrapper\n const policyType = policy.type ?? policy.kind ?? 'never';\n this._state.confirmationPolicy = {\n type: policyType,\n requiresConfirmation: () => policyType === 'always' || policyType === 'AlwaysConfirm',\n };\n }\n }\n }\n /**\n * Send a confirmation response.\n *\n * Note: Confirmation handling is not yet fully implemented in LocalConversation.\n */\n async sendConfirmationResponse(accept, reason) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'confirmation_response', accept, reason },\n });\n // Resume execution if paused for confirmation\n if (accept) {\n this._isPaused = false;\n }\n }\n async setTitle(title) {\n this._title = title;\n }\n /**\n * Generate a title for the conversation using the LLM.\n */\n async generateTitle(maxLength = 50, _llm) {\n // LocalConversation always uses its own ILLM instance for title generation.\n // The llm parameter exists for interface compatibility with RemoteConversation.\n const llmToUse = this.llm;\n // Get a summary of the conversation\n const userMessages = this.messages\n .filter((m) => m.role === 'user')\n .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)))\n .slice(0, 3)\n .join('\\n');\n if (!userMessages) {\n return 'New Conversation';\n }\n const prompt = `Generate a short title (max ${maxLength} characters) for a conversation that starts with:\\n\\n${userMessages}\\n\\nRespond with only the title, no quotes or explanation.`;\n const title = await llmToUse.generate(prompt);\n return title.slice(0, maxLength).trim();\n }\n /**\n * Update secrets available to the agent.\n * Secrets are stored in the SecretRegistry and can be used for:\n * - Environment variable injection into commands\n * - Output masking to prevent accidental exposure\n */\n async updateSecrets(secrets) {\n this.secretRegistry.updateSecrets(secrets);\n }\n /**\n * Ask the agent a simple, stateless question and get a direct LLM response.\n *\n * This bypasses the normal conversation flow and does NOT modify, persist,\n * or become part of the conversation state. The request is not remembered by\n * the main agent, no events are recorded, and execution status is untouched.\n *\n * @param question - A simple string question to ask the agent\n * @returns A string response from the agent\n */\n async askAgent(question) {\n // Build context from recent conversation history\n const contextMessages = this.messages.slice(-10); // Last 10 messages for context\n const askPrompt = `Based on the conversation context, please answer this question concisely:\n\nQuestion: ${question}\n\nProvide a direct answer without using any tools.`;\n const messages = [...contextMessages, { role: 'user', content: askPrompt }];\n // Make a simple completion without tools\n const response = await this.llm.chatCompletion({\n messages,\n // No tools - just get a direct answer\n });\n return response.choices[0]?.message?.content || 'Unable to generate a response.';\n }\n /**\n * Reject all pending actions awaiting confirmation.\n *\n * @param reason - The reason for rejection\n */\n async rejectPendingActions(reason = 'User rejected the action') {\n if (!this._state)\n return;\n for (const [actionId, action] of this._state.pendingActions) {\n // Emit rejection event\n const rejectEvent = {\n id: generateEventId(),\n kind: 'UserRejectObservation',\n timestamp: new Date().toISOString(),\n source: 'user',\n action_id: actionId,\n tool_name: action.tool_name ?? '',\n tool_call_id: action.tool_call_id ?? '',\n rejection_reason: reason,\n rejection_source: 'user',\n };\n this.emitTypedEvent(rejectEvent);\n // Add rejection as tool result\n this.messages.push({\n role: 'tool',\n content: `Action rejected: ${reason}`,\n tool_call_id: action.tool_call_id,\n });\n }\n // Clear pending actions\n this._state.pendingActions.clear();\n // Resume if was waiting for confirmation\n if (this._isWaitingForConfirmation) {\n this._isWaitingForConfirmation = false;\n this._state.executionStatus = 'running';\n }\n }\n /**\n * Set the security analyzer for evaluating action risks.\n *\n * @param analyzer - The security analyzer to use, or null to disable\n */\n setSecurityAnalyzer(analyzer) {\n this.securityAnalyzer = analyzer || undefined;\n if (this._state) {\n this._state.securityAnalyzer = this.securityAnalyzer;\n }\n }\n /**\n * Check if the agent is currently stuck using the stuck detector.\n *\n * @returns StuckDetectionResult with details about any detected stuck pattern\n */\n checkIfStuck() {\n if (!this.stuckDetector || !this._state) {\n return { isStuck: false };\n }\n const events = this._state.events.getEventsSync();\n return this.stuckDetector.isStuck(events);\n }\n /**\n * Get the secret registry for direct access.\n * Useful for masking secrets in custom output handling.\n */\n getSecretRegistry() {\n return this.secretRegistry;\n }\n /**\n * Mask any secrets in the given text.\n *\n * @param text - Text that may contain secret values\n * @returns Text with secret values replaced by <secret-hidden>\n */\n maskSecrets(text) {\n return this.secretRegistry.maskSecretsInOutput(text);\n }\n /**\n * Start WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket since it runs locally.\n */\n async startWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Stop WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket.\n */\n async stopWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Close the conversation and cleanup resources.\n */\n async close() {\n this._isPaused = true;\n this._isFinished = true;\n if (this._state) {\n this._state.executionStatus = 'finished';\n }\n this.workspace.close();\n this.llm.close();\n const stateEvent = {\n id: generateEventId(),\n kind: 'ConversationStateUpdateEvent',\n timestamp: new Date().toISOString(),\n source: 'system',\n key: 'status',\n value: 'closed',\n };\n this.emitTypedEvent(stateEvent);\n }\n /**\n * Get the current message history.\n */\n getMessages() {\n return [...this.messages];\n }\n /**\n * Emit a typed event and call the callback if provided.\n */\n emitTypedEvent(event) {\n if (this._state) {\n this._state.events.addEvent(event);\n }\n if (this.callback) {\n // Convert to the callback's expected Event format\n this.callback(event);\n }\n }\n /**\n * Emit an event (legacy format) and call the callback if provided.\n * @deprecated Use emitTypedEvent instead\n */\n emitEvent(event) {\n // Convert to typed event\n const typedEvent = {\n id: generateEventId(),\n kind: event.data?.kind || event.type,\n timestamp: new Date(event.timestamp).toISOString(),\n ...event.data,\n };\n if (this._state) {\n this._state.events.addEvent(typedEvent);\n }\n if (this.callback) {\n this.callback(typedEvent);\n }\n }\n /**\n * Generate a unique conversation ID.\n */\n generateConversationId() {\n return crypto.randomUUID();\n }\n}\n//# sourceMappingURL=local-conversation.js.map"],"x_google_ignoreList":[0],"mappings":"yGA+GyBA,EAAAA,kBAAkB,gBAyBlBA,EAAAA,kBAAkB,UAiBlBA,EAAAA,kBAAkB,WA2BlBA,EAAAA,kBAAkB,MAiBlBA,EAAAA,kBAAkB"}
1
+ {"version":3,"file":"local-conversation.cjs","names":["TOOL_DESCRIPTIONS"],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js"],"sourcesContent":["/**\n * Local conversation implementation\n *\n * This implements the IConversation interface for local execution. Unlike RemoteConversation,\n * LocalConversation runs the agent loop locally without connecting to a remote server.\n *\n * This mirrors the Python SDK's LocalConversation class.\n */\nimport { LocalWorkspace } from '../workspace/local-workspace.js';\nimport { generateSystemPrompt, TOOL_DESCRIPTIONS } from '../prompts/index.js';\nimport { SecretRegistry } from './secret-registry.js';\nimport { StuckDetector } from './stuck-detector.js';\nimport { generateEventId, } from '../events/types.js';\nimport { NeverConfirm } from '../security/confirmation-policy.js';\n/**\n * Implementation of events list for local conversations.\n * Stores typed events and provides indexing and search capabilities.\n */\nclass LocalEventsList {\n constructor() {\n this.events = [];\n this.idToIndex = new Map();\n }\n async addEvent(event) {\n const index = this.events.length;\n this.events.push(event);\n if (event.id) {\n this.idToIndex.set(event.id, index);\n }\n }\n async getEvents() {\n return [...this.events];\n }\n /**\n * Get all events as an array (synchronous access).\n */\n getEventsSync() {\n return [...this.events];\n }\n /**\n * Get an event by index.\n */\n getByIndex(index) {\n if (index < 0) {\n index = this.events.length + index;\n }\n return this.events[index];\n }\n /**\n * Get an event by ID.\n */\n getById(id) {\n const index = this.idToIndex.get(id);\n return index !== undefined ? this.events[index] : undefined;\n }\n /**\n * Get the index of an event by ID.\n */\n getIndex(id) {\n return this.idToIndex.get(id);\n }\n /**\n * Get the number of events.\n */\n get length() {\n return this.events.length;\n }\n /**\n * Iterate over events.\n */\n [Symbol.iterator]() {\n return this.events[Symbol.iterator]();\n }\n getEventCounts() {\n let messages = 0;\n let actions = 0;\n let observations = 0;\n let errors = 0;\n for (const event of this.events) {\n if (event.kind === 'MessageEvent')\n messages++;\n else if (event.kind === 'ActionEvent')\n actions++;\n else if (event.kind === 'ObservationEvent')\n observations++;\n else if (event.kind === 'AgentErrorEvent')\n errors++;\n }\n return { total: this.events.length, messages, actions, observations, errors };\n }\n}\n/**\n * Implementation of conversation state for local conversations.\n */\nclass LocalConversationState {\n constructor(id) {\n this.executionStatus = 'idle';\n this.confirmationPolicy = new NeverConfirm();\n /** Actions waiting for confirmation: action_id -> ActionEvent */\n this.pendingActions = new Map();\n this.id = id;\n this.events = new LocalEventsList();\n }\n}\n/**\n * Built-in tools that require a functional workspace (execute_command, read_file, write_file).\n * These are only registered when the workspace supports them (i.e., not a stub LocalWorkspace).\n */\nconst WORKSPACE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'execute_command',\n description: TOOL_DESCRIPTIONS.execute_command,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The bash command to execute. You can only execute one bash command at a time. If you need to run multiple commands sequentially, use `&&` or `;` to chain them together.',\n },\n cwd: {\n type: 'string',\n description: 'Working directory for the command (optional, defaults to workspace root)',\n },\n timeout: {\n type: 'number',\n description: 'Optional timeout in seconds for the command (default: 30)',\n },\n },\n required: ['command'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'read_file',\n description: TOOL_DESCRIPTIONS.read_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to read (relative to workspace or absolute)',\n },\n },\n required: ['path'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'write_file',\n description: TOOL_DESCRIPTIONS.write_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to write (relative to workspace or absolute)',\n },\n content: {\n type: 'string',\n description: 'Content to write to the file',\n },\n },\n required: ['path', 'content'],\n },\n },\n },\n];\n/**\n * Built-in tools that work without a functional workspace.\n * These are always available when built-in tools are enabled.\n */\nconst STANDALONE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'think',\n description: TOOL_DESCRIPTIONS.think,\n parameters: {\n type: 'object',\n properties: {\n thought: {\n type: 'string',\n description: 'The thought to log',\n },\n },\n required: ['thought'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'finish',\n description: TOOL_DESCRIPTIONS.finish,\n parameters: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Final message or summary to present to the user',\n },\n },\n required: ['message'],\n },\n },\n },\n];\n/**\n * Local conversation implementation that runs the agent loop locally.\n *\n * LocalConversation provides direct agent execution on the local system without\n * requiring a remote server. It integrates with an LLM (via ILLM interface) to\n * process messages and execute tool calls through the LocalWorkspace.\n *\n * Example:\n * ```typescript\n * const workspace = new LocalWorkspace({ workingDir: '/path/to/project' });\n * const llm = new OpenRouterLLM({ apiKey: 'your-key', defaultModel: 'anthropic/claude-3.5-sonnet' });\n * const conversation = new LocalConversation(agent, workspace, {\n * llm,\n * maxIterations: 500,\n * systemPrompt: 'You are a helpful assistant...'\n * });\n * await conversation.start({ initialMessage: 'Hello!' });\n * await conversation.run();\n * await conversation.close();\n * ```\n */\nexport class LocalConversation {\n constructor(agent, workspace, options) {\n this.maxIterations = 500;\n this.messages = [];\n this._isPaused = false;\n this._isFinished = false;\n this._isWaitingForConfirmation = false;\n this.agent = agent;\n this.workspace = workspace;\n this.llm = options.llm;\n this.callback = options.callback;\n this.tokenCallback = options.tokenCallback;\n this._conversationId = options.conversationId;\n this.persistenceDir = options.persistenceDir;\n this.customTools = options.tools;\n this.toolExecutor = options.toolExecutor;\n // Include built-in tools by default only if no custom tools are provided\n this.includeBuiltinTools = options.includeBuiltinTools ?? !options.tools;\n // Initialize secret registry\n this.secretRegistry = new SecretRegistry();\n if (options.secrets) {\n this.secretRegistry.updateSecrets(options.secrets);\n }\n // Initialize stuck detection\n this.stuckDetectionEnabled = options.stuckDetection ?? true;\n if (this.stuckDetectionEnabled) {\n this.stuckDetector = new StuckDetector(options.stuckDetectionThresholds);\n }\n // Initialize security analyzer\n this.securityAnalyzer = options.securityAnalyzer;\n // Generate system prompt - use custom if provided, otherwise generate default\n this.systemPrompt =\n options.systemPrompt ||\n generateSystemPrompt({\n workingDir: workspace.workingDir,\n });\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n }\n /**\n * Check whether the workspace supports actual operations.\n * LocalWorkspace is a stub that throws on all operations.\n */\n workspaceIsStub() {\n return this.workspace instanceof LocalWorkspace;\n }\n /**\n * Get the tools available to the agent.\n * Workspace-dependent tools (execute_command, read_file, write_file) are only\n * included when the workspace supports actual operations.\n */\n getTools() {\n const tools = [];\n if (this.includeBuiltinTools) {\n tools.push(...STANDALONE_TOOLS);\n if (!this.workspaceIsStub()) {\n tools.push(...WORKSPACE_TOOLS);\n }\n }\n if (this.customTools) {\n tools.push(...this.customTools);\n }\n return tools;\n }\n get id() {\n if (!this._conversationId) {\n throw new Error('Conversation ID not set. Call start() to initialize the conversation.');\n }\n return this._conversationId;\n }\n get state() {\n if (!this._state) {\n if (!this._conversationId) {\n throw new Error('Conversation not initialized. Call start() to initialize the conversation.');\n }\n this._state = new LocalConversationState(this._conversationId);\n }\n return this._state;\n }\n /**\n * Start or resume a conversation.\n */\n async start(options = {}) {\n // Generate a conversation ID if not provided\n if (!this._conversationId) {\n this._conversationId = this.generateConversationId();\n }\n // Initialize state\n this._state = new LocalConversationState(this._conversationId);\n // Set max iterations if provided\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n // Initialize message history with system prompt\n this.messages = [{ role: 'system', content: this.systemPrompt }];\n // Add initial message if provided\n if (options.initialMessage) {\n await this.sendMessage(options.initialMessage);\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'conversation_started', conversationId: this._conversationId },\n });\n }\n /**\n * Get conversation statistics.\n */\n async conversationStats() {\n if (!this._state) {\n return { total_events: 0, message_events: 0, action_events: 0, observation_events: 0 };\n }\n const counts = this._state.events.getEventCounts();\n return {\n total_events: counts.total,\n message_events: counts.messages,\n action_events: counts.actions,\n observation_events: counts.observations,\n };\n }\n /**\n * Send a message to the agent.\n */\n async sendMessage(message) {\n const content = typeof message === 'string' ? message : JSON.stringify(message);\n // Add user message to history\n this.messages.push({ role: 'user', content });\n // Record the event\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'user_message', content },\n });\n }\n /**\n * Execute the agent loop to process messages.\n *\n * This runs the agent until:\n * - The agent calls the finish() tool\n * - Maximum iterations reached\n * - pause() is called\n * - An error occurs\n */\n async run() {\n if (!this._state) {\n throw new Error('Conversation not started. Call start() first.');\n }\n this._state.executionStatus = 'running';\n this._isPaused = false;\n this._isFinished = false;\n let iterations = 0;\n const tools = this.getTools();\n while (iterations < this.maxIterations && !this._isPaused && !this._isFinished) {\n iterations++;\n try {\n // Get LLM response\n const response = await this.llm.chatCompletion({\n messages: this.messages,\n tools: tools.length > 0 ? tools : undefined,\n toolChoice: tools.length > 0 ? 'auto' : undefined,\n });\n const choice = response.choices[0];\n if (!choice) {\n throw new Error('No response from LLM');\n }\n const assistantMessage = choice.message;\n // Add assistant message to history\n this.messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n tool_calls: assistantMessage.tool_calls,\n });\n // Emit the assistant's response\n if (assistantMessage.content) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'assistant_message', content: assistantMessage.content },\n });\n }\n // Handle tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (this._isPaused || this._isFinished)\n break;\n await this.handleToolCall(toolCall);\n }\n }\n else if (choice.finish_reason === 'stop') {\n // No tool calls and stop reason - agent is done\n this._isFinished = true;\n }\n }\n catch (error) {\n this.emitEvent({\n type: 'error',\n timestamp: Date.now(),\n data: {\n kind: 'agent_error',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n this._state.executionStatus = 'finished';\n throw error;\n }\n }\n this._state.executionStatus = this._isPaused ? 'paused' : 'finished';\n if (iterations >= this.maxIterations && !this._isFinished) {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'max_iterations_reached', iterations },\n });\n }\n }\n /**\n * Handle a tool call from the LLM.\n */\n async handleToolCall(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n this.emitEvent({\n type: 'action',\n timestamp: Date.now(),\n data: { kind: 'tool_call', tool: name, arguments: argsString },\n });\n let result;\n try {\n // If a custom tool executor is provided, use it for all tool calls\n if (this.toolExecutor) {\n result = await this.toolExecutor(toolCall);\n // Check if this was a finish tool call\n if (name === 'finish') {\n this._isFinished = true;\n }\n }\n else {\n // Use built-in tool handling\n result = await this.executeBuiltinTool(toolCall);\n }\n }\n catch (error) {\n result = `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`;\n }\n // Add tool result to messages\n this.messages.push({\n role: 'tool',\n content: result,\n tool_call_id: toolCall.id,\n });\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'tool_result', tool: name, result },\n });\n }\n /**\n * Execute a built-in tool.\n */\n async executeBuiltinTool(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n const args = JSON.parse(argsString);\n switch (name) {\n case 'execute_command': {\n const cmdResult = await this.workspace.executeCommand(args.command, args.cwd);\n let result = `Exit code: ${cmdResult.exit_code}\\n`;\n if (cmdResult.stdout)\n result += `stdout:\\n${cmdResult.stdout}\\n`;\n if (cmdResult.stderr)\n result += `stderr:\\n${cmdResult.stderr}`;\n if (cmdResult.timeout_occurred)\n result += '\\n(Command timed out)';\n return result;\n }\n case 'read_file': {\n const content = await this.workspace.downloadAsText(args.path);\n return content;\n }\n case 'write_file': {\n const uploadResult = await this.workspace.fileUpload(args.content, args.path);\n if (uploadResult.success) {\n return `Successfully wrote ${uploadResult.file_size} bytes to ${args.path}`;\n }\n else {\n return `Failed to write file: ${uploadResult.error}`;\n }\n }\n case 'think': {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'think', thought: args.thought },\n });\n return 'Your thought has been logged.';\n }\n case 'finish': {\n this._isFinished = true;\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'finish', message: args.message },\n });\n return 'Task completed.';\n }\n default:\n return `Unknown tool: ${name}`;\n }\n }\n /**\n * Pause agent execution.\n */\n async pause() {\n this._isPaused = true;\n if (this._state) {\n this._state.executionStatus = 'paused';\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'paused' },\n });\n }\n /**\n * Set the confirmation policy.\n */\n async setConfirmationPolicy(policy) {\n if (this._state) {\n // If it's a ConfirmationPolicyBase (old interface), wrap it\n if ('requiresConfirmation' in policy) {\n this._state.confirmationPolicy = policy;\n }\n else {\n // Create a simple wrapper\n const policyType = policy.type ?? policy.kind ?? 'never';\n this._state.confirmationPolicy = {\n type: policyType,\n requiresConfirmation: () => policyType === 'always' || policyType === 'AlwaysConfirm',\n };\n }\n }\n }\n /**\n * Send a confirmation response.\n *\n * Note: Confirmation handling is not yet fully implemented in LocalConversation.\n */\n async sendConfirmationResponse(accept, reason) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'confirmation_response', accept, reason },\n });\n // Resume execution if paused for confirmation\n if (accept) {\n this._isPaused = false;\n }\n }\n async setTitle(title) {\n this._title = title;\n }\n /**\n * Generate a title for the conversation using the LLM.\n */\n async generateTitle(maxLength = 50, _llm) {\n // LocalConversation always uses its own ILLM instance for title generation.\n // The llm parameter exists for interface compatibility with RemoteConversation.\n const llmToUse = this.llm;\n // Get a summary of the conversation\n const userMessages = this.messages\n .filter((m) => m.role === 'user')\n .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)))\n .slice(0, 3)\n .join('\\n');\n if (!userMessages) {\n return 'New Conversation';\n }\n const prompt = `Generate a short title (max ${maxLength} characters) for a conversation that starts with:\\n\\n${userMessages}\\n\\nRespond with only the title, no quotes or explanation.`;\n const title = await llmToUse.generate(prompt);\n return title.slice(0, maxLength).trim();\n }\n /**\n * Update secrets available to the agent.\n * Secrets are stored in the SecretRegistry and can be used for:\n * - Environment variable injection into commands\n * - Output masking to prevent accidental exposure\n */\n async updateSecrets(secrets) {\n this.secretRegistry.updateSecrets(secrets);\n }\n /**\n * Ask the agent a simple, stateless question and get a direct LLM response.\n *\n * This bypasses the normal conversation flow and does NOT modify, persist,\n * or become part of the conversation state. The request is not remembered by\n * the main agent, no events are recorded, and execution status is untouched.\n *\n * @param question - A simple string question to ask the agent\n * @returns A string response from the agent\n */\n async askAgent(question) {\n // Build context from recent conversation history\n const contextMessages = this.messages.slice(-10); // Last 10 messages for context\n const askPrompt = `Based on the conversation context, please answer this question concisely:\n\nQuestion: ${question}\n\nProvide a direct answer without using any tools.`;\n const messages = [...contextMessages, { role: 'user', content: askPrompt }];\n // Make a simple completion without tools\n const response = await this.llm.chatCompletion({\n messages,\n // No tools - just get a direct answer\n });\n return response.choices[0]?.message?.content || 'Unable to generate a response.';\n }\n /**\n * Reject all pending actions awaiting confirmation.\n *\n * @param reason - The reason for rejection\n */\n async rejectPendingActions(reason = 'User rejected the action') {\n if (!this._state)\n return;\n for (const [actionId, action] of this._state.pendingActions) {\n // Emit rejection event\n const rejectEvent = {\n id: generateEventId(),\n kind: 'UserRejectObservation',\n timestamp: new Date().toISOString(),\n source: 'user',\n action_id: actionId,\n tool_name: action.tool_name ?? '',\n tool_call_id: action.tool_call_id ?? '',\n rejection_reason: reason,\n rejection_source: 'user',\n };\n this.emitTypedEvent(rejectEvent);\n // Add rejection as tool result\n this.messages.push({\n role: 'tool',\n content: `Action rejected: ${reason}`,\n tool_call_id: action.tool_call_id,\n });\n }\n // Clear pending actions\n this._state.pendingActions.clear();\n // Resume if was waiting for confirmation\n if (this._isWaitingForConfirmation) {\n this._isWaitingForConfirmation = false;\n this._state.executionStatus = 'running';\n }\n }\n /**\n * Set the security analyzer for evaluating action risks.\n *\n * @param analyzer - The security analyzer to use, or null to disable\n */\n setSecurityAnalyzer(analyzer) {\n this.securityAnalyzer = analyzer || undefined;\n if (this._state) {\n this._state.securityAnalyzer = this.securityAnalyzer;\n }\n }\n /**\n * Check if the agent is currently stuck using the stuck detector.\n *\n * @returns StuckDetectionResult with details about any detected stuck pattern\n */\n checkIfStuck() {\n if (!this.stuckDetector || !this._state) {\n return { isStuck: false };\n }\n const events = this._state.events.getEventsSync();\n return this.stuckDetector.isStuck(events);\n }\n /**\n * Get the secret registry for direct access.\n * Useful for masking secrets in custom output handling.\n */\n getSecretRegistry() {\n return this.secretRegistry;\n }\n /**\n * Mask any secrets in the given text.\n *\n * @param text - Text that may contain secret values\n * @returns Text with secret values replaced by <secret-hidden>\n */\n maskSecrets(text) {\n return this.secretRegistry.maskSecretsInOutput(text);\n }\n /**\n * Start WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket since it runs locally.\n */\n async startWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Stop WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket.\n */\n async stopWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Close the conversation and cleanup resources.\n */\n async close() {\n this._isPaused = true;\n this._isFinished = true;\n if (this._state) {\n this._state.executionStatus = 'finished';\n }\n this.workspace.close();\n this.llm.close();\n const stateEvent = {\n id: generateEventId(),\n kind: 'ConversationStateUpdateEvent',\n timestamp: new Date().toISOString(),\n source: 'environment',\n key: 'status',\n value: 'closed',\n };\n this.emitTypedEvent(stateEvent);\n }\n /**\n * Get the current message history.\n */\n getMessages() {\n return [...this.messages];\n }\n /**\n * Emit a typed event and call the callback if provided.\n */\n emitTypedEvent(event) {\n if (this._state) {\n this._state.events.addEvent(event);\n }\n if (this.callback) {\n // Convert to the callback's expected Event format\n this.callback(event);\n }\n }\n /**\n * Emit an event (legacy format) and call the callback if provided.\n * @deprecated Use emitTypedEvent instead\n */\n emitEvent(event) {\n // Convert to typed event\n const typedEvent = {\n id: generateEventId(),\n kind: event.data?.kind || event.type,\n timestamp: new Date(event.timestamp).toISOString(),\n ...event.data,\n };\n if (this._state) {\n this._state.events.addEvent(typedEvent);\n }\n if (this.callback) {\n this.callback(typedEvent);\n }\n }\n /**\n * Generate a unique conversation ID.\n */\n generateConversationId() {\n return crypto.randomUUID();\n }\n}\n//# sourceMappingURL=local-conversation.js.map"],"x_google_ignoreList":[0],"mappings":"yGAiHyBA,EAAAA,kBAAkB,gBAyBlBA,EAAAA,kBAAkB,UAiBlBA,EAAAA,kBAAkB,WA2BlBA,EAAAA,kBAAkB,MAiBlBA,EAAAA,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-conversation.js","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js"],"sourcesContent":["/**\n * Local conversation implementation\n *\n * This implements the IConversation interface for local execution. Unlike RemoteConversation,\n * LocalConversation runs the agent loop locally without connecting to a remote server.\n *\n * This mirrors the Python SDK's LocalConversation class.\n */\nimport { LocalWorkspace } from '../workspace/local-workspace.js';\nimport { generateSystemPrompt, TOOL_DESCRIPTIONS } from '../prompts/index.js';\nimport { SecretRegistry } from './secret-registry.js';\nimport { StuckDetector } from './stuck-detector.js';\nimport { generateEventId, } from '../events/types.js';\nimport { NeverConfirm } from '../security/confirmation-policy.js';\n/**\n * Implementation of events list for local conversations.\n * Stores typed events and provides indexing and search capabilities.\n */\nclass LocalEventsList {\n constructor() {\n this.events = [];\n this.idToIndex = new Map();\n }\n async addEvent(event) {\n const index = this.events.length;\n this.events.push(event);\n this.idToIndex.set(event.id, index);\n }\n async getEvents() {\n return [...this.events];\n }\n /**\n * Get all events as an array (synchronous access).\n */\n getEventsSync() {\n return [...this.events];\n }\n /**\n * Get an event by index.\n */\n getByIndex(index) {\n if (index < 0) {\n index = this.events.length + index;\n }\n return this.events[index];\n }\n /**\n * Get an event by ID.\n */\n getById(id) {\n const index = this.idToIndex.get(id);\n return index !== undefined ? this.events[index] : undefined;\n }\n /**\n * Get the index of an event by ID.\n */\n getIndex(id) {\n return this.idToIndex.get(id);\n }\n /**\n * Get the number of events.\n */\n get length() {\n return this.events.length;\n }\n /**\n * Iterate over events.\n */\n [Symbol.iterator]() {\n return this.events[Symbol.iterator]();\n }\n getEventCounts() {\n let messages = 0;\n let actions = 0;\n let observations = 0;\n let errors = 0;\n for (const event of this.events) {\n if (event.kind === 'MessageEvent')\n messages++;\n else if (event.kind === 'ActionEvent')\n actions++;\n else if (event.kind === 'ObservationEvent')\n observations++;\n else if (event.kind === 'AgentErrorEvent')\n errors++;\n }\n return { total: this.events.length, messages, actions, observations, errors };\n }\n}\n/**\n * Implementation of conversation state for local conversations.\n */\nclass LocalConversationState {\n constructor(id) {\n this.executionStatus = 'idle';\n this.confirmationPolicy = new NeverConfirm();\n /** Actions waiting for confirmation: action_id -> ActionEvent */\n this.pendingActions = new Map();\n this.id = id;\n this.events = new LocalEventsList();\n }\n}\n/**\n * Built-in tools that require a functional workspace (execute_command, read_file, write_file).\n * These are only registered when the workspace supports them (i.e., not a stub LocalWorkspace).\n */\nconst WORKSPACE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'execute_command',\n description: TOOL_DESCRIPTIONS.execute_command,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The bash command to execute. You can only execute one bash command at a time. If you need to run multiple commands sequentially, use `&&` or `;` to chain them together.',\n },\n cwd: {\n type: 'string',\n description: 'Working directory for the command (optional, defaults to workspace root)',\n },\n timeout: {\n type: 'number',\n description: 'Optional timeout in seconds for the command (default: 30)',\n },\n },\n required: ['command'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'read_file',\n description: TOOL_DESCRIPTIONS.read_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to read (relative to workspace or absolute)',\n },\n },\n required: ['path'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'write_file',\n description: TOOL_DESCRIPTIONS.write_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to write (relative to workspace or absolute)',\n },\n content: {\n type: 'string',\n description: 'Content to write to the file',\n },\n },\n required: ['path', 'content'],\n },\n },\n },\n];\n/**\n * Built-in tools that work without a functional workspace.\n * These are always available when built-in tools are enabled.\n */\nconst STANDALONE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'think',\n description: TOOL_DESCRIPTIONS.think,\n parameters: {\n type: 'object',\n properties: {\n thought: {\n type: 'string',\n description: 'The thought to log',\n },\n },\n required: ['thought'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'finish',\n description: TOOL_DESCRIPTIONS.finish,\n parameters: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Final message or summary to present to the user',\n },\n },\n required: ['message'],\n },\n },\n },\n];\n/**\n * Local conversation implementation that runs the agent loop locally.\n *\n * LocalConversation provides direct agent execution on the local system without\n * requiring a remote server. It integrates with an LLM (via ILLM interface) to\n * process messages and execute tool calls through the LocalWorkspace.\n *\n * Example:\n * ```typescript\n * const workspace = new LocalWorkspace({ workingDir: '/path/to/project' });\n * const llm = new OpenRouterLLM({ apiKey: 'your-key', defaultModel: 'anthropic/claude-3.5-sonnet' });\n * const conversation = new LocalConversation(agent, workspace, {\n * llm,\n * maxIterations: 500,\n * systemPrompt: 'You are a helpful assistant...'\n * });\n * await conversation.start({ initialMessage: 'Hello!' });\n * await conversation.run();\n * await conversation.close();\n * ```\n */\nexport class LocalConversation {\n constructor(agent, workspace, options) {\n this.maxIterations = 500;\n this.messages = [];\n this._isPaused = false;\n this._isFinished = false;\n this._isWaitingForConfirmation = false;\n this.agent = agent;\n this.workspace = workspace;\n this.llm = options.llm;\n this.callback = options.callback;\n this.tokenCallback = options.tokenCallback;\n this._conversationId = options.conversationId;\n this.persistenceDir = options.persistenceDir;\n this.customTools = options.tools;\n this.toolExecutor = options.toolExecutor;\n // Include built-in tools by default only if no custom tools are provided\n this.includeBuiltinTools = options.includeBuiltinTools ?? !options.tools;\n // Initialize secret registry\n this.secretRegistry = new SecretRegistry();\n if (options.secrets) {\n this.secretRegistry.updateSecrets(options.secrets);\n }\n // Initialize stuck detection\n this.stuckDetectionEnabled = options.stuckDetection ?? true;\n if (this.stuckDetectionEnabled) {\n this.stuckDetector = new StuckDetector(options.stuckDetectionThresholds);\n }\n // Initialize security analyzer\n this.securityAnalyzer = options.securityAnalyzer;\n // Generate system prompt - use custom if provided, otherwise generate default\n this.systemPrompt =\n options.systemPrompt ||\n generateSystemPrompt({\n workingDir: workspace.workingDir,\n });\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n }\n /**\n * Check whether the workspace supports actual operations.\n * LocalWorkspace is a stub that throws on all operations.\n */\n workspaceIsStub() {\n return this.workspace instanceof LocalWorkspace;\n }\n /**\n * Get the tools available to the agent.\n * Workspace-dependent tools (execute_command, read_file, write_file) are only\n * included when the workspace supports actual operations.\n */\n getTools() {\n const tools = [];\n if (this.includeBuiltinTools) {\n tools.push(...STANDALONE_TOOLS);\n if (!this.workspaceIsStub()) {\n tools.push(...WORKSPACE_TOOLS);\n }\n }\n if (this.customTools) {\n tools.push(...this.customTools);\n }\n return tools;\n }\n get id() {\n if (!this._conversationId) {\n throw new Error('Conversation ID not set. Call start() to initialize the conversation.');\n }\n return this._conversationId;\n }\n get state() {\n if (!this._state) {\n if (!this._conversationId) {\n throw new Error('Conversation not initialized. Call start() to initialize the conversation.');\n }\n this._state = new LocalConversationState(this._conversationId);\n }\n return this._state;\n }\n /**\n * Start or resume a conversation.\n */\n async start(options = {}) {\n // Generate a conversation ID if not provided\n if (!this._conversationId) {\n this._conversationId = this.generateConversationId();\n }\n // Initialize state\n this._state = new LocalConversationState(this._conversationId);\n // Set max iterations if provided\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n // Initialize message history with system prompt\n this.messages = [{ role: 'system', content: this.systemPrompt }];\n // Add initial message if provided\n if (options.initialMessage) {\n await this.sendMessage(options.initialMessage);\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'conversation_started', conversationId: this._conversationId },\n });\n }\n /**\n * Get conversation statistics.\n */\n async conversationStats() {\n if (!this._state) {\n return { total_events: 0, message_events: 0, action_events: 0, observation_events: 0 };\n }\n const counts = this._state.events.getEventCounts();\n return {\n total_events: counts.total,\n message_events: counts.messages,\n action_events: counts.actions,\n observation_events: counts.observations,\n };\n }\n /**\n * Send a message to the agent.\n */\n async sendMessage(message) {\n const content = typeof message === 'string' ? message : JSON.stringify(message);\n // Add user message to history\n this.messages.push({ role: 'user', content });\n // Record the event\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'user_message', content },\n });\n }\n /**\n * Execute the agent loop to process messages.\n *\n * This runs the agent until:\n * - The agent calls the finish() tool\n * - Maximum iterations reached\n * - pause() is called\n * - An error occurs\n */\n async run() {\n if (!this._state) {\n throw new Error('Conversation not started. Call start() first.');\n }\n this._state.executionStatus = 'running';\n this._isPaused = false;\n this._isFinished = false;\n let iterations = 0;\n const tools = this.getTools();\n while (iterations < this.maxIterations && !this._isPaused && !this._isFinished) {\n iterations++;\n try {\n // Get LLM response\n const response = await this.llm.chatCompletion({\n messages: this.messages,\n tools: tools.length > 0 ? tools : undefined,\n toolChoice: tools.length > 0 ? 'auto' : undefined,\n });\n const choice = response.choices[0];\n if (!choice) {\n throw new Error('No response from LLM');\n }\n const assistantMessage = choice.message;\n // Add assistant message to history\n this.messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n tool_calls: assistantMessage.tool_calls,\n });\n // Emit the assistant's response\n if (assistantMessage.content) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'assistant_message', content: assistantMessage.content },\n });\n }\n // Handle tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (this._isPaused || this._isFinished)\n break;\n await this.handleToolCall(toolCall);\n }\n }\n else if (choice.finish_reason === 'stop') {\n // No tool calls and stop reason - agent is done\n this._isFinished = true;\n }\n }\n catch (error) {\n this.emitEvent({\n type: 'error',\n timestamp: Date.now(),\n data: {\n kind: 'agent_error',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n this._state.executionStatus = 'finished';\n throw error;\n }\n }\n this._state.executionStatus = this._isPaused ? 'paused' : 'finished';\n if (iterations >= this.maxIterations && !this._isFinished) {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'max_iterations_reached', iterations },\n });\n }\n }\n /**\n * Handle a tool call from the LLM.\n */\n async handleToolCall(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n this.emitEvent({\n type: 'action',\n timestamp: Date.now(),\n data: { kind: 'tool_call', tool: name, arguments: argsString },\n });\n let result;\n try {\n // If a custom tool executor is provided, use it for all tool calls\n if (this.toolExecutor) {\n result = await this.toolExecutor(toolCall);\n // Check if this was a finish tool call\n if (name === 'finish') {\n this._isFinished = true;\n }\n }\n else {\n // Use built-in tool handling\n result = await this.executeBuiltinTool(toolCall);\n }\n }\n catch (error) {\n result = `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`;\n }\n // Add tool result to messages\n this.messages.push({\n role: 'tool',\n content: result,\n tool_call_id: toolCall.id,\n });\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'tool_result', tool: name, result },\n });\n }\n /**\n * Execute a built-in tool.\n */\n async executeBuiltinTool(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n const args = JSON.parse(argsString);\n switch (name) {\n case 'execute_command': {\n const cmdResult = await this.workspace.executeCommand(args.command, args.cwd);\n let result = `Exit code: ${cmdResult.exit_code}\\n`;\n if (cmdResult.stdout)\n result += `stdout:\\n${cmdResult.stdout}\\n`;\n if (cmdResult.stderr)\n result += `stderr:\\n${cmdResult.stderr}`;\n if (cmdResult.timeout_occurred)\n result += '\\n(Command timed out)';\n return result;\n }\n case 'read_file': {\n const content = await this.workspace.downloadAsText(args.path);\n return content;\n }\n case 'write_file': {\n const uploadResult = await this.workspace.fileUpload(args.content, args.path);\n if (uploadResult.success) {\n return `Successfully wrote ${uploadResult.file_size} bytes to ${args.path}`;\n }\n else {\n return `Failed to write file: ${uploadResult.error}`;\n }\n }\n case 'think': {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'think', thought: args.thought },\n });\n return 'Your thought has been logged.';\n }\n case 'finish': {\n this._isFinished = true;\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'finish', message: args.message },\n });\n return 'Task completed.';\n }\n default:\n return `Unknown tool: ${name}`;\n }\n }\n /**\n * Pause agent execution.\n */\n async pause() {\n this._isPaused = true;\n if (this._state) {\n this._state.executionStatus = 'paused';\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'paused' },\n });\n }\n /**\n * Set the confirmation policy.\n */\n async setConfirmationPolicy(policy) {\n if (this._state) {\n // If it's a ConfirmationPolicyBase (old interface), wrap it\n if ('requiresConfirmation' in policy) {\n this._state.confirmationPolicy = policy;\n }\n else {\n // Create a simple wrapper\n const policyType = policy.type ?? policy.kind ?? 'never';\n this._state.confirmationPolicy = {\n type: policyType,\n requiresConfirmation: () => policyType === 'always' || policyType === 'AlwaysConfirm',\n };\n }\n }\n }\n /**\n * Send a confirmation response.\n *\n * Note: Confirmation handling is not yet fully implemented in LocalConversation.\n */\n async sendConfirmationResponse(accept, reason) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'confirmation_response', accept, reason },\n });\n // Resume execution if paused for confirmation\n if (accept) {\n this._isPaused = false;\n }\n }\n async setTitle(title) {\n this._title = title;\n }\n /**\n * Generate a title for the conversation using the LLM.\n */\n async generateTitle(maxLength = 50, _llm) {\n // LocalConversation always uses its own ILLM instance for title generation.\n // The llm parameter exists for interface compatibility with RemoteConversation.\n const llmToUse = this.llm;\n // Get a summary of the conversation\n const userMessages = this.messages\n .filter((m) => m.role === 'user')\n .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)))\n .slice(0, 3)\n .join('\\n');\n if (!userMessages) {\n return 'New Conversation';\n }\n const prompt = `Generate a short title (max ${maxLength} characters) for a conversation that starts with:\\n\\n${userMessages}\\n\\nRespond with only the title, no quotes or explanation.`;\n const title = await llmToUse.generate(prompt);\n return title.slice(0, maxLength).trim();\n }\n /**\n * Update secrets available to the agent.\n * Secrets are stored in the SecretRegistry and can be used for:\n * - Environment variable injection into commands\n * - Output masking to prevent accidental exposure\n */\n async updateSecrets(secrets) {\n this.secretRegistry.updateSecrets(secrets);\n }\n /**\n * Ask the agent a simple, stateless question and get a direct LLM response.\n *\n * This bypasses the normal conversation flow and does NOT modify, persist,\n * or become part of the conversation state. The request is not remembered by\n * the main agent, no events are recorded, and execution status is untouched.\n *\n * @param question - A simple string question to ask the agent\n * @returns A string response from the agent\n */\n async askAgent(question) {\n // Build context from recent conversation history\n const contextMessages = this.messages.slice(-10); // Last 10 messages for context\n const askPrompt = `Based on the conversation context, please answer this question concisely:\n\nQuestion: ${question}\n\nProvide a direct answer without using any tools.`;\n const messages = [...contextMessages, { role: 'user', content: askPrompt }];\n // Make a simple completion without tools\n const response = await this.llm.chatCompletion({\n messages,\n // No tools - just get a direct answer\n });\n return response.choices[0]?.message?.content || 'Unable to generate a response.';\n }\n /**\n * Reject all pending actions awaiting confirmation.\n *\n * @param reason - The reason for rejection\n */\n async rejectPendingActions(reason = 'User rejected the action') {\n if (!this._state)\n return;\n for (const [actionId, action] of this._state.pendingActions) {\n // Emit rejection event\n const rejectEvent = {\n id: generateEventId(),\n kind: 'UserRejectObservation',\n timestamp: new Date().toISOString(),\n source: 'user',\n action_id: actionId,\n tool_name: action.tool_name ?? '',\n tool_call_id: action.tool_call_id ?? '',\n rejection_reason: reason,\n rejection_source: 'user',\n };\n this.emitTypedEvent(rejectEvent);\n // Add rejection as tool result\n this.messages.push({\n role: 'tool',\n content: `Action rejected: ${reason}`,\n tool_call_id: action.tool_call_id,\n });\n }\n // Clear pending actions\n this._state.pendingActions.clear();\n // Resume if was waiting for confirmation\n if (this._isWaitingForConfirmation) {\n this._isWaitingForConfirmation = false;\n this._state.executionStatus = 'running';\n }\n }\n /**\n * Set the security analyzer for evaluating action risks.\n *\n * @param analyzer - The security analyzer to use, or null to disable\n */\n setSecurityAnalyzer(analyzer) {\n this.securityAnalyzer = analyzer || undefined;\n if (this._state) {\n this._state.securityAnalyzer = this.securityAnalyzer;\n }\n }\n /**\n * Check if the agent is currently stuck using the stuck detector.\n *\n * @returns StuckDetectionResult with details about any detected stuck pattern\n */\n checkIfStuck() {\n if (!this.stuckDetector || !this._state) {\n return { isStuck: false };\n }\n const events = this._state.events.getEventsSync();\n return this.stuckDetector.isStuck(events);\n }\n /**\n * Get the secret registry for direct access.\n * Useful for masking secrets in custom output handling.\n */\n getSecretRegistry() {\n return this.secretRegistry;\n }\n /**\n * Mask any secrets in the given text.\n *\n * @param text - Text that may contain secret values\n * @returns Text with secret values replaced by <secret-hidden>\n */\n maskSecrets(text) {\n return this.secretRegistry.maskSecretsInOutput(text);\n }\n /**\n * Start WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket since it runs locally.\n */\n async startWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Stop WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket.\n */\n async stopWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Close the conversation and cleanup resources.\n */\n async close() {\n this._isPaused = true;\n this._isFinished = true;\n if (this._state) {\n this._state.executionStatus = 'finished';\n }\n this.workspace.close();\n this.llm.close();\n const stateEvent = {\n id: generateEventId(),\n kind: 'ConversationStateUpdateEvent',\n timestamp: new Date().toISOString(),\n source: 'system',\n key: 'status',\n value: 'closed',\n };\n this.emitTypedEvent(stateEvent);\n }\n /**\n * Get the current message history.\n */\n getMessages() {\n return [...this.messages];\n }\n /**\n * Emit a typed event and call the callback if provided.\n */\n emitTypedEvent(event) {\n if (this._state) {\n this._state.events.addEvent(event);\n }\n if (this.callback) {\n // Convert to the callback's expected Event format\n this.callback(event);\n }\n }\n /**\n * Emit an event (legacy format) and call the callback if provided.\n * @deprecated Use emitTypedEvent instead\n */\n emitEvent(event) {\n // Convert to typed event\n const typedEvent = {\n id: generateEventId(),\n kind: event.data?.kind || event.type,\n timestamp: new Date(event.timestamp).toISOString(),\n ...event.data,\n };\n if (this._state) {\n this._state.events.addEvent(typedEvent);\n }\n if (this.callback) {\n this.callback(typedEvent);\n }\n }\n /**\n * Generate a unique conversation ID.\n */\n generateConversationId() {\n return crypto.randomUUID();\n }\n}\n//# sourceMappingURL=local-conversation.js.map"],"x_google_ignoreList":[0],"mappings":";AA+GyB,EAAkB,iBAyBlB,EAAkB,WAiBlB,EAAkB,YA2BlB,EAAkB,OAiBlB,EAAkB"}
1
+ {"version":3,"file":"local-conversation.js","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/conversation/local-conversation.js"],"sourcesContent":["/**\n * Local conversation implementation\n *\n * This implements the IConversation interface for local execution. Unlike RemoteConversation,\n * LocalConversation runs the agent loop locally without connecting to a remote server.\n *\n * This mirrors the Python SDK's LocalConversation class.\n */\nimport { LocalWorkspace } from '../workspace/local-workspace.js';\nimport { generateSystemPrompt, TOOL_DESCRIPTIONS } from '../prompts/index.js';\nimport { SecretRegistry } from './secret-registry.js';\nimport { StuckDetector } from './stuck-detector.js';\nimport { generateEventId, } from '../events/types.js';\nimport { NeverConfirm } from '../security/confirmation-policy.js';\n/**\n * Implementation of events list for local conversations.\n * Stores typed events and provides indexing and search capabilities.\n */\nclass LocalEventsList {\n constructor() {\n this.events = [];\n this.idToIndex = new Map();\n }\n async addEvent(event) {\n const index = this.events.length;\n this.events.push(event);\n if (event.id) {\n this.idToIndex.set(event.id, index);\n }\n }\n async getEvents() {\n return [...this.events];\n }\n /**\n * Get all events as an array (synchronous access).\n */\n getEventsSync() {\n return [...this.events];\n }\n /**\n * Get an event by index.\n */\n getByIndex(index) {\n if (index < 0) {\n index = this.events.length + index;\n }\n return this.events[index];\n }\n /**\n * Get an event by ID.\n */\n getById(id) {\n const index = this.idToIndex.get(id);\n return index !== undefined ? this.events[index] : undefined;\n }\n /**\n * Get the index of an event by ID.\n */\n getIndex(id) {\n return this.idToIndex.get(id);\n }\n /**\n * Get the number of events.\n */\n get length() {\n return this.events.length;\n }\n /**\n * Iterate over events.\n */\n [Symbol.iterator]() {\n return this.events[Symbol.iterator]();\n }\n getEventCounts() {\n let messages = 0;\n let actions = 0;\n let observations = 0;\n let errors = 0;\n for (const event of this.events) {\n if (event.kind === 'MessageEvent')\n messages++;\n else if (event.kind === 'ActionEvent')\n actions++;\n else if (event.kind === 'ObservationEvent')\n observations++;\n else if (event.kind === 'AgentErrorEvent')\n errors++;\n }\n return { total: this.events.length, messages, actions, observations, errors };\n }\n}\n/**\n * Implementation of conversation state for local conversations.\n */\nclass LocalConversationState {\n constructor(id) {\n this.executionStatus = 'idle';\n this.confirmationPolicy = new NeverConfirm();\n /** Actions waiting for confirmation: action_id -> ActionEvent */\n this.pendingActions = new Map();\n this.id = id;\n this.events = new LocalEventsList();\n }\n}\n/**\n * Built-in tools that require a functional workspace (execute_command, read_file, write_file).\n * These are only registered when the workspace supports them (i.e., not a stub LocalWorkspace).\n */\nconst WORKSPACE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'execute_command',\n description: TOOL_DESCRIPTIONS.execute_command,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The bash command to execute. You can only execute one bash command at a time. If you need to run multiple commands sequentially, use `&&` or `;` to chain them together.',\n },\n cwd: {\n type: 'string',\n description: 'Working directory for the command (optional, defaults to workspace root)',\n },\n timeout: {\n type: 'number',\n description: 'Optional timeout in seconds for the command (default: 30)',\n },\n },\n required: ['command'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'read_file',\n description: TOOL_DESCRIPTIONS.read_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to read (relative to workspace or absolute)',\n },\n },\n required: ['path'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'write_file',\n description: TOOL_DESCRIPTIONS.write_file,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to the file to write (relative to workspace or absolute)',\n },\n content: {\n type: 'string',\n description: 'Content to write to the file',\n },\n },\n required: ['path', 'content'],\n },\n },\n },\n];\n/**\n * Built-in tools that work without a functional workspace.\n * These are always available when built-in tools are enabled.\n */\nconst STANDALONE_TOOLS = [\n {\n type: 'function',\n function: {\n name: 'think',\n description: TOOL_DESCRIPTIONS.think,\n parameters: {\n type: 'object',\n properties: {\n thought: {\n type: 'string',\n description: 'The thought to log',\n },\n },\n required: ['thought'],\n },\n },\n },\n {\n type: 'function',\n function: {\n name: 'finish',\n description: TOOL_DESCRIPTIONS.finish,\n parameters: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Final message or summary to present to the user',\n },\n },\n required: ['message'],\n },\n },\n },\n];\n/**\n * Local conversation implementation that runs the agent loop locally.\n *\n * LocalConversation provides direct agent execution on the local system without\n * requiring a remote server. It integrates with an LLM (via ILLM interface) to\n * process messages and execute tool calls through the LocalWorkspace.\n *\n * Example:\n * ```typescript\n * const workspace = new LocalWorkspace({ workingDir: '/path/to/project' });\n * const llm = new OpenRouterLLM({ apiKey: 'your-key', defaultModel: 'anthropic/claude-3.5-sonnet' });\n * const conversation = new LocalConversation(agent, workspace, {\n * llm,\n * maxIterations: 500,\n * systemPrompt: 'You are a helpful assistant...'\n * });\n * await conversation.start({ initialMessage: 'Hello!' });\n * await conversation.run();\n * await conversation.close();\n * ```\n */\nexport class LocalConversation {\n constructor(agent, workspace, options) {\n this.maxIterations = 500;\n this.messages = [];\n this._isPaused = false;\n this._isFinished = false;\n this._isWaitingForConfirmation = false;\n this.agent = agent;\n this.workspace = workspace;\n this.llm = options.llm;\n this.callback = options.callback;\n this.tokenCallback = options.tokenCallback;\n this._conversationId = options.conversationId;\n this.persistenceDir = options.persistenceDir;\n this.customTools = options.tools;\n this.toolExecutor = options.toolExecutor;\n // Include built-in tools by default only if no custom tools are provided\n this.includeBuiltinTools = options.includeBuiltinTools ?? !options.tools;\n // Initialize secret registry\n this.secretRegistry = new SecretRegistry();\n if (options.secrets) {\n this.secretRegistry.updateSecrets(options.secrets);\n }\n // Initialize stuck detection\n this.stuckDetectionEnabled = options.stuckDetection ?? true;\n if (this.stuckDetectionEnabled) {\n this.stuckDetector = new StuckDetector(options.stuckDetectionThresholds);\n }\n // Initialize security analyzer\n this.securityAnalyzer = options.securityAnalyzer;\n // Generate system prompt - use custom if provided, otherwise generate default\n this.systemPrompt =\n options.systemPrompt ||\n generateSystemPrompt({\n workingDir: workspace.workingDir,\n });\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n }\n /**\n * Check whether the workspace supports actual operations.\n * LocalWorkspace is a stub that throws on all operations.\n */\n workspaceIsStub() {\n return this.workspace instanceof LocalWorkspace;\n }\n /**\n * Get the tools available to the agent.\n * Workspace-dependent tools (execute_command, read_file, write_file) are only\n * included when the workspace supports actual operations.\n */\n getTools() {\n const tools = [];\n if (this.includeBuiltinTools) {\n tools.push(...STANDALONE_TOOLS);\n if (!this.workspaceIsStub()) {\n tools.push(...WORKSPACE_TOOLS);\n }\n }\n if (this.customTools) {\n tools.push(...this.customTools);\n }\n return tools;\n }\n get id() {\n if (!this._conversationId) {\n throw new Error('Conversation ID not set. Call start() to initialize the conversation.');\n }\n return this._conversationId;\n }\n get state() {\n if (!this._state) {\n if (!this._conversationId) {\n throw new Error('Conversation not initialized. Call start() to initialize the conversation.');\n }\n this._state = new LocalConversationState(this._conversationId);\n }\n return this._state;\n }\n /**\n * Start or resume a conversation.\n */\n async start(options = {}) {\n // Generate a conversation ID if not provided\n if (!this._conversationId) {\n this._conversationId = this.generateConversationId();\n }\n // Initialize state\n this._state = new LocalConversationState(this._conversationId);\n // Set max iterations if provided\n if (options.maxIterations !== undefined) {\n this.maxIterations = options.maxIterations;\n }\n // Initialize message history with system prompt\n this.messages = [{ role: 'system', content: this.systemPrompt }];\n // Add initial message if provided\n if (options.initialMessage) {\n await this.sendMessage(options.initialMessage);\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'conversation_started', conversationId: this._conversationId },\n });\n }\n /**\n * Get conversation statistics.\n */\n async conversationStats() {\n if (!this._state) {\n return { total_events: 0, message_events: 0, action_events: 0, observation_events: 0 };\n }\n const counts = this._state.events.getEventCounts();\n return {\n total_events: counts.total,\n message_events: counts.messages,\n action_events: counts.actions,\n observation_events: counts.observations,\n };\n }\n /**\n * Send a message to the agent.\n */\n async sendMessage(message) {\n const content = typeof message === 'string' ? message : JSON.stringify(message);\n // Add user message to history\n this.messages.push({ role: 'user', content });\n // Record the event\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'user_message', content },\n });\n }\n /**\n * Execute the agent loop to process messages.\n *\n * This runs the agent until:\n * - The agent calls the finish() tool\n * - Maximum iterations reached\n * - pause() is called\n * - An error occurs\n */\n async run() {\n if (!this._state) {\n throw new Error('Conversation not started. Call start() first.');\n }\n this._state.executionStatus = 'running';\n this._isPaused = false;\n this._isFinished = false;\n let iterations = 0;\n const tools = this.getTools();\n while (iterations < this.maxIterations && !this._isPaused && !this._isFinished) {\n iterations++;\n try {\n // Get LLM response\n const response = await this.llm.chatCompletion({\n messages: this.messages,\n tools: tools.length > 0 ? tools : undefined,\n toolChoice: tools.length > 0 ? 'auto' : undefined,\n });\n const choice = response.choices[0];\n if (!choice) {\n throw new Error('No response from LLM');\n }\n const assistantMessage = choice.message;\n // Add assistant message to history\n this.messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n tool_calls: assistantMessage.tool_calls,\n });\n // Emit the assistant's response\n if (assistantMessage.content) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'assistant_message', content: assistantMessage.content },\n });\n }\n // Handle tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (this._isPaused || this._isFinished)\n break;\n await this.handleToolCall(toolCall);\n }\n }\n else if (choice.finish_reason === 'stop') {\n // No tool calls and stop reason - agent is done\n this._isFinished = true;\n }\n }\n catch (error) {\n this.emitEvent({\n type: 'error',\n timestamp: Date.now(),\n data: {\n kind: 'agent_error',\n error: error instanceof Error ? error.message : String(error),\n },\n });\n this._state.executionStatus = 'finished';\n throw error;\n }\n }\n this._state.executionStatus = this._isPaused ? 'paused' : 'finished';\n if (iterations >= this.maxIterations && !this._isFinished) {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'max_iterations_reached', iterations },\n });\n }\n }\n /**\n * Handle a tool call from the LLM.\n */\n async handleToolCall(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n this.emitEvent({\n type: 'action',\n timestamp: Date.now(),\n data: { kind: 'tool_call', tool: name, arguments: argsString },\n });\n let result;\n try {\n // If a custom tool executor is provided, use it for all tool calls\n if (this.toolExecutor) {\n result = await this.toolExecutor(toolCall);\n // Check if this was a finish tool call\n if (name === 'finish') {\n this._isFinished = true;\n }\n }\n else {\n // Use built-in tool handling\n result = await this.executeBuiltinTool(toolCall);\n }\n }\n catch (error) {\n result = `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`;\n }\n // Add tool result to messages\n this.messages.push({\n role: 'tool',\n content: result,\n tool_call_id: toolCall.id,\n });\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'tool_result', tool: name, result },\n });\n }\n /**\n * Execute a built-in tool.\n */\n async executeBuiltinTool(toolCall) {\n const { name, arguments: argsString } = toolCall.function;\n const args = JSON.parse(argsString);\n switch (name) {\n case 'execute_command': {\n const cmdResult = await this.workspace.executeCommand(args.command, args.cwd);\n let result = `Exit code: ${cmdResult.exit_code}\\n`;\n if (cmdResult.stdout)\n result += `stdout:\\n${cmdResult.stdout}\\n`;\n if (cmdResult.stderr)\n result += `stderr:\\n${cmdResult.stderr}`;\n if (cmdResult.timeout_occurred)\n result += '\\n(Command timed out)';\n return result;\n }\n case 'read_file': {\n const content = await this.workspace.downloadAsText(args.path);\n return content;\n }\n case 'write_file': {\n const uploadResult = await this.workspace.fileUpload(args.content, args.path);\n if (uploadResult.success) {\n return `Successfully wrote ${uploadResult.file_size} bytes to ${args.path}`;\n }\n else {\n return `Failed to write file: ${uploadResult.error}`;\n }\n }\n case 'think': {\n this.emitEvent({\n type: 'observation',\n timestamp: Date.now(),\n data: { kind: 'think', thought: args.thought },\n });\n return 'Your thought has been logged.';\n }\n case 'finish': {\n this._isFinished = true;\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'finish', message: args.message },\n });\n return 'Task completed.';\n }\n default:\n return `Unknown tool: ${name}`;\n }\n }\n /**\n * Pause agent execution.\n */\n async pause() {\n this._isPaused = true;\n if (this._state) {\n this._state.executionStatus = 'paused';\n }\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'paused' },\n });\n }\n /**\n * Set the confirmation policy.\n */\n async setConfirmationPolicy(policy) {\n if (this._state) {\n // If it's a ConfirmationPolicyBase (old interface), wrap it\n if ('requiresConfirmation' in policy) {\n this._state.confirmationPolicy = policy;\n }\n else {\n // Create a simple wrapper\n const policyType = policy.type ?? policy.kind ?? 'never';\n this._state.confirmationPolicy = {\n type: policyType,\n requiresConfirmation: () => policyType === 'always' || policyType === 'AlwaysConfirm',\n };\n }\n }\n }\n /**\n * Send a confirmation response.\n *\n * Note: Confirmation handling is not yet fully implemented in LocalConversation.\n */\n async sendConfirmationResponse(accept, reason) {\n this.emitEvent({\n type: 'message',\n timestamp: Date.now(),\n data: { kind: 'confirmation_response', accept, reason },\n });\n // Resume execution if paused for confirmation\n if (accept) {\n this._isPaused = false;\n }\n }\n async setTitle(title) {\n this._title = title;\n }\n /**\n * Generate a title for the conversation using the LLM.\n */\n async generateTitle(maxLength = 50, _llm) {\n // LocalConversation always uses its own ILLM instance for title generation.\n // The llm parameter exists for interface compatibility with RemoteConversation.\n const llmToUse = this.llm;\n // Get a summary of the conversation\n const userMessages = this.messages\n .filter((m) => m.role === 'user')\n .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)))\n .slice(0, 3)\n .join('\\n');\n if (!userMessages) {\n return 'New Conversation';\n }\n const prompt = `Generate a short title (max ${maxLength} characters) for a conversation that starts with:\\n\\n${userMessages}\\n\\nRespond with only the title, no quotes or explanation.`;\n const title = await llmToUse.generate(prompt);\n return title.slice(0, maxLength).trim();\n }\n /**\n * Update secrets available to the agent.\n * Secrets are stored in the SecretRegistry and can be used for:\n * - Environment variable injection into commands\n * - Output masking to prevent accidental exposure\n */\n async updateSecrets(secrets) {\n this.secretRegistry.updateSecrets(secrets);\n }\n /**\n * Ask the agent a simple, stateless question and get a direct LLM response.\n *\n * This bypasses the normal conversation flow and does NOT modify, persist,\n * or become part of the conversation state. The request is not remembered by\n * the main agent, no events are recorded, and execution status is untouched.\n *\n * @param question - A simple string question to ask the agent\n * @returns A string response from the agent\n */\n async askAgent(question) {\n // Build context from recent conversation history\n const contextMessages = this.messages.slice(-10); // Last 10 messages for context\n const askPrompt = `Based on the conversation context, please answer this question concisely:\n\nQuestion: ${question}\n\nProvide a direct answer without using any tools.`;\n const messages = [...contextMessages, { role: 'user', content: askPrompt }];\n // Make a simple completion without tools\n const response = await this.llm.chatCompletion({\n messages,\n // No tools - just get a direct answer\n });\n return response.choices[0]?.message?.content || 'Unable to generate a response.';\n }\n /**\n * Reject all pending actions awaiting confirmation.\n *\n * @param reason - The reason for rejection\n */\n async rejectPendingActions(reason = 'User rejected the action') {\n if (!this._state)\n return;\n for (const [actionId, action] of this._state.pendingActions) {\n // Emit rejection event\n const rejectEvent = {\n id: generateEventId(),\n kind: 'UserRejectObservation',\n timestamp: new Date().toISOString(),\n source: 'user',\n action_id: actionId,\n tool_name: action.tool_name ?? '',\n tool_call_id: action.tool_call_id ?? '',\n rejection_reason: reason,\n rejection_source: 'user',\n };\n this.emitTypedEvent(rejectEvent);\n // Add rejection as tool result\n this.messages.push({\n role: 'tool',\n content: `Action rejected: ${reason}`,\n tool_call_id: action.tool_call_id,\n });\n }\n // Clear pending actions\n this._state.pendingActions.clear();\n // Resume if was waiting for confirmation\n if (this._isWaitingForConfirmation) {\n this._isWaitingForConfirmation = false;\n this._state.executionStatus = 'running';\n }\n }\n /**\n * Set the security analyzer for evaluating action risks.\n *\n * @param analyzer - The security analyzer to use, or null to disable\n */\n setSecurityAnalyzer(analyzer) {\n this.securityAnalyzer = analyzer || undefined;\n if (this._state) {\n this._state.securityAnalyzer = this.securityAnalyzer;\n }\n }\n /**\n * Check if the agent is currently stuck using the stuck detector.\n *\n * @returns StuckDetectionResult with details about any detected stuck pattern\n */\n checkIfStuck() {\n if (!this.stuckDetector || !this._state) {\n return { isStuck: false };\n }\n const events = this._state.events.getEventsSync();\n return this.stuckDetector.isStuck(events);\n }\n /**\n * Get the secret registry for direct access.\n * Useful for masking secrets in custom output handling.\n */\n getSecretRegistry() {\n return this.secretRegistry;\n }\n /**\n * Mask any secrets in the given text.\n *\n * @param text - Text that may contain secret values\n * @returns Text with secret values replaced by <secret-hidden>\n */\n maskSecrets(text) {\n return this.secretRegistry.maskSecretsInOutput(text);\n }\n /**\n * Start WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket since it runs locally.\n */\n async startWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Stop WebSocket client.\n *\n * NOTE: LocalConversation doesn't use WebSocket.\n */\n async stopWebSocketClient() {\n // No-op for local conversation\n }\n /**\n * Close the conversation and cleanup resources.\n */\n async close() {\n this._isPaused = true;\n this._isFinished = true;\n if (this._state) {\n this._state.executionStatus = 'finished';\n }\n this.workspace.close();\n this.llm.close();\n const stateEvent = {\n id: generateEventId(),\n kind: 'ConversationStateUpdateEvent',\n timestamp: new Date().toISOString(),\n source: 'environment',\n key: 'status',\n value: 'closed',\n };\n this.emitTypedEvent(stateEvent);\n }\n /**\n * Get the current message history.\n */\n getMessages() {\n return [...this.messages];\n }\n /**\n * Emit a typed event and call the callback if provided.\n */\n emitTypedEvent(event) {\n if (this._state) {\n this._state.events.addEvent(event);\n }\n if (this.callback) {\n // Convert to the callback's expected Event format\n this.callback(event);\n }\n }\n /**\n * Emit an event (legacy format) and call the callback if provided.\n * @deprecated Use emitTypedEvent instead\n */\n emitEvent(event) {\n // Convert to typed event\n const typedEvent = {\n id: generateEventId(),\n kind: event.data?.kind || event.type,\n timestamp: new Date(event.timestamp).toISOString(),\n ...event.data,\n };\n if (this._state) {\n this._state.events.addEvent(typedEvent);\n }\n if (this.callback) {\n this.callback(typedEvent);\n }\n }\n /**\n * Generate a unique conversation ID.\n */\n generateConversationId() {\n return crypto.randomUUID();\n }\n}\n//# sourceMappingURL=local-conversation.js.map"],"x_google_ignoreList":[0],"mappings":";AAiHyB,EAAkB,iBAyBlB,EAAkB,WAiBlB,EAAkB,YA2BlB,EAAkB,OAiBlB,EAAkB"}
@@ -1,2 +1,2 @@
1
- require("../../../../../_virtual/_rolldown/runtime.cjs");var e={"claude-code":{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp@0.44.0`],api_key_env_var:`ANTHROPIC_API_KEY`,base_url_env_var:`ANTHROPIC_BASE_URL`,default_session_mode:`bypassPermissions`,agent_name_patterns:[`claude-agent`],supports_set_session_model:!0,session_meta_key:`claudeCode`,available_models:[{id:`default`,label:`Default (recommended)`},{id:`opus[1m]`,label:`Claude Opus 4.8 (1M)`},{id:`sonnet`,label:`Claude Sonnet 4.6`},{id:`haiku`,label:`Claude Haiku 4.5`}],default_model:`opus[1m]`,supports_runtime_model_switch:!0,file_secrets:[],binary_name:`claude-agent-acp`,data_dir_env_var:`CLAUDE_CONFIG_DIR`},codex:{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@agentclientprotocol/codex-acp@1.1.2`],api_key_env_var:`OPENAI_API_KEY`,base_url_env_var:`OPENAI_BASE_URL`,default_session_mode:`agent-full-access`,agent_name_patterns:[`codex-acp`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`gpt-5.6`,label:`GPT-5.6`},{id:`gpt-5.6-sol`,label:`GPT-5.6 Sol`},{id:`gpt-5.6-terra`,label:`GPT-5.6 Terra`},{id:`gpt-5.6-luna`,label:`GPT-5.6 Luna`},{id:`gpt-5.5`,label:`GPT-5.5`},{id:`gpt-5.4`,label:`GPT-5.4`},{id:`gpt-5.4-mini`,label:`GPT-5.4 Mini`}],default_model:`gpt-5.5`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`CODEX_AUTH_JSON`,filename:`auth.json`,env_var:`CODEX_HOME`,subdir:`codex`,env_points_to:`dir`,warn_if_unset:[]}],binary_name:`codex-acp`,data_dir_env_var:`CODEX_HOME`},"gemini-cli":{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli@0.46.0`,`--acp`],api_key_env_var:`GEMINI_API_KEY`,base_url_env_var:`GEMINI_BASE_URL`,default_session_mode:`default`,agent_name_patterns:[`gemini-cli`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`auto`,label:`Auto`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-pro-preview`,label:`Gemini 3 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`}],default_model:`auto`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`GOOGLE_APPLICATION_CREDENTIALS_JSON`,filename:`gcloud-credentials.json`,env_var:`GOOGLE_APPLICATION_CREDENTIALS`,subdir:`gemini-cli`,env_points_to:`file`,warn_if_unset:[`GOOGLE_CLOUD_PROJECT`,`GOOGLE_CLOUD_LOCATION`]}],binary_name:`gemini`,data_dir_env_var:`HOME`}};exports.default=e;
1
+ require("../../../../../_virtual/_rolldown/runtime.cjs");var e={"claude-code":{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp@0.63.0`],api_key_env_var:`ANTHROPIC_API_KEY`,base_url_env_var:`ANTHROPIC_BASE_URL`,default_session_mode:`bypassPermissions`,agent_name_patterns:[`claude-agent`],supports_set_session_model:!0,session_meta_key:`claudeCode`,available_models:[{id:`default`,label:`Default (recommended)`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-5`,label:`Claude Opus 5`},{id:`sonnet`,label:`Claude Sonnet`},{id:`haiku`,label:`Claude Haiku`}],default_model:`opus[1m]`,supports_runtime_model_switch:!0,file_secrets:[],binary_name:`claude-agent-acp`,data_dir_env_var:`CLAUDE_CONFIG_DIR`},codex:{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@agentclientprotocol/codex-acp@1.1.7`],api_key_env_var:`OPENAI_API_KEY`,base_url_env_var:`OPENAI_BASE_URL`,default_session_mode:`agent-full-access`,agent_name_patterns:[`codex-acp`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`gpt-5.6`,label:`GPT-5.6`},{id:`gpt-5.6-sol`,label:`GPT-5.6 Sol`},{id:`gpt-5.6-terra`,label:`GPT-5.6 Terra`},{id:`gpt-5.6-luna`,label:`GPT-5.6 Luna`},{id:`gpt-5.5`,label:`GPT-5.5`},{id:`gpt-5.4`,label:`GPT-5.4`},{id:`gpt-5.4-mini`,label:`GPT-5.4 Mini`}],default_model:`gpt-5.5`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`CODEX_AUTH_JSON`,filename:`auth.json`,env_var:`CODEX_HOME`,subdir:`codex`,env_points_to:`dir`,warn_if_unset:[]}],binary_name:`codex-acp`,data_dir_env_var:`CODEX_HOME`},"gemini-cli":{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli@0.46.0`,`--acp`],api_key_env_var:`GEMINI_API_KEY`,base_url_env_var:`GEMINI_BASE_URL`,default_session_mode:`default`,agent_name_patterns:[`gemini-cli`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`auto`,label:`Auto`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-pro-preview`,label:`Gemini 3 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`}],default_model:`auto`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`GOOGLE_APPLICATION_CREDENTIALS_JSON`,filename:`gcloud-credentials.json`,env_var:`GOOGLE_APPLICATION_CREDENTIALS`,subdir:`gemini-cli`,env_points_to:`file`,warn_if_unset:[`GOOGLE_CLOUD_PROJECT`,`GOOGLE_CLOUD_LOCATION`]}],binary_name:`gemini`,data_dir_env_var:`HOME`}};exports.default=e;
2
2
  //# sourceMappingURL=acp-providers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acp-providers.cjs","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/models/acp-providers.json"],"sourcesContent":["{\n \"claude-code\": {\n \"key\": \"claude-code\",\n \"display_name\": \"Claude Code\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/claude-agent-acp@0.44.0\"],\n \"api_key_env_var\": \"ANTHROPIC_API_KEY\",\n \"base_url_env_var\": \"ANTHROPIC_BASE_URL\",\n \"default_session_mode\": \"bypassPermissions\",\n \"agent_name_patterns\": [\"claude-agent\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": \"claudeCode\",\n \"available_models\": [\n {\n \"id\": \"default\",\n \"label\": \"Default (recommended)\"\n },\n {\n \"id\": \"opus[1m]\",\n \"label\": \"Claude Opus 4.8 (1M)\"\n },\n {\n \"id\": \"sonnet\",\n \"label\": \"Claude Sonnet 4.6\"\n },\n {\n \"id\": \"haiku\",\n \"label\": \"Claude Haiku 4.5\"\n }\n ],\n \"default_model\": \"opus[1m]\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [],\n \"binary_name\": \"claude-agent-acp\",\n \"data_dir_env_var\": \"CLAUDE_CONFIG_DIR\"\n },\n \"codex\": {\n \"key\": \"codex\",\n \"display_name\": \"Codex\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/codex-acp@1.1.2\"],\n \"api_key_env_var\": \"OPENAI_API_KEY\",\n \"base_url_env_var\": \"OPENAI_BASE_URL\",\n \"default_session_mode\": \"agent-full-access\",\n \"agent_name_patterns\": [\"codex-acp\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"gpt-5.6\",\n \"label\": \"GPT-5.6\"\n },\n {\n \"id\": \"gpt-5.6-sol\",\n \"label\": \"GPT-5.6 Sol\"\n },\n {\n \"id\": \"gpt-5.6-terra\",\n \"label\": \"GPT-5.6 Terra\"\n },\n {\n \"id\": \"gpt-5.6-luna\",\n \"label\": \"GPT-5.6 Luna\"\n },\n {\n \"id\": \"gpt-5.5\",\n \"label\": \"GPT-5.5\"\n },\n {\n \"id\": \"gpt-5.4\",\n \"label\": \"GPT-5.4\"\n },\n {\n \"id\": \"gpt-5.4-mini\",\n \"label\": \"GPT-5.4 Mini\"\n }\n ],\n \"default_model\": \"gpt-5.5\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"CODEX_AUTH_JSON\",\n \"filename\": \"auth.json\",\n \"env_var\": \"CODEX_HOME\",\n \"subdir\": \"codex\",\n \"env_points_to\": \"dir\",\n \"warn_if_unset\": []\n }\n ],\n \"binary_name\": \"codex-acp\",\n \"data_dir_env_var\": \"CODEX_HOME\"\n },\n \"gemini-cli\": {\n \"key\": \"gemini-cli\",\n \"display_name\": \"Gemini CLI\",\n \"default_command\": [\"npx\", \"-y\", \"@google/gemini-cli@0.46.0\", \"--acp\"],\n \"api_key_env_var\": \"GEMINI_API_KEY\",\n \"base_url_env_var\": \"GEMINI_BASE_URL\",\n \"default_session_mode\": \"default\",\n \"agent_name_patterns\": [\"gemini-cli\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"id\": \"gemini-3.1-pro-preview\",\n \"label\": \"Gemini 3.1 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-pro-preview\",\n \"label\": \"Gemini 3 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-flash-preview\",\n \"label\": \"Gemini 3 Flash (preview)\"\n },\n {\n \"id\": \"gemini-3.1-flash-lite\",\n \"label\": \"Gemini 3.1 Flash Lite\"\n },\n {\n \"id\": \"gemini-2.5-pro\",\n \"label\": \"Gemini 2.5 Pro\"\n },\n {\n \"id\": \"gemini-2.5-flash\",\n \"label\": \"Gemini 2.5 Flash\"\n }\n ],\n \"default_model\": \"auto\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"filename\": \"gcloud-credentials.json\",\n \"env_var\": \"GOOGLE_APPLICATION_CREDENTIALS\",\n \"subdir\": \"gemini-cli\",\n \"env_points_to\": \"file\",\n \"warn_if_unset\": [\"GOOGLE_CLOUD_PROJECT\", \"GOOGLE_CLOUD_LOCATION\"]\n }\n ],\n \"binary_name\": \"gemini\",\n \"data_dir_env_var\": \"HOME\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
1
+ {"version":3,"file":"acp-providers.cjs","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/models/acp-providers.json"],"sourcesContent":["{\n \"claude-code\": {\n \"key\": \"claude-code\",\n \"display_name\": \"Claude Code\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/claude-agent-acp@0.63.0\"],\n \"api_key_env_var\": \"ANTHROPIC_API_KEY\",\n \"base_url_env_var\": \"ANTHROPIC_BASE_URL\",\n \"default_session_mode\": \"bypassPermissions\",\n \"agent_name_patterns\": [\"claude-agent\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": \"claudeCode\",\n \"available_models\": [\n {\n \"id\": \"default\",\n \"label\": \"Default (recommended)\"\n },\n {\n \"id\": \"opus[1m]\",\n \"label\": \"Claude Opus (1M)\"\n },\n {\n \"id\": \"claude-opus-5\",\n \"label\": \"Claude Opus 5\"\n },\n {\n \"id\": \"sonnet\",\n \"label\": \"Claude Sonnet\"\n },\n {\n \"id\": \"haiku\",\n \"label\": \"Claude Haiku\"\n }\n ],\n \"default_model\": \"opus[1m]\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [],\n \"binary_name\": \"claude-agent-acp\",\n \"data_dir_env_var\": \"CLAUDE_CONFIG_DIR\"\n },\n \"codex\": {\n \"key\": \"codex\",\n \"display_name\": \"Codex\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/codex-acp@1.1.7\"],\n \"api_key_env_var\": \"OPENAI_API_KEY\",\n \"base_url_env_var\": \"OPENAI_BASE_URL\",\n \"default_session_mode\": \"agent-full-access\",\n \"agent_name_patterns\": [\"codex-acp\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"gpt-5.6\",\n \"label\": \"GPT-5.6\"\n },\n {\n \"id\": \"gpt-5.6-sol\",\n \"label\": \"GPT-5.6 Sol\"\n },\n {\n \"id\": \"gpt-5.6-terra\",\n \"label\": \"GPT-5.6 Terra\"\n },\n {\n \"id\": \"gpt-5.6-luna\",\n \"label\": \"GPT-5.6 Luna\"\n },\n {\n \"id\": \"gpt-5.5\",\n \"label\": \"GPT-5.5\"\n },\n {\n \"id\": \"gpt-5.4\",\n \"label\": \"GPT-5.4\"\n },\n {\n \"id\": \"gpt-5.4-mini\",\n \"label\": \"GPT-5.4 Mini\"\n }\n ],\n \"default_model\": \"gpt-5.5\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"CODEX_AUTH_JSON\",\n \"filename\": \"auth.json\",\n \"env_var\": \"CODEX_HOME\",\n \"subdir\": \"codex\",\n \"env_points_to\": \"dir\",\n \"warn_if_unset\": []\n }\n ],\n \"binary_name\": \"codex-acp\",\n \"data_dir_env_var\": \"CODEX_HOME\"\n },\n \"gemini-cli\": {\n \"key\": \"gemini-cli\",\n \"display_name\": \"Gemini CLI\",\n \"default_command\": [\"npx\", \"-y\", \"@google/gemini-cli@0.46.0\", \"--acp\"],\n \"api_key_env_var\": \"GEMINI_API_KEY\",\n \"base_url_env_var\": \"GEMINI_BASE_URL\",\n \"default_session_mode\": \"default\",\n \"agent_name_patterns\": [\"gemini-cli\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"id\": \"gemini-3.1-pro-preview\",\n \"label\": \"Gemini 3.1 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-pro-preview\",\n \"label\": \"Gemini 3 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-flash-preview\",\n \"label\": \"Gemini 3 Flash (preview)\"\n },\n {\n \"id\": \"gemini-3.1-flash-lite\",\n \"label\": \"Gemini 3.1 Flash Lite\"\n },\n {\n \"id\": \"gemini-2.5-pro\",\n \"label\": \"Gemini 2.5 Pro\"\n },\n {\n \"id\": \"gemini-2.5-flash\",\n \"label\": \"Gemini 2.5 Flash\"\n }\n ],\n \"default_model\": \"auto\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"filename\": \"gcloud-credentials.json\",\n \"env_var\": \"GOOGLE_APPLICATION_CREDENTIALS\",\n \"subdir\": \"gemini-cli\",\n \"env_points_to\": \"file\",\n \"warn_if_unset\": [\"GOOGLE_CLOUD_PROJECT\", \"GOOGLE_CLOUD_LOCATION\"]\n }\n ],\n \"binary_name\": \"gemini\",\n \"data_dir_env_var\": \"HOME\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -5,7 +5,7 @@ var e = {
5
5
  default_command: [
6
6
  "npx",
7
7
  "-y",
8
- "@agentclientprotocol/claude-agent-acp@0.44.0"
8
+ "@agentclientprotocol/claude-agent-acp@0.63.0"
9
9
  ],
10
10
  api_key_env_var: "ANTHROPIC_API_KEY",
11
11
  base_url_env_var: "ANTHROPIC_BASE_URL",
@@ -20,15 +20,19 @@ var e = {
20
20
  },
21
21
  {
22
22
  id: "opus[1m]",
23
- label: "Claude Opus 4.8 (1M)"
23
+ label: "Claude Opus (1M)"
24
+ },
25
+ {
26
+ id: "claude-opus-5",
27
+ label: "Claude Opus 5"
24
28
  },
25
29
  {
26
30
  id: "sonnet",
27
- label: "Claude Sonnet 4.6"
31
+ label: "Claude Sonnet"
28
32
  },
29
33
  {
30
34
  id: "haiku",
31
- label: "Claude Haiku 4.5"
35
+ label: "Claude Haiku"
32
36
  }
33
37
  ],
34
38
  default_model: "opus[1m]",
@@ -43,7 +47,7 @@ var e = {
43
47
  default_command: [
44
48
  "npx",
45
49
  "-y",
46
- "@agentclientprotocol/codex-acp@1.1.2"
50
+ "@agentclientprotocol/codex-acp@1.1.7"
47
51
  ],
48
52
  api_key_env_var: "OPENAI_API_KEY",
49
53
  base_url_env_var: "OPENAI_BASE_URL",
@@ -1 +1 @@
1
- {"version":3,"file":"acp-providers.js","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/models/acp-providers.json"],"sourcesContent":["{\n \"claude-code\": {\n \"key\": \"claude-code\",\n \"display_name\": \"Claude Code\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/claude-agent-acp@0.44.0\"],\n \"api_key_env_var\": \"ANTHROPIC_API_KEY\",\n \"base_url_env_var\": \"ANTHROPIC_BASE_URL\",\n \"default_session_mode\": \"bypassPermissions\",\n \"agent_name_patterns\": [\"claude-agent\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": \"claudeCode\",\n \"available_models\": [\n {\n \"id\": \"default\",\n \"label\": \"Default (recommended)\"\n },\n {\n \"id\": \"opus[1m]\",\n \"label\": \"Claude Opus 4.8 (1M)\"\n },\n {\n \"id\": \"sonnet\",\n \"label\": \"Claude Sonnet 4.6\"\n },\n {\n \"id\": \"haiku\",\n \"label\": \"Claude Haiku 4.5\"\n }\n ],\n \"default_model\": \"opus[1m]\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [],\n \"binary_name\": \"claude-agent-acp\",\n \"data_dir_env_var\": \"CLAUDE_CONFIG_DIR\"\n },\n \"codex\": {\n \"key\": \"codex\",\n \"display_name\": \"Codex\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/codex-acp@1.1.2\"],\n \"api_key_env_var\": \"OPENAI_API_KEY\",\n \"base_url_env_var\": \"OPENAI_BASE_URL\",\n \"default_session_mode\": \"agent-full-access\",\n \"agent_name_patterns\": [\"codex-acp\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"gpt-5.6\",\n \"label\": \"GPT-5.6\"\n },\n {\n \"id\": \"gpt-5.6-sol\",\n \"label\": \"GPT-5.6 Sol\"\n },\n {\n \"id\": \"gpt-5.6-terra\",\n \"label\": \"GPT-5.6 Terra\"\n },\n {\n \"id\": \"gpt-5.6-luna\",\n \"label\": \"GPT-5.6 Luna\"\n },\n {\n \"id\": \"gpt-5.5\",\n \"label\": \"GPT-5.5\"\n },\n {\n \"id\": \"gpt-5.4\",\n \"label\": \"GPT-5.4\"\n },\n {\n \"id\": \"gpt-5.4-mini\",\n \"label\": \"GPT-5.4 Mini\"\n }\n ],\n \"default_model\": \"gpt-5.5\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"CODEX_AUTH_JSON\",\n \"filename\": \"auth.json\",\n \"env_var\": \"CODEX_HOME\",\n \"subdir\": \"codex\",\n \"env_points_to\": \"dir\",\n \"warn_if_unset\": []\n }\n ],\n \"binary_name\": \"codex-acp\",\n \"data_dir_env_var\": \"CODEX_HOME\"\n },\n \"gemini-cli\": {\n \"key\": \"gemini-cli\",\n \"display_name\": \"Gemini CLI\",\n \"default_command\": [\"npx\", \"-y\", \"@google/gemini-cli@0.46.0\", \"--acp\"],\n \"api_key_env_var\": \"GEMINI_API_KEY\",\n \"base_url_env_var\": \"GEMINI_BASE_URL\",\n \"default_session_mode\": \"default\",\n \"agent_name_patterns\": [\"gemini-cli\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"id\": \"gemini-3.1-pro-preview\",\n \"label\": \"Gemini 3.1 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-pro-preview\",\n \"label\": \"Gemini 3 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-flash-preview\",\n \"label\": \"Gemini 3 Flash (preview)\"\n },\n {\n \"id\": \"gemini-3.1-flash-lite\",\n \"label\": \"Gemini 3.1 Flash Lite\"\n },\n {\n \"id\": \"gemini-2.5-pro\",\n \"label\": \"Gemini 2.5 Pro\"\n },\n {\n \"id\": \"gemini-2.5-flash\",\n \"label\": \"Gemini 2.5 Flash\"\n }\n ],\n \"default_model\": \"auto\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"filename\": \"gcloud-credentials.json\",\n \"env_var\": \"GOOGLE_APPLICATION_CREDENTIALS\",\n \"subdir\": \"gemini-cli\",\n \"env_points_to\": \"file\",\n \"warn_if_unset\": [\"GOOGLE_CLOUD_PROJECT\", \"GOOGLE_CLOUD_LOCATION\"]\n }\n ],\n \"binary_name\": \"gemini\",\n \"data_dir_env_var\": \"HOME\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
1
+ {"version":3,"file":"acp-providers.js","names":[],"sources":["../../../../../../node_modules/@openhands/typescript-client/dist/models/acp-providers.json"],"sourcesContent":["{\n \"claude-code\": {\n \"key\": \"claude-code\",\n \"display_name\": \"Claude Code\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/claude-agent-acp@0.63.0\"],\n \"api_key_env_var\": \"ANTHROPIC_API_KEY\",\n \"base_url_env_var\": \"ANTHROPIC_BASE_URL\",\n \"default_session_mode\": \"bypassPermissions\",\n \"agent_name_patterns\": [\"claude-agent\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": \"claudeCode\",\n \"available_models\": [\n {\n \"id\": \"default\",\n \"label\": \"Default (recommended)\"\n },\n {\n \"id\": \"opus[1m]\",\n \"label\": \"Claude Opus (1M)\"\n },\n {\n \"id\": \"claude-opus-5\",\n \"label\": \"Claude Opus 5\"\n },\n {\n \"id\": \"sonnet\",\n \"label\": \"Claude Sonnet\"\n },\n {\n \"id\": \"haiku\",\n \"label\": \"Claude Haiku\"\n }\n ],\n \"default_model\": \"opus[1m]\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [],\n \"binary_name\": \"claude-agent-acp\",\n \"data_dir_env_var\": \"CLAUDE_CONFIG_DIR\"\n },\n \"codex\": {\n \"key\": \"codex\",\n \"display_name\": \"Codex\",\n \"default_command\": [\"npx\", \"-y\", \"@agentclientprotocol/codex-acp@1.1.7\"],\n \"api_key_env_var\": \"OPENAI_API_KEY\",\n \"base_url_env_var\": \"OPENAI_BASE_URL\",\n \"default_session_mode\": \"agent-full-access\",\n \"agent_name_patterns\": [\"codex-acp\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"gpt-5.6\",\n \"label\": \"GPT-5.6\"\n },\n {\n \"id\": \"gpt-5.6-sol\",\n \"label\": \"GPT-5.6 Sol\"\n },\n {\n \"id\": \"gpt-5.6-terra\",\n \"label\": \"GPT-5.6 Terra\"\n },\n {\n \"id\": \"gpt-5.6-luna\",\n \"label\": \"GPT-5.6 Luna\"\n },\n {\n \"id\": \"gpt-5.5\",\n \"label\": \"GPT-5.5\"\n },\n {\n \"id\": \"gpt-5.4\",\n \"label\": \"GPT-5.4\"\n },\n {\n \"id\": \"gpt-5.4-mini\",\n \"label\": \"GPT-5.4 Mini\"\n }\n ],\n \"default_model\": \"gpt-5.5\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"CODEX_AUTH_JSON\",\n \"filename\": \"auth.json\",\n \"env_var\": \"CODEX_HOME\",\n \"subdir\": \"codex\",\n \"env_points_to\": \"dir\",\n \"warn_if_unset\": []\n }\n ],\n \"binary_name\": \"codex-acp\",\n \"data_dir_env_var\": \"CODEX_HOME\"\n },\n \"gemini-cli\": {\n \"key\": \"gemini-cli\",\n \"display_name\": \"Gemini CLI\",\n \"default_command\": [\"npx\", \"-y\", \"@google/gemini-cli@0.46.0\", \"--acp\"],\n \"api_key_env_var\": \"GEMINI_API_KEY\",\n \"base_url_env_var\": \"GEMINI_BASE_URL\",\n \"default_session_mode\": \"default\",\n \"agent_name_patterns\": [\"gemini-cli\"],\n \"supports_set_session_model\": true,\n \"session_meta_key\": null,\n \"available_models\": [\n {\n \"id\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"id\": \"gemini-3.1-pro-preview\",\n \"label\": \"Gemini 3.1 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-pro-preview\",\n \"label\": \"Gemini 3 Pro (preview)\"\n },\n {\n \"id\": \"gemini-3-flash-preview\",\n \"label\": \"Gemini 3 Flash (preview)\"\n },\n {\n \"id\": \"gemini-3.1-flash-lite\",\n \"label\": \"Gemini 3.1 Flash Lite\"\n },\n {\n \"id\": \"gemini-2.5-pro\",\n \"label\": \"Gemini 2.5 Pro\"\n },\n {\n \"id\": \"gemini-2.5-flash\",\n \"label\": \"Gemini 2.5 Flash\"\n }\n ],\n \"default_model\": \"auto\",\n \"supports_runtime_model_switch\": true,\n \"file_secrets\": [\n {\n \"secret_name\": \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"filename\": \"gcloud-credentials.json\",\n \"env_var\": \"GOOGLE_APPLICATION_CREDENTIALS\",\n \"subdir\": \"gemini-cli\",\n \"env_points_to\": \"file\",\n \"warn_if_unset\": [\"GOOGLE_CLOUD_PROJECT\", \"GOOGLE_CLOUD_LOCATION\"]\n }\n ],\n \"binary_name\": \"gemini\",\n \"data_dir_env_var\": \"HOME\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -1,2 +1,2 @@
1
- require("../../../_virtual/_rolldown/runtime.cjs");var e=[];e.forEach,e.slice;var t=[`__proto__`,`constructor`,`prototype`];function n(e){return!(typeof e!=`string`||e.length===0||e.length>128||t.indexOf(e)>-1||e.indexOf(`..`)>-1||e.indexOf(`\\`)>-1||/[?#%\s@]/.test(e)||/[\x00-\x1F\x7F]/.test(e))}function r(e){return!(!n(e)||e.indexOf(`/`)>-1)}function i(e){return n(e)}var a={lng:r,ns:i};function o(e){return typeof e==`string`?e.replace(/[\r\n\x00-\x1F\x7F]/g,` `):e}function s(e){if(typeof e!=`string`||e.length===0)return e;try{let t=new URL(e);return t.username||t.password?(t.username=``,t.password=``,t.toString()):e}catch{return e.replace(/(\/\/)[^/@\s]+@/g,`$1`)}}function c(){return typeof XMLHttpRequest==`function`||typeof XMLHttpRequest==`object`}function l(e){return!!e&&typeof e.then==`function`}function u(e){return l(e)?e:Promise.resolve(e)}var d=/\{\{(.+?)\}\}/g;function f(e,n){let i=!1,o=e.replace(d,(e,o)=>{let s=o.trim();if(t.indexOf(s)>-1)return e;let c=n[s];if(c==null)return e;let l=a[s]||r,u=String(c).split(`+`);for(let t of u)if(!l(t))return i=!0,e;return u.join(`+`)});return i?null:o}var p=typeof globalThis<`u`?globalThis:typeof global<`u`?global:typeof window<`u`?window:void 0,m;typeof fetch==`function`?m=fetch:p&&typeof p.fetch==`function`&&(m=p.fetch);var h=c()&&p?p.XMLHttpRequest:void 0,g=typeof ActiveXObject==`function`&&p?p.ActiveXObject:void 0,_=[`__proto__`,`constructor`,`prototype`],v=(e,t)=>{if(t&&typeof t==`object`){let n=``;for(let e of Object.keys(t))_.indexOf(e)>-1||(n+=`&`+encodeURIComponent(e)+`=`+encodeURIComponent(t[e]));if(!n)return e;e=e+(e.indexOf(`?`)===-1?`?`:`&`)+n.slice(1)}return e},y=(e,t,n,r)=>{let i=e=>{if(!e.ok)return n(e.statusText||`Error`,{status:e.status});e.text().then(t=>{n(null,{status:e.status,data:t})}).catch(n)};if(r){let a=r(e,t);if(a instanceof Promise){a.then(i).catch(n);return}}typeof fetch==`function`?fetch(e,t).then(i).catch(n):m(e,t).then(i).catch(n)},b=(e,t,n,r)=>{e.queryStringParams&&(t=v(t,e.queryStringParams));let i={...typeof e.customHeaders==`function`?e.customHeaders():e.customHeaders};typeof window>`u`&&typeof global<`u`&&global.process!==void 0&&global.process.versions&&global.process.versions.node&&(i[`User-Agent`]=`i18next-http-backend (node/${global.process.version}; ${global.process.platform} ${global.process.arch})`),n&&(i[`Content-Type`]=`application/json`);let a=typeof e.requestOptions==`function`?e.requestOptions(n):e.requestOptions,o={method:n?`POST`:`GET`,body:n?e.stringify(n):void 0,headers:i,...e._omitFetchOptions?{}:a},s=typeof e.alternateFetch==`function`&&e.alternateFetch.length>=1?e.alternateFetch:void 0;try{y(t,o,r,s)}catch(n){if(!a||Object.keys(a).length===0||!n.message||n.message.indexOf(`not implemented`)<0)return r(n);try{Object.keys(a).forEach(e=>{delete o[e]}),y(t,o,r,s),e._omitFetchOptions=!0}catch(e){r(e)}}},x=(e,t,n,r)=>{n&&typeof n==`object`&&(n=v(``,n).slice(1)),e.queryStringParams&&(t=v(t,e.queryStringParams));try{let i=h?new h:new g(`MSXML2.XMLHTTP.3.0`);i.open(n?`POST`:`GET`,t,1),e.crossDomain||i.setRequestHeader(`X-Requested-With`,`XMLHttpRequest`),i.withCredentials=!!e.withCredentials,n&&i.setRequestHeader(`Content-Type`,`application/x-www-form-urlencoded`),i.overrideMimeType&&i.overrideMimeType(`application/json`);let a=e.customHeaders;if(a=typeof a==`function`?a():a,a)for(let e of Object.keys(a))_.indexOf(e)>-1||i.setRequestHeader(e,a[e]);i.onreadystatechange=()=>{i.readyState>3&&r(i.status>=400?i.statusText:null,{status:i.status,data:i.responseText})},i.send(n)}catch(e){console&&console.log(e)}},S=(e,t,n,r)=>{if(typeof n==`function`&&(r=n,n=void 0),r||=(()=>{}),m&&t.indexOf(`file:`)!==0)return b(e,t,n,r);if(c()||typeof ActiveXObject==`function`)return x(e,t,n,r);r(Error(`No fetch and no xhr implementation found!`))},C=()=>({loadPath:`/locales/{{lng}}/{{ns}}.json`,addPath:`/locales/add/{{lng}}/{{ns}}`,parse:e=>JSON.parse(e),stringify:JSON.stringify,parsePayload:(e,t,n)=>({[t]:n||``}),parseLoadPayload:(e,t)=>void 0,request:S,reloadInterval:typeof window<`u`?!1:3600*1e3,customHeaders:{},queryStringParams:{},crossDomain:!1,withCredentials:!1,overrideMimeType:!1,requestOptions:{mode:`cors`,credentials:`same-origin`,cache:`default`}}),w=class{constructor(e,t={},n={}){this.services=e,this.options=t,this.allOptions=n,this.type=`backend`,this.init(e,t,n)}init(e,t={},n={}){if(this.services=e,this.options={...C(),...this.options||{},...t},this.allOptions=n,this.services&&this.options.reloadInterval){let e=setInterval(()=>this.reload(),this.options.reloadInterval);typeof e==`object`&&typeof e.unref==`function`&&e.unref()}}readMulti(e,t,n){this._readAny(e,e,t,t,n)}read(e,t,n){this._readAny([e],e,[t],t,n)}_readAny(e,t,n,r,i){let a=this.options.loadPath;typeof this.options.loadPath==`function`&&(a=this.options.loadPath(e,n)),a=u(a),a.then(a=>{if(!a)return i(null,{});let s=f(a,{lng:e.join(`+`),ns:n.join(`+`)});if(s==null){let t=e.map(o).join(`, `),r=n.map(o).join(`, `);return i(Error(`i18next-http-backend: unsafe lng/ns value — refusing to build request URL for languages=[`+t+`] namespaces=[`+r+`]`),!1)}this.loadUrl(s,i,t,r)})}loadUrl(e,t,n,r){let i=typeof n==`string`?[n]:n,a=typeof r==`string`?[r]:r,c=this.options.parseLoadPayload(i,a),l=o(s(e));this.options.request(this.options,e,c,(e,i)=>{if(i&&(i.status>=500&&i.status<600||!i.status))return t(`failed loading `+l+`; status code: `+i.status,!0);if(i&&i.status>=400&&i.status<500)return t(`failed loading `+l+`; status code: `+i.status,!1);if(!i&&e&&e.message){let n=e.message.toLowerCase();if([`failed`,`fetch`,`network`,`load`].find(e=>n.indexOf(e)>-1))return t(`failed loading `+l+`: `+o(e.message),!0)}if(e)return t(e,!1);let a,s;try{a=typeof i.data==`string`?this.options.parse(i.data,n,r):i.data}catch{s=`failed parsing `+l+` to json`}if(s)return t(s,!1);t(null,a)})}create(e,t,n,r,i){if(!this.options.addPath)return;typeof e==`string`&&(e=[e]);let a=this.options.parsePayload(t,n,r),o=0,s=[],c=[];e.forEach(n=>{let r=this.options.addPath;typeof this.options.addPath==`function`&&(r=this.options.addPath(n,t));let l=f(r,{lng:n,ns:t});if(l==null){o+=1,i&&o===e.length&&i(s,c);return}this.options.request(this.options,l,a,(t,n)=>{o+=1,s.push(t),c.push(n),o===e.length&&typeof i==`function`&&i(s,c)})})}reload(){let{backendConnector:e,languageUtils:t,logger:n}=this.services,r=e.language;if(r&&r.toLowerCase()===`cimode`)return;let i=[],a=e=>{t.toResolveHierarchy(e).forEach(e=>{i.indexOf(e)<0&&i.push(e)})};a(r),this.allOptions.preload&&this.allOptions.preload.forEach(e=>a(e)),i.forEach(t=>{this.allOptions.ns.forEach(r=>{e.read(t,r,`read`,null,null,(i,a)=>{i&&n.warn(`loading namespace ${r} for language ${t} failed`,i),!i&&a&&n.log(`loaded namespace ${r} for language ${t}`,a),e.loaded(`${t}|${r}`,i,a)})})})}};w.type=`backend`,exports.Backend=w;
1
+ require("../../../_virtual/_rolldown/runtime.cjs");var e=[];e.forEach,e.slice;var t=[`__proto__`,`constructor`,`prototype`];function n(e){return!(typeof e!=`string`||e.length===0||e.length>128||t.indexOf(e)>-1||e.indexOf(`..`)>-1||e.indexOf(`\\`)>-1||/[?#%\s]/.test(e)||/[\x00-\x1F\x7F]/.test(e))}function r(e){return!(!n(e)||e.indexOf(`/`)>-1||e.indexOf(`@`)>-1)}function i(e){return n(e)}var a={lng:r,ns:i};function o(e){return typeof e==`string`?e.replace(/[\r\n\x00-\x1F\x7F]/g,` `):e}function s(e){if(typeof e!=`string`||e.length===0)return e;try{let t=new URL(e);return t.username||t.password?(t.username=``,t.password=``,t.toString()):e}catch{return e.replace(/(\/\/)[^/@\s]+@/g,`$1`)}}function c(){return typeof XMLHttpRequest==`function`||typeof XMLHttpRequest==`object`}function l(e){return!!e&&typeof e.then==`function`}function u(e){return l(e)?e:Promise.resolve(e)}var d=/\{\{(.+?)\}\}/g;function f(e,n){let i=!1,o=e.replace(d,(e,o)=>{let s=o.trim();if(t.indexOf(s)>-1)return e;let c=n[s];if(c==null)return e;let l=a[s]||r,u=String(c).split(`+`);for(let t of u)if(!l(t))return i=!0,e;return u.join(`+`)});return i?null:o}var p=typeof globalThis<`u`?globalThis:typeof global<`u`?global:typeof window<`u`?window:void 0,m;typeof fetch==`function`?m=fetch:p&&typeof p.fetch==`function`&&(m=p.fetch);var h=c()&&p?p.XMLHttpRequest:void 0,g=typeof ActiveXObject==`function`&&p?p.ActiveXObject:void 0,_=[`__proto__`,`constructor`,`prototype`],v=(e,t)=>{if(t&&typeof t==`object`){let n=``;for(let e of Object.keys(t))_.indexOf(e)>-1||(n+=`&`+encodeURIComponent(e)+`=`+encodeURIComponent(t[e]));if(!n)return e;e=e+(e.indexOf(`?`)===-1?`?`:`&`)+n.slice(1)}return e},y=(e,t,n,r)=>{let i=e=>{if(!e.ok)return n(e.statusText||`Error`,{status:e.status});e.text().then(t=>{n(null,{status:e.status,data:t})}).catch(n)};if(r){let a=r(e,t);if(a instanceof Promise){a.then(i).catch(n);return}}typeof fetch==`function`?fetch(e,t).then(i).catch(n):m(e,t).then(i).catch(n)},b=(e,t,n,r)=>{e.queryStringParams&&(t=v(t,e.queryStringParams));let i={...typeof e.customHeaders==`function`?e.customHeaders():e.customHeaders};typeof window>`u`&&typeof global<`u`&&global.process!==void 0&&global.process.versions&&global.process.versions.node&&(i[`User-Agent`]=`i18next-http-backend (node/${global.process.version}; ${global.process.platform} ${global.process.arch})`),n&&(i[`Content-Type`]=`application/json`);let a=typeof e.requestOptions==`function`?e.requestOptions(n):e.requestOptions,o={method:n?`POST`:`GET`,body:n?e.stringify(n):void 0,headers:i,...e._omitFetchOptions?{}:a},s=typeof e.alternateFetch==`function`&&e.alternateFetch.length>=1?e.alternateFetch:void 0;try{y(t,o,r,s)}catch(n){if(!a||Object.keys(a).length===0||!n.message||n.message.indexOf(`not implemented`)<0)return r(n);try{Object.keys(a).forEach(e=>{delete o[e]}),y(t,o,r,s),e._omitFetchOptions=!0}catch(e){r(e)}}},x=(e,t,n,r)=>{n&&typeof n==`object`&&(n=v(``,n).slice(1)),e.queryStringParams&&(t=v(t,e.queryStringParams));try{let i=h?new h:new g(`MSXML2.XMLHTTP.3.0`);i.open(n?`POST`:`GET`,t,1),e.crossDomain||i.setRequestHeader(`X-Requested-With`,`XMLHttpRequest`),i.withCredentials=!!e.withCredentials,n&&i.setRequestHeader(`Content-Type`,`application/x-www-form-urlencoded`),i.overrideMimeType&&i.overrideMimeType(`application/json`);let a=e.customHeaders;if(a=typeof a==`function`?a():a,a)for(let e of Object.keys(a))_.indexOf(e)>-1||i.setRequestHeader(e,a[e]);i.onreadystatechange=()=>{i.readyState>3&&r(i.status>=400?i.statusText:null,{status:i.status,data:i.responseText})},i.send(n)}catch(e){console&&console.log(e)}},S=(e,t,n,r)=>{if(typeof n==`function`&&(r=n,n=void 0),r||=(()=>{}),m&&t.indexOf(`file:`)!==0)return b(e,t,n,r);if(c()||typeof ActiveXObject==`function`)return x(e,t,n,r);r(Error(`No fetch and no xhr implementation found!`))},C=()=>({loadPath:`/locales/{{lng}}/{{ns}}.json`,addPath:`/locales/add/{{lng}}/{{ns}}`,parse:e=>JSON.parse(e),stringify:JSON.stringify,parsePayload:(e,t,n)=>({[t]:n||``}),parseLoadPayload:(e,t)=>void 0,request:S,reloadInterval:typeof window<`u`?!1:3600*1e3,customHeaders:{},queryStringParams:{},crossDomain:!1,withCredentials:!1,overrideMimeType:!1,requestOptions:{mode:`cors`,credentials:`same-origin`,cache:`default`}}),w=class{constructor(e,t={},n={}){this.services=e,this.options=t,this.allOptions=n,this.type=`backend`,this.init(e,t,n)}init(e,t={},n={}){if(this.services=e,this.options={...C(),...this.options||{},...t},this.allOptions=n,this.services&&this.options.reloadInterval){let e=setInterval(()=>this.reload(),this.options.reloadInterval);typeof e==`object`&&typeof e.unref==`function`&&e.unref()}}readMulti(e,t,n){this._readAny(e,e,t,t,n)}read(e,t,n){this._readAny([e],e,[t],t,n)}_readAny(e,t,n,r,i){let a=this.options.loadPath;typeof this.options.loadPath==`function`&&(a=this.options.loadPath(e,n)),a=u(a),a.then(a=>{if(!a)return i(null,{});let s=f(a,{lng:e.join(`+`),ns:n.join(`+`)});if(s==null){let t=e.map(o).join(`, `),r=n.map(o).join(`, `);return i(Error(`i18next-http-backend: unsafe lng/ns value — refusing to build request URL for languages=[`+t+`] namespaces=[`+r+`]`),!1)}this.loadUrl(s,i,t,r)})}loadUrl(e,t,n,r){let i=typeof n==`string`?[n]:n,a=typeof r==`string`?[r]:r,c=this.options.parseLoadPayload(i,a),l=o(s(e));this.options.request(this.options,e,c,(e,i)=>{if(i&&(i.status>=500&&i.status<600||!i.status))return t(`failed loading `+l+`; status code: `+i.status,!0);if(i&&i.status>=400&&i.status<500)return t(`failed loading `+l+`; status code: `+i.status,!1);if(!i&&e&&e.message){let n=e.message.toLowerCase();if([`failed`,`fetch`,`network`,`load`].find(e=>n.indexOf(e)>-1))return t(`failed loading `+l+`: `+o(e.message),!0)}if(e)return t(e,!1);let a,s;try{a=typeof i.data==`string`?this.options.parse(i.data,n,r):i.data}catch{s=`failed parsing `+l+` to json`}if(s)return t(s,!1);t(null,a)})}create(e,t,n,r,i){if(!this.options.addPath)return;typeof e==`string`&&(e=[e]);let a=this.options.parsePayload(t,n,r),o=0,s=[],c=[];e.forEach(n=>{let r=this.options.addPath;typeof this.options.addPath==`function`&&(r=this.options.addPath(n,t));let l=f(r,{lng:n,ns:t});if(l==null){o+=1,i&&o===e.length&&i(s,c);return}this.options.request(this.options,l,a,(t,n)=>{o+=1,s.push(t),c.push(n),o===e.length&&typeof i==`function`&&i(s,c)})})}reload(){let{backendConnector:e,languageUtils:t,logger:n}=this.services,r=e.language;if(r&&r.toLowerCase()===`cimode`)return;let i=[],a=e=>{t.toResolveHierarchy(e).forEach(e=>{i.indexOf(e)<0&&i.push(e)})};a(r),this.allOptions.preload&&this.allOptions.preload.forEach(e=>a(e)),i.forEach(t=>{this.allOptions.ns.forEach(r=>{e.read(t,r,`read`,null,null,(i,a)=>{i&&n.warn(`loading namespace ${r} for language ${t} failed`,i),!i&&a&&n.log(`loaded namespace ${r} for language ${t}`,a),e.loaded(`${t}|${r}`,i,a)})})})}};w.type=`backend`,exports.Backend=w;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../node_modules/i18next-http-backend/esm/index.js"],"sourcesContent":["//#region lib/utils.js\nconst arr = [];\narr.forEach;\narr.slice;\nconst UNSAFE_KEYS$1 = [\n\t\"__proto__\",\n\t\"constructor\",\n\t\"prototype\"\n];\nfunction isSafeUrlSegmentBase(v) {\n\tif (typeof v !== \"string\") return false;\n\tif (v.length === 0 || v.length > 128) return false;\n\tif (UNSAFE_KEYS$1.indexOf(v) > -1) return false;\n\tif (v.indexOf(\"..\") > -1) return false;\n\tif (v.indexOf(\"\\\\\") > -1) return false;\n\tif (/[?#%\\s@]/.test(v)) return false;\n\tif (/[\\x00-\\x1F\\x7F]/.test(v)) return false;\n\treturn true;\n}\nfunction isSafeLangUrlSegment(v) {\n\tif (!isSafeUrlSegmentBase(v)) return false;\n\tif (v.indexOf(\"/\") > -1) return false;\n\treturn true;\n}\nfunction isSafeNsUrlSegment(v) {\n\treturn isSafeUrlSegmentBase(v);\n}\nconst SAFETY_CHECK_BY_KEY = {\n\tlng: isSafeLangUrlSegment,\n\tns: isSafeNsUrlSegment\n};\nfunction sanitizeLogValue(v) {\n\tif (typeof v !== \"string\") return v;\n\treturn v.replace(/[\\r\\n\\x00-\\x1F\\x7F]/g, \" \");\n}\nfunction redactUrlCredentials(u) {\n\tif (typeof u !== \"string\" || u.length === 0) return u;\n\ttry {\n\t\tconst parsed = new URL(u);\n\t\tif (parsed.username || parsed.password) {\n\t\t\tparsed.username = \"\";\n\t\t\tparsed.password = \"\";\n\t\t\treturn parsed.toString();\n\t\t}\n\t\treturn u;\n\t} catch (e) {\n\t\treturn u.replace(/(\\/\\/)[^/@\\s]+@/g, \"$1\");\n\t}\n}\nfunction hasXMLHttpRequest() {\n\treturn typeof XMLHttpRequest === \"function\" || typeof XMLHttpRequest === \"object\";\n}\n/**\n* Determine whether the given `maybePromise` is a Promise.\n*\n* @param {*} maybePromise\n*\n* @returns {Boolean}\n*/\nfunction isPromise(maybePromise) {\n\treturn !!maybePromise && typeof maybePromise.then === \"function\";\n}\n/**\n* Convert any value to a Promise than will resolve to this value.\n*\n* @param {*} maybePromise\n*\n* @returns {Promise}\n*/\nfunction makePromise(maybePromise) {\n\tif (isPromise(maybePromise)) return maybePromise;\n\treturn Promise.resolve(maybePromise);\n}\nconst interpolationRegexp = /\\{\\{(.+?)\\}\\}/g;\nfunction interpolateUrl(str, data) {\n\tlet unsafe = false;\n\tconst result = str.replace(interpolationRegexp, (match, key) => {\n\t\tconst k = key.trim();\n\t\tif (UNSAFE_KEYS$1.indexOf(k) > -1) return match;\n\t\tconst value = data[k];\n\t\tif (value == null) return match;\n\t\tconst check = SAFETY_CHECK_BY_KEY[k] || isSafeLangUrlSegment;\n\t\tconst segments = String(value).split(\"+\");\n\t\tfor (const seg of segments) if (!check(seg)) {\n\t\t\tunsafe = true;\n\t\t\treturn match;\n\t\t}\n\t\treturn segments.join(\"+\");\n\t});\n\treturn unsafe ? null : result;\n}\n//#endregion\n//#region lib/request.js\nconst g = typeof globalThis !== \"undefined\" ? globalThis : typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : void 0;\nlet fetchApi;\nif (typeof fetch === \"function\") fetchApi = fetch;\nelse if (g && typeof g.fetch === \"function\") fetchApi = g.fetch;\nconst XmlHttpRequestApi = hasXMLHttpRequest() && g ? g.XMLHttpRequest : void 0;\nconst ActiveXObjectApi = typeof ActiveXObject === \"function\" && g ? g.ActiveXObject : void 0;\nconst UNSAFE_KEYS = [\n\t\"__proto__\",\n\t\"constructor\",\n\t\"prototype\"\n];\nconst addQueryString = (url, params) => {\n\tif (params && typeof params === \"object\") {\n\t\tlet queryString = \"\";\n\t\tfor (const paramName of Object.keys(params)) {\n\t\t\tif (UNSAFE_KEYS.indexOf(paramName) > -1) continue;\n\t\t\tqueryString += \"&\" + encodeURIComponent(paramName) + \"=\" + encodeURIComponent(params[paramName]);\n\t\t}\n\t\tif (!queryString) return url;\n\t\turl = url + (url.indexOf(\"?\") !== -1 ? \"&\" : \"?\") + queryString.slice(1);\n\t}\n\treturn url;\n};\nconst fetchIt = (url, fetchOptions, callback, altFetch) => {\n\tconst resolver = (response) => {\n\t\tif (!response.ok) return callback(response.statusText || \"Error\", { status: response.status });\n\t\tresponse.text().then((data) => {\n\t\t\tcallback(null, {\n\t\t\t\tstatus: response.status,\n\t\t\t\tdata\n\t\t\t});\n\t\t}).catch(callback);\n\t};\n\tif (altFetch) {\n\t\tconst altResponse = altFetch(url, fetchOptions);\n\t\tif (altResponse instanceof Promise) {\n\t\t\taltResponse.then(resolver).catch(callback);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (typeof fetch === \"function\") fetch(url, fetchOptions).then(resolver).catch(callback);\n\telse fetchApi(url, fetchOptions).then(resolver).catch(callback);\n};\nconst requestWithFetch = (options, url, payload, callback) => {\n\tif (options.queryStringParams) url = addQueryString(url, options.queryStringParams);\n\tconst headers = { ...typeof options.customHeaders === \"function\" ? options.customHeaders() : options.customHeaders };\n\tif (typeof window === \"undefined\" && typeof global !== \"undefined\" && typeof global.process !== \"undefined\" && global.process.versions && global.process.versions.node) headers[\"User-Agent\"] = `i18next-http-backend (node/${global.process.version}; ${global.process.platform} ${global.process.arch})`;\n\tif (payload) headers[\"Content-Type\"] = \"application/json\";\n\tconst reqOptions = typeof options.requestOptions === \"function\" ? options.requestOptions(payload) : options.requestOptions;\n\tconst fetchOptions = {\n\t\tmethod: payload ? \"POST\" : \"GET\",\n\t\tbody: payload ? options.stringify(payload) : void 0,\n\t\theaders,\n\t\t...options._omitFetchOptions ? {} : reqOptions\n\t};\n\tconst altFetch = typeof options.alternateFetch === \"function\" && options.alternateFetch.length >= 1 ? options.alternateFetch : void 0;\n\ttry {\n\t\tfetchIt(url, fetchOptions, callback, altFetch);\n\t} catch (e) {\n\t\tif (!reqOptions || Object.keys(reqOptions).length === 0 || !e.message || e.message.indexOf(\"not implemented\") < 0) return callback(e);\n\t\ttry {\n\t\t\tObject.keys(reqOptions).forEach((opt) => {\n\t\t\t\tdelete fetchOptions[opt];\n\t\t\t});\n\t\t\tfetchIt(url, fetchOptions, callback, altFetch);\n\t\t\toptions._omitFetchOptions = true;\n\t\t} catch (err) {\n\t\t\tcallback(err);\n\t\t}\n\t}\n};\nconst requestWithXmlHttpRequest = (options, url, payload, callback) => {\n\tif (payload && typeof payload === \"object\") payload = addQueryString(\"\", payload).slice(1);\n\tif (options.queryStringParams) url = addQueryString(url, options.queryStringParams);\n\ttry {\n\t\tconst x = XmlHttpRequestApi ? new XmlHttpRequestApi() : new ActiveXObjectApi(\"MSXML2.XMLHTTP.3.0\");\n\t\tx.open(payload ? \"POST\" : \"GET\", url, 1);\n\t\tif (!options.crossDomain) x.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\t\tx.withCredentials = !!options.withCredentials;\n\t\tif (payload) x.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\t\tif (x.overrideMimeType) x.overrideMimeType(\"application/json\");\n\t\tlet h = options.customHeaders;\n\t\th = typeof h === \"function\" ? h() : h;\n\t\tif (h) for (const i of Object.keys(h)) {\n\t\t\tif (UNSAFE_KEYS.indexOf(i) > -1) continue;\n\t\t\tx.setRequestHeader(i, h[i]);\n\t\t}\n\t\tx.onreadystatechange = () => {\n\t\t\tx.readyState > 3 && callback(x.status >= 400 ? x.statusText : null, {\n\t\t\t\tstatus: x.status,\n\t\t\t\tdata: x.responseText\n\t\t\t});\n\t\t};\n\t\tx.send(payload);\n\t} catch (e) {\n\t\tconsole && console.log(e);\n\t}\n};\nconst request = (options, url, payload, callback) => {\n\tif (typeof payload === \"function\") {\n\t\tcallback = payload;\n\t\tpayload = void 0;\n\t}\n\tcallback = callback || (() => {});\n\tif (fetchApi && url.indexOf(\"file:\") !== 0) return requestWithFetch(options, url, payload, callback);\n\tif (hasXMLHttpRequest() || typeof ActiveXObject === \"function\") return requestWithXmlHttpRequest(options, url, payload, callback);\n\tcallback(/* @__PURE__ */ new Error(\"No fetch and no xhr implementation found!\"));\n};\n//#endregion\n//#region lib/index.js\nconst getDefaults = () => {\n\treturn {\n\t\tloadPath: \"/locales/{{lng}}/{{ns}}.json\",\n\t\taddPath: \"/locales/add/{{lng}}/{{ns}}\",\n\t\tparse: (data) => JSON.parse(data),\n\t\tstringify: JSON.stringify,\n\t\tparsePayload: (namespace, key, fallbackValue) => ({ [key]: fallbackValue || \"\" }),\n\t\tparseLoadPayload: (languages, namespaces) => void 0,\n\t\trequest,\n\t\treloadInterval: typeof window !== \"undefined\" ? false : 3600 * 1e3,\n\t\tcustomHeaders: {},\n\t\tqueryStringParams: {},\n\t\tcrossDomain: false,\n\t\twithCredentials: false,\n\t\toverrideMimeType: false,\n\t\trequestOptions: {\n\t\t\tmode: \"cors\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\tcache: \"default\"\n\t\t}\n\t};\n};\nvar Backend = class {\n\tconstructor(services, options = {}, allOptions = {}) {\n\t\tthis.services = services;\n\t\tthis.options = options;\n\t\tthis.allOptions = allOptions;\n\t\tthis.type = \"backend\";\n\t\tthis.init(services, options, allOptions);\n\t}\n\tinit(services, options = {}, allOptions = {}) {\n\t\tthis.services = services;\n\t\tthis.options = {\n\t\t\t...getDefaults(),\n\t\t\t...this.options || {},\n\t\t\t...options\n\t\t};\n\t\tthis.allOptions = allOptions;\n\t\tif (this.services && this.options.reloadInterval) {\n\t\t\tconst timer = setInterval(() => this.reload(), this.options.reloadInterval);\n\t\t\tif (typeof timer === \"object\" && typeof timer.unref === \"function\") timer.unref();\n\t\t}\n\t}\n\treadMulti(languages, namespaces, callback) {\n\t\tthis._readAny(languages, languages, namespaces, namespaces, callback);\n\t}\n\tread(language, namespace, callback) {\n\t\tthis._readAny([language], language, [namespace], namespace, callback);\n\t}\n\t_readAny(languages, loadUrlLanguages, namespaces, loadUrlNamespaces, callback) {\n\t\tlet loadPath = this.options.loadPath;\n\t\tif (typeof this.options.loadPath === \"function\") loadPath = this.options.loadPath(languages, namespaces);\n\t\tloadPath = makePromise(loadPath);\n\t\tloadPath.then((resolvedLoadPath) => {\n\t\t\tif (!resolvedLoadPath) return callback(null, {});\n\t\t\tconst url = interpolateUrl(resolvedLoadPath, {\n\t\t\t\tlng: languages.join(\"+\"),\n\t\t\t\tns: namespaces.join(\"+\")\n\t\t\t});\n\t\t\tif (url == null) {\n\t\t\t\tconst safeLngs = languages.map(sanitizeLogValue).join(\", \");\n\t\t\t\tconst safeNss = namespaces.map(sanitizeLogValue).join(\", \");\n\t\t\t\treturn callback(/* @__PURE__ */ new Error(\"i18next-http-backend: unsafe lng/ns value — refusing to build request URL for languages=[\" + safeLngs + \"] namespaces=[\" + safeNss + \"]\"), false);\n\t\t\t}\n\t\t\tthis.loadUrl(url, callback, loadUrlLanguages, loadUrlNamespaces);\n\t\t});\n\t}\n\tloadUrl(url, callback, languages, namespaces) {\n\t\tconst lng = typeof languages === \"string\" ? [languages] : languages;\n\t\tconst ns = typeof namespaces === \"string\" ? [namespaces] : namespaces;\n\t\tconst payload = this.options.parseLoadPayload(lng, ns);\n\t\tconst safeUrl = sanitizeLogValue(redactUrlCredentials(url));\n\t\tthis.options.request(this.options, url, payload, (err, res) => {\n\t\t\tif (res && (res.status >= 500 && res.status < 600 || !res.status)) return callback(\"failed loading \" + safeUrl + \"; status code: \" + res.status, true);\n\t\t\tif (res && res.status >= 400 && res.status < 500) return callback(\"failed loading \" + safeUrl + \"; status code: \" + res.status, false);\n\t\t\tif (!res && err && err.message) {\n\t\t\t\tconst errorMessage = err.message.toLowerCase();\n\t\t\t\tif ([\n\t\t\t\t\t\"failed\",\n\t\t\t\t\t\"fetch\",\n\t\t\t\t\t\"network\",\n\t\t\t\t\t\"load\"\n\t\t\t\t].find((term) => errorMessage.indexOf(term) > -1)) return callback(\"failed loading \" + safeUrl + \": \" + sanitizeLogValue(err.message), true);\n\t\t\t}\n\t\t\tif (err) return callback(err, false);\n\t\t\tlet ret, parseErr;\n\t\t\ttry {\n\t\t\t\tif (typeof res.data === \"string\") ret = this.options.parse(res.data, languages, namespaces);\n\t\t\t\telse ret = res.data;\n\t\t\t} catch (e) {\n\t\t\t\tparseErr = \"failed parsing \" + safeUrl + \" to json\";\n\t\t\t}\n\t\t\tif (parseErr) return callback(parseErr, false);\n\t\t\tcallback(null, ret);\n\t\t});\n\t}\n\tcreate(languages, namespace, key, fallbackValue, callback) {\n\t\tif (!this.options.addPath) return;\n\t\tif (typeof languages === \"string\") languages = [languages];\n\t\tconst payload = this.options.parsePayload(namespace, key, fallbackValue);\n\t\tlet finished = 0;\n\t\tconst dataArray = [];\n\t\tconst resArray = [];\n\t\tlanguages.forEach((lng) => {\n\t\t\tlet addPath = this.options.addPath;\n\t\t\tif (typeof this.options.addPath === \"function\") addPath = this.options.addPath(lng, namespace);\n\t\t\tconst url = interpolateUrl(addPath, {\n\t\t\t\tlng,\n\t\t\t\tns: namespace\n\t\t\t});\n\t\t\tif (url == null) {\n\t\t\t\tfinished += 1;\n\t\t\t\tif (callback && finished === languages.length) callback(dataArray, resArray);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.options.request(this.options, url, payload, (data, res) => {\n\t\t\t\tfinished += 1;\n\t\t\t\tdataArray.push(data);\n\t\t\t\tresArray.push(res);\n\t\t\t\tif (finished === languages.length) {\n\t\t\t\t\tif (typeof callback === \"function\") callback(dataArray, resArray);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\treload() {\n\t\tconst { backendConnector, languageUtils, logger } = this.services;\n\t\tconst currentLanguage = backendConnector.language;\n\t\tif (currentLanguage && currentLanguage.toLowerCase() === \"cimode\") return;\n\t\tconst toLoad = [];\n\t\tconst append = (lng) => {\n\t\t\tlanguageUtils.toResolveHierarchy(lng).forEach((l) => {\n\t\t\t\tif (toLoad.indexOf(l) < 0) toLoad.push(l);\n\t\t\t});\n\t\t};\n\t\tappend(currentLanguage);\n\t\tif (this.allOptions.preload) this.allOptions.preload.forEach((l) => append(l));\n\t\ttoLoad.forEach((lng) => {\n\t\t\tthis.allOptions.ns.forEach((ns) => {\n\t\t\t\tbackendConnector.read(lng, ns, \"read\", null, null, (err, data) => {\n\t\t\t\t\tif (err) logger.warn(`loading namespace ${ns} for language ${lng} failed`, err);\n\t\t\t\t\tif (!err && data) logger.log(`loaded namespace ${ns} for language ${lng}`, data);\n\t\t\t\t\tbackendConnector.loaded(`${lng}|${ns}`, err, data);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n};\nBackend.type = \"backend\";\n//#endregion\nexport { Backend as default };\n"],"x_google_ignoreList":[0],"mappings":"mDACA,IAAM,EAAM,CAAC,EACb,EAAI,QACJ,EAAI,MACJ,IAAM,EAAgB,CACrB,YACA,cACA,WACD,EACA,SAAS,EAAqB,EAAG,CAQhC,MADA,EANI,OAAO,GAAM,UACb,EAAE,SAAW,GAAK,EAAE,OAAS,KAC7B,EAAc,QAAQ,CAAC,EAAI,IAC3B,EAAE,QAAQ,IAAI,EAAI,IAClB,EAAE,QAAQ,IAAI,EAAI,IAClB,WAAW,KAAK,CAAC,GACjB,kBAAkB,KAAK,CAAC,EAE7B,CACA,SAAS,EAAqB,EAAG,CAGhC,MADA,EADI,CAAC,EAAqB,CAAC,GACvB,EAAE,QAAQ,GAAG,EAAI,GAEtB,CACA,SAAS,EAAmB,EAAG,CAC9B,OAAO,EAAqB,CAAC,CAC9B,CACA,IAAM,EAAsB,CAC3B,IAAK,EACL,GAAI,CACL,EACA,SAAS,EAAiB,EAAG,CAE5B,OADI,OAAO,GAAM,SACV,EAAE,QAAQ,uBAAwB,GAAG,EADV,CAEnC,CACA,SAAS,EAAqB,EAAG,CAChC,GAAI,OAAO,GAAM,UAAY,EAAE,SAAW,EAAG,OAAO,EACpD,GAAI,CACH,IAAM,EAAS,IAAI,IAAI,CAAC,EAMxB,OALI,EAAO,UAAY,EAAO,UAC7B,EAAO,SAAW,GAClB,EAAO,SAAW,GACX,EAAO,SAAS,GAEjB,CACR,MAAY,CACX,OAAO,EAAE,QAAQ,mBAAoB,IAAI,CAC1C,CACD,CACA,SAAS,GAAoB,CAC5B,OAAO,OAAO,gBAAmB,YAAc,OAAO,gBAAmB,QAC1E,CAQA,SAAS,EAAU,EAAc,CAChC,MAAO,CAAC,CAAC,GAAgB,OAAO,EAAa,MAAS,UACvD,CAQA,SAAS,EAAY,EAAc,CAElC,OADI,EAAU,CAAY,EAAU,EAC7B,QAAQ,QAAQ,CAAY,CACpC,CACA,IAAM,EAAsB,iBAC5B,SAAS,EAAe,EAAK,EAAM,CAClC,IAAI,EAAS,GACP,EAAS,EAAI,QAAQ,GAAsB,EAAO,IAAQ,CAC/D,IAAM,EAAI,EAAI,KAAK,EACnB,GAAI,EAAc,QAAQ,CAAC,EAAI,GAAI,OAAO,EAC1C,IAAM,EAAQ,EAAK,GACnB,GAAI,GAAS,KAAM,OAAO,EAC1B,IAAM,EAAQ,EAAoB,IAAM,EAClC,EAAW,OAAO,CAAK,EAAE,MAAM,GAAG,EACxC,IAAK,IAAM,KAAO,EAAU,GAAI,CAAC,EAAM,CAAG,EAEzC,MADA,GAAS,GACF,EAER,OAAO,EAAS,KAAK,GAAG,CACzB,CAAC,EACD,OAAO,EAAS,KAAO,CACxB,CAGA,IAAM,EAAI,OAAO,WAAe,IAAc,WAAa,OAAO,OAAW,IAAc,OAAS,OAAO,OAAW,IAAc,OAAS,IAAK,GAC9I,EACA,OAAO,OAAU,WAAY,EAAW,MACnC,GAAK,OAAO,EAAE,OAAU,aAAY,EAAW,EAAE,OAC1D,IAAM,EAAoB,EAAkB,GAAK,EAAI,EAAE,eAAiB,IAAK,GACvE,EAAmB,OAAO,eAAkB,YAAc,EAAI,EAAE,cAAgB,IAAK,GACrF,EAAc,CACnB,YACA,cACA,WACD,EACM,GAAkB,EAAK,IAAW,CACvC,GAAI,GAAU,OAAO,GAAW,SAAU,CACzC,IAAI,EAAc,GAClB,IAAK,IAAM,KAAa,OAAO,KAAK,CAAM,EACrC,EAAY,QAAQ,CAAS,EAAI,KACrC,GAAe,IAAM,mBAAmB,CAAS,EAAI,IAAM,mBAAmB,EAAO,EAAU,GAEhG,GAAI,CAAC,EAAa,OAAO,EACzB,EAAM,GAAO,EAAI,QAAQ,GAAG,IAAM,GAAW,IAAN,KAAa,EAAY,MAAM,CAAC,CACxE,CACA,OAAO,CACR,EACM,GAAW,EAAK,EAAc,EAAU,IAAa,CAC1D,IAAM,EAAY,GAAa,CAC9B,GAAI,CAAC,EAAS,GAAI,OAAO,EAAS,EAAS,YAAc,QAAS,CAAE,OAAQ,EAAS,MAAO,CAAC,EAC7F,EAAS,KAAK,EAAE,KAAM,GAAS,CAC9B,EAAS,KAAM,CACd,OAAQ,EAAS,OACjB,MACD,CAAC,CACF,CAAC,EAAE,MAAM,CAAQ,CAClB,EACA,GAAI,EAAU,CACb,IAAM,EAAc,EAAS,EAAK,CAAY,EAC9C,GAAI,aAAuB,QAAS,CACnC,EAAY,KAAK,CAAQ,EAAE,MAAM,CAAQ,EACzC,MACD,CACD,CACI,OAAO,OAAU,WAAY,MAAM,EAAK,CAAY,EAAE,KAAK,CAAQ,EAAE,MAAM,CAAQ,EAClF,EAAS,EAAK,CAAY,EAAE,KAAK,CAAQ,EAAE,MAAM,CAAQ,CAC/D,EACM,GAAoB,EAAS,EAAK,EAAS,IAAa,CACzD,EAAQ,oBAAmB,EAAM,EAAe,EAAK,EAAQ,iBAAiB,GAClF,IAAM,EAAU,CAAE,GAAG,OAAO,EAAQ,eAAkB,WAAa,EAAQ,cAAc,EAAI,EAAQ,aAAc,EAC/G,OAAO,OAAW,KAAe,OAAO,OAAW,KAAsB,OAAO,UAAY,QAAe,OAAO,QAAQ,UAAY,OAAO,QAAQ,SAAS,OAAM,EAAQ,cAAgB,8BAA8B,OAAO,QAAQ,QAAQ,IAAI,OAAO,QAAQ,SAAS,GAAG,OAAO,QAAQ,KAAK,IACpS,IAAS,EAAQ,gBAAkB,oBACvC,IAAM,EAAa,OAAO,EAAQ,gBAAmB,WAAa,EAAQ,eAAe,CAAO,EAAI,EAAQ,eACtG,EAAe,CACpB,OAAQ,EAAU,OAAS,MAC3B,KAAM,EAAU,EAAQ,UAAU,CAAO,EAAI,IAAK,GAClD,UACA,GAAG,EAAQ,kBAAoB,CAAC,EAAI,CACrC,EACM,EAAW,OAAO,EAAQ,gBAAmB,YAAc,EAAQ,eAAe,QAAU,EAAI,EAAQ,eAAiB,IAAK,GACpI,GAAI,CACH,EAAQ,EAAK,EAAc,EAAU,CAAQ,CAC9C,OAAS,EAAG,CACX,GAAI,CAAC,GAAc,OAAO,KAAK,CAAU,EAAE,SAAW,GAAK,CAAC,EAAE,SAAW,EAAE,QAAQ,QAAQ,iBAAiB,EAAI,EAAG,OAAO,EAAS,CAAC,EACpI,GAAI,CACH,OAAO,KAAK,CAAU,EAAE,QAAS,GAAQ,CACxC,OAAO,EAAa,EACrB,CAAC,EACD,EAAQ,EAAK,EAAc,EAAU,CAAQ,EAC7C,EAAQ,kBAAoB,EAC7B,OAAS,EAAK,CACb,EAAS,CAAG,CACb,CACD,CACD,EACM,GAA6B,EAAS,EAAK,EAAS,IAAa,CAClE,GAAW,OAAO,GAAY,WAAU,EAAU,EAAe,GAAI,CAAO,EAAE,MAAM,CAAC,GACrF,EAAQ,oBAAmB,EAAM,EAAe,EAAK,EAAQ,iBAAiB,GAClF,GAAI,CACH,IAAM,EAAI,EAAoB,IAAI,EAAsB,IAAI,EAAiB,oBAAoB,EACjG,EAAE,KAAK,EAAU,OAAS,MAAO,EAAK,CAAC,EAClC,EAAQ,aAAa,EAAE,iBAAiB,mBAAoB,gBAAgB,EACjF,EAAE,gBAAkB,CAAC,CAAC,EAAQ,gBAC1B,GAAS,EAAE,iBAAiB,eAAgB,mCAAmC,EAC/E,EAAE,kBAAkB,EAAE,iBAAiB,kBAAkB,EAC7D,IAAI,EAAI,EAAQ,cAEhB,GADA,EAAI,OAAO,GAAM,WAAa,EAAE,EAAI,EAChC,EAAG,IAAK,IAAM,KAAK,OAAO,KAAK,CAAC,EAC/B,EAAY,QAAQ,CAAC,EAAI,IAC7B,EAAE,iBAAiB,EAAG,EAAE,EAAE,EAE3B,EAAE,uBAA2B,CAC5B,EAAE,WAAa,GAAK,EAAS,EAAE,QAAU,IAAM,EAAE,WAAa,KAAM,CACnE,OAAQ,EAAE,OACV,KAAM,EAAE,YACT,CAAC,CACF,EACA,EAAE,KAAK,CAAO,CACf,OAAS,EAAG,CACX,SAAW,QAAQ,IAAI,CAAC,CACzB,CACD,EACM,GAAW,EAAS,EAAK,EAAS,IAAa,CAMpD,GALI,OAAO,GAAY,aACtB,EAAW,EACX,EAAU,IAAK,IAEhB,SAA8B,CAAC,GAC3B,GAAY,EAAI,QAAQ,OAAO,IAAM,EAAG,OAAO,EAAiB,EAAS,EAAK,EAAS,CAAQ,EACnG,GAAI,EAAkB,GAAK,OAAO,eAAkB,WAAY,OAAO,EAA0B,EAAS,EAAK,EAAS,CAAQ,EAChI,EAA6B,MAAM,2CAA2C,CAAC,CAChF,EAGM,OACE,CACN,SAAU,+BACV,QAAS,8BACT,MAAQ,GAAS,KAAK,MAAM,CAAI,EAChC,UAAW,KAAK,UAChB,cAAe,EAAW,EAAK,KAAmB,EAAG,GAAM,GAAiB,EAAG,GAC/E,kBAAmB,EAAW,IAAe,IAAK,GAClD,UACA,eAAgB,OAAO,OAAW,IAAc,GAAQ,KAAO,IAC/D,cAAe,CAAC,EAChB,kBAAmB,CAAC,EACpB,YAAa,GACb,gBAAiB,GACjB,iBAAkB,GAClB,eAAgB,CACf,KAAM,OACN,YAAa,cACb,MAAO,SACR,CACD,GAEG,EAAU,KAAM,CACnB,YAAY,EAAU,EAAU,CAAC,EAAG,EAAa,CAAC,EAAG,CACpD,KAAK,SAAW,EAChB,KAAK,QAAU,EACf,KAAK,WAAa,EAClB,KAAK,KAAO,UACZ,KAAK,KAAK,EAAU,EAAS,CAAU,CACxC,CACA,KAAK,EAAU,EAAU,CAAC,EAAG,EAAa,CAAC,EAAG,CAQ7C,GAPA,KAAK,SAAW,EAChB,KAAK,QAAU,CACd,GAAG,EAAY,EACf,GAAG,KAAK,SAAW,CAAC,EACpB,GAAG,CACJ,EACA,KAAK,WAAa,EACd,KAAK,UAAY,KAAK,QAAQ,eAAgB,CACjD,IAAM,EAAQ,gBAAkB,KAAK,OAAO,EAAG,KAAK,QAAQ,cAAc,EACtE,OAAO,GAAU,UAAY,OAAO,EAAM,OAAU,YAAY,EAAM,MAAM,CACjF,CACD,CACA,UAAU,EAAW,EAAY,EAAU,CAC1C,KAAK,SAAS,EAAW,EAAW,EAAY,EAAY,CAAQ,CACrE,CACA,KAAK,EAAU,EAAW,EAAU,CACnC,KAAK,SAAS,CAAC,CAAQ,EAAG,EAAU,CAAC,CAAS,EAAG,EAAW,CAAQ,CACrE,CACA,SAAS,EAAW,EAAkB,EAAY,EAAmB,EAAU,CAC9E,IAAI,EAAW,KAAK,QAAQ,SACxB,OAAO,KAAK,QAAQ,UAAa,aAAY,EAAW,KAAK,QAAQ,SAAS,EAAW,CAAU,GACvG,EAAW,EAAY,CAAQ,EAC/B,EAAS,KAAM,GAAqB,CACnC,GAAI,CAAC,EAAkB,OAAO,EAAS,KAAM,CAAC,CAAC,EAC/C,IAAM,EAAM,EAAe,EAAkB,CAC5C,IAAK,EAAU,KAAK,GAAG,EACvB,GAAI,EAAW,KAAK,GAAG,CACxB,CAAC,EACD,GAAI,GAAO,KAAM,CAChB,IAAM,EAAW,EAAU,IAAI,CAAgB,EAAE,KAAK,IAAI,EACpD,EAAU,EAAW,IAAI,CAAgB,EAAE,KAAK,IAAI,EAC1D,OAAO,EAA6B,MAAM,4FAA8F,EAAW,iBAAmB,EAAU,GAAG,EAAG,EAAK,CAC5L,CACA,KAAK,QAAQ,EAAK,EAAU,EAAkB,CAAiB,CAChE,CAAC,CACF,CACA,QAAQ,EAAK,EAAU,EAAW,EAAY,CAC7C,IAAM,EAAM,OAAO,GAAc,SAAW,CAAC,CAAS,EAAI,EACpD,EAAK,OAAO,GAAe,SAAW,CAAC,CAAU,EAAI,EACrD,EAAU,KAAK,QAAQ,iBAAiB,EAAK,CAAE,EAC/C,EAAU,EAAiB,EAAqB,CAAG,CAAC,EAC1D,KAAK,QAAQ,QAAQ,KAAK,QAAS,EAAK,GAAU,EAAK,IAAQ,CAC9D,GAAI,IAAQ,EAAI,QAAU,KAAO,EAAI,OAAS,KAAO,CAAC,EAAI,QAAS,OAAO,EAAS,kBAAoB,EAAU,kBAAoB,EAAI,OAAQ,EAAI,EACrJ,GAAI,GAAO,EAAI,QAAU,KAAO,EAAI,OAAS,IAAK,OAAO,EAAS,kBAAoB,EAAU,kBAAoB,EAAI,OAAQ,EAAK,EACrI,GAAI,CAAC,GAAO,GAAO,EAAI,QAAS,CAC/B,IAAM,EAAe,EAAI,QAAQ,YAAY,EAC7C,GAAI,CACH,SACA,QACA,UACA,MACD,EAAE,KAAM,GAAS,EAAa,QAAQ,CAAI,EAAI,EAAE,EAAG,OAAO,EAAS,kBAAoB,EAAU,KAAO,EAAiB,EAAI,OAAO,EAAG,EAAI,CAC5I,CACA,GAAI,EAAK,OAAO,EAAS,EAAK,EAAK,EACnC,IAAI,EAAK,EACT,GAAI,CACH,AACK,EADD,OAAO,EAAI,MAAS,SAAgB,KAAK,QAAQ,MAAM,EAAI,KAAM,EAAW,CAAU,EAC/E,EAAI,IAChB,MAAY,CACX,EAAW,kBAAoB,EAAU,UAC1C,CACA,GAAI,EAAU,OAAO,EAAS,EAAU,EAAK,EAC7C,EAAS,KAAM,CAAG,CACnB,CAAC,CACF,CACA,OAAO,EAAW,EAAW,EAAK,EAAe,EAAU,CAC1D,GAAI,CAAC,KAAK,QAAQ,QAAS,OACvB,OAAO,GAAc,WAAU,EAAY,CAAC,CAAS,GACzD,IAAM,EAAU,KAAK,QAAQ,aAAa,EAAW,EAAK,CAAa,EACnE,EAAW,EACT,EAAY,CAAC,EACb,EAAW,CAAC,EAClB,EAAU,QAAS,GAAQ,CAC1B,IAAI,EAAU,KAAK,QAAQ,QACvB,OAAO,KAAK,QAAQ,SAAY,aAAY,EAAU,KAAK,QAAQ,QAAQ,EAAK,CAAS,GAC7F,IAAM,EAAM,EAAe,EAAS,CACnC,MACA,GAAI,CACL,CAAC,EACD,GAAI,GAAO,KAAM,CAChB,GAAY,EACR,GAAY,IAAa,EAAU,QAAQ,EAAS,EAAW,CAAQ,EAC3E,MACD,CACA,KAAK,QAAQ,QAAQ,KAAK,QAAS,EAAK,GAAU,EAAM,IAAQ,CAC/D,GAAY,EACZ,EAAU,KAAK,CAAI,EACnB,EAAS,KAAK,CAAG,EACb,IAAa,EAAU,QACtB,OAAO,GAAa,YAAY,EAAS,EAAW,CAAQ,CAElE,CAAC,CACF,CAAC,CACF,CACA,QAAS,CACR,GAAM,CAAE,mBAAkB,gBAAe,UAAW,KAAK,SACnD,EAAkB,EAAiB,SACzC,GAAI,GAAmB,EAAgB,YAAY,IAAM,SAAU,OACnE,IAAM,EAAS,CAAC,EACV,EAAU,GAAQ,CACvB,EAAc,mBAAmB,CAAG,EAAE,QAAS,GAAM,CAChD,EAAO,QAAQ,CAAC,EAAI,GAAG,EAAO,KAAK,CAAC,CACzC,CAAC,CACF,EACA,EAAO,CAAe,EAClB,KAAK,WAAW,SAAS,KAAK,WAAW,QAAQ,QAAS,GAAM,EAAO,CAAC,CAAC,EAC7E,EAAO,QAAS,GAAQ,CACvB,KAAK,WAAW,GAAG,QAAS,GAAO,CAClC,EAAiB,KAAK,EAAK,EAAI,OAAQ,KAAM,MAAO,EAAK,IAAS,CAC7D,GAAK,EAAO,KAAK,qBAAqB,EAAG,gBAAgB,EAAI,SAAU,CAAG,EAC1E,CAAC,GAAO,GAAM,EAAO,IAAI,oBAAoB,EAAG,gBAAgB,IAAO,CAAI,EAC/E,EAAiB,OAAO,GAAG,EAAI,GAAG,IAAM,EAAK,CAAI,CAClD,CAAC,CACF,CAAC,CACF,CAAC,CACF,CACD,EACA,EAAQ,KAAO"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../node_modules/i18next-http-backend/esm/index.js"],"sourcesContent":["//#region lib/utils.js\nconst arr = [];\narr.forEach;\narr.slice;\nconst UNSAFE_KEYS$1 = [\n\t\"__proto__\",\n\t\"constructor\",\n\t\"prototype\"\n];\nfunction isSafeUrlSegmentBase(v) {\n\tif (typeof v !== \"string\") return false;\n\tif (v.length === 0 || v.length > 128) return false;\n\tif (UNSAFE_KEYS$1.indexOf(v) > -1) return false;\n\tif (v.indexOf(\"..\") > -1) return false;\n\tif (v.indexOf(\"\\\\\") > -1) return false;\n\tif (/[?#%\\s]/.test(v)) return false;\n\tif (/[\\x00-\\x1F\\x7F]/.test(v)) return false;\n\treturn true;\n}\nfunction isSafeLangUrlSegment(v) {\n\tif (!isSafeUrlSegmentBase(v)) return false;\n\tif (v.indexOf(\"/\") > -1 || v.indexOf(\"@\") > -1) return false;\n\treturn true;\n}\nfunction isSafeNsUrlSegment(v) {\n\treturn isSafeUrlSegmentBase(v);\n}\nconst SAFETY_CHECK_BY_KEY = {\n\tlng: isSafeLangUrlSegment,\n\tns: isSafeNsUrlSegment\n};\nfunction sanitizeLogValue(v) {\n\tif (typeof v !== \"string\") return v;\n\treturn v.replace(/[\\r\\n\\x00-\\x1F\\x7F]/g, \" \");\n}\nfunction redactUrlCredentials(u) {\n\tif (typeof u !== \"string\" || u.length === 0) return u;\n\ttry {\n\t\tconst parsed = new URL(u);\n\t\tif (parsed.username || parsed.password) {\n\t\t\tparsed.username = \"\";\n\t\t\tparsed.password = \"\";\n\t\t\treturn parsed.toString();\n\t\t}\n\t\treturn u;\n\t} catch (e) {\n\t\treturn u.replace(/(\\/\\/)[^/@\\s]+@/g, \"$1\");\n\t}\n}\nfunction hasXMLHttpRequest() {\n\treturn typeof XMLHttpRequest === \"function\" || typeof XMLHttpRequest === \"object\";\n}\n/**\n* Determine whether the given `maybePromise` is a Promise.\n*\n* @param {*} maybePromise\n*\n* @returns {Boolean}\n*/\nfunction isPromise(maybePromise) {\n\treturn !!maybePromise && typeof maybePromise.then === \"function\";\n}\n/**\n* Convert any value to a Promise than will resolve to this value.\n*\n* @param {*} maybePromise\n*\n* @returns {Promise}\n*/\nfunction makePromise(maybePromise) {\n\tif (isPromise(maybePromise)) return maybePromise;\n\treturn Promise.resolve(maybePromise);\n}\nconst interpolationRegexp = /\\{\\{(.+?)\\}\\}/g;\nfunction interpolateUrl(str, data) {\n\tlet unsafe = false;\n\tconst result = str.replace(interpolationRegexp, (match, key) => {\n\t\tconst k = key.trim();\n\t\tif (UNSAFE_KEYS$1.indexOf(k) > -1) return match;\n\t\tconst value = data[k];\n\t\tif (value == null) return match;\n\t\tconst check = SAFETY_CHECK_BY_KEY[k] || isSafeLangUrlSegment;\n\t\tconst segments = String(value).split(\"+\");\n\t\tfor (const seg of segments) if (!check(seg)) {\n\t\t\tunsafe = true;\n\t\t\treturn match;\n\t\t}\n\t\treturn segments.join(\"+\");\n\t});\n\treturn unsafe ? null : result;\n}\n//#endregion\n//#region lib/request.js\nconst g = typeof globalThis !== \"undefined\" ? globalThis : typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : void 0;\nlet fetchApi;\nif (typeof fetch === \"function\") fetchApi = fetch;\nelse if (g && typeof g.fetch === \"function\") fetchApi = g.fetch;\nconst XmlHttpRequestApi = hasXMLHttpRequest() && g ? g.XMLHttpRequest : void 0;\nconst ActiveXObjectApi = typeof ActiveXObject === \"function\" && g ? g.ActiveXObject : void 0;\nconst UNSAFE_KEYS = [\n\t\"__proto__\",\n\t\"constructor\",\n\t\"prototype\"\n];\nconst addQueryString = (url, params) => {\n\tif (params && typeof params === \"object\") {\n\t\tlet queryString = \"\";\n\t\tfor (const paramName of Object.keys(params)) {\n\t\t\tif (UNSAFE_KEYS.indexOf(paramName) > -1) continue;\n\t\t\tqueryString += \"&\" + encodeURIComponent(paramName) + \"=\" + encodeURIComponent(params[paramName]);\n\t\t}\n\t\tif (!queryString) return url;\n\t\turl = url + (url.indexOf(\"?\") !== -1 ? \"&\" : \"?\") + queryString.slice(1);\n\t}\n\treturn url;\n};\nconst fetchIt = (url, fetchOptions, callback, altFetch) => {\n\tconst resolver = (response) => {\n\t\tif (!response.ok) return callback(response.statusText || \"Error\", { status: response.status });\n\t\tresponse.text().then((data) => {\n\t\t\tcallback(null, {\n\t\t\t\tstatus: response.status,\n\t\t\t\tdata\n\t\t\t});\n\t\t}).catch(callback);\n\t};\n\tif (altFetch) {\n\t\tconst altResponse = altFetch(url, fetchOptions);\n\t\tif (altResponse instanceof Promise) {\n\t\t\taltResponse.then(resolver).catch(callback);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (typeof fetch === \"function\") fetch(url, fetchOptions).then(resolver).catch(callback);\n\telse fetchApi(url, fetchOptions).then(resolver).catch(callback);\n};\nconst requestWithFetch = (options, url, payload, callback) => {\n\tif (options.queryStringParams) url = addQueryString(url, options.queryStringParams);\n\tconst headers = { ...typeof options.customHeaders === \"function\" ? options.customHeaders() : options.customHeaders };\n\tif (typeof window === \"undefined\" && typeof global !== \"undefined\" && typeof global.process !== \"undefined\" && global.process.versions && global.process.versions.node) headers[\"User-Agent\"] = `i18next-http-backend (node/${global.process.version}; ${global.process.platform} ${global.process.arch})`;\n\tif (payload) headers[\"Content-Type\"] = \"application/json\";\n\tconst reqOptions = typeof options.requestOptions === \"function\" ? options.requestOptions(payload) : options.requestOptions;\n\tconst fetchOptions = {\n\t\tmethod: payload ? \"POST\" : \"GET\",\n\t\tbody: payload ? options.stringify(payload) : void 0,\n\t\theaders,\n\t\t...options._omitFetchOptions ? {} : reqOptions\n\t};\n\tconst altFetch = typeof options.alternateFetch === \"function\" && options.alternateFetch.length >= 1 ? options.alternateFetch : void 0;\n\ttry {\n\t\tfetchIt(url, fetchOptions, callback, altFetch);\n\t} catch (e) {\n\t\tif (!reqOptions || Object.keys(reqOptions).length === 0 || !e.message || e.message.indexOf(\"not implemented\") < 0) return callback(e);\n\t\ttry {\n\t\t\tObject.keys(reqOptions).forEach((opt) => {\n\t\t\t\tdelete fetchOptions[opt];\n\t\t\t});\n\t\t\tfetchIt(url, fetchOptions, callback, altFetch);\n\t\t\toptions._omitFetchOptions = true;\n\t\t} catch (err) {\n\t\t\tcallback(err);\n\t\t}\n\t}\n};\nconst requestWithXmlHttpRequest = (options, url, payload, callback) => {\n\tif (payload && typeof payload === \"object\") payload = addQueryString(\"\", payload).slice(1);\n\tif (options.queryStringParams) url = addQueryString(url, options.queryStringParams);\n\ttry {\n\t\tconst x = XmlHttpRequestApi ? new XmlHttpRequestApi() : new ActiveXObjectApi(\"MSXML2.XMLHTTP.3.0\");\n\t\tx.open(payload ? \"POST\" : \"GET\", url, 1);\n\t\tif (!options.crossDomain) x.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\t\tx.withCredentials = !!options.withCredentials;\n\t\tif (payload) x.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\t\tif (x.overrideMimeType) x.overrideMimeType(\"application/json\");\n\t\tlet h = options.customHeaders;\n\t\th = typeof h === \"function\" ? h() : h;\n\t\tif (h) for (const i of Object.keys(h)) {\n\t\t\tif (UNSAFE_KEYS.indexOf(i) > -1) continue;\n\t\t\tx.setRequestHeader(i, h[i]);\n\t\t}\n\t\tx.onreadystatechange = () => {\n\t\t\tx.readyState > 3 && callback(x.status >= 400 ? x.statusText : null, {\n\t\t\t\tstatus: x.status,\n\t\t\t\tdata: x.responseText\n\t\t\t});\n\t\t};\n\t\tx.send(payload);\n\t} catch (e) {\n\t\tconsole && console.log(e);\n\t}\n};\nconst request = (options, url, payload, callback) => {\n\tif (typeof payload === \"function\") {\n\t\tcallback = payload;\n\t\tpayload = void 0;\n\t}\n\tcallback = callback || (() => {});\n\tif (fetchApi && url.indexOf(\"file:\") !== 0) return requestWithFetch(options, url, payload, callback);\n\tif (hasXMLHttpRequest() || typeof ActiveXObject === \"function\") return requestWithXmlHttpRequest(options, url, payload, callback);\n\tcallback(/* @__PURE__ */ new Error(\"No fetch and no xhr implementation found!\"));\n};\n//#endregion\n//#region lib/index.js\nconst getDefaults = () => {\n\treturn {\n\t\tloadPath: \"/locales/{{lng}}/{{ns}}.json\",\n\t\taddPath: \"/locales/add/{{lng}}/{{ns}}\",\n\t\tparse: (data) => JSON.parse(data),\n\t\tstringify: JSON.stringify,\n\t\tparsePayload: (namespace, key, fallbackValue) => ({ [key]: fallbackValue || \"\" }),\n\t\tparseLoadPayload: (languages, namespaces) => void 0,\n\t\trequest,\n\t\treloadInterval: typeof window !== \"undefined\" ? false : 3600 * 1e3,\n\t\tcustomHeaders: {},\n\t\tqueryStringParams: {},\n\t\tcrossDomain: false,\n\t\twithCredentials: false,\n\t\toverrideMimeType: false,\n\t\trequestOptions: {\n\t\t\tmode: \"cors\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\tcache: \"default\"\n\t\t}\n\t};\n};\nvar Backend = class {\n\tconstructor(services, options = {}, allOptions = {}) {\n\t\tthis.services = services;\n\t\tthis.options = options;\n\t\tthis.allOptions = allOptions;\n\t\tthis.type = \"backend\";\n\t\tthis.init(services, options, allOptions);\n\t}\n\tinit(services, options = {}, allOptions = {}) {\n\t\tthis.services = services;\n\t\tthis.options = {\n\t\t\t...getDefaults(),\n\t\t\t...this.options || {},\n\t\t\t...options\n\t\t};\n\t\tthis.allOptions = allOptions;\n\t\tif (this.services && this.options.reloadInterval) {\n\t\t\tconst timer = setInterval(() => this.reload(), this.options.reloadInterval);\n\t\t\tif (typeof timer === \"object\" && typeof timer.unref === \"function\") timer.unref();\n\t\t}\n\t}\n\treadMulti(languages, namespaces, callback) {\n\t\tthis._readAny(languages, languages, namespaces, namespaces, callback);\n\t}\n\tread(language, namespace, callback) {\n\t\tthis._readAny([language], language, [namespace], namespace, callback);\n\t}\n\t_readAny(languages, loadUrlLanguages, namespaces, loadUrlNamespaces, callback) {\n\t\tlet loadPath = this.options.loadPath;\n\t\tif (typeof this.options.loadPath === \"function\") loadPath = this.options.loadPath(languages, namespaces);\n\t\tloadPath = makePromise(loadPath);\n\t\tloadPath.then((resolvedLoadPath) => {\n\t\t\tif (!resolvedLoadPath) return callback(null, {});\n\t\t\tconst url = interpolateUrl(resolvedLoadPath, {\n\t\t\t\tlng: languages.join(\"+\"),\n\t\t\t\tns: namespaces.join(\"+\")\n\t\t\t});\n\t\t\tif (url == null) {\n\t\t\t\tconst safeLngs = languages.map(sanitizeLogValue).join(\", \");\n\t\t\t\tconst safeNss = namespaces.map(sanitizeLogValue).join(\", \");\n\t\t\t\treturn callback(/* @__PURE__ */ new Error(\"i18next-http-backend: unsafe lng/ns value — refusing to build request URL for languages=[\" + safeLngs + \"] namespaces=[\" + safeNss + \"]\"), false);\n\t\t\t}\n\t\t\tthis.loadUrl(url, callback, loadUrlLanguages, loadUrlNamespaces);\n\t\t});\n\t}\n\tloadUrl(url, callback, languages, namespaces) {\n\t\tconst lng = typeof languages === \"string\" ? [languages] : languages;\n\t\tconst ns = typeof namespaces === \"string\" ? [namespaces] : namespaces;\n\t\tconst payload = this.options.parseLoadPayload(lng, ns);\n\t\tconst safeUrl = sanitizeLogValue(redactUrlCredentials(url));\n\t\tthis.options.request(this.options, url, payload, (err, res) => {\n\t\t\tif (res && (res.status >= 500 && res.status < 600 || !res.status)) return callback(\"failed loading \" + safeUrl + \"; status code: \" + res.status, true);\n\t\t\tif (res && res.status >= 400 && res.status < 500) return callback(\"failed loading \" + safeUrl + \"; status code: \" + res.status, false);\n\t\t\tif (!res && err && err.message) {\n\t\t\t\tconst errorMessage = err.message.toLowerCase();\n\t\t\t\tif ([\n\t\t\t\t\t\"failed\",\n\t\t\t\t\t\"fetch\",\n\t\t\t\t\t\"network\",\n\t\t\t\t\t\"load\"\n\t\t\t\t].find((term) => errorMessage.indexOf(term) > -1)) return callback(\"failed loading \" + safeUrl + \": \" + sanitizeLogValue(err.message), true);\n\t\t\t}\n\t\t\tif (err) return callback(err, false);\n\t\t\tlet ret, parseErr;\n\t\t\ttry {\n\t\t\t\tif (typeof res.data === \"string\") ret = this.options.parse(res.data, languages, namespaces);\n\t\t\t\telse ret = res.data;\n\t\t\t} catch (e) {\n\t\t\t\tparseErr = \"failed parsing \" + safeUrl + \" to json\";\n\t\t\t}\n\t\t\tif (parseErr) return callback(parseErr, false);\n\t\t\tcallback(null, ret);\n\t\t});\n\t}\n\tcreate(languages, namespace, key, fallbackValue, callback) {\n\t\tif (!this.options.addPath) return;\n\t\tif (typeof languages === \"string\") languages = [languages];\n\t\tconst payload = this.options.parsePayload(namespace, key, fallbackValue);\n\t\tlet finished = 0;\n\t\tconst dataArray = [];\n\t\tconst resArray = [];\n\t\tlanguages.forEach((lng) => {\n\t\t\tlet addPath = this.options.addPath;\n\t\t\tif (typeof this.options.addPath === \"function\") addPath = this.options.addPath(lng, namespace);\n\t\t\tconst url = interpolateUrl(addPath, {\n\t\t\t\tlng,\n\t\t\t\tns: namespace\n\t\t\t});\n\t\t\tif (url == null) {\n\t\t\t\tfinished += 1;\n\t\t\t\tif (callback && finished === languages.length) callback(dataArray, resArray);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.options.request(this.options, url, payload, (data, res) => {\n\t\t\t\tfinished += 1;\n\t\t\t\tdataArray.push(data);\n\t\t\t\tresArray.push(res);\n\t\t\t\tif (finished === languages.length) {\n\t\t\t\t\tif (typeof callback === \"function\") callback(dataArray, resArray);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\treload() {\n\t\tconst { backendConnector, languageUtils, logger } = this.services;\n\t\tconst currentLanguage = backendConnector.language;\n\t\tif (currentLanguage && currentLanguage.toLowerCase() === \"cimode\") return;\n\t\tconst toLoad = [];\n\t\tconst append = (lng) => {\n\t\t\tlanguageUtils.toResolveHierarchy(lng).forEach((l) => {\n\t\t\t\tif (toLoad.indexOf(l) < 0) toLoad.push(l);\n\t\t\t});\n\t\t};\n\t\tappend(currentLanguage);\n\t\tif (this.allOptions.preload) this.allOptions.preload.forEach((l) => append(l));\n\t\ttoLoad.forEach((lng) => {\n\t\t\tthis.allOptions.ns.forEach((ns) => {\n\t\t\t\tbackendConnector.read(lng, ns, \"read\", null, null, (err, data) => {\n\t\t\t\t\tif (err) logger.warn(`loading namespace ${ns} for language ${lng} failed`, err);\n\t\t\t\t\tif (!err && data) logger.log(`loaded namespace ${ns} for language ${lng}`, data);\n\t\t\t\t\tbackendConnector.loaded(`${lng}|${ns}`, err, data);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n};\nBackend.type = \"backend\";\n//#endregion\nexport { Backend as default };\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -7,10 +7,10 @@ var t = [
7
7
  "prototype"
8
8
  ];
9
9
  function n(e) {
10
- return !(typeof e != "string" || e.length === 0 || e.length > 128 || t.indexOf(e) > -1 || e.indexOf("..") > -1 || e.indexOf("\\") > -1 || /[?#%\s@]/.test(e) || /[\x00-\x1F\x7F]/.test(e));
10
+ return !(typeof e != "string" || e.length === 0 || e.length > 128 || t.indexOf(e) > -1 || e.indexOf("..") > -1 || e.indexOf("\\") > -1 || /[?#%\s]/.test(e) || /[\x00-\x1F\x7F]/.test(e));
11
11
  }
12
12
  function r(e) {
13
- return !(!n(e) || e.indexOf("/") > -1);
13
+ return !(!n(e) || e.indexOf("/") > -1 || e.indexOf("@") > -1);
14
14
  }
15
15
  function i(e) {
16
16
  return n(e);