openclaw-multi-auto 1.3.7 → 1.3.8

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 (503) hide show
  1. package/dist/{accounts-L9ByEpnP.js → accounts-C9HcPI9h.js} +2 -2
  2. package/dist/{accounts-BOzyfwW4.js → accounts-C_lW3Ag9.js} +2 -2
  3. package/dist/{accounts-yfBeCZtS.js → accounts-Tgelvk0C.js} +17 -17
  4. package/dist/{active-listener-D1yqT1cw.js → active-listener-BEdprTkn.js} +2 -2
  5. package/dist/{api-key-rotation-DtsNS2Nb.js → api-key-rotation-BJpKWXy0.js} +2 -2
  6. package/dist/{audio-preflight-DpxQCpsA.js → audio-preflight-BMvgEQ5j.js} +32 -32
  7. package/dist/{audio-preflight-5FEeDooz.js → audio-preflight-DDBLZBdb.js} +4 -4
  8. package/dist/{audio-transcription-runner-B-UvoDjZ.js → audio-transcription-runner-DZbSWT9E.js} +1 -1
  9. package/dist/{audio-transcription-runner-28fcRNNi.js → audio-transcription-runner-gLFfz8fr.js} +12 -12
  10. package/dist/{audit-membership-runtime-DWyHWAHM.js → audit-membership-runtime-Dntemq07.js} +4 -4
  11. package/dist/build-info.json +3 -3
  12. package/dist/bundled/boot-md/handler.js +51 -51
  13. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  14. package/dist/bundled/command-logger/handler.js +2 -2
  15. package/dist/bundled/session-memory/handler.js +51 -51
  16. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  17. package/dist/{channel-activity-xHOMiarp.js → channel-activity-BDnjYF7B.js} +3 -3
  18. package/dist/{chrome-D45SyhQL.js → chrome-CMU2WVFh.js} +8 -8
  19. package/dist/{chrome-DwizpzOC.js → chrome-DxxEKrY7.js} +18 -18
  20. package/dist/{commands-registry-V1zZ5pPC.js → commands-registry-D5qXbFJn.js} +4 -4
  21. package/dist/{deliver-B9cys0EZ.js → deliver-BXVcFIHL.js} +1 -1
  22. package/dist/{deliver-D4o6VIur.js → deliver-DbdywYJE.js} +21 -21
  23. package/dist/deliver-runtime-BFs7iAZF.js +36 -0
  24. package/dist/{deliver-runtime-DhaQJ0pI.js → deliver-runtime-DTaIS-1i.js} +3 -3
  25. package/dist/deps-send-discord.runtime-DZUccI6Z.js +26 -0
  26. package/dist/deps-send-imessage.runtime-CF3OpoqY.js +25 -0
  27. package/dist/deps-send-signal.runtime-Cw4-ozeO.js +24 -0
  28. package/dist/deps-send-slack.runtime-BDsDhS1P.js +22 -0
  29. package/dist/deps-send-telegram.runtime-D_4xVasO.js +27 -0
  30. package/dist/{deps-send-whatsapp.runtime-DvTL2tzN.js → deps-send-whatsapp.runtime-CIZqFAqb.js} +7 -7
  31. package/dist/deps-send-whatsapp.runtime-DK8jqd14.js +60 -0
  32. package/dist/{diagnostic-Bn4PZjMZ.js → diagnostic-Co6Kghr-.js} +2 -2
  33. package/dist/{plugin-sdk/errors-CtMWwS2Z.js → errors-xt401nuk.js} +1 -1
  34. package/dist/extensionAPI.js +6 -6
  35. package/dist/{fetch-BlJWzEP6.js → fetch-DuraYswo.js} +5 -5
  36. package/dist/{fetch-guard-ChYBwfiy.js → fetch-guard-DWr0d00H.js} +2 -2
  37. package/dist/{frontmatter-CvaMP376.js → frontmatter-BkTfEZ93.js} +3 -3
  38. package/dist/{fs-safe-0jAo_Whb.js → fs-safe-CTYUrIgQ.js} +4 -4
  39. package/dist/{github-copilot-token-D13V9YBz.js → github-copilot-token-BDioPmd6.js} +7 -7
  40. package/dist/{image-DAOPwVXi.js → image-BCVLo0qw.js} +1 -1
  41. package/dist/{image-Bbn53mzj.js → image-eT7Y-nP5.js} +6 -6
  42. package/dist/{image-ops-CehkHxmW.js → image-ops-BuUnEOE0.js} +2 -2
  43. package/dist/image-runtime-BcAK3n8a.js +29 -0
  44. package/dist/{image-runtime-wlCLVvVv.js → image-runtime-DtCKpMPZ.js} +3 -3
  45. package/dist/{ir-DAP-B-Xw.js → ir-B83looB-.js} +8 -8
  46. package/dist/{legacy-names-TyzbVqa_.js → legacy-names-DOC03BkU.js} +1 -1
  47. package/dist/llm-slug-generator.js +51 -51
  48. package/dist/{logger-DMZQQtxK.js → logger-BfjWMCSD.js} +7 -7
  49. package/dist/{login-DiCctRo1.js → login-CrIwcrVI.js} +5 -5
  50. package/dist/{login-qr-MUbXgjtd.js → login-qr-BpPDZdl_.js} +10 -10
  51. package/dist/{manager-BW_NSIMl.js → manager-1bvuGrNR.js} +13 -13
  52. package/dist/manager-runtime-FO1Sx3W8.js +18 -0
  53. package/dist/{model-selection-idoqPmw0.js → model-selection-Dna0Gz1k.js} +43 -43
  54. package/dist/{outbound-C2kanETZ.js → outbound-ChDjtuD6.js} +6 -6
  55. package/dist/{outbound-attachment-DBrYWX8h.js → outbound-attachment-DqHlD21U.js} +2 -2
  56. package/dist/{path-alias-guards-DqXRZmsL.js → path-alias-guards-BzvdLvTI.js} +1 -1
  57. package/dist/{paths-CCxysrzL.js → paths-Bkr-BCxW.js} +4 -4
  58. package/dist/{paths-C6TxBCvO.js → paths-Cvc9EM8Y.js} +5 -5
  59. package/dist/{pi-embedded-BaGj07T0.js → pi-embedded-BQQa91aA.js} +158 -158
  60. package/dist/{pi-embedded-DYU79yGe.js → pi-embedded-CgQ_W6Xs.js} +24 -24
  61. package/dist/{pi-embedded-helpers-wy0DZvx1.js → pi-embedded-helpers-CLXm10bV.js} +52 -52
  62. package/dist/{pi-embedded-helpers-uTRAmQ4n.js → pi-embedded-helpers-CwuBTKza.js} +3 -3
  63. package/dist/{plugin-sdk/pi-model-discovery-v-XPUOOf.js → pi-model-discovery-Dymwdjt0.js} +2 -2
  64. package/dist/pi-model-discovery-runtime-BeY4EUPp.js +11 -0
  65. package/dist/{pi-tools.before-tool-call.runtime-BuLxSyx9.js → pi-tools.before-tool-call.runtime-Cwab_5W1.js} +9 -9
  66. package/dist/plugin-sdk/{accounts-DyFCXtHv.js → accounts-BslAlVYS.js} +2 -2
  67. package/dist/plugin-sdk/{accounts-BJAXxY46.js → accounts-C3m65--E.js} +2 -2
  68. package/dist/plugin-sdk/{accounts-C1j7HSL0.js → accounts-CNCCkdEF.js} +3 -3
  69. package/dist/plugin-sdk/{active-listener-B_sLJTXM.js → active-listener-CkPnMUkB.js} +2 -2
  70. package/dist/plugin-sdk/{api-key-rotation-8nyyt1kx.js → api-key-rotation-BXnNsojA.js} +2 -2
  71. package/dist/plugin-sdk/{audio-preflight-C_aSAPR1.js → audio-preflight-CtO4fFvp.js} +26 -26
  72. package/dist/plugin-sdk/{audio-transcription-runner-CB53F7_7.js → audio-transcription-runner-DnxvOS1-.js} +11 -11
  73. package/dist/plugin-sdk/{audit-membership-runtime-BXndI4LG.js → audit-membership-runtime-BpfoSk8M.js} +2 -2
  74. package/dist/plugin-sdk/{channel-activity-C5y8AgAV.js → channel-activity-WJYxcJ3S.js} +3 -3
  75. package/dist/plugin-sdk/{channel-web-DBTRO03V.js → channel-web-dO5k3ubM.js} +18 -18
  76. package/dist/plugin-sdk/{chrome-f00sZkDX.js → chrome-CjNTuJML.js} +6 -6
  77. package/dist/plugin-sdk/{commands-registry-BJ_NxG2F.js → commands-registry-CdYjoI0i.js} +4 -4
  78. package/dist/plugin-sdk/{common-Cf27Jwxu.js → common-oYc5vPFl.js} +2 -2
  79. package/dist/plugin-sdk/{config-CHQrpx-Q.js → config-B1z-UxQ3.js} +7 -7
  80. package/dist/plugin-sdk/{deliver-DNEuetST.js → deliver-D5_6T567.js} +10 -10
  81. package/dist/plugin-sdk/deliver-runtime-C5dgvvga.js +32 -0
  82. package/dist/plugin-sdk/deps-send-discord.runtime-Dg4N7PHJ.js +23 -0
  83. package/dist/plugin-sdk/deps-send-imessage.runtime-0OEwzMQm.js +22 -0
  84. package/dist/plugin-sdk/deps-send-signal.runtime-BM1jRt3G.js +21 -0
  85. package/dist/plugin-sdk/deps-send-slack.runtime-1E3BYRdF.js +19 -0
  86. package/dist/plugin-sdk/deps-send-telegram.runtime-DNCxIflA.js +24 -0
  87. package/dist/plugin-sdk/deps-send-whatsapp.runtime-OLwr-9c8.js +57 -0
  88. package/dist/plugin-sdk/{diagnostic-LYUUmjJ5.js → diagnostic-Bxxu0ig-.js} +2 -2
  89. package/dist/plugin-sdk/{errors-DaiAM-yU.js → errors-B3cHyZZA.js} +1 -1
  90. package/dist/plugin-sdk/{fetch-guard-CxYB5Kg6.js → fetch-guard-Dcgod0tg.js} +2 -2
  91. package/dist/plugin-sdk/{fs-safe-DtfhxbrI.js → fs-safe-BaKqI3G4.js} +3 -3
  92. package/dist/plugin-sdk/{image-BwjYjRHx.js → image-B2mQW9Rb.js} +6 -6
  93. package/dist/plugin-sdk/{image-ops-BnZKcbd6.js → image-ops-Cbzr4U9l.js} +2 -2
  94. package/dist/plugin-sdk/image-runtime-BFm45j49.js +25 -0
  95. package/dist/plugin-sdk/index.js +50 -50
  96. package/dist/plugin-sdk/{ir-Z4hX67TJ.js → ir-ZEmrTr4J.js} +7 -7
  97. package/dist/plugin-sdk/{local-roots-KhjQw04O.js → local-roots-CIPRxA-4.js} +4 -4
  98. package/dist/plugin-sdk/{logger-DHIIvMxj.js → logger-CvPFVOgT.js} +2 -2
  99. package/dist/plugin-sdk/{login-C31642Ld.js → login-CCTew9bt.js} +4 -4
  100. package/dist/plugin-sdk/{login-qr--y2SG_Ue.js → login-qr-BI3Vi_wJ.js} +5 -5
  101. package/dist/plugin-sdk/{manager-2UZBMCc7.js → manager-BEoYPn7R.js} +8 -8
  102. package/dist/plugin-sdk/manager-runtime-DxclHQ4U.js +15 -0
  103. package/dist/plugin-sdk/{outbound-Ba0QUI5h.js → outbound-ByOw1K6W.js} +5 -5
  104. package/dist/plugin-sdk/{outbound-attachment-B1Laso-8.js → outbound-attachment-BzVhxRRw.js} +2 -2
  105. package/dist/plugin-sdk/{path-alias-guards-C7Vm5DZ1.js → path-alias-guards-sWayacde.js} +1 -1
  106. package/dist/plugin-sdk/{paths-DopV9PQG.js → paths-Dpg3qxcl.js} +1 -1
  107. package/dist/plugin-sdk/{pi-embedded-helpers-DnA_OCzP.js → pi-embedded-helpers-DIxXkGJf.js} +16 -16
  108. package/dist/plugin-sdk/{pi-model-discovery-DdPqXk8f.js → pi-model-discovery-DM_2uFtj.js} +1 -1
  109. package/dist/plugin-sdk/pi-model-discovery-runtime-BuzvkvNR.js +8 -0
  110. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-DxFHiLUE.js → pi-tools.before-tool-call.runtime-w1dqL_ty.js} +4 -4
  111. package/dist/plugin-sdk/{plugins-CbCt4osF.js → plugins-C4USiH29.js} +4 -4
  112. package/dist/plugin-sdk/{proxy-env-C63mMdas.js → proxy-env-ET-rp8eg.js} +1 -1
  113. package/dist/plugin-sdk/{proxy-fetch-ChxOhWF4.js → proxy-fetch-uDXGKG3Z.js} +1 -1
  114. package/dist/plugin-sdk/{pw-ai-DpJk62D4.js → pw-ai-CyOt3RDA.js} +9 -9
  115. package/dist/plugin-sdk/{qmd-manager-Ca-iSfEE.js → qmd-manager-BySdoVR7.js} +7 -7
  116. package/dist/plugin-sdk/{query-expansion-B_Xe41Ab.js → query-expansion-C6uS-7lj.js} +4 -4
  117. package/dist/plugin-sdk/{redact-DjVX-1N3.js → redact-Bvxt1T_Q.js} +1 -1
  118. package/dist/plugin-sdk/{reply-CovBlFea.js → reply-CTCSeQqW.js} +73 -73
  119. package/dist/plugin-sdk/{resolve-outbound-target-BbrHgyUk.js → resolve-outbound-target-Bw8YNANu.js} +2 -2
  120. package/dist/plugin-sdk/{run-with-concurrency-BR1DXa8T.js → run-with-concurrency-C_KCHwvf.js} +1 -1
  121. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-BxgRDkhc.js +10 -0
  122. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-elOqrkfg.js +19 -0
  123. package/dist/plugin-sdk/{send-BvAtLLPl.js → send-BZ6nYFZr.js} +5 -5
  124. package/dist/plugin-sdk/{send-BTztm3D2.js → send-C0w6xP2x.js} +6 -6
  125. package/dist/plugin-sdk/{send-CWJUuG0i.js → send-CFf-1V89.js} +8 -8
  126. package/dist/plugin-sdk/{send-EcglC4cG.js → send-CY-Qfwia.js} +7 -7
  127. package/dist/plugin-sdk/{send-BXpXBwM_.js → send-qPyNGSe4.js} +13 -13
  128. package/dist/plugin-sdk/{session-k256LJZT.js → session-COrvpvUQ.js} +3 -3
  129. package/dist/plugin-sdk/{skill-commands-DoRqLzxm.js → skill-commands-DZqhtmiv.js} +4 -4
  130. package/dist/plugin-sdk/{skills-QudILG6e.js → skills-Cw_vXEJb.js} +6 -6
  131. package/dist/plugin-sdk/slash-commands.runtime-D67JLweo.js +13 -0
  132. package/dist/plugin-sdk/slash-dispatch.runtime-DvcpvCJ0.js +52 -0
  133. package/dist/plugin-sdk/slash-skill-commands.runtime-BM1x3azR.js +16 -0
  134. package/dist/plugin-sdk/{store-BbDQw3g6.js → store-CMHj6IIw.js} +2 -2
  135. package/dist/plugin-sdk/subagent-registry-runtime-1lbDyRzz.js +52 -0
  136. package/dist/plugin-sdk/{tables-BhvloMKN.js → tables-CSqrHsKL.js} +1 -1
  137. package/dist/plugin-sdk/{thinking-URzkT-3p.js → thinking-DOnsR_A8.js} +7 -7
  138. package/dist/plugin-sdk/{tokens-DgNRBwIg.js → tokens-BDr0Z9o3.js} +1 -1
  139. package/dist/plugin-sdk/{tool-images-xpqbP6RR.js → tool-images-eEfOVkzf.js} +2 -2
  140. package/dist/plugin-sdk/web-BLyT64pW.js +56 -0
  141. package/dist/plugin-sdk/{whatsapp-actions-RcZ6vp61.js → whatsapp-actions-xcleMoMv.js} +17 -17
  142. package/dist/plugin-sdk/whatsapp.js +50 -50
  143. package/dist/plugin-sdk/zalo.js +2 -2
  144. package/dist/{plugins-CWkRQYDj.js → plugins-4Rj4OjLY.js} +11 -11
  145. package/dist/{proxy-env-Cq5gdrbj.js → proxy-env-DlmzDx8x.js} +1 -1
  146. package/dist/{plugin-sdk/proxy-fetch-Ch95c_Y2.js → proxy-fetch-B2pEfjbR.js} +1 -1
  147. package/dist/{pw-ai-GcYO6HPE.js → pw-ai-CmphSzHx.js} +1 -1
  148. package/dist/{pw-ai-Cl1Lc7RC.js → pw-ai-DNMjFMqH.js} +14 -14
  149. package/dist/{qmd-manager-BsYsO9Ii.js → qmd-manager-BtIKUaO9.js} +10 -10
  150. package/dist/{query-expansion-DtLc3wjL.js → query-expansion-CX-1fS52.js} +6 -6
  151. package/dist/{plugin-sdk/redact-hp9TOulW.js → redact-COik8ET1.js} +1 -1
  152. package/dist/{run-with-concurrency-D_ZpbgEG.js → run-with-concurrency-BgYfgkXT.js} +4 -4
  153. package/dist/runtime-whatsapp-login.runtime-DUb55byQ.js +13 -0
  154. package/dist/runtime-whatsapp-outbound.runtime-Bii_xSfI.js +22 -0
  155. package/dist/{send-Dx2RkUOZ.js → send-6lz6rNVP.js} +6 -6
  156. package/dist/{send-vmONuVgL.js → send-BHTiZcH3.js} +26 -26
  157. package/dist/{send-Bj776ESJ.js → send-L7gRiwyd.js} +7 -7
  158. package/dist/{send-DcxmcFi_.js → send-PE6cwoTe.js} +8 -8
  159. package/dist/{send-BQERFNyo.js → send-dfu6_rgf.js} +5 -5
  160. package/dist/{session-A4QhBRvH.js → session-D8ImowSs.js} +8 -8
  161. package/dist/{skill-commands-CMzBZKG2.js → skill-commands-DNqJ-kwn.js} +9 -9
  162. package/dist/{skills-CE_iqvM5.js → skills-7ODkHQYp.js} +22 -22
  163. package/dist/slash-commands.runtime-CVw6566g.js +16 -0
  164. package/dist/{slash-dispatch.runtime-Dh053pQK.js → slash-dispatch.runtime-131yup2e.js} +6 -6
  165. package/dist/slash-dispatch.runtime-B9Ygtzi4.js +56 -0
  166. package/dist/slash-skill-commands.runtime-DxZ4z5h6.js +20 -0
  167. package/dist/{store--eR1R_UX.js → store-D89wDcz9.js} +2 -2
  168. package/dist/subagent-registry-runtime-DL1Wv7nA.js +56 -0
  169. package/dist/{subagent-registry-runtime-DSi5mnCQ.js → subagent-registry-runtime-DbSf_Je6.js} +6 -6
  170. package/dist/{subsystem-Di1z8l0Z.js → subsystem-B45WV3qB.js} +14 -14
  171. package/dist/{tables-d739Y1xW.js → tables-mE4cJBN2.js} +1 -1
  172. package/dist/{target-errors-CBI2Ga0y.js → target-errors-mnlwhAjP.js} +2 -2
  173. package/dist/{thinking-DXYisHiZ.js → thinking-BeGmb5k6.js} +7 -7
  174. package/dist/{tokens-DxnY9ui_.js → tokens-q32vI39c.js} +1 -1
  175. package/dist/{tool-images-2cBx1W8h.js → tool-images-RZdHiZcG.js} +2 -2
  176. package/dist/{web-CzWRVmFt.js → web-Btj-e8kN.js} +55 -55
  177. package/dist/{web-1hWJDzNA.js → web-MR9d7KyB.js} +6 -6
  178. package/dist/{whatsapp-actions-iEArE_Ez.js → whatsapp-actions-BHbJJyqw.js} +21 -21
  179. package/dist/{workspace-CUVC6GX1.js → workspace-U-DyR64O.js} +20 -20
  180. package/package.json +6 -5
  181. package/scripts/create-instance.sh +18 -15
  182. package/scripts/install-maca.sh +1 -1
  183. package/ui/index.html +16 -0
  184. package/ui/node_modules/.bin/jiti +21 -0
  185. package/ui/node_modules/.bin/lessc +21 -0
  186. package/ui/node_modules/.bin/marked +21 -0
  187. package/ui/node_modules/.bin/playwright +21 -0
  188. package/ui/node_modules/.bin/sass +21 -0
  189. package/ui/node_modules/.bin/tsx +21 -0
  190. package/ui/node_modules/.bin/vite +21 -0
  191. package/ui/node_modules/.bin/vitest +21 -0
  192. package/ui/node_modules/.bin/yaml +21 -0
  193. package/ui/package.json +27 -0
  194. package/ui/public/apple-touch-icon.png +0 -0
  195. package/ui/public/favicon-32.png +0 -0
  196. package/ui/public/favicon.ico +0 -0
  197. package/ui/public/favicon.svg +22 -0
  198. package/ui/src/css.d.ts +1 -0
  199. package/ui/src/i18n/index.ts +3 -0
  200. package/ui/src/i18n/lib/lit-controller.ts +22 -0
  201. package/ui/src/i18n/lib/registry.ts +64 -0
  202. package/ui/src/i18n/lib/translate.ts +123 -0
  203. package/ui/src/i18n/lib/types.ts +9 -0
  204. package/ui/src/i18n/locales/de.ts +129 -0
  205. package/ui/src/i18n/locales/en.ts +337 -0
  206. package/ui/src/i18n/locales/pt-BR.ts +128 -0
  207. package/ui/src/i18n/locales/zh-CN.ts +330 -0
  208. package/ui/src/i18n/locales/zh-TW.ts +125 -0
  209. package/ui/src/i18n/test/translate.test.ts +56 -0
  210. package/ui/src/main.ts +2 -0
  211. package/ui/src/styles/base.css +385 -0
  212. package/ui/src/styles/chat/grouped.css +300 -0
  213. package/ui/src/styles/chat/layout.css +481 -0
  214. package/ui/src/styles/chat/sidebar.css +117 -0
  215. package/ui/src/styles/chat/text.css +146 -0
  216. package/ui/src/styles/chat/tool-cards.css +202 -0
  217. package/ui/src/styles/chat.css +5 -0
  218. package/ui/src/styles/components.css +2612 -0
  219. package/ui/src/styles/config.css +1658 -0
  220. package/ui/src/styles/layout.css +621 -0
  221. package/ui/src/styles/layout.mobile.css +374 -0
  222. package/ui/src/styles.css +5 -0
  223. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-flags-unsupported-unions-1.png +0 -0
  224. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-inputs-and-patches-values-1.png +0 -0
  225. package/ui/src/ui/__screenshots__/config-form.browser.test.ts/config-form-renderer-renders-union-literals-as-select-options-1.png +0 -0
  226. package/ui/src/ui/__screenshots__/navigation.browser.test.ts/control-UI-routing-auto-scrolls-chat-history-to-the-latest-message-1.png +0 -0
  227. package/ui/src/ui/app-channels.ts +279 -0
  228. package/ui/src/ui/app-chat.ts +266 -0
  229. package/ui/src/ui/app-defaults.ts +50 -0
  230. package/ui/src/ui/app-events.ts +5 -0
  231. package/ui/src/ui/app-gateway.node.test.ts +229 -0
  232. package/ui/src/ui/app-gateway.ts +349 -0
  233. package/ui/src/ui/app-lifecycle.node.test.ts +44 -0
  234. package/ui/src/ui/app-lifecycle.ts +109 -0
  235. package/ui/src/ui/app-polling.ts +69 -0
  236. package/ui/src/ui/app-render-usage-tab.ts +273 -0
  237. package/ui/src/ui/app-render.helpers.node.test.ts +286 -0
  238. package/ui/src/ui/app-render.helpers.ts +574 -0
  239. package/ui/src/ui/app-render.ts +1168 -0
  240. package/ui/src/ui/app-scroll.test.ts +275 -0
  241. package/ui/src/ui/app-scroll.ts +179 -0
  242. package/ui/src/ui/app-settings.test.ts +70 -0
  243. package/ui/src/ui/app-settings.ts +440 -0
  244. package/ui/src/ui/app-tool-stream.node.test.ts +139 -0
  245. package/ui/src/ui/app-tool-stream.ts +455 -0
  246. package/ui/src/ui/app-view-state.ts +321 -0
  247. package/ui/src/ui/app.ts +621 -0
  248. package/ui/src/ui/assistant-identity.ts +23 -0
  249. package/ui/src/ui/chat/constants.ts +12 -0
  250. package/ui/src/ui/chat/copy-as-markdown.ts +97 -0
  251. package/ui/src/ui/chat/grouped-render.ts +287 -0
  252. package/ui/src/ui/chat/message-extract.test.ts +64 -0
  253. package/ui/src/ui/chat/message-extract.ts +122 -0
  254. package/ui/src/ui/chat/message-normalizer.test.ts +179 -0
  255. package/ui/src/ui/chat/message-normalizer.ts +101 -0
  256. package/ui/src/ui/chat/tool-cards.ts +156 -0
  257. package/ui/src/ui/chat/tool-helpers.test.ts +141 -0
  258. package/ui/src/ui/chat/tool-helpers.ts +37 -0
  259. package/ui/src/ui/chat-event-reload.test.ts +47 -0
  260. package/ui/src/ui/chat-event-reload.ts +16 -0
  261. package/ui/src/ui/chat-markdown.browser.test.ts +37 -0
  262. package/ui/src/ui/components/resizable-divider.ts +110 -0
  263. package/ui/src/ui/config-form.browser.test.ts +443 -0
  264. package/ui/src/ui/controllers/agent-files.ts +126 -0
  265. package/ui/src/ui/controllers/agent-identity.ts +59 -0
  266. package/ui/src/ui/controllers/agent-skills.ts +33 -0
  267. package/ui/src/ui/controllers/agents.test.ts +61 -0
  268. package/ui/src/ui/controllers/agents.ts +64 -0
  269. package/ui/src/ui/controllers/assistant-identity.ts +34 -0
  270. package/ui/src/ui/controllers/channels.ts +94 -0
  271. package/ui/src/ui/controllers/channels.types.ts +15 -0
  272. package/ui/src/ui/controllers/chat.test.ts +568 -0
  273. package/ui/src/ui/controllers/chat.ts +318 -0
  274. package/ui/src/ui/controllers/config/form-coerce.ts +160 -0
  275. package/ui/src/ui/controllers/config/form-utils.node.test.ts +455 -0
  276. package/ui/src/ui/controllers/config/form-utils.ts +90 -0
  277. package/ui/src/ui/controllers/config.test.ts +289 -0
  278. package/ui/src/ui/controllers/config.ts +219 -0
  279. package/ui/src/ui/controllers/control-ui-bootstrap.test.ts +82 -0
  280. package/ui/src/ui/controllers/control-ui-bootstrap.ts +49 -0
  281. package/ui/src/ui/controllers/cron-filters.test.ts +81 -0
  282. package/ui/src/ui/controllers/cron.test.ts +1070 -0
  283. package/ui/src/ui/controllers/cron.ts +921 -0
  284. package/ui/src/ui/controllers/debug.ts +60 -0
  285. package/ui/src/ui/controllers/devices.ts +159 -0
  286. package/ui/src/ui/controllers/exec-approval.ts +100 -0
  287. package/ui/src/ui/controllers/exec-approvals.ts +170 -0
  288. package/ui/src/ui/controllers/logs.ts +147 -0
  289. package/ui/src/ui/controllers/nodes.ts +32 -0
  290. package/ui/src/ui/controllers/presence.ts +37 -0
  291. package/ui/src/ui/controllers/sessions.test.ts +104 -0
  292. package/ui/src/ui/controllers/sessions.ts +127 -0
  293. package/ui/src/ui/controllers/skills.ts +157 -0
  294. package/ui/src/ui/controllers/usage.node.test.ts +181 -0
  295. package/ui/src/ui/controllers/usage.ts +315 -0
  296. package/ui/src/ui/data/moonshot-kimi-k2.ts +45 -0
  297. package/ui/src/ui/device-auth.ts +73 -0
  298. package/ui/src/ui/device-identity.ts +112 -0
  299. package/ui/src/ui/external-link.test.ts +18 -0
  300. package/ui/src/ui/external-link.ts +19 -0
  301. package/ui/src/ui/focus-mode.browser.test.ts +39 -0
  302. package/ui/src/ui/format.test.ts +101 -0
  303. package/ui/src/ui/format.ts +60 -0
  304. package/ui/src/ui/gateway.ts +360 -0
  305. package/ui/src/ui/icons.ts +256 -0
  306. package/ui/src/ui/markdown.test.ts +85 -0
  307. package/ui/src/ui/markdown.ts +139 -0
  308. package/ui/src/ui/navigation.browser.test.ts +188 -0
  309. package/ui/src/ui/navigation.test.ts +189 -0
  310. package/ui/src/ui/navigation.ts +165 -0
  311. package/ui/src/ui/open-external-url.test.ts +108 -0
  312. package/ui/src/ui/open-external-url.ts +73 -0
  313. package/ui/src/ui/presenter.ts +85 -0
  314. package/ui/src/ui/storage.node.test.ts +63 -0
  315. package/ui/src/ui/storage.ts +99 -0
  316. package/ui/src/ui/test-helpers/app-mount.ts +27 -0
  317. package/ui/src/ui/text-direction.test.ts +24 -0
  318. package/ui/src/ui/text-direction.ts +30 -0
  319. package/ui/src/ui/theme-transition.ts +109 -0
  320. package/ui/src/ui/theme.ts +16 -0
  321. package/ui/src/ui/tool-display.ts +159 -0
  322. package/ui/src/ui/types/chat-types.ts +44 -0
  323. package/ui/src/ui/types.ts +627 -0
  324. package/ui/src/ui/ui-types.ts +54 -0
  325. package/ui/src/ui/usage-helpers.node.test.ts +43 -0
  326. package/ui/src/ui/usage-helpers.ts +321 -0
  327. package/ui/src/ui/usage-types.ts +22 -0
  328. package/ui/src/ui/uuid.test.ts +41 -0
  329. package/ui/src/ui/uuid.ts +57 -0
  330. package/ui/src/ui/views/agents-panels-status-files.ts +461 -0
  331. package/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts +102 -0
  332. package/ui/src/ui/views/agents-panels-tools-skills.ts +537 -0
  333. package/ui/src/ui/views/agents-utils.test.ts +100 -0
  334. package/ui/src/ui/views/agents-utils.ts +502 -0
  335. package/ui/src/ui/views/agents.ts +499 -0
  336. package/ui/src/ui/views/channel-config-extras.ts +49 -0
  337. package/ui/src/ui/views/channels.config.ts +155 -0
  338. package/ui/src/ui/views/channels.discord.ts +65 -0
  339. package/ui/src/ui/views/channels.googlechat.ts +79 -0
  340. package/ui/src/ui/views/channels.imessage.ts +65 -0
  341. package/ui/src/ui/views/channels.nostr-profile-form.ts +321 -0
  342. package/ui/src/ui/views/channels.nostr.ts +237 -0
  343. package/ui/src/ui/views/channels.shared.ts +38 -0
  344. package/ui/src/ui/views/channels.signal.ts +69 -0
  345. package/ui/src/ui/views/channels.slack.ts +65 -0
  346. package/ui/src/ui/views/channels.telegram.ts +120 -0
  347. package/ui/src/ui/views/channels.ts +325 -0
  348. package/ui/src/ui/views/channels.types.ts +62 -0
  349. package/ui/src/ui/views/channels.whatsapp.ts +118 -0
  350. package/ui/src/ui/views/chat-image-open.browser.test.ts +70 -0
  351. package/ui/src/ui/views/chat.test.ts +227 -0
  352. package/ui/src/ui/views/chat.ts +616 -0
  353. package/ui/src/ui/views/config-form.analyze.ts +267 -0
  354. package/ui/src/ui/views/config-form.node.ts +1073 -0
  355. package/ui/src/ui/views/config-form.render.ts +478 -0
  356. package/ui/src/ui/views/config-form.search.node.test.ts +69 -0
  357. package/ui/src/ui/views/config-form.shared.ts +96 -0
  358. package/ui/src/ui/views/config-form.ts +4 -0
  359. package/ui/src/ui/views/config-search.node.test.ts +50 -0
  360. package/ui/src/ui/views/config-search.ts +92 -0
  361. package/ui/src/ui/views/config.browser.test.ts +233 -0
  362. package/ui/src/ui/views/config.ts +820 -0
  363. package/ui/src/ui/views/cron.test.ts +741 -0
  364. package/ui/src/ui/views/cron.ts +1758 -0
  365. package/ui/src/ui/views/debug.ts +151 -0
  366. package/ui/src/ui/views/exec-approval.ts +89 -0
  367. package/ui/src/ui/views/gateway-url-confirmation.ts +40 -0
  368. package/ui/src/ui/views/instances.ts +89 -0
  369. package/ui/src/ui/views/logs.ts +155 -0
  370. package/ui/src/ui/views/markdown-sidebar.ts +40 -0
  371. package/ui/src/ui/views/nodes-exec-approvals.ts +617 -0
  372. package/ui/src/ui/views/nodes-shared.ts +67 -0
  373. package/ui/src/ui/views/nodes.ts +485 -0
  374. package/ui/src/ui/views/overview-hints.ts +16 -0
  375. package/ui/src/ui/views/overview.node.test.ts +39 -0
  376. package/ui/src/ui/views/overview.ts +361 -0
  377. package/ui/src/ui/views/sessions.test.ts +81 -0
  378. package/ui/src/ui/views/sessions.ts +321 -0
  379. package/ui/src/ui/views/skills-grouping.ts +40 -0
  380. package/ui/src/ui/views/skills-shared.ts +52 -0
  381. package/ui/src/ui/views/skills.ts +192 -0
  382. package/ui/src/ui/views/usage-metrics.ts +578 -0
  383. package/ui/src/ui/views/usage-query.ts +277 -0
  384. package/ui/src/ui/views/usage-render-details.test.ts +136 -0
  385. package/ui/src/ui/views/usage-render-details.ts +1083 -0
  386. package/ui/src/ui/views/usage-render-overview.ts +796 -0
  387. package/ui/src/ui/views/usage-styles/usageStyles-part1.ts +701 -0
  388. package/ui/src/ui/views/usage-styles/usageStyles-part2.ts +702 -0
  389. package/ui/src/ui/views/usage-styles/usageStyles-part3.ts +551 -0
  390. package/ui/src/ui/views/usage.ts +836 -0
  391. package/ui/src/ui/views/usageStyles.ts +5 -0
  392. package/ui/src/ui/views/usageTypes.ts +105 -0
  393. package/ui/vite.config.ts +43 -0
  394. package/ui/vitest.config.ts +15 -0
  395. package/ui/vitest.node.config.ts +10 -0
  396. package/dist/deliver-runtime-P-G3bPjW.js +0 -36
  397. package/dist/deps-send-discord.runtime-DnbhTFX9.js +0 -26
  398. package/dist/deps-send-imessage.runtime-BOiQ6mDx.js +0 -25
  399. package/dist/deps-send-signal.runtime-CTcl388M.js +0 -24
  400. package/dist/deps-send-slack.runtime-CCqBz4Kg.js +0 -22
  401. package/dist/deps-send-telegram.runtime-DGSKTCpH.js +0 -27
  402. package/dist/deps-send-whatsapp.runtime-CJkTHkah.js +0 -60
  403. package/dist/errors-CCLeFWAg.js +0 -54
  404. package/dist/image-runtime-CVv2ra9J.js +0 -29
  405. package/dist/manager-runtime-BN6VevdC.js +0 -18
  406. package/dist/pi-model-discovery-BGgOlX8N.js +0 -134
  407. package/dist/pi-model-discovery-runtime-Bwmi4Ev8.js +0 -11
  408. package/dist/plugin-sdk/accounts-CJWOBzwB.js +0 -35
  409. package/dist/plugin-sdk/accounts-DP1-L-QS.js +0 -288
  410. package/dist/plugin-sdk/accounts-DZhWlEg3.js +0 -46
  411. package/dist/plugin-sdk/active-listener-CftX5jLD.js +0 -50
  412. package/dist/plugin-sdk/api-key-rotation-BRE4X2tf.js +0 -181
  413. package/dist/plugin-sdk/audio-preflight-DGEUDxxR.js +0 -69
  414. package/dist/plugin-sdk/audio-transcription-runner-DkoPNPYt.js +0 -2176
  415. package/dist/plugin-sdk/audit-membership-runtime-DSBHHw7o.js +0 -58
  416. package/dist/plugin-sdk/channel-activity-F3d0yUwy.js +0 -94
  417. package/dist/plugin-sdk/channel-web-QF7EpjeP.js +0 -2256
  418. package/dist/plugin-sdk/chrome-BXoCyCkY.js +0 -2415
  419. package/dist/plugin-sdk/commands-registry-t7cXBTfN.js +0 -1125
  420. package/dist/plugin-sdk/config-BkEnz2Po.js +0 -17913
  421. package/dist/plugin-sdk/deliver-B6AG_l67.js +0 -1694
  422. package/dist/plugin-sdk/deliver-runtime-BFdqklJM.js +0 -32
  423. package/dist/plugin-sdk/deliver-runtime-D585kJZc.js +0 -32
  424. package/dist/plugin-sdk/deps-send-discord.runtime-DuqpYwU0.js +0 -23
  425. package/dist/plugin-sdk/deps-send-discord.runtime-a_OKY2js.js +0 -23
  426. package/dist/plugin-sdk/deps-send-imessage.runtime-Baxy9TD4.js +0 -22
  427. package/dist/plugin-sdk/deps-send-imessage.runtime-CZ2rS8Lb.js +0 -22
  428. package/dist/plugin-sdk/deps-send-signal.runtime-BdqiWhIh.js +0 -21
  429. package/dist/plugin-sdk/deps-send-signal.runtime-BwXoCrFl.js +0 -21
  430. package/dist/plugin-sdk/deps-send-slack.runtime-04s36qiC.js +0 -19
  431. package/dist/plugin-sdk/deps-send-slack.runtime-CLmKjgso.js +0 -19
  432. package/dist/plugin-sdk/deps-send-telegram.runtime-BKfdBKnZ.js +0 -24
  433. package/dist/plugin-sdk/deps-send-telegram.runtime-LE5tkPvr.js +0 -24
  434. package/dist/plugin-sdk/deps-send-whatsapp.runtime-BOTwkbx_.js +0 -57
  435. package/dist/plugin-sdk/deps-send-whatsapp.runtime-Bz57lobC.js +0 -57
  436. package/dist/plugin-sdk/diagnostic-CsP-lEkI.js +0 -319
  437. package/dist/plugin-sdk/fetch-guard-DETCcJzQ.js +0 -156
  438. package/dist/plugin-sdk/fs-safe-B8y811FR.js +0 -352
  439. package/dist/plugin-sdk/image-DjTEkYZE.js +0 -2310
  440. package/dist/plugin-sdk/image-ops-BSiMpAw4.js +0 -584
  441. package/dist/plugin-sdk/image-runtime-6xPp8m5a.js +0 -25
  442. package/dist/plugin-sdk/image-runtime-B8twoubs.js +0 -25
  443. package/dist/plugin-sdk/ir-DQ7_HbvK.js +0 -1296
  444. package/dist/plugin-sdk/local-roots-BUP4YBmR.js +0 -186
  445. package/dist/plugin-sdk/logger-CZY9KIoY.js +0 -1163
  446. package/dist/plugin-sdk/login-BxEKLlCo.js +0 -57
  447. package/dist/plugin-sdk/login-qr-BQIpMPr9.js +0 -320
  448. package/dist/plugin-sdk/manager-I6KbPihW.js +0 -3917
  449. package/dist/plugin-sdk/manager-runtime-CFfYYWIQ.js +0 -15
  450. package/dist/plugin-sdk/manager-runtime-CMeLwose.js +0 -15
  451. package/dist/plugin-sdk/outbound-NS6UHnB6.js +0 -212
  452. package/dist/plugin-sdk/outbound-attachment-Dy6fyf6H.js +0 -19
  453. package/dist/plugin-sdk/path-alias-guards-DBjLbIX_.js +0 -43
  454. package/dist/plugin-sdk/paths-vTM3Lh3X.js +0 -166
  455. package/dist/plugin-sdk/pi-embedded-helpers-1R1gu7eX.js +0 -9627
  456. package/dist/plugin-sdk/pi-model-discovery-runtime-D8CJhtJY.js +0 -8
  457. package/dist/plugin-sdk/pi-model-discovery-runtime-Do9o-dUd.js +0 -8
  458. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-D4sFsIks.js +0 -354
  459. package/dist/plugin-sdk/plugins-DeBZB9l_.js +0 -864
  460. package/dist/plugin-sdk/pw-ai-DEOmCSSC.js +0 -1938
  461. package/dist/plugin-sdk/qmd-manager-HyYKoEch.js +0 -1448
  462. package/dist/plugin-sdk/query-expansion-CeyKUeDW.js +0 -1011
  463. package/dist/plugin-sdk/reply-DAo_Jt8K.js +0 -97916
  464. package/dist/plugin-sdk/resolve-outbound-target-B42qgQS9.js +0 -40
  465. package/dist/plugin-sdk/run-with-concurrency-Bt_ks0Qa.js +0 -1994
  466. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6W989eF.js +0 -10
  467. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-SkO91TZH.js +0 -10
  468. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-B0VWK5hm.js +0 -19
  469. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-c_GDFy37.js +0 -19
  470. package/dist/plugin-sdk/send-CQpMudwO.js +0 -2587
  471. package/dist/plugin-sdk/send-DQHLzVyO.js +0 -414
  472. package/dist/plugin-sdk/send-DTB24bEF.js +0 -3135
  473. package/dist/plugin-sdk/send-DfHadjZ_.js +0 -503
  474. package/dist/plugin-sdk/send-XXlW2iny.js +0 -540
  475. package/dist/plugin-sdk/session-6TF6MyaC.js +0 -169
  476. package/dist/plugin-sdk/skill-commands-CkGeFUMl.js +0 -342
  477. package/dist/plugin-sdk/skills-CBkHBYPq.js +0 -1428
  478. package/dist/plugin-sdk/slash-commands.runtime-CxliuGaP.js +0 -13
  479. package/dist/plugin-sdk/slash-commands.runtime-DS6vCNSL.js +0 -13
  480. package/dist/plugin-sdk/slash-dispatch.runtime-BXrxb2wd.js +0 -52
  481. package/dist/plugin-sdk/slash-dispatch.runtime-DFaeYlJQ.js +0 -52
  482. package/dist/plugin-sdk/slash-skill-commands.runtime-0M0OLCxq.js +0 -16
  483. package/dist/plugin-sdk/slash-skill-commands.runtime-Bd6qQ2oT.js +0 -16
  484. package/dist/plugin-sdk/ssrf-cFtplYtS.js +0 -202
  485. package/dist/plugin-sdk/store-5nyxY3WU.js +0 -81
  486. package/dist/plugin-sdk/subagent-registry-runtime-1uwQbuXj.js +0 -52
  487. package/dist/plugin-sdk/subagent-registry-runtime-DCtmDwna.js +0 -52
  488. package/dist/plugin-sdk/tables-C47P4GTN.js +0 -55
  489. package/dist/plugin-sdk/target-errors-Blia4S69.js +0 -195
  490. package/dist/plugin-sdk/thinking-Bo2eosVa.js +0 -1206
  491. package/dist/plugin-sdk/tokens-B1PW5Ayy.js +0 -52
  492. package/dist/plugin-sdk/tool-images-Gk_-0y2N.js +0 -274
  493. package/dist/plugin-sdk/web-B74yhL2N.js +0 -56
  494. package/dist/plugin-sdk/web-CVxZbXyH.js +0 -56
  495. package/dist/plugin-sdk/whatsapp-actions-Bw0H9g-n.js +0 -80
  496. package/dist/proxy-fetch-CCjEYbFm.js +0 -38
  497. package/dist/redact-ClbcYG1J.js +0 -319
  498. package/dist/runtime-whatsapp-login.runtime-IeylZEl4.js +0 -13
  499. package/dist/runtime-whatsapp-outbound.runtime-ClBRuLsq.js +0 -22
  500. package/dist/slash-commands.runtime-Cpn2tYW4.js +0 -16
  501. package/dist/slash-dispatch.runtime-DoBAQBU5.js +0 -56
  502. package/dist/slash-skill-commands.runtime-DKMvvdDW.js +0 -20
  503. package/dist/subagent-registry-runtime-ppWS3tVu.js +0 -56
@@ -0,0 +1,621 @@
1
+ import { LitElement } from "lit";
2
+ import { customElement, state } from "lit/decorators.js";
3
+ import { i18n, I18nController, isSupportedLocale } from "../i18n/index.ts";
4
+ import {
5
+ handleChannelConfigReload as handleChannelConfigReloadInternal,
6
+ handleChannelConfigSave as handleChannelConfigSaveInternal,
7
+ handleNostrProfileCancel as handleNostrProfileCancelInternal,
8
+ handleNostrProfileEdit as handleNostrProfileEditInternal,
9
+ handleNostrProfileFieldChange as handleNostrProfileFieldChangeInternal,
10
+ handleNostrProfileImport as handleNostrProfileImportInternal,
11
+ handleNostrProfileSave as handleNostrProfileSaveInternal,
12
+ handleNostrProfileToggleAdvanced as handleNostrProfileToggleAdvancedInternal,
13
+ handleWhatsAppLogout as handleWhatsAppLogoutInternal,
14
+ handleWhatsAppStart as handleWhatsAppStartInternal,
15
+ handleWhatsAppWait as handleWhatsAppWaitInternal,
16
+ } from "./app-channels.ts";
17
+ import {
18
+ handleAbortChat as handleAbortChatInternal,
19
+ handleSendChat as handleSendChatInternal,
20
+ removeQueuedMessage as removeQueuedMessageInternal,
21
+ } from "./app-chat.ts";
22
+ import { DEFAULT_CRON_FORM, DEFAULT_LOG_LEVEL_FILTERS } from "./app-defaults.ts";
23
+ import type { EventLogEntry } from "./app-events.ts";
24
+ import { connectGateway as connectGatewayInternal } from "./app-gateway.ts";
25
+ import {
26
+ handleConnected,
27
+ handleDisconnected,
28
+ handleFirstUpdated,
29
+ handleUpdated,
30
+ } from "./app-lifecycle.ts";
31
+ import { renderApp } from "./app-render.ts";
32
+ import {
33
+ exportLogs as exportLogsInternal,
34
+ handleChatScroll as handleChatScrollInternal,
35
+ handleLogsScroll as handleLogsScrollInternal,
36
+ resetChatScroll as resetChatScrollInternal,
37
+ scheduleChatScroll as scheduleChatScrollInternal,
38
+ } from "./app-scroll.ts";
39
+ import {
40
+ applySettings as applySettingsInternal,
41
+ loadCron as loadCronInternal,
42
+ loadOverview as loadOverviewInternal,
43
+ setTab as setTabInternal,
44
+ setTheme as setThemeInternal,
45
+ onPopState as onPopStateInternal,
46
+ } from "./app-settings.ts";
47
+ import {
48
+ resetToolStream as resetToolStreamInternal,
49
+ type ToolStreamEntry,
50
+ type CompactionStatus,
51
+ type FallbackStatus,
52
+ } from "./app-tool-stream.ts";
53
+ import type { AppViewState } from "./app-view-state.ts";
54
+ import { normalizeAssistantIdentity } from "./assistant-identity.ts";
55
+ import { loadAssistantIdentity as loadAssistantIdentityInternal } from "./controllers/assistant-identity.ts";
56
+ import type { CronFieldErrors } from "./controllers/cron.ts";
57
+ import type { DevicePairingList } from "./controllers/devices.ts";
58
+ import type { ExecApprovalRequest } from "./controllers/exec-approval.ts";
59
+ import type { ExecApprovalsFile, ExecApprovalsSnapshot } from "./controllers/exec-approvals.ts";
60
+ import type { SkillMessage } from "./controllers/skills.ts";
61
+ import type { GatewayBrowserClient, GatewayHelloOk } from "./gateway.ts";
62
+ import type { Tab } from "./navigation.ts";
63
+ import { loadSettings, type UiSettings } from "./storage.ts";
64
+ import type { ResolvedTheme, ThemeMode } from "./theme.ts";
65
+ import type {
66
+ AgentsListResult,
67
+ AgentsFilesListResult,
68
+ AgentIdentityResult,
69
+ ConfigSnapshot,
70
+ ConfigUiHints,
71
+ CronJob,
72
+ CronRunLogEntry,
73
+ CronStatus,
74
+ HealthSnapshot,
75
+ LogEntry,
76
+ LogLevel,
77
+ PresenceEntry,
78
+ ChannelsStatusSnapshot,
79
+ SessionsListResult,
80
+ SkillStatusReport,
81
+ ToolsCatalogResult,
82
+ StatusSummary,
83
+ NostrProfile,
84
+ } from "./types.ts";
85
+ import { type ChatAttachment, type ChatQueueItem, type CronFormState } from "./ui-types.ts";
86
+ import { generateUUID } from "./uuid.ts";
87
+ import type { NostrProfileFormState } from "./views/channels.nostr-profile-form.ts";
88
+
89
+ declare global {
90
+ interface Window {
91
+ __OPENCLAW_CONTROL_UI_BASE_PATH__?: string;
92
+ }
93
+ }
94
+
95
+ const bootAssistantIdentity = normalizeAssistantIdentity({});
96
+
97
+ function resolveOnboardingMode(): boolean {
98
+ if (!window.location.search) {
99
+ return false;
100
+ }
101
+ const params = new URLSearchParams(window.location.search);
102
+ const raw = params.get("onboarding");
103
+ if (!raw) {
104
+ return false;
105
+ }
106
+ const normalized = raw.trim().toLowerCase();
107
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
108
+ }
109
+
110
+ @customElement("openclaw-app")
111
+ export class OpenClawApp extends LitElement {
112
+ private i18nController = new I18nController(this);
113
+ clientInstanceId = generateUUID();
114
+ @state() settings: UiSettings = loadSettings();
115
+ constructor() {
116
+ super();
117
+ if (isSupportedLocale(this.settings.locale)) {
118
+ void i18n.setLocale(this.settings.locale);
119
+ }
120
+ }
121
+ @state() password = "";
122
+ @state() tab: Tab = "chat";
123
+ @state() onboarding = resolveOnboardingMode();
124
+ @state() connected = false;
125
+ @state() theme: ThemeMode = this.settings.theme ?? "system";
126
+ @state() themeResolved: ResolvedTheme = "dark";
127
+ @state() hello: GatewayHelloOk | null = null;
128
+ @state() lastError: string | null = null;
129
+ @state() lastErrorCode: string | null = null;
130
+ @state() eventLog: EventLogEntry[] = [];
131
+ private eventLogBuffer: EventLogEntry[] = [];
132
+ private toolStreamSyncTimer: number | null = null;
133
+ private sidebarCloseTimer: number | null = null;
134
+
135
+ @state() assistantName = bootAssistantIdentity.name;
136
+ @state() assistantAvatar = bootAssistantIdentity.avatar;
137
+ @state() assistantAgentId = bootAssistantIdentity.agentId ?? null;
138
+
139
+ @state() sessionKey = this.settings.sessionKey;
140
+ @state() chatLoading = false;
141
+ @state() chatSending = false;
142
+ @state() chatMessage = "";
143
+ @state() chatMessages: unknown[] = [];
144
+ @state() chatToolMessages: unknown[] = [];
145
+ @state() chatStream: string | null = null;
146
+ @state() chatStreamStartedAt: number | null = null;
147
+ @state() chatRunId: string | null = null;
148
+ @state() compactionStatus: CompactionStatus | null = null;
149
+ @state() fallbackStatus: FallbackStatus | null = null;
150
+ @state() chatAvatarUrl: string | null = null;
151
+ @state() chatThinkingLevel: string | null = null;
152
+ @state() chatQueue: ChatQueueItem[] = [];
153
+ @state() chatAttachments: ChatAttachment[] = [];
154
+ @state() chatManualRefreshInFlight = false;
155
+ // Sidebar state for tool output viewing
156
+ @state() sidebarOpen = false;
157
+ @state() sidebarContent: string | null = null;
158
+ @state() sidebarError: string | null = null;
159
+ @state() splitRatio = this.settings.splitRatio;
160
+
161
+ @state() nodesLoading = false;
162
+ @state() nodes: Array<Record<string, unknown>> = [];
163
+ @state() devicesLoading = false;
164
+ @state() devicesError: string | null = null;
165
+ @state() devicesList: DevicePairingList | null = null;
166
+ @state() execApprovalsLoading = false;
167
+ @state() execApprovalsSaving = false;
168
+ @state() execApprovalsDirty = false;
169
+ @state() execApprovalsSnapshot: ExecApprovalsSnapshot | null = null;
170
+ @state() execApprovalsForm: ExecApprovalsFile | null = null;
171
+ @state() execApprovalsSelectedAgent: string | null = null;
172
+ @state() execApprovalsTarget: "gateway" | "node" = "gateway";
173
+ @state() execApprovalsTargetNodeId: string | null = null;
174
+ @state() execApprovalQueue: ExecApprovalRequest[] = [];
175
+ @state() execApprovalBusy = false;
176
+ @state() execApprovalError: string | null = null;
177
+ @state() pendingGatewayUrl: string | null = null;
178
+
179
+ @state() configLoading = false;
180
+ @state() configRaw = "{\n}\n";
181
+ @state() configRawOriginal = "";
182
+ @state() configValid: boolean | null = null;
183
+ @state() configIssues: unknown[] = [];
184
+ @state() configSaving = false;
185
+ @state() configApplying = false;
186
+ @state() updateRunning = false;
187
+ @state() applySessionKey = this.settings.lastActiveSessionKey;
188
+ @state() configSnapshot: ConfigSnapshot | null = null;
189
+ @state() configSchema: unknown = null;
190
+ @state() configSchemaVersion: string | null = null;
191
+ @state() configSchemaLoading = false;
192
+ @state() configUiHints: ConfigUiHints = {};
193
+ @state() configForm: Record<string, unknown> | null = null;
194
+ @state() configFormOriginal: Record<string, unknown> | null = null;
195
+ @state() configFormDirty = false;
196
+ @state() configFormMode: "form" | "raw" = "form";
197
+ @state() configSearchQuery = "";
198
+ @state() configActiveSection: string | null = null;
199
+ @state() configActiveSubsection: string | null = null;
200
+
201
+ @state() channelsLoading = false;
202
+ @state() channelsSnapshot: ChannelsStatusSnapshot | null = null;
203
+ @state() channelsError: string | null = null;
204
+ @state() channelsLastSuccess: number | null = null;
205
+ @state() whatsappLoginMessage: string | null = null;
206
+ @state() whatsappLoginQrDataUrl: string | null = null;
207
+ @state() whatsappLoginConnected: boolean | null = null;
208
+ @state() whatsappBusy = false;
209
+ @state() nostrProfileFormState: NostrProfileFormState | null = null;
210
+ @state() nostrProfileAccountId: string | null = null;
211
+
212
+ @state() presenceLoading = false;
213
+ @state() presenceEntries: PresenceEntry[] = [];
214
+ @state() presenceError: string | null = null;
215
+ @state() presenceStatus: string | null = null;
216
+
217
+ @state() agentsLoading = false;
218
+ @state() agentsList: AgentsListResult | null = null;
219
+ @state() agentsError: string | null = null;
220
+ @state() agentsSelectedId: string | null = null;
221
+ @state() toolsCatalogLoading = false;
222
+ @state() toolsCatalogError: string | null = null;
223
+ @state() toolsCatalogResult: ToolsCatalogResult | null = null;
224
+ @state() agentsPanel: "overview" | "files" | "tools" | "skills" | "channels" | "cron" =
225
+ "overview";
226
+ @state() agentFilesLoading = false;
227
+ @state() agentFilesError: string | null = null;
228
+ @state() agentFilesList: AgentsFilesListResult | null = null;
229
+ @state() agentFileContents: Record<string, string> = {};
230
+ @state() agentFileDrafts: Record<string, string> = {};
231
+ @state() agentFileActive: string | null = null;
232
+ @state() agentFileSaving = false;
233
+ @state() agentIdentityLoading = false;
234
+ @state() agentIdentityError: string | null = null;
235
+ @state() agentIdentityById: Record<string, AgentIdentityResult> = {};
236
+ @state() agentSkillsLoading = false;
237
+ @state() agentSkillsError: string | null = null;
238
+ @state() agentSkillsReport: SkillStatusReport | null = null;
239
+ @state() agentSkillsAgentId: string | null = null;
240
+
241
+ @state() sessionsLoading = false;
242
+ @state() sessionsResult: SessionsListResult | null = null;
243
+ @state() sessionsError: string | null = null;
244
+ @state() sessionsFilterActive = "";
245
+ @state() sessionsFilterLimit = "120";
246
+ @state() sessionsIncludeGlobal = true;
247
+ @state() sessionsIncludeUnknown = false;
248
+ @state() sessionsHideCron = true;
249
+
250
+ @state() usageLoading = false;
251
+ @state() usageResult: import("./types.js").SessionsUsageResult | null = null;
252
+ @state() usageCostSummary: import("./types.js").CostUsageSummary | null = null;
253
+ @state() usageError: string | null = null;
254
+ @state() usageStartDate = (() => {
255
+ const d = new Date();
256
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
257
+ })();
258
+ @state() usageEndDate = (() => {
259
+ const d = new Date();
260
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
261
+ })();
262
+ @state() usageSelectedSessions: string[] = [];
263
+ @state() usageSelectedDays: string[] = [];
264
+ @state() usageSelectedHours: number[] = [];
265
+ @state() usageChartMode: "tokens" | "cost" = "tokens";
266
+ @state() usageDailyChartMode: "total" | "by-type" = "by-type";
267
+ @state() usageTimeSeriesMode: "cumulative" | "per-turn" = "per-turn";
268
+ @state() usageTimeSeriesBreakdownMode: "total" | "by-type" = "by-type";
269
+ @state() usageTimeSeries: import("./types.js").SessionUsageTimeSeries | null = null;
270
+ @state() usageTimeSeriesLoading = false;
271
+ @state() usageTimeSeriesCursorStart: number | null = null;
272
+ @state() usageTimeSeriesCursorEnd: number | null = null;
273
+ @state() usageSessionLogs: import("./views/usage.js").SessionLogEntry[] | null = null;
274
+ @state() usageSessionLogsLoading = false;
275
+ @state() usageSessionLogsExpanded = false;
276
+ // Applied query (used to filter the already-loaded sessions list client-side).
277
+ @state() usageQuery = "";
278
+ // Draft query text (updates immediately as the user types; applied via debounce or "Search").
279
+ @state() usageQueryDraft = "";
280
+ @state() usageSessionSort: "tokens" | "cost" | "recent" | "messages" | "errors" = "recent";
281
+ @state() usageSessionSortDir: "desc" | "asc" = "desc";
282
+ @state() usageRecentSessions: string[] = [];
283
+ @state() usageTimeZone: "local" | "utc" = "local";
284
+ @state() usageContextExpanded = false;
285
+ @state() usageHeaderPinned = false;
286
+ @state() usageSessionsTab: "all" | "recent" = "all";
287
+ @state() usageVisibleColumns: string[] = [
288
+ "channel",
289
+ "agent",
290
+ "provider",
291
+ "model",
292
+ "messages",
293
+ "tools",
294
+ "errors",
295
+ "duration",
296
+ ];
297
+ @state() usageLogFilterRoles: import("./views/usage.js").SessionLogRole[] = [];
298
+ @state() usageLogFilterTools: string[] = [];
299
+ @state() usageLogFilterHasTools = false;
300
+ @state() usageLogFilterQuery = "";
301
+
302
+ // Non-reactive (don’t trigger renders just for timer bookkeeping).
303
+ usageQueryDebounceTimer: number | null = null;
304
+
305
+ @state() cronLoading = false;
306
+ @state() cronJobsLoadingMore = false;
307
+ @state() cronJobs: CronJob[] = [];
308
+ @state() cronJobsTotal = 0;
309
+ @state() cronJobsHasMore = false;
310
+ @state() cronJobsNextOffset: number | null = null;
311
+ @state() cronJobsLimit = 50;
312
+ @state() cronJobsQuery = "";
313
+ @state() cronJobsEnabledFilter: import("./types.js").CronJobsEnabledFilter = "all";
314
+ @state() cronJobsScheduleKindFilter: import("./controllers/cron.js").CronJobsScheduleKindFilter =
315
+ "all";
316
+ @state() cronJobsLastStatusFilter: import("./controllers/cron.js").CronJobsLastStatusFilter =
317
+ "all";
318
+ @state() cronJobsSortBy: import("./types.js").CronJobsSortBy = "nextRunAtMs";
319
+ @state() cronJobsSortDir: import("./types.js").CronSortDir = "asc";
320
+ @state() cronStatus: CronStatus | null = null;
321
+ @state() cronError: string | null = null;
322
+ @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };
323
+ @state() cronFieldErrors: CronFieldErrors = {};
324
+ @state() cronEditingJobId: string | null = null;
325
+ @state() cronRunsJobId: string | null = null;
326
+ @state() cronRunsLoadingMore = false;
327
+ @state() cronRuns: CronRunLogEntry[] = [];
328
+ @state() cronRunsTotal = 0;
329
+ @state() cronRunsHasMore = false;
330
+ @state() cronRunsNextOffset: number | null = null;
331
+ @state() cronRunsLimit = 50;
332
+ @state() cronRunsScope: import("./types.js").CronRunScope = "all";
333
+ @state() cronRunsStatuses: import("./types.js").CronRunsStatusValue[] = [];
334
+ @state() cronRunsDeliveryStatuses: import("./types.js").CronDeliveryStatus[] = [];
335
+ @state() cronRunsStatusFilter: import("./types.js").CronRunsStatusFilter = "all";
336
+ @state() cronRunsQuery = "";
337
+ @state() cronRunsSortDir: import("./types.js").CronSortDir = "desc";
338
+ @state() cronModelSuggestions: string[] = [];
339
+ @state() cronBusy = false;
340
+
341
+ @state() updateAvailable: import("./types.js").UpdateAvailable | null = null;
342
+
343
+ @state() skillsLoading = false;
344
+ @state() skillsReport: SkillStatusReport | null = null;
345
+ @state() skillsError: string | null = null;
346
+ @state() skillsFilter = "";
347
+ @state() skillEdits: Record<string, string> = {};
348
+ @state() skillsBusyKey: string | null = null;
349
+ @state() skillMessages: Record<string, SkillMessage> = {};
350
+
351
+ @state() debugLoading = false;
352
+ @state() debugStatus: StatusSummary | null = null;
353
+ @state() debugHealth: HealthSnapshot | null = null;
354
+ @state() debugModels: unknown[] = [];
355
+ @state() debugHeartbeat: unknown = null;
356
+ @state() debugCallMethod = "";
357
+ @state() debugCallParams = "{}";
358
+ @state() debugCallResult: string | null = null;
359
+ @state() debugCallError: string | null = null;
360
+
361
+ @state() logsLoading = false;
362
+ @state() logsError: string | null = null;
363
+ @state() logsFile: string | null = null;
364
+ @state() logsEntries: LogEntry[] = [];
365
+ @state() logsFilterText = "";
366
+ @state() logsLevelFilters: Record<LogLevel, boolean> = {
367
+ ...DEFAULT_LOG_LEVEL_FILTERS,
368
+ };
369
+ @state() logsAutoFollow = true;
370
+ @state() logsTruncated = false;
371
+ @state() logsCursor: number | null = null;
372
+ @state() logsLastFetchAt: number | null = null;
373
+ @state() logsLimit = 500;
374
+ @state() logsMaxBytes = 250_000;
375
+ @state() logsAtBottom = true;
376
+
377
+ client: GatewayBrowserClient | null = null;
378
+ private chatScrollFrame: number | null = null;
379
+ private chatScrollTimeout: number | null = null;
380
+ private chatHasAutoScrolled = false;
381
+ private chatUserNearBottom = true;
382
+ @state() chatNewMessagesBelow = false;
383
+ private nodesPollInterval: number | null = null;
384
+ private logsPollInterval: number | null = null;
385
+ private debugPollInterval: number | null = null;
386
+ private logsScrollFrame: number | null = null;
387
+ private toolStreamById = new Map<string, ToolStreamEntry>();
388
+ private toolStreamOrder: string[] = [];
389
+ refreshSessionsAfterChat = new Set<string>();
390
+ basePath = "";
391
+ private popStateHandler = () =>
392
+ onPopStateInternal(this as unknown as Parameters<typeof onPopStateInternal>[0]);
393
+ private themeMedia: MediaQueryList | null = null;
394
+ private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;
395
+ private topbarObserver: ResizeObserver | null = null;
396
+
397
+ createRenderRoot() {
398
+ return this;
399
+ }
400
+
401
+ connectedCallback() {
402
+ super.connectedCallback();
403
+ handleConnected(this as unknown as Parameters<typeof handleConnected>[0]);
404
+ }
405
+
406
+ protected firstUpdated() {
407
+ handleFirstUpdated(this as unknown as Parameters<typeof handleFirstUpdated>[0]);
408
+ }
409
+
410
+ disconnectedCallback() {
411
+ handleDisconnected(this as unknown as Parameters<typeof handleDisconnected>[0]);
412
+ super.disconnectedCallback();
413
+ }
414
+
415
+ protected updated(changed: Map<PropertyKey, unknown>) {
416
+ handleUpdated(this as unknown as Parameters<typeof handleUpdated>[0], changed);
417
+ }
418
+
419
+ connect() {
420
+ connectGatewayInternal(this as unknown as Parameters<typeof connectGatewayInternal>[0]);
421
+ }
422
+
423
+ handleChatScroll(event: Event) {
424
+ handleChatScrollInternal(
425
+ this as unknown as Parameters<typeof handleChatScrollInternal>[0],
426
+ event,
427
+ );
428
+ }
429
+
430
+ handleLogsScroll(event: Event) {
431
+ handleLogsScrollInternal(
432
+ this as unknown as Parameters<typeof handleLogsScrollInternal>[0],
433
+ event,
434
+ );
435
+ }
436
+
437
+ exportLogs(lines: string[], label: string) {
438
+ exportLogsInternal(lines, label);
439
+ }
440
+
441
+ resetToolStream() {
442
+ resetToolStreamInternal(this as unknown as Parameters<typeof resetToolStreamInternal>[0]);
443
+ }
444
+
445
+ resetChatScroll() {
446
+ resetChatScrollInternal(this as unknown as Parameters<typeof resetChatScrollInternal>[0]);
447
+ }
448
+
449
+ scrollToBottom(opts?: { smooth?: boolean }) {
450
+ resetChatScrollInternal(this as unknown as Parameters<typeof resetChatScrollInternal>[0]);
451
+ scheduleChatScrollInternal(
452
+ this as unknown as Parameters<typeof scheduleChatScrollInternal>[0],
453
+ true,
454
+ Boolean(opts?.smooth),
455
+ );
456
+ }
457
+
458
+ async loadAssistantIdentity() {
459
+ await loadAssistantIdentityInternal(this);
460
+ }
461
+
462
+ applySettings(next: UiSettings) {
463
+ applySettingsInternal(this as unknown as Parameters<typeof applySettingsInternal>[0], next);
464
+ }
465
+
466
+ setTab(next: Tab) {
467
+ setTabInternal(this as unknown as Parameters<typeof setTabInternal>[0], next);
468
+ }
469
+
470
+ setTheme(next: ThemeMode, context?: Parameters<typeof setThemeInternal>[2]) {
471
+ setThemeInternal(this as unknown as Parameters<typeof setThemeInternal>[0], next, context);
472
+ }
473
+
474
+ async loadOverview() {
475
+ await loadOverviewInternal(this as unknown as Parameters<typeof loadOverviewInternal>[0]);
476
+ }
477
+
478
+ async loadCron() {
479
+ await loadCronInternal(this as unknown as Parameters<typeof loadCronInternal>[0]);
480
+ }
481
+
482
+ async handleAbortChat() {
483
+ await handleAbortChatInternal(this as unknown as Parameters<typeof handleAbortChatInternal>[0]);
484
+ }
485
+
486
+ removeQueuedMessage(id: string) {
487
+ removeQueuedMessageInternal(
488
+ this as unknown as Parameters<typeof removeQueuedMessageInternal>[0],
489
+ id,
490
+ );
491
+ }
492
+
493
+ async handleSendChat(
494
+ messageOverride?: string,
495
+ opts?: Parameters<typeof handleSendChatInternal>[2],
496
+ ) {
497
+ await handleSendChatInternal(
498
+ this as unknown as Parameters<typeof handleSendChatInternal>[0],
499
+ messageOverride,
500
+ opts,
501
+ );
502
+ }
503
+
504
+ async handleWhatsAppStart(force: boolean) {
505
+ await handleWhatsAppStartInternal(this, force);
506
+ }
507
+
508
+ async handleWhatsAppWait() {
509
+ await handleWhatsAppWaitInternal(this);
510
+ }
511
+
512
+ async handleWhatsAppLogout() {
513
+ await handleWhatsAppLogoutInternal(this);
514
+ }
515
+
516
+ async handleChannelConfigSave() {
517
+ await handleChannelConfigSaveInternal(this);
518
+ }
519
+
520
+ async handleChannelConfigReload() {
521
+ await handleChannelConfigReloadInternal(this);
522
+ }
523
+
524
+ handleNostrProfileEdit(accountId: string, profile: NostrProfile | null) {
525
+ handleNostrProfileEditInternal(this, accountId, profile);
526
+ }
527
+
528
+ handleNostrProfileCancel() {
529
+ handleNostrProfileCancelInternal(this);
530
+ }
531
+
532
+ handleNostrProfileFieldChange(field: keyof NostrProfile, value: string) {
533
+ handleNostrProfileFieldChangeInternal(this, field, value);
534
+ }
535
+
536
+ async handleNostrProfileSave() {
537
+ await handleNostrProfileSaveInternal(this);
538
+ }
539
+
540
+ async handleNostrProfileImport() {
541
+ await handleNostrProfileImportInternal(this);
542
+ }
543
+
544
+ handleNostrProfileToggleAdvanced() {
545
+ handleNostrProfileToggleAdvancedInternal(this);
546
+ }
547
+
548
+ async handleExecApprovalDecision(decision: "allow-once" | "allow-always" | "deny") {
549
+ const active = this.execApprovalQueue[0];
550
+ if (!active || !this.client || this.execApprovalBusy) {
551
+ return;
552
+ }
553
+ this.execApprovalBusy = true;
554
+ this.execApprovalError = null;
555
+ try {
556
+ await this.client.request("exec.approval.resolve", {
557
+ id: active.id,
558
+ decision,
559
+ });
560
+ this.execApprovalQueue = this.execApprovalQueue.filter((entry) => entry.id !== active.id);
561
+ } catch (err) {
562
+ this.execApprovalError = `Exec approval failed: ${String(err)}`;
563
+ } finally {
564
+ this.execApprovalBusy = false;
565
+ }
566
+ }
567
+
568
+ handleGatewayUrlConfirm() {
569
+ const nextGatewayUrl = this.pendingGatewayUrl;
570
+ if (!nextGatewayUrl) {
571
+ return;
572
+ }
573
+ this.pendingGatewayUrl = null;
574
+ applySettingsInternal(this as unknown as Parameters<typeof applySettingsInternal>[0], {
575
+ ...this.settings,
576
+ gatewayUrl: nextGatewayUrl,
577
+ });
578
+ this.connect();
579
+ }
580
+
581
+ handleGatewayUrlCancel() {
582
+ this.pendingGatewayUrl = null;
583
+ }
584
+
585
+ // Sidebar handlers for tool output viewing
586
+ handleOpenSidebar(content: string) {
587
+ if (this.sidebarCloseTimer != null) {
588
+ window.clearTimeout(this.sidebarCloseTimer);
589
+ this.sidebarCloseTimer = null;
590
+ }
591
+ this.sidebarContent = content;
592
+ this.sidebarError = null;
593
+ this.sidebarOpen = true;
594
+ }
595
+
596
+ handleCloseSidebar() {
597
+ this.sidebarOpen = false;
598
+ // Clear content after transition
599
+ if (this.sidebarCloseTimer != null) {
600
+ window.clearTimeout(this.sidebarCloseTimer);
601
+ }
602
+ this.sidebarCloseTimer = window.setTimeout(() => {
603
+ if (this.sidebarOpen) {
604
+ return;
605
+ }
606
+ this.sidebarContent = null;
607
+ this.sidebarError = null;
608
+ this.sidebarCloseTimer = null;
609
+ }, 200);
610
+ }
611
+
612
+ handleSplitRatioChange(ratio: number) {
613
+ const newRatio = Math.max(0.4, Math.min(0.7, ratio));
614
+ this.splitRatio = newRatio;
615
+ this.applySettings({ ...this.settings, splitRatio: newRatio });
616
+ }
617
+
618
+ render() {
619
+ return renderApp(this as unknown as AppViewState);
620
+ }
621
+ }
@@ -0,0 +1,23 @@
1
+ import { coerceIdentityValue } from "../../../src/shared/assistant-identity-values.js";
2
+
3
+ const MAX_ASSISTANT_NAME = 50;
4
+ const MAX_ASSISTANT_AVATAR = 200;
5
+
6
+ export const DEFAULT_ASSISTANT_NAME = "Assistant";
7
+ export const DEFAULT_ASSISTANT_AVATAR = "A";
8
+
9
+ export type AssistantIdentity = {
10
+ agentId?: string | null;
11
+ name: string;
12
+ avatar: string | null;
13
+ };
14
+
15
+ export function normalizeAssistantIdentity(
16
+ input?: Partial<AssistantIdentity> | null,
17
+ ): AssistantIdentity {
18
+ const name = coerceIdentityValue(input?.name, MAX_ASSISTANT_NAME) ?? DEFAULT_ASSISTANT_NAME;
19
+ const avatar = coerceIdentityValue(input?.avatar ?? undefined, MAX_ASSISTANT_AVATAR) ?? null;
20
+ const agentId =
21
+ typeof input?.agentId === "string" && input.agentId.trim() ? input.agentId.trim() : null;
22
+ return { agentId, name, avatar };
23
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Chat-related constants for the UI layer.
3
+ */
4
+
5
+ /** Character threshold for showing tool output inline vs collapsed */
6
+ export const TOOL_INLINE_THRESHOLD = 80;
7
+
8
+ /** Maximum lines to show in collapsed preview */
9
+ export const PREVIEW_MAX_LINES = 2;
10
+
11
+ /** Maximum characters to show in collapsed preview */
12
+ export const PREVIEW_MAX_CHARS = 100;