@openhands/agent-canvas 1.0.0-rc.8 → 1.0.0-rc.9

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 (101) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BqUvf67Q.js → acp-providers-Dzb4nxxB.js} +1 -1
  4. package/build/assets/{active-backend-context-CNF2lPkA.js → active-backend-context-B2OSC-qe.js} +1 -1
  5. package/build/assets/{add-backend-modal-BywVr6uq.js → add-backend-modal-lG8XDYjr.js} +1 -1
  6. package/build/assets/{agent-server-adapter-k8veH-1O.js → agent-server-adapter-BPpZcLOE.js} +3 -3
  7. package/build/assets/agent-server-client-options-wXLeJYeM.js +1 -0
  8. package/build/assets/{agent-server-conversation-service.api-CGbkhsLj.js → agent-server-conversation-service.api-C4Fc9Jnp.js} +1 -1
  9. package/build/assets/{agent-settings-DoHXHcoA.js → agent-settings-Blipgztd.js} +1 -1
  10. package/build/assets/{analytics-consent-form-modal-CVhsAREx.js → analytics-consent-form-modal-Cujm1lCj.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Dnr5TcV0.js → api-key-entry-screen-BarZU9nr.js} +1 -1
  12. package/build/assets/{app-settings-Bgm2-yOM.js → app-settings-CofRfixq.js} +1 -1
  13. package/build/assets/{automation-detail-86M_yMqz.js → automation-detail-BV4Cn0O8.js} +1 -1
  14. package/build/assets/{automations-list-BWUILrqY.js → automations-list-BaJ61q7P.js} +1 -1
  15. package/build/assets/{backend-form-modal-Dl29wkF5.js → backend-form-modal-B3BCZDPq.js} +1 -1
  16. package/build/assets/{backend-synced-settings-badge-Dcd4712m.js → backend-synced-settings-badge-Da0G6Lwv.js} +1 -1
  17. package/build/assets/{chat-send-button-BhoO7T0s.js → chat-send-button-DzRpAQr4.js} +1 -1
  18. package/build/assets/{condenser-settings-DgQ0rsAf.js → condenser-settings-Bo07FAEi.js} +1 -1
  19. package/build/assets/{conversation-CayU5Lrr.js → conversation-DDdRyW4z.js} +3 -3
  20. package/build/assets/conversation-panel-Dww2uJOd.js +1 -0
  21. package/build/assets/conversation-rGQV1Eym.js +1 -0
  22. package/build/assets/{conversation-service.api-shHWtFwu.js → conversation-service.api-ByRiRU1e.js} +1 -1
  23. package/build/assets/{edit-automation-modal-8y9Uctxo.js → edit-automation-modal-CpA_JKLY.js} +1 -1
  24. package/build/assets/{entry.client-D_wtryHT.js → entry.client-DUpefbBp.js} +1 -1
  25. package/build/assets/{extensions-hub-CoWO3SzQ.js → extensions-hub-BYCLWP3d.js} +1 -1
  26. package/build/assets/{extensions-navigation-D5w2sFQe.js → extensions-navigation-3FLKfb6g.js} +1 -1
  27. package/build/assets/{files-tab-CxdtgkIe.js → files-tab-CBUPwSV1.js} +1 -1
  28. package/build/assets/{home-3joHMYSR.js → home-BDCL0Psk.js} +1 -1
  29. package/build/assets/{install-server-modal-_7l1gcjd.js → install-server-modal-CWZhBKwH.js} +1 -1
  30. package/build/assets/{launch-fU77utLO.js → launch-CMZknx1e.js} +1 -1
  31. package/build/assets/{lesson-plan-CHGc-B8Y.js → lesson-plan-y520IDs6.js} +1 -1
  32. package/build/assets/{llm-client-P9f2gKeW.js → llm-client-D6EtdLBs.js} +1 -1
  33. package/build/assets/{llm-not-configured-banner-BMGzpBPV.js → llm-not-configured-banner-CJyURBCm.js} +1 -1
  34. package/build/assets/llm-settings-BW6yW2Go.js +1 -0
  35. package/build/assets/{llm-settings-yDgbXP6Q.js → llm-settings-CiY22Wzi.js} +1 -1
  36. package/build/assets/{manage-backends-modal-tfdzTXWU.js → manage-backends-modal-v5POMal5.js} +1 -1
  37. package/build/assets/{manifest-bbc1374e.js → manifest-eccb7f46.js} +1 -1
  38. package/build/assets/{mcp-Dopstf0t.js → mcp-DgPFZ_Dv.js} +1 -1
  39. package/build/assets/{messages-CsFUrAen.js → messages-Dq6AQ8mp.js} +1 -1
  40. package/build/assets/{model-selector-sioC8xP4.js → model-selector-CdZs21EZ.js} +1 -1
  41. package/build/assets/{onboarding-CQh50i2z.js → onboarding-Cdwu8QIy.js} +1 -1
  42. package/build/assets/{option-service.api-DjPvPAtd.js → option-service.api-CdYnKVsu.js} +1 -1
  43. package/build/assets/{organization-service.api-BNc9Kn6n.js → organization-service.api-CzMvXIQT.js} +1 -1
  44. package/build/assets/{path-utils-YlkpoImJ.js → path-utils-DKu3CNkH.js} +1 -1
  45. package/build/assets/{planner-tab-DjIFIQDk.js → planner-tab-YkOp7QXt.js} +1 -1
  46. package/build/assets/{profiles-client-BNvHck-I.js → profiles-client-BjUo3q05.js} +1 -1
  47. package/build/assets/{providers-BiWSYwRT.js → providers-CbpQft-X.js} +1 -1
  48. package/build/assets/{proxy--Uy1iGsW.js → proxy-Bx3NeKeo.js} +1 -1
  49. package/build/assets/{recommended-automations-launcher-DCi0RXIj.js → recommended-automations-launcher-WxaZcjRD.js} +1 -1
  50. package/build/assets/{root-DrHpnAqU.js → root-CiNoOVrb.js} +2 -2
  51. package/build/assets/{root-layout-Cf7FC9DC.js → root-layout-DUw-s9LS.js} +2 -2
  52. package/build/assets/{sdk-section-page-COlGKv4E.js → sdk-section-page-DPBwwLle.js} +1 -1
  53. package/build/assets/{secrets-service-D6Gcymcs.js → secrets-service-Skzza9sx.js} +1 -1
  54. package/build/assets/{secrets-settings-DYfTc5c8.js → secrets-settings-DmpsTC9V.js} +1 -1
  55. package/build/assets/{settings-DRmVFdOc.js → settings-ChsRtIJQ.js} +1 -1
  56. package/build/assets/{settings-index-B035V2pu.js → settings-index-BLfmrKRl.js} +1 -1
  57. package/build/assets/{settings-modal-CeRvS5Bc.js → settings-modal-Cth7Zb-I.js} +1 -1
  58. package/build/assets/{settings-service.api-CFt5HmXD.js → settings-service.api-CcpckquT.js} +1 -1
  59. package/build/assets/{shared-conversation-CBbpyPaD.js → shared-conversation-Y0C8zqdr.js} +1 -1
  60. package/build/assets/{sidebar-mobile-menu-toggle-SKcwsEtD.js → sidebar-mobile-menu-toggle-BvcBXvLY.js} +1 -1
  61. package/build/assets/{sidebar-nav-link-CPWuQ_c6.js → sidebar-nav-link-BekRAssb.js} +1 -1
  62. package/build/assets/{skills-client-Ui_9FvXp.js → skills-client-CgraS-wA.js} +1 -1
  63. package/build/assets/{skills-plugins-Dc4ec3CW.js → skills-plugins-rIza_fUf.js} +1 -1
  64. package/build/assets/{skills-settings-B6HwvA0S.js → skills-settings-Dvl7gpEx.js} +1 -1
  65. package/build/assets/{telemetry-DCFAqpIA.js → telemetry-CAWBJ_rB.js} +1 -1
  66. package/build/assets/{terminal-CltMeLv4.js → terminal-BFypysgZ.js} +1 -1
  67. package/build/assets/{use-acp-credential-form-LjCIhMSK.js → use-acp-credential-form-Dj7Jkhgp.js} +1 -1
  68. package/build/assets/{use-active-conversation-B0_rXnqa.js → use-active-conversation-BkohEtaN.js} +1 -1
  69. package/build/assets/{use-agent-settings-schema-D8x5LJVS.js → use-agent-settings-schema-Lf_lBAky.js} +1 -1
  70. package/build/assets/{use-agent-state-BuOzLeFN.js → use-agent-state-DITv5qV7.js} +1 -1
  71. package/build/assets/{use-cloud-current-user-id-DVZXa_WH.js → use-cloud-current-user-id-CSm3kgqy.js} +1 -1
  72. package/build/assets/{use-config-5zEjywCL.js → use-config-DVU9HaPf.js} +1 -1
  73. package/build/assets/{use-create-conversation-pV2eA-e9.js → use-create-conversation-CJUAOf1q.js} +1 -1
  74. package/build/assets/{use-create-secret-ClPpLBgD.js → use-create-secret-LObNBU3M.js} +1 -1
  75. package/build/assets/{use-handle-plan-click-CwN_nNib.js → use-handle-plan-click-BdcdMWbv.js} +1 -1
  76. package/build/assets/{use-llm-profiles-CWLfWjav.js → use-llm-profiles-BBTR-OsK.js} +1 -1
  77. package/build/assets/use-runtime-is-ready-BOQpqCvp.js +1 -0
  78. package/build/assets/{use-save-settings-Xp8DD-jf.js → use-save-settings-7_MLft-Y.js} +1 -1
  79. package/build/assets/{use-settings-0SeqaDeW.js → use-settings-CNsxccvQ.js} +1 -1
  80. package/build/assets/{use-settings-nav-items-DVrMNk0I.js → use-settings-nav-items-ykMjd_NG.js} +1 -1
  81. package/build/assets/{use-skills-Bv8LXrys.js → use-skills-_unimM2d.js} +1 -1
  82. package/build/assets/{use-tracking-BhyV5A9i.js → use-tracking-C9P88zSo.js} +1 -1
  83. package/build/assets/{use-user-conversation-6yFVEXiG.js → use-user-conversation-2jZZ-MLA.js} +1 -1
  84. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-CGm-Jxp5.js → vendor~root-layout~home~conversation-panel~conversation~launch~mcp~settings~settings-index~~m3acswdn-DQE89epK.js} +1 -1
  85. package/build/assets/{verification-settings-Be6NxjuT.js → verification-settings-EUkt_CkZ.js} +1 -1
  86. package/build/index.html +4 -4
  87. package/config/defaults.json +1 -6
  88. package/dist/package.cjs +1 -1
  89. package/dist/package.cjs.map +1 -1
  90. package/dist/package.js +1 -1
  91. package/dist/package.js.map +1 -1
  92. package/dist/utils/websocket-url.cjs +1 -1
  93. package/dist/utils/websocket-url.cjs.map +1 -1
  94. package/dist/utils/websocket-url.js +2 -2
  95. package/dist/utils/websocket-url.js.map +1 -1
  96. package/package.json +1 -1
  97. package/build/assets/agent-server-client-options-B-C8JaTb.js +0 -1
  98. package/build/assets/conversation-erinyBqT.js +0 -1
  99. package/build/assets/conversation-panel-DiI4q-8-.js +0 -1
  100. package/build/assets/llm-settings-BRotm_g6.js +0 -1
  101. package/build/assets/use-runtime-is-ready-Bbory9-s.js +0 -1
package/build/index.html CHANGED
@@ -1,13 +1,13 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>OpenHands</title><meta name="description" content="Let&#x27;s Start Building!"/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="modulepreload" href="/assets/manifest-bbc1374e.js"/><link rel="modulepreload" href="/assets/entry.client-D_wtryHT.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-BFRubm34.js"/><link rel="modulepreload" href="/assets/preload-helper-CT1Z6Pdu.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-EcEhmoJW.js"/><link rel="modulepreload" href="/assets/providers-BiWSYwRT.js"/><link rel="modulepreload" href="/assets/declaration-D9ucT0fq.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-DrAdOKqA.js"/><link rel="modulepreload" href="/assets/react-CM_dJw1Z.js"/><link rel="modulepreload" href="/assets/query-client-config-Ca3tW1AH.js"/><link rel="modulepreload" href="/assets/react-dom-hVBnwgwZ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-BjMt2JeR.js"/><link rel="modulepreload" href="/assets/active-backend-context-CNF2lPkA.js"/><link rel="modulepreload" href="/assets/QueryClientProvider-XcSjsfpb.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BmOMM-6e.js"/><link rel="modulepreload" href="/assets/context-CI9FqkUp.js"/><link rel="modulepreload" href="/assets/option-service.api-DjPvPAtd.js"/><link rel="modulepreload" href="/assets/utils-eXk6yerZ.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-BwIZYdC1.js"/><link rel="modulepreload" href="/assets/agent-server-client-options-B-C8JaTb.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfbjdnyv-C5ZIbuq8.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dqseey1n-D_BSEDk4.js"/><link rel="modulepreload" href="/assets/createLucideIcon-CkGTf9Qj.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nh19ovoo-DJTFnsA1.js"/><link rel="modulepreload" href="/assets/common-Dh7OqABE.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-Cl4h-NSi.js"/><link rel="modulepreload" href="/assets/llm-client-P9f2gKeW.js"/><link rel="modulepreload" href="/assets/root-DrHpnAqU.js"/><link rel="modulepreload" href="/assets/useTranslation-CL6FTf1b.js"/><link rel="modulepreload" href="/assets/telemetry-DCFAqpIA.js"/><link rel="modulepreload" href="/assets/brand-button-9SOzmqPP.js"/><link rel="modulepreload" href="/assets/base-modal-DvuGYyu1.js"/><link rel="modulepreload" href="/assets/loading-spinner-D7bOU6I7.js"/><link rel="modulepreload" href="/assets/modal-backdrop-_VbcKk5K.js"/><link rel="modulepreload" href="/assets/modal-body-Cd-PtMHr.js"/><link rel="modulepreload" href="/assets/use-config-5zEjywCL.js"/><link rel="modulepreload" href="/assets/color-themes-0biOprdo.js"/><link rel="modulepreload" href="/assets/modal-classes-CNm4ovfm.js"/><link rel="modulepreload" href="/assets/useQuery-DGRSm7IT.js"/><link rel="modulepreload" href="/assets/suspense-Bqb0V0q1.js"/><link rel="stylesheet" href="/assets/root-CRkz_h2T.css"/></head><body data-agent-server-ui="" class="m-0"><div data-agent-server-ui="" style="--oh-color-logo:#cfb755;--oh-color-base:var(--cool-grey-950);--oh-color-base-secondary:var(--cool-grey-925);--oh-color-danger:#e76a5e;--oh-color-success:#a5e75e;--oh-color-basic:var(--cool-grey-400);--oh-color-tertiary:var(--cool-grey-800);--oh-color-tertiary-light:var(--cool-grey-300);--oh-color-content:var(--cool-grey-100);--oh-color-content-2:var(--cool-grey-50);--oh-background:var(--cool-grey-950);--oh-foreground:var(--cool-grey-100);--oh-surface:var(--cool-grey-925);--oh-surface-foreground:var(--cool-grey-100);--oh-surface-raised:var(--cool-grey-900);--oh-surface-deep:var(--cool-grey-975);--oh-overlay:var(--cool-grey-925);--oh-overlay-foreground:var(--cool-grey-100);--oh-muted:var(--cool-grey-400);--oh-text-secondary:var(--cool-grey-300);--oh-text-tertiary:var(--cool-grey-200);--oh-text-dim:var(--cool-grey-500);--oh-text-subtle:var(--cool-grey-600);--oh-interactive-hover:var(--cool-grey-700);--oh-interactive-hover-low:var(--cool-grey-900);--oh-interactive-active:var(--cool-grey-800);--oh-interactive-selected:var(--cool-grey-600);--oh-scrollbar:color-mix(in srgb, var(--cool-grey-400) 30%, transparent);--oh-scrollbar-hover:color-mix(in srgb, var(--cool-grey-400) 50%, transparent);--oh-default:var(--cool-grey-800);--oh-default-foreground:var(--cool-grey-100);--oh-accent-foreground:var(--cool-grey-950);--oh-success:#a5e75e;--oh-success-foreground:var(--cool-grey-950);--oh-warning-foreground:var(--cool-grey-950);--oh-danger:#e76a5e;--oh-danger-foreground:var(--cool-grey-50);--oh-segment:var(--cool-grey-925);--oh-segment-foreground:var(--cool-grey-100);--oh-border-width:1px;--oh-field-border-width:1px;--oh-border:var(--cool-grey-700);--oh-border-input:var(--cool-grey-600);--oh-border-subtle:var(--cool-grey-800);--oh-separator:rgba(113, 120, 136, 0.5);--oh-focus:#ffffff;--oh-status-success:#1FBD53;--oh-status-error:#FF684E;--oh-link:var(--cool-grey-100);--oh-radius:8px;--oh-field-radius:8px;--oh-surface-shadow:none;--oh-overlay-shadow:none;--oh-field-shadow:none;--oh-bg-dark:var(--cool-grey-950);--oh-bg-light:var(--cool-grey-900);--oh-bg-input:var(--cool-grey-800);--oh-bg-workspace:var(--cool-grey-925);--oh-text-editor-base:var(--cool-grey-400);--oh-text-editor-active:var(--cool-grey-300);--oh-bg-editor-sidebar:var(--cool-grey-925);--oh-bg-editor-active:var(--cool-grey-900);--oh-border-editor-sidebar:var(--cool-grey-800);--oh-bg-neutral-muted:color-mix(in srgb, var(--cool-grey-300) 20%, transparent)"><div class="dark min-h-screen text-foreground" data-theme="dark"><script>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>OpenHands</title><meta name="description" content="Let&#x27;s Start Building!"/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="modulepreload" href="/assets/manifest-eccb7f46.js"/><link rel="modulepreload" href="/assets/entry.client-DUpefbBp.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-BFRubm34.js"/><link rel="modulepreload" href="/assets/preload-helper-CT1Z6Pdu.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-EcEhmoJW.js"/><link rel="modulepreload" href="/assets/providers-CbpQft-X.js"/><link rel="modulepreload" href="/assets/declaration-D9ucT0fq.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-DrAdOKqA.js"/><link rel="modulepreload" href="/assets/react-CM_dJw1Z.js"/><link rel="modulepreload" href="/assets/query-client-config-Ca3tW1AH.js"/><link rel="modulepreload" href="/assets/react-dom-hVBnwgwZ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-BjMt2JeR.js"/><link rel="modulepreload" href="/assets/active-backend-context-B2OSC-qe.js"/><link rel="modulepreload" href="/assets/QueryClientProvider-XcSjsfpb.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BmOMM-6e.js"/><link rel="modulepreload" href="/assets/context-CI9FqkUp.js"/><link rel="modulepreload" href="/assets/option-service.api-CdYnKVsu.js"/><link rel="modulepreload" href="/assets/utils-eXk6yerZ.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-BwIZYdC1.js"/><link rel="modulepreload" href="/assets/agent-server-client-options-wXLeJYeM.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfbjdnyv-C5ZIbuq8.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dqseey1n-D_BSEDk4.js"/><link rel="modulepreload" href="/assets/createLucideIcon-CkGTf9Qj.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nh19ovoo-DJTFnsA1.js"/><link rel="modulepreload" href="/assets/common-Dh7OqABE.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-Cl4h-NSi.js"/><link rel="modulepreload" href="/assets/llm-client-D6EtdLBs.js"/><link rel="modulepreload" href="/assets/root-CiNoOVrb.js"/><link rel="modulepreload" href="/assets/useTranslation-CL6FTf1b.js"/><link rel="modulepreload" href="/assets/telemetry-CAWBJ_rB.js"/><link rel="modulepreload" href="/assets/brand-button-9SOzmqPP.js"/><link rel="modulepreload" href="/assets/base-modal-DvuGYyu1.js"/><link rel="modulepreload" href="/assets/loading-spinner-D7bOU6I7.js"/><link rel="modulepreload" href="/assets/modal-backdrop-_VbcKk5K.js"/><link rel="modulepreload" href="/assets/modal-body-Cd-PtMHr.js"/><link rel="modulepreload" href="/assets/use-config-DVU9HaPf.js"/><link rel="modulepreload" href="/assets/color-themes-0biOprdo.js"/><link rel="modulepreload" href="/assets/modal-classes-CNm4ovfm.js"/><link rel="modulepreload" href="/assets/useQuery-DGRSm7IT.js"/><link rel="modulepreload" href="/assets/suspense-Bqb0V0q1.js"/><link rel="stylesheet" href="/assets/root-CRkz_h2T.css"/></head><body data-agent-server-ui="" class="m-0"><div data-agent-server-ui="" style="--oh-color-logo:#cfb755;--oh-color-base:var(--cool-grey-950);--oh-color-base-secondary:var(--cool-grey-925);--oh-color-danger:#e76a5e;--oh-color-success:#a5e75e;--oh-color-basic:var(--cool-grey-400);--oh-color-tertiary:var(--cool-grey-800);--oh-color-tertiary-light:var(--cool-grey-300);--oh-color-content:var(--cool-grey-100);--oh-color-content-2:var(--cool-grey-50);--oh-background:var(--cool-grey-950);--oh-foreground:var(--cool-grey-100);--oh-surface:var(--cool-grey-925);--oh-surface-foreground:var(--cool-grey-100);--oh-surface-raised:var(--cool-grey-900);--oh-surface-deep:var(--cool-grey-975);--oh-overlay:var(--cool-grey-925);--oh-overlay-foreground:var(--cool-grey-100);--oh-muted:var(--cool-grey-400);--oh-text-secondary:var(--cool-grey-300);--oh-text-tertiary:var(--cool-grey-200);--oh-text-dim:var(--cool-grey-500);--oh-text-subtle:var(--cool-grey-600);--oh-interactive-hover:var(--cool-grey-700);--oh-interactive-hover-low:var(--cool-grey-900);--oh-interactive-active:var(--cool-grey-800);--oh-interactive-selected:var(--cool-grey-600);--oh-scrollbar:color-mix(in srgb, var(--cool-grey-400) 30%, transparent);--oh-scrollbar-hover:color-mix(in srgb, var(--cool-grey-400) 50%, transparent);--oh-default:var(--cool-grey-800);--oh-default-foreground:var(--cool-grey-100);--oh-accent-foreground:var(--cool-grey-950);--oh-success:#a5e75e;--oh-success-foreground:var(--cool-grey-950);--oh-warning-foreground:var(--cool-grey-950);--oh-danger:#e76a5e;--oh-danger-foreground:var(--cool-grey-50);--oh-segment:var(--cool-grey-925);--oh-segment-foreground:var(--cool-grey-100);--oh-border-width:1px;--oh-field-border-width:1px;--oh-border:var(--cool-grey-700);--oh-border-input:var(--cool-grey-600);--oh-border-subtle:var(--cool-grey-800);--oh-separator:rgba(113, 120, 136, 0.5);--oh-focus:#ffffff;--oh-status-success:#1FBD53;--oh-status-error:#FF684E;--oh-link:var(--cool-grey-100);--oh-radius:8px;--oh-field-radius:8px;--oh-surface-shadow:none;--oh-overlay-shadow:none;--oh-field-shadow:none;--oh-bg-dark:var(--cool-grey-950);--oh-bg-light:var(--cool-grey-900);--oh-bg-input:var(--cool-grey-800);--oh-bg-workspace:var(--cool-grey-925);--oh-text-editor-base:var(--cool-grey-400);--oh-text-editor-active:var(--cool-grey-300);--oh-bg-editor-sidebar:var(--cool-grey-925);--oh-bg-editor-active:var(--cool-grey-900);--oh-border-editor-sidebar:var(--cool-grey-800);--oh-bg-neutral-muted:color-mix(in srgb, var(--cool-grey-300) 20%, transparent)"><div class="dark min-h-screen text-foreground" data-theme="dark"><script>
2
2
  console.log(
3
3
  "💿 Hey developer 👋. You can provide a way better UX than this " +
4
4
  "when your app is loading JS modules and/or running `clientLoader` " +
5
5
  "functions. Check out https://reactrouter.com/start/framework/route-module#hydratefallback " +
6
6
  "for more information."
7
7
  );
8
- </script><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div id="modal-portal-exit"></div></div></div><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"v8_passThroughRequests":false,"v8_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-bbc1374e.js";
9
- import * as route0 from "/assets/root-DrHpnAqU.js";
8
+ </script><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div id="modal-portal-exit"></div></div></div><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"v8_passThroughRequests":false,"v8_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-eccb7f46.js";
9
+ import * as route0 from "/assets/root-CiNoOVrb.js";
10
10
 
11
11
  window.__reactRouterRouteModules = {"root":route0};
12
12
 
13
- import("/assets/entry.client-D_wtryHT.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>
13
+ import("/assets/entry.client-DUpefbBp.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>
@@ -1,32 +1,27 @@
1
1
  {
2
2
  "_comment": "Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.",
3
-
4
3
  "versions": {
5
4
  "agentServer": "1.28.1",
6
- "agentCanvas": "1.0.0-rc.8",
5
+ "agentCanvas": "1.0.0-rc.9",
7
6
  "automation": "1.0.0a9",
8
7
  "automationSdk": "1.28.1",
9
8
  "githubMcpServer": "1.2.0"
10
9
  },
11
-
12
10
  "images": {
13
11
  "agentServer": "ghcr.io/openhands/agent-server",
14
12
  "agentCanvas": "ghcr.io/openhands/agent-canvas"
15
13
  },
16
-
17
14
  "ports": {
18
15
  "agentServer": 18000,
19
16
  "automation": 18001,
20
17
  "proxy": 8000
21
18
  },
22
-
23
19
  "paths": {
24
20
  "stateSubdir": "agent-canvas",
25
21
  "conversations": "agent-canvas/conversations",
26
22
  "bashEvents": "agent-canvas/bash_events",
27
23
  "automationDb": "automation/automations.db"
28
24
  },
29
-
30
25
  "packages": {
31
26
  "agentServer": "openhands-agent-server",
32
27
  "automation": "openhands-automation",
package/dist/package.cjs CHANGED
@@ -1,2 +1,2 @@
1
- require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.0.0-rc.8`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/agent-canvas`},homepage:`https://github.com/OpenHands/agent-canvas#readme`,bugs:{url:`https://github.com/OpenHands/agent-canvas/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=22.12.0`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.20`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.4.1`,"@openhands/typescript-client":`1.24.3`,"@react-router/node":`7.17.0`,"@react-router/serve":`7.17.0`,"@tailwindcss/vite":`4.2.4`,"@tanstack/react-query":`5.100.9`,"@types/shell-quote":`^1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.16.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,i18next:`26.0.8`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.0`,isbot:`5.1.39`,"lucide-react":`1.14.0`,"monaco-editor":`0.55.1`,"posthog-js":`1.372.6`,react:`19.2.5`,"react-dom":`19.2.5`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.6`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.17.0`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`^1.8.3`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.5.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.10`,winston:`^3.19.0`,"winston-daily-rotate-file":`^5.0.0`,zustand:`5.0.12`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:e2e:snapshots":`playwright test tests/e2e/snapshots --project=chromium --retries=0`,"test:e2e:snapshots:update":`playwright test tests/e2e/snapshots --project=chromium --update-snapshots`,"test:coverage":`npm run make-i18n && vitest run --coverage`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`bash -c 'npm run typecheck:staged'`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.1`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.59.1`,"@react-router/dev":`7.17.0`,"@tailwindcss/typography":`0.5.19`,"@tanstack/eslint-plugin-query":`5.100.9`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`6.9.1`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`25.6.0`,"@types/react":`19.2.14`,"@types/react-dom":`19.2.3`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.59.2`,"@typescript-eslint/parser":`8.59.2`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.5`,"cross-env":`10.1.0`,eslint:`9.39.4`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.4`,"eslint-plugin-i18next":`6.1.4`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`29.1.1`,"lint-staged":`16.4.0`,msw:`2.14.2`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.2.4`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.5`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.7`},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.5`,"react-dom":`19.2.5`,"react-router":`7.17.0`}};exports.default=e;
1
+ require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.0.0-rc.9`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/agent-canvas`},homepage:`https://github.com/OpenHands/agent-canvas#readme`,bugs:{url:`https://github.com/OpenHands/agent-canvas/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=22.12.0`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.20`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.4.1`,"@openhands/typescript-client":`1.24.3`,"@react-router/node":`7.17.0`,"@react-router/serve":`7.17.0`,"@tailwindcss/vite":`4.2.4`,"@tanstack/react-query":`5.100.9`,"@types/shell-quote":`^1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.16.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,i18next:`26.0.8`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.0`,isbot:`5.1.39`,"lucide-react":`1.14.0`,"monaco-editor":`0.55.1`,"posthog-js":`1.372.6`,react:`19.2.5`,"react-dom":`19.2.5`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.6`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.17.0`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`^1.8.3`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.5.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.10`,winston:`^3.19.0`,"winston-daily-rotate-file":`^5.0.0`,zustand:`5.0.12`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:e2e:snapshots":`playwright test tests/e2e/snapshots --project=chromium --retries=0`,"test:e2e:snapshots:update":`playwright test tests/e2e/snapshots --project=chromium --update-snapshots`,"test:coverage":`npm run make-i18n && vitest run --coverage`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`bash -c 'npm run typecheck:staged'`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.1`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.59.1`,"@react-router/dev":`7.17.0`,"@tailwindcss/typography":`0.5.19`,"@tanstack/eslint-plugin-query":`5.100.9`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`6.9.1`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`25.6.0`,"@types/react":`19.2.14`,"@types/react-dom":`19.2.3`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.59.2`,"@typescript-eslint/parser":`8.59.2`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.5`,"cross-env":`10.1.0`,eslint:`9.39.4`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.4`,"eslint-plugin-i18next":`6.1.4`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`29.1.1`,"lint-staged":`16.4.0`,msw:`2.14.2`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.2.4`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.5`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.7`},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.5`,"react-dom":`19.2.5`,"react-router":`7.17.0`}};exports.default=e;
2
2
  //# sourceMappingURL=package.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.8\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.9\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
package/dist/package.js CHANGED
@@ -1,6 +1,6 @@
1
1
  var e = {
2
2
  name: "@openhands/agent-canvas",
3
- version: "1.0.0-rc.8",
3
+ version: "1.0.0-rc.9",
4
4
  description: "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  license: "MIT",
6
6
  private: !1,
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.8\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.0.0-rc.9\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.4.1\",\n \"@openhands/typescript-client\": \"1.24.3\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"^1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"^3.19.0\",\n \"winston-daily-rotate-file\": \"^5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:e2e:snapshots\": \"playwright test tests/e2e/snapshots --project=chromium --retries=0\",\n \"test:e2e:snapshots:update\": \"playwright test tests/e2e/snapshots --project=chromium --update-snapshots\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"bash -c 'npm run typecheck:staged'\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);function e(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function t(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function n(n){let r=e(n),i=t(n);return`${window.location.protocol===`https:`?`https:`:`http:`}//${r}${i}`}function r(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function i(n,i){let a=e(n),o=t(n),s=window.location.protocol===`https:`,c=r(n)===`https:`,l=`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/bash-events`;return i?`${l}?session_api_key=${encodeURIComponent(i)}`:l}function a(n,i){if(!n)return null;let a=e(i),o=t(i),s=window.location.protocol===`https:`,c=r(i)===`https:`;return`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/events/${n}`}exports.buildBashWebSocketUrl=i,exports.buildHttpBaseUrl=n,exports.buildWebSocketUrl=a;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);function e(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function t(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function n(n){let i=e(n),a=t(n),o=window.location.protocol===`https:`,s=r(n)===`https:`;return`${o||s?`https:`:`http:`}//${i}${a}`}function r(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function i(n,i){let a=e(n),o=t(n),s=window.location.protocol===`https:`,c=r(n)===`https:`,l=`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/bash-events`;return i?`${l}?session_api_key=${encodeURIComponent(i)}`:l}function a(n,i){if(!n)return null;let a=e(i),o=t(i),s=window.location.protocol===`https:`,c=r(i)===`https:`;return`${s||c?`wss:`:`ws:`}//${a}${o}/sockets/events/${n}`}exports.buildBashWebSocketUrl=i,exports.buildHttpBaseUrl=n,exports.buildWebSocketUrl=a;
2
2
  //# sourceMappingURL=websocket-url.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-url.cjs","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const protocol = window.location.protocol === \"https:\" ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":"6CAKA,SAAS,EAAgB,EAAoD,CAC3E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,EAAgB,CAG9B,EAAc,EAAI,SAClB,EACJ,OAAO,SAAS,UAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC,GAS/D,OAPE,IACC,IAAgB,aAAe,IAAgB,cAChD,IAAoB,aACpB,IAAoB,YAEb,GAAG,EAAgB,GAAG,EAAI,OAE5B,EAAI,UACL,CACN,OAAO,OAAO,SAAS,KAG3B,OAAO,OAAO,SAAS,KASzB,SAAS,EAAkB,EAAoD,CAC7E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CAGF,OADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,IAAM,IAChD,QAAQ,MAAO,GAAG,MACjC,CACN,MAAO,GAGX,MAAO,GAQT,SAAgB,EACd,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAErD,MAAO,GADU,OAAO,SAAS,WAAa,SAAW,SAAW,QACjD,IAAI,IAAW,IAGpC,SAAS,EACP,EACe,CACf,GAAI,CAAC,GAAmB,EAAgB,WAAW,IAAI,CACrD,OAAO,KAGT,GAAI,CACF,OAAO,IAAI,IAAI,EAAgB,CAAC,cAC1B,CACN,OAAO,MAaX,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAE/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAG5C,EAAO,GAFI,GAAgB,EAAiB,OAAS,MAElC,IAAI,IAAW,EAAW,sBAInD,OAHI,EACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,GAE9D,EAST,SAAgB,EACd,EACA,EACe,CACf,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAW/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAGlD,MAAO,GAFU,GAAgB,EAAiB,OAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
1
+ {"version":3,"file":"websocket-url.cjs","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":"6CAKA,SAAS,EAAgB,EAAoD,CAC3E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CACF,IAAM,EAAM,IAAI,IAAI,EAAgB,CAG9B,EAAc,EAAI,SAClB,EACJ,OAAO,SAAS,UAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC,GAS/D,OAPE,IACC,IAAgB,aAAe,IAAgB,cAChD,IAAoB,aACpB,IAAoB,YAEb,GAAG,EAAgB,GAAG,EAAI,OAE5B,EAAI,UACL,CACN,OAAO,OAAO,SAAS,KAG3B,OAAO,OAAO,SAAS,KASzB,SAAS,EAAkB,EAAoD,CAC7E,GAAI,GAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,GAAI,CAGF,OADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,IAAM,IAChD,QAAQ,MAAO,GAAG,MACjC,CACN,MAAO,GAGX,MAAO,GAQT,SAAgB,EACd,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAC/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAElD,MAAO,GADU,GAAgB,EAAiB,SAAW,QAC1C,IAAI,IAAW,IAGpC,SAAS,EACP,EACe,CACf,GAAI,CAAC,GAAmB,EAAgB,WAAW,IAAI,CACrD,OAAO,KAGT,GAAI,CACF,OAAO,IAAI,IAAI,EAAgB,CAAC,cAC1B,CACN,OAAO,MAaX,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAE/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAG5C,EAAO,GAFI,GAAgB,EAAiB,OAAS,MAElC,IAAI,IAAW,EAAW,sBAInD,OAHI,EACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,GAE9D,EAST,SAAgB,EACd,EACA,EACe,CACf,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAW,EAAgB,EAAgB,CAC3C,EAAa,EAAkB,EAAgB,CAW/C,EAAe,OAAO,SAAS,WAAa,SAC5C,EACJ,EAA2B,EAAgB,GAAK,SAGlD,MAAO,GAFU,GAAgB,EAAiB,OAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
@@ -17,8 +17,8 @@ function t(e) {
17
17
  return "";
18
18
  }
19
19
  function n(n) {
20
- let r = e(n), i = t(n);
21
- return `${window.location.protocol === "https:" ? "https:" : "http:"}//${r}${i}`;
20
+ let i = e(n), a = t(n), o = window.location.protocol === "https:", s = r(n) === "https:";
21
+ return `${o || s ? "https:" : "http:"}//${i}${a}`;
22
22
  }
23
23
  function r(e) {
24
24
  if (!e || e.startsWith("/")) return null;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-url.js","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const protocol = window.location.protocol === \"https:\" ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":";AAKA,SAAS,EAAgB,GAAoD;AAC3E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;EACF,IAAM,IAAM,IAAI,IAAI,EAAgB,EAG9B,IAAc,EAAI,UAClB,IACJ,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC;AAS/D,SAPE,MACC,MAAgB,eAAe,MAAgB,gBAChD,MAAoB,eACpB,MAAoB,cAEb,GAAG,EAAgB,GAAG,EAAI,SAE5B,EAAI;SACL;AACN,SAAO,OAAO,SAAS;;AAG3B,QAAO,OAAO,SAAS;;AASzB,SAAS,EAAkB,GAAoD;AAC7E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;AAGF,UADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,MAAM,IAChD,QAAQ,OAAO,GAAG;SACjC;AACN,SAAO;;AAGX,QAAO;;AAQT,SAAgB,EACd,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB;AAErD,QAAO,GADU,OAAO,SAAS,aAAa,WAAW,WAAW,QACjD,IAAI,IAAW;;AAGpC,SAAS,EACP,GACe;AACf,KAAI,CAAC,KAAmB,EAAgB,WAAW,IAAI,CACrD,QAAO;AAGT,KAAI;AACF,SAAO,IAAI,IAAI,EAAgB,CAAC;SAC1B;AACN,SAAO;;;AAaX,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAE/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK,UAG5C,IAAO,GAFI,KAAgB,IAAiB,SAAS,MAElC,IAAI,IAAW,EAAW;AAInD,QAHI,IACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,KAE9D;;AAST,SAAgB,EACd,GACA,GACe;AACf,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAW/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAGlD,QAAO,GAFU,KAAgB,IAAiB,SAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
1
+ {"version":3,"file":"websocket-url.js","names":[],"sources":["../../src/utils/websocket-url.ts"],"sourcesContent":["/**\n * Extracts the base host from conversation URL\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns Base host (e.g., \"localhost:3000\") or window.location.host as fallback\n */\nfunction extractBaseHost(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n // If the conversation URL points to localhost but we're accessing from external,\n // use the browser's hostname with the conversation URL's port\n const urlHostname = url.hostname;\n const browserHostname =\n window.location.hostname ?? window.location.host?.split(\":\")[0];\n if (\n browserHostname &&\n (urlHostname === \"localhost\" || urlHostname === \"127.0.0.1\") &&\n browserHostname !== \"localhost\" &&\n browserHostname !== \"127.0.0.1\"\n ) {\n return `${browserHostname}:${url.port}`;\n }\n return url.host; // e.g., \"localhost:3000\"\n } catch {\n return window.location.host;\n }\n }\n return window.location.host;\n}\n\n/**\n * Extracts the path prefix from conversation URL (everything before /api/conversations)\n * This is needed for proxy deployments where agent-servers are accessed via paths like /runtime/{port}/\n * @param conversationUrl The conversation URL (e.g., \"http://localhost:3000/runtime/55313/api/conversations/123\")\n * @returns Path prefix without trailing slash (e.g., \"/runtime/55313\") or empty string\n */\nfunction extractPathPrefix(conversationUrl: string | null | undefined): string {\n if (conversationUrl && !conversationUrl.startsWith(\"/\")) {\n try {\n const url = new URL(conversationUrl);\n const pathBeforeApi = url.pathname.split(\"/api/conversations\")[0] || \"\";\n return pathBeforeApi.replace(/\\/$/, \"\"); // Remove trailing slash\n } catch {\n return \"\";\n }\n }\n return \"\";\n}\n\n/**\n * Builds the HTTP base URL for V1 API calls\n * @param conversationUrl The conversation URL containing host/port\n * @returns HTTP base URL (e.g., \"http://localhost:3000\" or \"http://localhost:3000/runtime/55313\")\n */\nexport function buildHttpBaseUrl(\n conversationUrl: string | null | undefined,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"https:\" : \"http:\";\n return `${protocol}//${baseHost}${pathPrefix}`;\n}\n\nfunction getConversationUrlProtocol(\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationUrl || conversationUrl.startsWith(\"/\")) {\n return null;\n }\n\n try {\n return new URL(conversationUrl).protocol;\n } catch {\n return null;\n }\n}\n\n/**\n * Builds the WebSocket URL for the agent-server's bash-events endpoint.\n * The URL is derived from the same host and path prefix as the conversation\n * events socket so it works in both direct-connect and reverse-proxy deployments.\n *\n * @param conversationUrl The conversation URL containing host/port\n * @param sessionApiKey Optional session API key (appended as query param)\n * @returns WebSocket URL for the bash-events endpoint\n */\nexport function buildBashWebSocketUrl(\n conversationUrl: string | null | undefined,\n sessionApiKey?: string | null,\n): string {\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n const base = `${protocol}//${baseHost}${pathPrefix}/sockets/bash-events`;\n if (sessionApiKey) {\n return `${base}?session_api_key=${encodeURIComponent(sessionApiKey)}`;\n }\n return base;\n}\n\n/**\n * Builds the WebSocket URL for V1 conversations (without query params)\n * @param conversationId The conversation ID\n * @param conversationUrl The conversation URL containing host/port (e.g., \"http://localhost:3000/api/conversations/123\")\n * @returns WebSocket URL or null if inputs are invalid\n */\nexport function buildWebSocketUrl(\n conversationId: string | undefined,\n conversationUrl: string | null | undefined,\n): string | null {\n if (!conversationId) {\n return null;\n }\n\n const baseHost = extractBaseHost(conversationUrl);\n const pathPrefix = extractPathPrefix(conversationUrl);\n\n // Build WebSocket URL: ws://host:port[/path-prefix]/sockets/events/{conversationId}\n // The path prefix (e.g., /runtime/55313) is needed for proxy deployments\n // Note: Query params should be passed via the useWebSocket hook options\n //\n // Protocol selection follows the actual HTTP access path. A page served\n // over HTTPS must use WSS, but an HTTP page that reaches a remote dev ingress\n // over plain HTTP (for example a Tailscale hostname) must use WS; forcing WSS\n // sends a TLS handshake to the HTTP-only ingress and Node reports it as a\n // malformed HTTP method.\n const pageIsSecure = window.location.protocol === \"https:\";\n const targetIsSecure =\n getConversationUrlProtocol(conversationUrl) === \"https:\";\n const protocol = pageIsSecure || targetIsSecure ? \"wss:\" : \"ws:\";\n\n return `${protocol}//${baseHost}${pathPrefix}/sockets/events/${conversationId}`;\n}\n"],"mappings":";AAKA,SAAS,EAAgB,GAAoD;AAC3E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;EACF,IAAM,IAAM,IAAI,IAAI,EAAgB,EAG9B,IAAc,EAAI,UAClB,IACJ,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI,CAAC;AAS/D,SAPE,MACC,MAAgB,eAAe,MAAgB,gBAChD,MAAoB,eACpB,MAAoB,cAEb,GAAG,EAAgB,GAAG,EAAI,SAE5B,EAAI;SACL;AACN,SAAO,OAAO,SAAS;;AAG3B,QAAO,OAAO,SAAS;;AASzB,SAAS,EAAkB,GAAoD;AAC7E,KAAI,KAAmB,CAAC,EAAgB,WAAW,IAAI,CACrD,KAAI;AAGF,UADsB,IADN,IAAI,EACE,CAAI,SAAS,MAAM,qBAAqB,CAAC,MAAM,IAChD,QAAQ,OAAO,GAAG;SACjC;AACN,SAAO;;AAGX,QAAO;;AAQT,SAAgB,EACd,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAC/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAElD,QAAO,GADU,KAAgB,IAAiB,WAAW,QAC1C,IAAI,IAAW;;AAGpC,SAAS,EACP,GACe;AACf,KAAI,CAAC,KAAmB,EAAgB,WAAW,IAAI,CACrD,QAAO;AAGT,KAAI;AACF,SAAO,IAAI,IAAI,EAAgB,CAAC;SAC1B;AACN,SAAO;;;AAaX,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAE/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK,UAG5C,IAAO,GAFI,KAAgB,IAAiB,SAAS,MAElC,IAAI,IAAW,EAAW;AAInD,QAHI,IACK,GAAG,EAAK,mBAAmB,mBAAmB,EAAc,KAE9D;;AAST,SAAgB,EACd,GACA,GACe;AACf,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IAAW,EAAgB,EAAgB,EAC3C,IAAa,EAAkB,EAAgB,EAW/C,IAAe,OAAO,SAAS,aAAa,UAC5C,IACJ,EAA2B,EAAgB,KAAK;AAGlD,QAAO,GAFU,KAAgB,IAAiB,SAAS,MAExC,IAAI,IAAW,EAAW,kBAAkB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openhands/agent-canvas",
3
- "version": "1.0.0-rc.8",
3
+ "version": "1.0.0-rc.9",
4
4
  "description": "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -1 +0,0 @@
1
- var e=class extends Error{constructor(e,t,n,r){super(r||`HTTP ${e}: ${t}`),this.status=e,this.statusText=t,this.response=n,this.name=`HttpError`}},t=class{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,``),this.apiKey=e.apiKey,this.timeout=e.timeout||6e4}async request(t){let n=t.url.startsWith(`/`)?t.url.slice(1):t.url,r=new URL(n,this.baseUrl+`/`);t.params&&Object.entries(t.params).forEach(([e,t])=>{t!=null&&(Array.isArray(t)?t.forEach(t=>r.searchParams.append(e,String(t))):r.searchParams.append(e,String(t)))});let i={"Content-Type":`application/json`,...t.headers};this.apiKey&&(i[`X-Session-API-Key`]=this.apiKey);let a={method:t.method,headers:i,signal:AbortSignal.timeout(t.timeout||this.timeout)};t.credentials&&(a.credentials=t.credentials),t.data&&t.method!==`GET`&&(t.data instanceof FormData?(delete i[`Content-Type`],a.body=t.data):a.body=JSON.stringify(t.data));try{let n=await fetch(r.toString(),a);if(!(t.acceptableStatusCodes?.has(n.status)||!t.acceptableStatusCodes&&n.ok)){let t;try{t=n.headers.get(`content-type`)?.includes(`application/json`)?await n.json():await n.text()}catch{t=null}throw new e(n.status,n.statusText,t,`HTTP request failed (${n.status} ${n.statusText}): ${JSON.stringify(t)}`)}let i=await this.parseResponse(n,t.responseType||`auto`),o={};return n.headers.forEach((e,t)=>{o[t]=e}),{data:i,status:n.status,statusText:n.statusText,headers:o}}catch(n){throw n instanceof e?n:n instanceof Error?n.name===`AbortError`?Error(`Request timeout after ${t.timeout||this.timeout}ms`,{cause:n}):Error(`Request failed: ${n.message}`,{cause:n}):Error(`Unknown request error`,{cause:n})}}async parseResponse(e,t){return t===`json`?await e.json():t===`text`?await e.text():t===`blob`?await e.blob():t===`arrayBuffer`?await e.arrayBuffer():e.headers.get(`content-type`)?.includes(`application/json`)?await e.json():await e.text()}async get(e,t){return this.request({method:`GET`,url:e,...t})}async post(e,t,n){return this.request({method:`POST`,url:e,data:t,...n})}async put(e,t,n){return this.request({method:`PUT`,url:e,data:t,...n})}async patch(e,t,n){return this.request({method:`PATCH`,url:e,data:t,...n})}async delete(e,t){return this.request({method:`DELETE`,url:e,...t})}close(){}},n=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getAgentSchema(){return(await this.client.get(`/api/settings/agent-schema`)).data}async getSettings(e={}){return(await this.client.get(`/api/settings`,{headers:e.exposeSecrets?{"X-Expose-Secrets":e.exposeSecrets}:void 0})).data}async updateSettings(e){return(await this.client.patch(`/api/settings`,e)).data}async listSecrets(){return(await this.client.get(`/api/settings/secrets`)).data}async upsertSecret(e){return(await this.client.put(`/api/settings/secrets`,e)).data}async getSecret(e){return(await this.client.get(`/api/settings/secrets/${encodeURIComponent(e)}`,{responseType:`text`})).data}async deleteSecret(e){return(await this.client.delete(`/api/settings/secrets/${encodeURIComponent(e)}`)).data}async getConversationSchema(){return(await this.client.get(`/api/settings/conversation-schema`)).data}async listProfiles(){return(await this.client.get(`/api/profiles`)).data}async getProfile(e,t={}){return(await this.client.get(`/api/profiles/${encodeURIComponent(e)}`,{headers:t.exposeSecrets?{"X-Expose-Secrets":t.exposeSecrets}:void 0})).data}async saveProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}`,t)).data}async deleteProfile(e){return(await this.client.delete(`/api/profiles/${encodeURIComponent(e)}`)).data}async renameProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}/rename`,{new_name:t})).data}close(){this.client.close()}};function r(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function i(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function a(e){let t=r(e),n=i(e);return`${window.location.protocol===`https:`?`https:`:`http:`}//${t}${n}`}function o(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function s(e,t){let n=r(e),a=i(e),s=window.location.protocol===`https:`,c=o(e)===`https:`,l=`${s||c?`wss:`:`ws:`}//${n}${a}/sockets/bash-events`;return t?`${l}?session_api_key=${encodeURIComponent(t)}`:l}function c(e,t){if(!e)return null;let n=r(t),a=i(t),s=window.location.protocol===`https:`,c=o(t)===`https:`;return`${s||c?`wss:`:`ws:`}//${n}${a}/sockets/events/${e}`}var l=`workspace/project`;function u(e){return e?.trim()||null}function ee(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function d(){return ee(void 0)}function f(){let e=u(void 0);if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_SESSION_API_KEY__;if(typeof e==`string`)return u(e)}return null}function p(){return{baseUrl:m()??``,sessionApiKey:h()??``}}function m(){return d()||(typeof window<`u`?window.location.origin:null)}function h(){return f()}function g(){return(void 0)?.trim()||l}function _(e){return`${g().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function v(){let e=h();return e?{"X-Session-API-Key":e}:{}}function y(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}function b(){return y()?!h():!1}var x=`default-local`,S=`Local`;function C(){let e=m(),t=h();return!e||!t?null:{id:x,name:S,host:e,apiKey:t,kind:`local`}}var w=`openhands-backends`,T=`openhands-active-backend`,E=`openhands-agent-server-config`;function D(e){return e===`local`||e===`cloud`}function te(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&D(t.kind)}function ne(e){if(typeof e!=`string`)return null;let t=e.trim().replace(/\/+$/,``);return t?/^https?:\/\//i.test(t)?t:`http://${t}`:null}function re(){let e=window.localStorage.getItem(E);if(!e)return null;try{let t=JSON.parse(e),n=ne(t.baseUrl),r=typeof t.sessionApiKey==`string`?t.sessionApiKey.trim():``;return!n||!r?null:{id:x,name:S,host:n,apiKey:r,kind:`local`}}catch{return null}}function O(){window.localStorage.removeItem(E)}function k(e){return N(e),O(),e}function A(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function j(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||A(e.host)&&A(t.host)}function M(e){let t=C();if(!t)return e;let n=!1,r=e.map(e=>!j(e,t)||e.apiKey===t.apiKey?e:(n=!0,{...e,apiKey:t.apiKey}));return n?(N(r),r):e}function N(e){if(!(typeof window>`u`))try{window.localStorage.setItem(w,JSON.stringify(e))}catch{}}function P(){if(typeof window>`u`)return[];try{let e=window.localStorage.getItem(w);if(e===null){let e=re();if(e)return k([e]);let t=C();return t?k([t]):[]}let t=JSON.parse(e);if(!Array.isArray(t))return[];let n=t.filter(te);if(n.length===0){let e=C();return e?k([e]):[]}let r=M(n);return O(),r}catch{return[]}}function F(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let n=t.orgId;return{backendId:t.backendId,orgId:typeof n==`string`&&n.length>0?n:null}}catch{return null}}function I(e,t){try{return e?.getItem(t)??null}catch{return null}}function L(e,t,n){try{e?.setItem(t,n)}catch{}}function R(e,t){try{e?.removeItem(t)}catch{}}function z(){return typeof window>`u`?null:F(I(window.sessionStorage,T))||F(I(window.localStorage,T))}function B(e){if(typeof window>`u`)return;if(!e){R(window.sessionStorage,T),R(window.localStorage,T);return}let t=JSON.stringify({backendId:e.backendId,orgId:e.orgId??null});L(window.sessionStorage,T,t),L(window.localStorage,T,t)}var V=`no-backend`,H={id:V,name:`No Backend Available`,host:``,apiKey:``,kind:`local`};function U(e){return e.id===V}function W(e){return e[0]??H}function G(e,t){let n=null,r=null;if(t){let i=e.find(e=>e.id===t.backendId);i&&(n=i,r=t.orgId??null)}return n||(n=W(e),r=null),{backends:e,selection:t,active:{backend:n,orgId:r}}}var K=G(P(),z()),q=new Set;function J(){q.forEach(e=>e())}function Y(){return K.active}function X(){let e=K.active.backend;return e.kind===`local`&&!U(e)?e:null}function ie(){return K.backends}function ae(){return K.selection}function oe(){return K}function se(e){B(e),K=G(K.backends,e),J()}function ce(e){N(e);let t=K.selection;t&&!e.some(e=>e.id===t.backendId)&&(t=null,B(null)),K=G(e,t),J()}function le(e){return q.add(e),()=>{q.delete(e)}}var Z=class extends Error{constructor(){super(`No backend is configured.`),this.name=`NoBackendAvailableError`}};function Q(e){return e.replace(/\/+$/,``)}function ue(e,t){return e.host?Q(e.host):e.conversationUrl?Q(a(e.conversationUrl)):Q(t?.host??``)}function $(e={}){let t=X();if(!t&&!e.host&&!e.conversationUrl)throw new Z;let n=e.sessionApiKey??e.apiKey??t?.apiKey??void 0;return{host:ue(e,t),...n?{apiKey:n}:{},workingDir:e.workingDir??g(),...e.timeout===void 0?{}:{timeout:e.timeout}}}function de(e){let{host:t,apiKey:n,timeout:r}=$(e);return{baseUrl:t,...n?{apiKey:n}:{},timeout:r??6e4}}export{b as C,n as D,c as E,t as O,y as S,a as T,_,Y as a,v as b,ie as c,se as d,ce as f,l as g,C as h,H as i,e as k,oe as l,S as m,$ as n,ae as o,le as p,de as r,X as s,Z as t,U as u,m as v,s as w,g as x,p as y};
@@ -1 +0,0 @@
1
- import{t as e}from"./conversation-CayU5Lrr.js";export{e as default};
@@ -1 +0,0 @@
1
- import{t as e}from"./conversation-CayU5Lrr.js";export{e as default};
@@ -1 +0,0 @@
1
- import{n as e}from"./llm-settings-yDgbXP6Q.js";export{e as default};
@@ -1 +0,0 @@
1
- import{C as e,w as t,y as n}from"./utils-eXk6yerZ.js";import{t as r}from"./use-active-conversation-B0_rXnqa.js";import{t as i}from"./use-agent-state-BuOzLeFN.js";var a=({allowAgentError:a=!1}={})=>{let{data:o}=r(),{curAgentState:s}=i(),c=a?t:e;return n(o?.execution_status)&&!c.includes(s)};export{a as t};