@castlekit/castle 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (573) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -0
  2. package/.next/standalone/.next/app-path-routes-manifest.json +29 -0
  3. package/.next/standalone/.next/build-manifest.json +20 -0
  4. package/.next/standalone/.next/package.json +1 -0
  5. package/.next/standalone/.next/prerender-manifest.json +186 -0
  6. package/.next/standalone/.next/required-server-files.json +322 -0
  7. package/.next/standalone/.next/routes-manifest.json +213 -0
  8. package/.next/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  9. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +17 -0
  10. package/.next/standalone/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  11. package/.next/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  12. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  13. package/.next/standalone/.next/server/app/_global-error/page.js +10 -0
  14. package/.next/standalone/.next/server/app/_global-error/page.js.map +5 -0
  15. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
  16. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
  17. package/.next/standalone/.next/server/app/_global-error.html +2 -0
  18. package/.next/standalone/.next/server/app/_global-error.meta +15 -0
  19. package/.next/standalone/.next/server/app/_global-error.rsc +12 -0
  20. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  21. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +12 -0
  22. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  23. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
  24. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  25. package/.next/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  26. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +17 -0
  27. package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  28. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  29. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  30. package/.next/standalone/.next/server/app/_not-found/page.js +15 -0
  31. package/.next/standalone/.next/server/app/_not-found/page.js.map +5 -0
  32. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
  33. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
  34. package/.next/standalone/.next/server/app/_not-found.html +1 -0
  35. package/.next/standalone/.next/server/app/_not-found.meta +16 -0
  36. package/.next/standalone/.next/server/app/_not-found.rsc +17 -0
  37. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
  38. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  39. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  40. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  41. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
  42. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  43. package/.next/standalone/.next/server/app/api/avatars/[id]/route/app-paths-manifest.json +3 -0
  44. package/.next/standalone/.next/server/app/api/avatars/[id]/route/build-manifest.json +11 -0
  45. package/.next/standalone/.next/server/app/api/avatars/[id]/route/server-reference-manifest.json +4 -0
  46. package/.next/standalone/.next/server/app/api/avatars/[id]/route.js +9 -0
  47. package/.next/standalone/.next/server/app/api/avatars/[id]/route.js.map +5 -0
  48. package/.next/standalone/.next/server/app/api/avatars/[id]/route.js.nft.json +1 -0
  49. package/.next/standalone/.next/server/app/api/avatars/[id]/route_client-reference-manifest.js +2 -0
  50. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/app-paths-manifest.json +3 -0
  51. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/build-manifest.json +11 -0
  52. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/server-reference-manifest.json +4 -0
  53. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js +9 -0
  54. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js.map +5 -0
  55. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js.nft.json +1 -0
  56. package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route_client-reference-manifest.js +2 -0
  57. package/.next/standalone/.next/server/app/api/openclaw/agents/route/app-paths-manifest.json +3 -0
  58. package/.next/standalone/.next/server/app/api/openclaw/agents/route/build-manifest.json +11 -0
  59. package/.next/standalone/.next/server/app/api/openclaw/agents/route/server-reference-manifest.json +4 -0
  60. package/.next/standalone/.next/server/app/api/openclaw/agents/route.js +9 -0
  61. package/.next/standalone/.next/server/app/api/openclaw/agents/route.js.map +5 -0
  62. package/.next/standalone/.next/server/app/api/openclaw/agents/route.js.nft.json +1 -0
  63. package/.next/standalone/.next/server/app/api/openclaw/agents/route_client-reference-manifest.js +2 -0
  64. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/app-paths-manifest.json +3 -0
  65. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/build-manifest.json +11 -0
  66. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/server-reference-manifest.json +4 -0
  67. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js +13 -0
  68. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js.map +5 -0
  69. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js.nft.json +1 -0
  70. package/.next/standalone/.next/server/app/api/openclaw/agents/status/route_client-reference-manifest.js +2 -0
  71. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/app-paths-manifest.json +3 -0
  72. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/build-manifest.json +11 -0
  73. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/server-reference-manifest.json +4 -0
  74. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js +13 -0
  75. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js.map +5 -0
  76. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js.nft.json +1 -0
  77. package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route_client-reference-manifest.js +2 -0
  78. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/app-paths-manifest.json +3 -0
  79. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/build-manifest.json +11 -0
  80. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/server-reference-manifest.json +4 -0
  81. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js +13 -0
  82. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js.map +5 -0
  83. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js.nft.json +1 -0
  84. package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route_client-reference-manifest.js +2 -0
  85. package/.next/standalone/.next/server/app/api/openclaw/chat/route/app-paths-manifest.json +3 -0
  86. package/.next/standalone/.next/server/app/api/openclaw/chat/route/build-manifest.json +11 -0
  87. package/.next/standalone/.next/server/app/api/openclaw/chat/route/server-reference-manifest.json +4 -0
  88. package/.next/standalone/.next/server/app/api/openclaw/chat/route.js +14 -0
  89. package/.next/standalone/.next/server/app/api/openclaw/chat/route.js.map +5 -0
  90. package/.next/standalone/.next/server/app/api/openclaw/chat/route.js.nft.json +1 -0
  91. package/.next/standalone/.next/server/app/api/openclaw/chat/route_client-reference-manifest.js +2 -0
  92. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/app-paths-manifest.json +3 -0
  93. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/build-manifest.json +11 -0
  94. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/server-reference-manifest.json +4 -0
  95. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js +13 -0
  96. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js.map +5 -0
  97. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js.nft.json +1 -0
  98. package/.next/standalone/.next/server/app/api/openclaw/chat/search/route_client-reference-manifest.js +2 -0
  99. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/app-paths-manifest.json +3 -0
  100. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/build-manifest.json +11 -0
  101. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/server-reference-manifest.json +4 -0
  102. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js +13 -0
  103. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js.map +5 -0
  104. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js.nft.json +1 -0
  105. package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route_client-reference-manifest.js +2 -0
  106. package/.next/standalone/.next/server/app/api/openclaw/config/route/app-paths-manifest.json +3 -0
  107. package/.next/standalone/.next/server/app/api/openclaw/config/route/build-manifest.json +11 -0
  108. package/.next/standalone/.next/server/app/api/openclaw/config/route/server-reference-manifest.json +4 -0
  109. package/.next/standalone/.next/server/app/api/openclaw/config/route.js +9 -0
  110. package/.next/standalone/.next/server/app/api/openclaw/config/route.js.map +5 -0
  111. package/.next/standalone/.next/server/app/api/openclaw/config/route.js.nft.json +1 -0
  112. package/.next/standalone/.next/server/app/api/openclaw/config/route_client-reference-manifest.js +2 -0
  113. package/.next/standalone/.next/server/app/api/openclaw/events/route/app-paths-manifest.json +3 -0
  114. package/.next/standalone/.next/server/app/api/openclaw/events/route/build-manifest.json +11 -0
  115. package/.next/standalone/.next/server/app/api/openclaw/events/route/server-reference-manifest.json +4 -0
  116. package/.next/standalone/.next/server/app/api/openclaw/events/route.js +8 -0
  117. package/.next/standalone/.next/server/app/api/openclaw/events/route.js.map +5 -0
  118. package/.next/standalone/.next/server/app/api/openclaw/events/route.js.nft.json +1 -0
  119. package/.next/standalone/.next/server/app/api/openclaw/events/route_client-reference-manifest.js +2 -0
  120. package/.next/standalone/.next/server/app/api/openclaw/logs/route/app-paths-manifest.json +3 -0
  121. package/.next/standalone/.next/server/app/api/openclaw/logs/route/build-manifest.json +11 -0
  122. package/.next/standalone/.next/server/app/api/openclaw/logs/route/server-reference-manifest.json +4 -0
  123. package/.next/standalone/.next/server/app/api/openclaw/logs/route.js +8 -0
  124. package/.next/standalone/.next/server/app/api/openclaw/logs/route.js.map +5 -0
  125. package/.next/standalone/.next/server/app/api/openclaw/logs/route.js.nft.json +1 -0
  126. package/.next/standalone/.next/server/app/api/openclaw/logs/route_client-reference-manifest.js +2 -0
  127. package/.next/standalone/.next/server/app/api/openclaw/ping/route/app-paths-manifest.json +3 -0
  128. package/.next/standalone/.next/server/app/api/openclaw/ping/route/build-manifest.json +11 -0
  129. package/.next/standalone/.next/server/app/api/openclaw/ping/route/server-reference-manifest.json +4 -0
  130. package/.next/standalone/.next/server/app/api/openclaw/ping/route.js +9 -0
  131. package/.next/standalone/.next/server/app/api/openclaw/ping/route.js.map +5 -0
  132. package/.next/standalone/.next/server/app/api/openclaw/ping/route.js.nft.json +1 -0
  133. package/.next/standalone/.next/server/app/api/openclaw/ping/route_client-reference-manifest.js +2 -0
  134. package/.next/standalone/.next/server/app/api/openclaw/restart/route/app-paths-manifest.json +3 -0
  135. package/.next/standalone/.next/server/app/api/openclaw/restart/route/build-manifest.json +11 -0
  136. package/.next/standalone/.next/server/app/api/openclaw/restart/route/server-reference-manifest.json +4 -0
  137. package/.next/standalone/.next/server/app/api/openclaw/restart/route.js +7 -0
  138. package/.next/standalone/.next/server/app/api/openclaw/restart/route.js.map +5 -0
  139. package/.next/standalone/.next/server/app/api/openclaw/restart/route.js.nft.json +1 -0
  140. package/.next/standalone/.next/server/app/api/openclaw/restart/route_client-reference-manifest.js +2 -0
  141. package/.next/standalone/.next/server/app/api/openclaw/session/context/route/app-paths-manifest.json +3 -0
  142. package/.next/standalone/.next/server/app/api/openclaw/session/context/route/build-manifest.json +11 -0
  143. package/.next/standalone/.next/server/app/api/openclaw/session/context/route/server-reference-manifest.json +4 -0
  144. package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js +14 -0
  145. package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js.map +5 -0
  146. package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js.nft.json +1 -0
  147. package/.next/standalone/.next/server/app/api/openclaw/session/context/route_client-reference-manifest.js +2 -0
  148. package/.next/standalone/.next/server/app/api/openclaw/session/status/route/app-paths-manifest.json +3 -0
  149. package/.next/standalone/.next/server/app/api/openclaw/session/status/route/build-manifest.json +11 -0
  150. package/.next/standalone/.next/server/app/api/openclaw/session/status/route/server-reference-manifest.json +4 -0
  151. package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js +8 -0
  152. package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js.map +5 -0
  153. package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js.nft.json +1 -0
  154. package/.next/standalone/.next/server/app/api/openclaw/session/status/route_client-reference-manifest.js +2 -0
  155. package/.next/standalone/.next/server/app/api/openclaw/sessions/route/app-paths-manifest.json +3 -0
  156. package/.next/standalone/.next/server/app/api/openclaw/sessions/route/build-manifest.json +11 -0
  157. package/.next/standalone/.next/server/app/api/openclaw/sessions/route/server-reference-manifest.json +4 -0
  158. package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js +8 -0
  159. package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js.map +5 -0
  160. package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js.nft.json +1 -0
  161. package/.next/standalone/.next/server/app/api/openclaw/sessions/route_client-reference-manifest.js +2 -0
  162. package/.next/standalone/.next/server/app/api/settings/avatar/route/app-paths-manifest.json +3 -0
  163. package/.next/standalone/.next/server/app/api/settings/avatar/route/build-manifest.json +11 -0
  164. package/.next/standalone/.next/server/app/api/settings/avatar/route/server-reference-manifest.json +4 -0
  165. package/.next/standalone/.next/server/app/api/settings/avatar/route.js +13 -0
  166. package/.next/standalone/.next/server/app/api/settings/avatar/route.js.map +5 -0
  167. package/.next/standalone/.next/server/app/api/settings/avatar/route.js.nft.json +1 -0
  168. package/.next/standalone/.next/server/app/api/settings/avatar/route_client-reference-manifest.js +2 -0
  169. package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  170. package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +11 -0
  171. package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  172. package/.next/standalone/.next/server/app/api/settings/route.js +13 -0
  173. package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
  174. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  175. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +2 -0
  176. package/.next/standalone/.next/server/app/chat/[channelId]/page/app-paths-manifest.json +3 -0
  177. package/.next/standalone/.next/server/app/chat/[channelId]/page/build-manifest.json +17 -0
  178. package/.next/standalone/.next/server/app/chat/[channelId]/page/next-font-manifest.json +11 -0
  179. package/.next/standalone/.next/server/app/chat/[channelId]/page/react-loadable-manifest.json +1 -0
  180. package/.next/standalone/.next/server/app/chat/[channelId]/page/server-reference-manifest.json +4 -0
  181. package/.next/standalone/.next/server/app/chat/[channelId]/page.js +18 -0
  182. package/.next/standalone/.next/server/app/chat/[channelId]/page.js.map +5 -0
  183. package/.next/standalone/.next/server/app/chat/[channelId]/page.js.nft.json +1 -0
  184. package/.next/standalone/.next/server/app/chat/[channelId]/page_client-reference-manifest.js +2 -0
  185. package/.next/standalone/.next/server/app/chat/page/app-paths-manifest.json +3 -0
  186. package/.next/standalone/.next/server/app/chat/page/build-manifest.json +17 -0
  187. package/.next/standalone/.next/server/app/chat/page/next-font-manifest.json +11 -0
  188. package/.next/standalone/.next/server/app/chat/page/react-loadable-manifest.json +1 -0
  189. package/.next/standalone/.next/server/app/chat/page/server-reference-manifest.json +4 -0
  190. package/.next/standalone/.next/server/app/chat/page.js +18 -0
  191. package/.next/standalone/.next/server/app/chat/page.js.map +5 -0
  192. package/.next/standalone/.next/server/app/chat/page.js.nft.json +1 -0
  193. package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +2 -0
  194. package/.next/standalone/.next/server/app/chat.html +1 -0
  195. package/.next/standalone/.next/server/app/chat.meta +15 -0
  196. package/.next/standalone/.next/server/app/chat.rsc +26 -0
  197. package/.next/standalone/.next/server/app/chat.segments/_full.segment.rsc +26 -0
  198. package/.next/standalone/.next/server/app/chat.segments/_head.segment.rsc +6 -0
  199. package/.next/standalone/.next/server/app/chat.segments/_index.segment.rsc +8 -0
  200. package/.next/standalone/.next/server/app/chat.segments/_tree.segment.rsc +4 -0
  201. package/.next/standalone/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +9 -0
  202. package/.next/standalone/.next/server/app/chat.segments/chat.segment.rsc +7 -0
  203. package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +3 -0
  204. package/.next/standalone/.next/server/app/icon.png/route/build-manifest.json +11 -0
  205. package/.next/standalone/.next/server/app/icon.png/route.js +8 -0
  206. package/.next/standalone/.next/server/app/icon.png/route.js.map +5 -0
  207. package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +1 -0
  208. package/.next/standalone/.next/server/app/icon.png.body +0 -0
  209. package/.next/standalone/.next/server/app/icon.png.meta +1 -0
  210. package/.next/standalone/.next/server/app/index.html +1 -0
  211. package/.next/standalone/.next/server/app/index.meta +14 -0
  212. package/.next/standalone/.next/server/app/index.rsc +23 -0
  213. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  214. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +23 -0
  215. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
  216. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +8 -0
  217. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +4 -0
  218. package/.next/standalone/.next/server/app/page/app-paths-manifest.json +3 -0
  219. package/.next/standalone/.next/server/app/page/build-manifest.json +17 -0
  220. package/.next/standalone/.next/server/app/page/next-font-manifest.json +11 -0
  221. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +1 -0
  222. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +4 -0
  223. package/.next/standalone/.next/server/app/page.js +17 -0
  224. package/.next/standalone/.next/server/app/page.js.map +5 -0
  225. package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
  226. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +2 -0
  227. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  228. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +17 -0
  229. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
  230. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  231. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
  232. package/.next/standalone/.next/server/app/settings/page.js +17 -0
  233. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  234. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  235. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +2 -0
  236. package/.next/standalone/.next/server/app/settings.html +1 -0
  237. package/.next/standalone/.next/server/app/settings.meta +15 -0
  238. package/.next/standalone/.next/server/app/settings.rsc +23 -0
  239. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +23 -0
  240. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +6 -0
  241. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +8 -0
  242. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
  243. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +9 -0
  244. package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +4 -0
  245. package/.next/standalone/.next/server/app/ui-kit/page/app-paths-manifest.json +3 -0
  246. package/.next/standalone/.next/server/app/ui-kit/page/build-manifest.json +17 -0
  247. package/.next/standalone/.next/server/app/ui-kit/page/next-font-manifest.json +11 -0
  248. package/.next/standalone/.next/server/app/ui-kit/page/react-loadable-manifest.json +1 -0
  249. package/.next/standalone/.next/server/app/ui-kit/page/server-reference-manifest.json +4 -0
  250. package/.next/standalone/.next/server/app/ui-kit/page.js +17 -0
  251. package/.next/standalone/.next/server/app/ui-kit/page.js.map +5 -0
  252. package/.next/standalone/.next/server/app/ui-kit/page.js.nft.json +1 -0
  253. package/.next/standalone/.next/server/app/ui-kit/page_client-reference-manifest.js +2 -0
  254. package/.next/standalone/.next/server/app/ui-kit.html +1 -0
  255. package/.next/standalone/.next/server/app/ui-kit.meta +15 -0
  256. package/.next/standalone/.next/server/app/ui-kit.rsc +23 -0
  257. package/.next/standalone/.next/server/app/ui-kit.segments/_full.segment.rsc +23 -0
  258. package/.next/standalone/.next/server/app/ui-kit.segments/_head.segment.rsc +6 -0
  259. package/.next/standalone/.next/server/app/ui-kit.segments/_index.segment.rsc +8 -0
  260. package/.next/standalone/.next/server/app/ui-kit.segments/_tree.segment.rsc +4 -0
  261. package/.next/standalone/.next/server/app/ui-kit.segments/ui-kit/__PAGE__.segment.rsc +9 -0
  262. package/.next/standalone/.next/server/app/ui-kit.segments/ui-kit.segment.rsc +4 -0
  263. package/.next/standalone/.next/server/app-paths-manifest.json +29 -0
  264. package/.next/standalone/.next/server/chunks/[externals]_next_dist_a6d89067._.js +3 -0
  265. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2824c41d._.js +3 -0
  266. package/.next/standalone/.next/server/chunks/[root-of-the-server]__28c35c7d._.js +11 -0
  267. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2aa60cfc._.js +3 -0
  268. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e91224f._.js +3 -0
  269. package/.next/standalone/.next/server/chunks/[root-of-the-server]__361bce14._.js +3 -0
  270. package/.next/standalone/.next/server/chunks/[root-of-the-server]__36b434e7._.js +3 -0
  271. package/.next/standalone/.next/server/chunks/[root-of-the-server]__47efedcd._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/[root-of-the-server]__4b157e5a._.js +3 -0
  273. package/.next/standalone/.next/server/chunks/[root-of-the-server]__56815e49._.js +3 -0
  274. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ef29d48._.js +3 -0
  275. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5f6aa90c._.js +3 -0
  276. package/.next/standalone/.next/server/chunks/[root-of-the-server]__7114163c._.js +3 -0
  277. package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f5ebbc3._.js +7 -0
  278. package/.next/standalone/.next/server/chunks/[root-of-the-server]__93758a40._.js +3 -0
  279. package/.next/standalone/.next/server/chunks/[root-of-the-server]__a80a1099._.js +31 -0
  280. package/.next/standalone/.next/server/chunks/[root-of-the-server]__af3cebf7._.js +138 -0
  281. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b3182da1._.js +4 -0
  282. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b39f673e._.js +3 -0
  283. package/.next/standalone/.next/server/chunks/[root-of-the-server]__bbd3b47c._.js +3 -0
  284. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c223b7d3._.js +3 -0
  285. package/.next/standalone/.next/server/chunks/[root-of-the-server]__c7ce1c43._.js +4 -0
  286. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e50da949._.js +3 -0
  287. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f41df55c._.js +3 -0
  288. package/.next/standalone/.next/server/chunks/[root-of-the-server]__faf9ad2e._.js +3 -0
  289. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe76fb40._.js +3 -0
  290. package/.next/standalone/.next/server/chunks/[turbopack]_runtime.js +795 -0
  291. package/.next/standalone/.next/server/chunks/_b137597c._.js +3 -0
  292. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_avatars_[id]_route_actions_21e11acd.js +3 -0
  293. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_[id]_avatar_route_actions_1cb9863b.js +3 -0
  294. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_route_actions_82d135b1.js +3 -0
  295. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_status_route_actions_0b88c8a6.js +3 -0
  296. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_attachments_route_actions_07ce0270.js +3 -0
  297. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_channels_route_actions_945f54a8.js +3 -0
  298. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_route_actions_cd398c8d.js +3 -0
  299. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_search_route_actions_d1599780.js +3 -0
  300. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_storage_route_actions_fd3e7369.js +3 -0
  301. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_config_route_actions_3c2a30de.js +3 -0
  302. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_events_route_actions_24b1acfe.js +3 -0
  303. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_logs_route_actions_151f8335.js +3 -0
  304. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_ping_route_actions_3079a70c.js +3 -0
  305. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_restart_route_actions_25b671bb.js +3 -0
  306. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_session_context_route_actions_14ebc427.js +3 -0
  307. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_session_status_route_actions_060ba4f4.js +3 -0
  308. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_sessions_route_actions_0c00f4a9.js +3 -0
  309. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_avatar_route_actions_e222d284.js +3 -0
  310. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_a476013b.js +3 -0
  311. package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_fa3562e2.js +3 -0
  312. package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_a549359e._.js +3 -0
  313. package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_f8415f57._.js +4 -0
  314. package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_index_d5f6a514.js +3 -0
  315. package/.next/standalone/.next/server/chunks/node_modules_next_1402a1da._.js +17 -0
  316. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_97dac613.js +3 -0
  317. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03219135._.js +3 -0
  318. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f7b131d._.js +3 -0
  319. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1690ee0d._.js +10 -0
  320. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__31de57f6._.js +3 -0
  321. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4e637dc9._.js +3 -0
  322. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__55ece10e._.js +3 -0
  323. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__69f5a83d._.js +3 -0
  324. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js +3 -0
  325. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a5ce2f72._.js +3 -0
  326. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__aecdcbb6._.js +3 -0
  327. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b4ed2322._.js +3 -0
  328. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ca05f4a0._.js +4 -0
  329. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e2f86be8._.js +3 -0
  330. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e375a3a7._.js +3 -0
  331. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ea12eca9._.js +3 -0
  332. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ed06de41._.js +3 -0
  333. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f907a2ce._.js +3 -0
  334. package/.next/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +795 -0
  335. package/.next/standalone/.next/server/chunks/ssr/_0bb5ce6a._.js +3 -0
  336. package/.next/standalone/.next/server/chunks/ssr/_30d6fdaa._.js +3 -0
  337. package/.next/standalone/.next/server/chunks/ssr/_3b2b917b._.js +4 -0
  338. package/.next/standalone/.next/server/chunks/ssr/_3bf0a72b._.js +4 -0
  339. package/.next/standalone/.next/server/chunks/ssr/_539da066._.js +4 -0
  340. package/.next/standalone/.next/server/chunks/ssr/_6caa74c9._.js +3 -0
  341. package/.next/standalone/.next/server/chunks/ssr/_7a67de23._.js +3 -0
  342. package/.next/standalone/.next/server/chunks/ssr/_7b52fbee._.js +3 -0
  343. package/.next/standalone/.next/server/chunks/ssr/_84fe35ec._.js +3 -0
  344. package/.next/standalone/.next/server/chunks/ssr/_ac1c4494._.js +3 -0
  345. package/.next/standalone/.next/server/chunks/ssr/_ca23d3b0._.js +4 -0
  346. package/.next/standalone/.next/server/chunks/ssr/_d04daf62._.js +3 -0
  347. package/.next/standalone/.next/server/chunks/ssr/_e6db8164._.js +4 -0
  348. package/.next/standalone/.next/server/chunks/ssr/_ef4d503b._.js +3 -0
  349. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_75761787.js +3 -0
  350. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_554ec2bf.js +3 -0
  351. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_chat_[channelId]_page_actions_6220414d.js +3 -0
  352. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_chat_page_actions_c92d15a6.js +3 -0
  353. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_page_actions_39d4fc33.js +3 -0
  354. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_840229cd.js +3 -0
  355. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_ui-kit_page_actions_8486bfbd.js +3 -0
  356. package/.next/standalone/.next/server/chunks/ssr/node_modules_45598cbe._.js +6 -0
  357. package/.next/standalone/.next/server/chunks/ssr/node_modules_d3586d0c._.js +3 -0
  358. package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_95f27697._.js +3 -0
  359. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_08570d7f._.js +4 -0
  360. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_65e60196._.js +3 -0
  361. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_681edc0a._.js +6 -0
  362. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_9774470f._.js +3 -0
  363. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js +3 -0
  364. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +3 -0
  365. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_15817684.js +3 -0
  366. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02f39477.js +4 -0
  367. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_f9713a08._.js +3 -0
  368. package/.next/standalone/.next/server/chunks/ssr/src_app_0c8a77b8._.js +3 -0
  369. package/.next/standalone/.next/server/chunks/ssr/src_app_chat_layout_tsx_31cd0231._.js +3 -0
  370. package/.next/standalone/.next/server/chunks/ssr/src_app_chat_layout_tsx_be09920b._.js +3 -0
  371. package/.next/standalone/.next/server/chunks/ssr/src_app_chat_page_tsx_2a0793ad._.js +3 -0
  372. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__25fe7590._.js +15 -0
  373. package/.next/standalone/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_78fa9d6a.js +3 -0
  374. package/.next/standalone/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_99e3e1b8.js +6 -0
  375. package/.next/standalone/.next/server/functions-config-manifest.json +6 -0
  376. package/.next/standalone/.next/server/middleware-build-manifest.js +21 -0
  377. package/.next/standalone/.next/server/middleware-manifest.json +33 -0
  378. package/.next/standalone/.next/server/next-font-manifest.js +1 -0
  379. package/.next/standalone/.next/server/next-font-manifest.json +31 -0
  380. package/.next/standalone/.next/server/pages/404.html +1 -0
  381. package/.next/standalone/.next/server/pages/500.html +2 -0
  382. package/.next/standalone/.next/server/pages-manifest.json +4 -0
  383. package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
  384. package/.next/standalone/.next/server/server-reference-manifest.json +5 -0
  385. package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_buildManifest.js +11 -0
  386. package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_clientMiddlewareManifest.json +6 -0
  387. package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_ssgManifest.js +1 -0
  388. package/.next/standalone/.next/static/chunks/1c362778d42e76b0.js +1 -0
  389. package/.next/standalone/.next/static/chunks/2b48886a383c2e37.js +1 -0
  390. package/.next/standalone/.next/static/chunks/3c2b51fd3ab2ac34.css +3 -0
  391. package/.next/standalone/.next/static/chunks/3fef23e63934711e.js +1 -0
  392. package/.next/standalone/.next/static/chunks/5781c606560d6f13.js +1 -0
  393. package/.next/standalone/.next/static/chunks/5a1105a61e9390f8.js +1 -0
  394. package/.next/standalone/.next/static/chunks/6468938847443ae8.js +1 -0
  395. package/.next/standalone/.next/static/chunks/76c064224d953678.js +4 -0
  396. package/.next/standalone/.next/static/chunks/77868ed664ba62d2.js +1 -0
  397. package/.next/standalone/.next/static/chunks/7de9141b1af425c3.js +1 -0
  398. package/.next/standalone/.next/static/chunks/868f09ea8b0a7649.js +1 -0
  399. package/.next/standalone/.next/static/chunks/97d384ea34b6283a.js +1 -0
  400. package/.next/standalone/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  401. package/.next/standalone/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
  402. package/.next/standalone/.next/static/chunks/afd967a636289a73.js +1 -0
  403. package/.next/standalone/.next/static/chunks/bffbc071b1075ac3.js +1 -0
  404. package/.next/standalone/.next/static/chunks/d11263c7e8894d27.js +1 -0
  405. package/.next/standalone/.next/static/chunks/f1f489dad7e35d90.js +2 -0
  406. package/.next/standalone/.next/static/chunks/turbopack-1da073e19f58dee0.js +4 -0
  407. package/.next/standalone/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  408. package/.next/standalone/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  409. package/.next/standalone/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  410. package/.next/standalone/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  411. package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  412. package/.next/standalone/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  413. package/.next/standalone/.next/static/media/icon.4cc5e0bd.png +0 -0
  414. package/.next/standalone/CHANGELOG.md +194 -0
  415. package/.next/standalone/CONTRIBUTING.md +46 -0
  416. package/.next/standalone/LICENSE +21 -0
  417. package/.next/standalone/README.md +54 -0
  418. package/.next/standalone/SECURITY.md +80 -0
  419. package/.next/standalone/bin/castle.js +193 -0
  420. package/.next/standalone/castle_secrets.py +29 -0
  421. package/.next/standalone/drizzle.config.ts +7 -0
  422. package/.next/standalone/index.js +1 -0
  423. package/.next/standalone/install.ps1 +437 -0
  424. package/.next/standalone/install.sh +780 -0
  425. package/.next/standalone/next.config.ts +9 -0
  426. package/.next/standalone/package-lock.json +8115 -0
  427. package/.next/standalone/package.json +106 -0
  428. package/.next/standalone/postcss.config.mjs +7 -0
  429. package/.next/standalone/server.js +44 -0
  430. package/.next/standalone/src/app/api/avatars/[id]/route.ts +172 -0
  431. package/.next/standalone/src/app/api/openclaw/agents/[id]/avatar/route.ts +216 -0
  432. package/.next/standalone/src/app/api/openclaw/agents/route.ts +149 -0
  433. package/.next/standalone/src/app/api/openclaw/agents/status/route.ts +55 -0
  434. package/.next/standalone/src/app/api/openclaw/chat/attachments/route.ts +230 -0
  435. package/.next/standalone/src/app/api/openclaw/chat/channels/route.ts +217 -0
  436. package/.next/standalone/src/app/api/openclaw/chat/route.ts +283 -0
  437. package/.next/standalone/src/app/api/openclaw/chat/search/route.ts +150 -0
  438. package/.next/standalone/src/app/api/openclaw/chat/storage/route.ts +75 -0
  439. package/.next/standalone/src/app/api/openclaw/config/route.ts +137 -0
  440. package/.next/standalone/src/app/api/openclaw/events/route.ts +140 -0
  441. package/.next/standalone/src/app/api/openclaw/logs/route.ts +74 -0
  442. package/.next/standalone/src/app/api/openclaw/ping/route.ts +73 -0
  443. package/.next/standalone/src/app/api/openclaw/restart/route.ts +73 -0
  444. package/.next/standalone/src/app/api/openclaw/session/context/route.ts +163 -0
  445. package/.next/standalone/src/app/api/openclaw/session/status/route.ts +210 -0
  446. package/.next/standalone/src/app/api/openclaw/sessions/route.ts +64 -0
  447. package/.next/standalone/src/app/api/settings/avatar/route.ts +190 -0
  448. package/.next/standalone/src/app/api/settings/route.ts +88 -0
  449. package/.next/standalone/src/app/chat/[channelId]/error-boundary.tsx +64 -0
  450. package/.next/standalone/src/app/chat/[channelId]/page.tsx +385 -0
  451. package/.next/standalone/src/app/chat/layout.tsx +96 -0
  452. package/.next/standalone/src/app/chat/page.tsx +52 -0
  453. package/.next/standalone/src/app/globals.css +383 -0
  454. package/.next/standalone/src/app/icon.png +0 -0
  455. package/.next/standalone/src/app/layout.tsx +48 -0
  456. package/.next/standalone/src/app/page.tsx +390 -0
  457. package/.next/standalone/src/app/settings/page.tsx +300 -0
  458. package/.next/standalone/src/app/ui-kit/page.tsx +684 -0
  459. package/.next/standalone/src/cli/onboarding.ts +883 -0
  460. package/.next/standalone/src/components/chat/agent-mention-popup.tsx +89 -0
  461. package/.next/standalone/src/components/chat/archived-channels.tsx +190 -0
  462. package/.next/standalone/src/components/chat/channel-list.tsx +140 -0
  463. package/.next/standalone/src/components/chat/chat-input.tsx +328 -0
  464. package/.next/standalone/src/components/chat/create-channel-dialog.tsx +171 -0
  465. package/.next/standalone/src/components/chat/markdown-content.tsx +205 -0
  466. package/.next/standalone/src/components/chat/message-bubble.tsx +168 -0
  467. package/.next/standalone/src/components/chat/message-list.tsx +666 -0
  468. package/.next/standalone/src/components/chat/message-queue.tsx +68 -0
  469. package/.next/standalone/src/components/chat/session-divider.tsx +61 -0
  470. package/.next/standalone/src/components/chat/session-stats-panel.tsx +444 -0
  471. package/.next/standalone/src/components/chat/storage-indicator.tsx +76 -0
  472. package/.next/standalone/src/components/dashboard/agent-status.tsx +107 -0
  473. package/.next/standalone/src/components/dashboard/glass-card.tsx +28 -0
  474. package/.next/standalone/src/components/dashboard/goal-widget.tsx +174 -0
  475. package/.next/standalone/src/components/dashboard/greeting-widget.tsx +78 -0
  476. package/.next/standalone/src/components/dashboard/index.ts +7 -0
  477. package/.next/standalone/src/components/dashboard/stat-widget.tsx +61 -0
  478. package/.next/standalone/src/components/dashboard/stock-widget.tsx +164 -0
  479. package/.next/standalone/src/components/dashboard/weather-widget.tsx +68 -0
  480. package/.next/standalone/src/components/icons/castle-icon.tsx +21 -0
  481. package/.next/standalone/src/components/kanban/index.ts +3 -0
  482. package/.next/standalone/src/components/kanban/kanban-board.tsx +391 -0
  483. package/.next/standalone/src/components/kanban/kanban-card.tsx +137 -0
  484. package/.next/standalone/src/components/kanban/kanban-column.tsx +98 -0
  485. package/.next/standalone/src/components/layout/index.ts +4 -0
  486. package/.next/standalone/src/components/layout/page-header.tsx +20 -0
  487. package/.next/standalone/src/components/layout/sidebar.tsx +209 -0
  488. package/.next/standalone/src/components/layout/theme-toggle.tsx +59 -0
  489. package/.next/standalone/src/components/layout/user-menu.tsx +97 -0
  490. package/.next/standalone/src/components/providers/presence-provider.tsx +8 -0
  491. package/.next/standalone/src/components/providers/search-provider.tsx +110 -0
  492. package/.next/standalone/src/components/search/search-dialog.tsx +269 -0
  493. package/.next/standalone/src/components/ui/alert.tsx +72 -0
  494. package/.next/standalone/src/components/ui/avatar.tsx +89 -0
  495. package/.next/standalone/src/components/ui/badge.tsx +39 -0
  496. package/.next/standalone/src/components/ui/button.tsx +43 -0
  497. package/.next/standalone/src/components/ui/card.tsx +107 -0
  498. package/.next/standalone/src/components/ui/checkbox.tsx +56 -0
  499. package/.next/standalone/src/components/ui/clock.tsx +171 -0
  500. package/.next/standalone/src/components/ui/dialog.tsx +111 -0
  501. package/.next/standalone/src/components/ui/index.ts +34 -0
  502. package/.next/standalone/src/components/ui/input.tsx +112 -0
  503. package/.next/standalone/src/components/ui/option-card.tsx +151 -0
  504. package/.next/standalone/src/components/ui/progress.tsx +103 -0
  505. package/.next/standalone/src/components/ui/radio.tsx +109 -0
  506. package/.next/standalone/src/components/ui/select.tsx +46 -0
  507. package/.next/standalone/src/components/ui/slider.tsx +62 -0
  508. package/.next/standalone/src/components/ui/tabs.tsx +132 -0
  509. package/.next/standalone/src/components/ui/toggle-group.tsx +85 -0
  510. package/.next/standalone/src/components/ui/toggle.tsx +78 -0
  511. package/.next/standalone/src/components/ui/tooltip.tsx +162 -0
  512. package/.next/standalone/src/components/ui/twemoji-text.tsx +37 -0
  513. package/.next/standalone/src/components/ui/uptime.tsx +106 -0
  514. package/.next/standalone/src/lib/api-security.ts +188 -0
  515. package/.next/standalone/src/lib/config.ts +227 -0
  516. package/.next/standalone/src/lib/date-utils.ts +79 -0
  517. package/.next/standalone/src/lib/db/index.ts +652 -0
  518. package/.next/standalone/src/lib/db/queries.ts +1144 -0
  519. package/.next/standalone/src/lib/db/schema.ts +164 -0
  520. package/.next/standalone/src/lib/device-identity.ts +303 -0
  521. package/.next/standalone/src/lib/gateway-connection.ts +649 -0
  522. package/.next/standalone/src/lib/hooks/use-agent-status.ts +251 -0
  523. package/.next/standalone/src/lib/hooks/use-chat.ts +753 -0
  524. package/.next/standalone/src/lib/hooks/use-compaction-events.ts +132 -0
  525. package/.next/standalone/src/lib/hooks/use-context-boundary.ts +82 -0
  526. package/.next/standalone/src/lib/hooks/use-openclaw.ts +185 -0
  527. package/.next/standalone/src/lib/hooks/use-search.ts +114 -0
  528. package/.next/standalone/src/lib/hooks/use-session-stats.ts +60 -0
  529. package/.next/standalone/src/lib/hooks/use-user-settings.ts +46 -0
  530. package/.next/standalone/src/lib/sse-singleton.ts +184 -0
  531. package/.next/standalone/src/lib/types/chat.ts +202 -0
  532. package/.next/standalone/src/lib/types/search.ts +60 -0
  533. package/.next/standalone/src/lib/utils.ts +6 -0
  534. package/.next/standalone/src/middleware.ts +52 -0
  535. package/.next/standalone/tsconfig.json +34 -0
  536. package/.next/standalone/vitest.config.ts +14 -0
  537. package/.next/standalone/vitest.stress.config.ts +14 -0
  538. package/.next/standalone/zizmor.yml +17 -0
  539. package/.next/static/IDGX3MGCjqUE6NQVlug5A/_buildManifest.js +11 -0
  540. package/.next/static/IDGX3MGCjqUE6NQVlug5A/_clientMiddlewareManifest.json +6 -0
  541. package/.next/static/IDGX3MGCjqUE6NQVlug5A/_ssgManifest.js +1 -0
  542. package/.next/static/chunks/1c362778d42e76b0.js +1 -0
  543. package/.next/static/chunks/2b48886a383c2e37.js +1 -0
  544. package/.next/static/chunks/3c2b51fd3ab2ac34.css +3 -0
  545. package/.next/static/chunks/3fef23e63934711e.js +1 -0
  546. package/.next/static/chunks/5781c606560d6f13.js +1 -0
  547. package/.next/static/chunks/5a1105a61e9390f8.js +1 -0
  548. package/.next/static/chunks/6468938847443ae8.js +1 -0
  549. package/.next/static/chunks/76c064224d953678.js +4 -0
  550. package/.next/static/chunks/77868ed664ba62d2.js +1 -0
  551. package/.next/static/chunks/7de9141b1af425c3.js +1 -0
  552. package/.next/static/chunks/868f09ea8b0a7649.js +1 -0
  553. package/.next/static/chunks/97d384ea34b6283a.js +1 -0
  554. package/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  555. package/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
  556. package/.next/static/chunks/afd967a636289a73.js +1 -0
  557. package/.next/static/chunks/bffbc071b1075ac3.js +1 -0
  558. package/.next/static/chunks/d11263c7e8894d27.js +1 -0
  559. package/.next/static/chunks/f1f489dad7e35d90.js +2 -0
  560. package/.next/static/chunks/turbopack-1da073e19f58dee0.js +4 -0
  561. package/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  562. package/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  563. package/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  564. package/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  565. package/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  566. package/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  567. package/.next/static/media/icon.4cc5e0bd.png +0 -0
  568. package/bin/castle.js +17 -0
  569. package/install.ps1 +437 -0
  570. package/install.sh +4 -0
  571. package/next.config.ts +1 -0
  572. package/package.json +6 -1
  573. package/src/cli/onboarding.ts +197 -50
@@ -0,0 +1,666 @@
1
+ "use client";
2
+
3
+ import { useEffect, useLayoutEffect, useRef, useCallback, useState } from "react";
4
+ import { CalendarDays, ChevronUp, Loader2, MessageSquare, Zap } from "lucide-react";
5
+ import { cn } from "@/lib/utils";
6
+ import { MessageBubble } from "./message-bubble";
7
+ import { SessionDivider } from "./session-divider";
8
+ import { useAgentStatus, setAgentActive, getThinkingChannel, USER_STATUS_ID } from "@/lib/hooks/use-agent-status";
9
+ import { formatDate } from "@/lib/date-utils";
10
+ import type { ChatMessage, ChannelSession, StreamingMessage } from "@/lib/types/chat";
11
+ import type { AgentInfo } from "./agent-mention-popup";
12
+
13
+ // ---------------------------------------------------------------------------
14
+ // Build a lightweight fake ChatMessage for the typing-indicator MessageBubble.
15
+ // This avoids a separate component entirely — the indicator IS a MessageBubble.
16
+ function makeIndicatorMessage(agentId: string, agentName?: string): ChatMessage {
17
+ return {
18
+ id: `typing-${agentId}`,
19
+ channelId: "",
20
+ sessionId: null,
21
+ senderType: "agent",
22
+ senderId: agentId,
23
+ senderName: agentName || null,
24
+ content: "",
25
+ status: undefined as never,
26
+ mentionedAgentId: null,
27
+ runId: null,
28
+ sessionKey: null,
29
+ inputTokens: null,
30
+ outputTokens: null,
31
+ createdAt: Date.now(),
32
+ attachments: [],
33
+ reactions: [],
34
+ };
35
+ }
36
+
37
+ interface MessageListProps {
38
+ messages: ChatMessage[];
39
+ sessions?: ChannelSession[];
40
+ loading?: boolean;
41
+ loadingMore?: boolean;
42
+ hasMore?: boolean;
43
+ agents: AgentInfo[];
44
+ userAvatar?: string | null;
45
+ streamingMessages?: Map<string, StreamingMessage>;
46
+ onLoadMore?: () => void;
47
+ /** Whether there are newer messages to load (anchor mode) */
48
+ hasMoreAfter?: boolean;
49
+ /** Callback to load newer messages (anchor mode) */
50
+ onLoadNewer?: () => void;
51
+ /** Whether newer messages are currently loading */
52
+ loadingNewer?: boolean;
53
+ channelId?: string;
54
+ channelName?: string | null;
55
+ channelCreatedAt?: number | null;
56
+ highlightMessageId?: string;
57
+ /** Ref that will be populated with a navigate-between-messages function */
58
+ navigateRef?: React.MutableRefObject<((direction: "up" | "down") => void) | null>;
59
+ /** ID of the oldest message still in the agent's context (compaction boundary) */
60
+ compactionBoundaryMessageId?: string | null;
61
+ /** Total number of compactions in this session */
62
+ compactionCount?: number;
63
+ }
64
+
65
+ export function MessageList({
66
+ messages,
67
+ sessions = [],
68
+ loading,
69
+ loadingMore,
70
+ hasMore,
71
+ agents,
72
+ userAvatar,
73
+ streamingMessages,
74
+ onLoadMore,
75
+ hasMoreAfter,
76
+ onLoadNewer,
77
+ loadingNewer,
78
+ channelId,
79
+ channelName,
80
+ channelCreatedAt,
81
+ highlightMessageId,
82
+ navigateRef,
83
+ compactionBoundaryMessageId,
84
+ compactionCount,
85
+ }: MessageListProps) {
86
+ const { statuses: agentStatuses, getStatus: getAgentStatus } = useAgentStatus();
87
+ const userStatus = getAgentStatus(USER_STATUS_ID);
88
+
89
+ // Clear stale "thinking" status on mount/update.
90
+ // If the agent finished its response while the user was on another page,
91
+ // the SSE listener was closed so setAgentActive() never fired.
92
+ // Detect this by checking if the "thinking" agent already has a completed
93
+ // message after the last user message, and transition them to "active".
94
+ // IMPORTANT: only check agents that are thinking in THIS channel to avoid
95
+ // clearing a thinking status that belongs to a different channel.
96
+ useEffect(() => {
97
+ if (messages.length === 0) return;
98
+ for (const [agentId, status] of Object.entries(agentStatuses)) {
99
+ if (status !== "thinking" || agentId === USER_STATUS_ID) continue;
100
+ // Only clear if the agent is thinking in this specific channel
101
+ const thinkingIn = getThinkingChannel(agentId);
102
+ if (thinkingIn && thinkingIn !== channelId) continue;
103
+ const lastUserIdx = messages.findLastIndex((m) => m.senderType === "user");
104
+ const lastAgentIdx = messages.findLastIndex(
105
+ (m) => m.senderType === "agent" && m.senderId === agentId
106
+ );
107
+ if (lastAgentIdx > lastUserIdx) {
108
+ // Agent already responded — clear the stale "thinking" status
109
+ setAgentActive(agentId);
110
+ }
111
+ }
112
+ }, [messages, agentStatuses, channelId]);
113
+
114
+ const bottomRef = useRef<HTMLDivElement>(null);
115
+ const scrollContainerRef = useRef<HTMLDivElement>(null);
116
+ const contentRef = useRef<HTMLDivElement>(null);
117
+ const isInitialLoad = useRef(true);
118
+ const pinnedToBottom = useRef(true);
119
+ const isLoadingOlder = useRef(false);
120
+ const prevScrollHeightRef = useRef<number>(0);
121
+ const highlightHandled = useRef<string | null>(null);
122
+
123
+ // "Scroll to message start" button — shows when the last agent message
124
+ // extends beyond the viewport so the user can jump to where it began.
125
+ const [showScrollToStart, setShowScrollToStart] = useState(false);
126
+ const lastAgentMsgId = useRef<string | null>(null);
127
+ // Once the user has navigated to a message's start, don't show the button again for it
128
+ const dismissedMsgId = useRef<string | null>(null);
129
+
130
+ // Scroll helper
131
+ const scrollToBottom = useCallback(() => {
132
+ const container = scrollContainerRef.current;
133
+ if (container) {
134
+ container.scrollTop = container.scrollHeight;
135
+ }
136
+ }, []);
137
+
138
+ // Track if user has scrolled away from bottom
139
+ const checkIfPinned = useCallback(() => {
140
+ const container = scrollContainerRef.current;
141
+ if (!container) return;
142
+ const threshold = 50;
143
+ pinnedToBottom.current =
144
+ container.scrollHeight - container.scrollTop - container.clientHeight < threshold;
145
+ }, []);
146
+
147
+ // ResizeObserver: auto-scroll when content OR container size changes while pinned.
148
+ // The container can resize when the input box below shrinks (e.g. text cleared on send).
149
+ // When that happens the browser caps scrollTop and content appears to shift down.
150
+ useEffect(() => {
151
+ const content = contentRef.current;
152
+ const container = scrollContainerRef.current;
153
+ if (!content || !container) return;
154
+
155
+ const observer = new ResizeObserver(() => {
156
+ if (pinnedToBottom.current) {
157
+ scrollToBottom();
158
+ }
159
+ });
160
+ observer.observe(content);
161
+ observer.observe(container);
162
+ return () => observer.disconnect();
163
+ }, [scrollToBottom]);
164
+
165
+ // Initial scroll before paint — skip if we have a highlight target
166
+ useLayoutEffect(() => {
167
+ if (isInitialLoad.current && messages.length > 0) {
168
+ if (!highlightMessageId) {
169
+ pinnedToBottom.current = true;
170
+ scrollToBottom();
171
+ requestAnimationFrame(scrollToBottom);
172
+ }
173
+ isInitialLoad.current = false;
174
+ }
175
+ }, [messages.length, scrollToBottom, highlightMessageId]);
176
+
177
+ // Re-pin to bottom when new messages arrive or streaming changes,
178
+ // but NOT when loading older messages via infinite scroll,
179
+ // and NOT when a highlight target is active.
180
+ useLayoutEffect(() => {
181
+ if (!isInitialLoad.current) {
182
+ if (isLoadingOlder.current) {
183
+ // Restore scroll position after older messages are prepended.
184
+ // The new content pushes everything down, so we adjust scrollTop
185
+ // by the difference in scrollHeight to keep the user at the same spot.
186
+ const container = scrollContainerRef.current;
187
+ if (container && prevScrollHeightRef.current > 0) {
188
+ const newScrollHeight = container.scrollHeight;
189
+ const delta = newScrollHeight - prevScrollHeightRef.current;
190
+ container.scrollTop += delta;
191
+ }
192
+ prevScrollHeightRef.current = 0;
193
+ isLoadingOlder.current = false;
194
+ } else if (highlightMessageId) {
195
+ // Don't auto-pin while a highlight target is active —
196
+ // let the highlight scroll and user scrolling manage pinning.
197
+ } else if (pinnedToBottom.current) {
198
+ // Only re-pin if already pinned (e.g. new incoming message while at bottom).
199
+ // Don't force-pin when user has scrolled away.
200
+ }
201
+ }
202
+ }, [messages, streamingMessages, highlightMessageId]);
203
+
204
+ // EVERY render: if pinned, scroll to bottom BEFORE paint.
205
+ useLayoutEffect(() => {
206
+ if (pinnedToBottom.current) {
207
+ scrollToBottom();
208
+ }
209
+ });
210
+
211
+ // Scroll to highlighted message — MUST be the LAST useLayoutEffect so it
212
+ // runs after all the pinning/scrolling effects above and gets the final say.
213
+ useLayoutEffect(() => {
214
+ if (!highlightMessageId) return;
215
+ if (highlightMessageId === highlightHandled.current) return;
216
+ if (messages.length === 0) return;
217
+
218
+ const el = document.getElementById(`msg-${highlightMessageId}`);
219
+ if (el) {
220
+ highlightHandled.current = highlightMessageId;
221
+ pinnedToBottom.current = false;
222
+ el.scrollIntoView({ behavior: "instant", block: "center" });
223
+ }
224
+ }, [highlightMessageId, messages]);
225
+
226
+ // Track the last agent message ID so we can check if its top is in view.
227
+ // On initial load, auto-dismiss so the button only appears for NEW messages.
228
+ useEffect(() => {
229
+ const lastAgent = [...messages].reverse().find((m) => m.senderType === "agent");
230
+ const prevId = lastAgentMsgId.current;
231
+ lastAgentMsgId.current = lastAgent?.id ?? null;
232
+
233
+ if (!lastAgent) {
234
+ setShowScrollToStart(false);
235
+ } else if (prevId === null) {
236
+ // First time we see messages (page load) — dismiss the current one
237
+ dismissedMsgId.current = lastAgent.id;
238
+ }
239
+ }, [messages]);
240
+
241
+ // Check if the last agent message's top edge is scrolled out of view.
242
+ // Called on every scroll event via handleScroll.
243
+ const checkScrollToStart = useCallback(() => {
244
+ const container = scrollContainerRef.current;
245
+ if (!lastAgentMsgId.current || !container) {
246
+ setShowScrollToStart(false);
247
+ return;
248
+ }
249
+ // Already dismissed for this message — don't show again
250
+ if (dismissedMsgId.current === lastAgentMsgId.current) {
251
+ setShowScrollToStart(false);
252
+ return;
253
+ }
254
+ const el = document.getElementById(`msg-${lastAgentMsgId.current}`);
255
+ if (!el) {
256
+ setShowScrollToStart(false);
257
+ return;
258
+ }
259
+ const containerRect = container.getBoundingClientRect();
260
+ const elRect = el.getBoundingClientRect();
261
+ // Show button when the top of the message is above the container's top edge
262
+ // AND the bottom is still visible (user is reading the message)
263
+ const topAboveView = elRect.top < containerRect.top - 10;
264
+ const bottomStillVisible = elRect.bottom > containerRect.top;
265
+ const shouldShow = topAboveView && bottomStillVisible;
266
+ // If user scrolled to the top of the message, dismiss permanently
267
+ if (!topAboveView && dismissedMsgId.current !== lastAgentMsgId.current) {
268
+ dismissedMsgId.current = lastAgentMsgId.current;
269
+ }
270
+ setShowScrollToStart(shouldShow);
271
+ }, []);
272
+
273
+ // Infinite scroll: up for older messages, down for newer messages
274
+ const handleScroll = useCallback(() => {
275
+ checkIfPinned();
276
+ checkScrollToStart();
277
+ const container = scrollContainerRef.current;
278
+ if (!container) return;
279
+
280
+ const { scrollTop, scrollHeight, clientHeight } = container;
281
+
282
+ // Load older messages when scrolling near the top
283
+ if (scrollTop < 200 && hasMore && !loadingMore && onLoadMore) {
284
+ isLoadingOlder.current = true;
285
+ prevScrollHeightRef.current = scrollHeight;
286
+ pinnedToBottom.current = false;
287
+ onLoadMore();
288
+ }
289
+
290
+ // Load newer messages when scrolling near the bottom (anchor mode)
291
+ const scrollBottom = scrollHeight - scrollTop - clientHeight;
292
+ if (scrollBottom < 100 && hasMoreAfter && !loadingNewer && onLoadNewer) {
293
+ onLoadNewer();
294
+ }
295
+ }, [hasMore, loadingMore, onLoadMore, hasMoreAfter, loadingNewer, onLoadNewer, checkIfPinned, checkScrollToStart]);
296
+
297
+ const getAgentName = (agentId: string) => {
298
+ const agent = agents.find((a) => a.id === agentId);
299
+ return agent?.name;
300
+ };
301
+
302
+ const getAgentAvatar = (agentId: string) => {
303
+ const agent = agents.find((a) => a.id === agentId);
304
+ return agent?.avatar;
305
+ };
306
+
307
+ // Format a date label like Slack does
308
+ const formatDateLabel = (timestamp: number): string => {
309
+ const date = new Date(timestamp);
310
+ const now = new Date();
311
+ const yesterday = new Date(now);
312
+ yesterday.setDate(yesterday.getDate() - 1);
313
+
314
+ const isToday = date.toDateString() === now.toDateString();
315
+ const isYesterday = date.toDateString() === yesterday.toDateString();
316
+
317
+ if (isToday) return "Today";
318
+ if (isYesterday) return "Yesterday";
319
+
320
+ return formatDate(timestamp);
321
+ };
322
+
323
+ // Get the date string (YYYY-MM-DD) for grouping
324
+ const getDateKey = (timestamp: number): string =>
325
+ new Date(timestamp).toDateString();
326
+
327
+ // Group messages and insert date + session dividers
328
+ type GroupItem =
329
+ | ChatMessage
330
+ | { type: "date"; label: string; key: string }
331
+ | { type: "divider"; session: ChannelSession };
332
+
333
+ const groupedContent: GroupItem[] = [];
334
+ let currentDateKey: string | null = null;
335
+ let currentSessionId: string | null = null;
336
+
337
+ const sortedSessions = [...sessions].sort((a, b) => a.startedAt - b.startedAt);
338
+
339
+ for (const message of messages) {
340
+ // Insert date separator when the day changes
341
+ const dateKey = getDateKey(message.createdAt);
342
+ if (dateKey !== currentDateKey) {
343
+ groupedContent.push({
344
+ type: "date",
345
+ label: formatDateLabel(message.createdAt),
346
+ key: dateKey,
347
+ });
348
+ currentDateKey = dateKey;
349
+ }
350
+
351
+ // Insert session divider when session changes
352
+ if (message.sessionId && message.sessionId !== currentSessionId) {
353
+ if (currentSessionId) {
354
+ const endedSession = sortedSessions.find(
355
+ (s) => s.id === currentSessionId && s.endedAt
356
+ );
357
+ if (endedSession) {
358
+ groupedContent.push({ type: "divider", session: endedSession });
359
+ }
360
+ }
361
+ currentSessionId = message.sessionId;
362
+ }
363
+ groupedContent.push(message);
364
+ }
365
+
366
+ // Navigate between messages with Shift+Up/Down (also used by "Start of message" button)
367
+ const navigateToMessage = useCallback(
368
+ (direction: "up" | "down") => {
369
+ const container = scrollContainerRef.current;
370
+ if (!container || messages.length === 0) return;
371
+
372
+ const containerRect = container.getBoundingClientRect();
373
+ const threshold = 10; // px tolerance to avoid sticking on current message
374
+
375
+ if (direction === "up") {
376
+ // Find the last message whose top is above the current viewport top
377
+ for (let i = messages.length - 1; i >= 0; i--) {
378
+ const el = document.getElementById(`msg-${messages[i].id}`);
379
+ if (!el) continue;
380
+ const rect = el.getBoundingClientRect();
381
+ if (rect.top < containerRect.top - threshold) {
382
+ const offset =
383
+ rect.top - containerRect.top + container.scrollTop - 8;
384
+ container.scrollTo({ top: offset, behavior: "smooth" });
385
+ return;
386
+ }
387
+ }
388
+ // Already at the top — scroll to very top
389
+ container.scrollTo({ top: 0, behavior: "smooth" });
390
+ } else {
391
+ // Find the first message whose top is below the current viewport top
392
+ for (let i = 0; i < messages.length; i++) {
393
+ const el = document.getElementById(`msg-${messages[i].id}`);
394
+ if (!el) continue;
395
+ const rect = el.getBoundingClientRect();
396
+ if (rect.top > containerRect.top + threshold) {
397
+ const offset =
398
+ rect.top - containerRect.top + container.scrollTop - 8;
399
+ container.scrollTo({ top: offset, behavior: "smooth" });
400
+ return;
401
+ }
402
+ }
403
+ // Already at the bottom — scroll to very bottom
404
+ container.scrollTo({
405
+ top: container.scrollHeight,
406
+ behavior: "smooth",
407
+ });
408
+ }
409
+ },
410
+ [messages]
411
+ );
412
+
413
+ // Expose navigateToMessage to parent via ref
414
+ useEffect(() => {
415
+ if (navigateRef) {
416
+ navigateRef.current = navigateToMessage;
417
+ }
418
+ return () => {
419
+ if (navigateRef) {
420
+ navigateRef.current = null;
421
+ }
422
+ };
423
+ }, [navigateRef, navigateToMessage]);
424
+
425
+ if (!loading && messages.length === 0 && (!streamingMessages || streamingMessages.size === 0)) {
426
+ return (
427
+ <div className="flex-1 flex items-center justify-center">
428
+ <div className="flex flex-col items-center">
429
+ <MessageSquare className="h-9 w-9 text-foreground-secondary/40 mb-3" />
430
+ <span className="text-sm font-medium text-foreground-secondary">No messages yet</span>
431
+ <span className="text-xs text-foreground-secondary/60 mt-1">Start the conversation</span>
432
+ </div>
433
+ </div>
434
+ );
435
+ }
436
+
437
+ return (
438
+ <div className="flex-1 relative overflow-hidden">
439
+ <div
440
+ ref={scrollContainerRef}
441
+ className="h-full overflow-y-auto flex flex-col"
442
+ onScroll={handleScroll}
443
+ >
444
+ <div className="flex-1" />
445
+ <div ref={contentRef} className="py-[20px] pr-[20px]">
446
+ {/* Loading more indicator */}
447
+ {loadingMore && (
448
+ <div className="flex justify-center py-2">
449
+ <Loader2 className="h-4 w-4 animate-spin text-foreground-secondary" />
450
+ </div>
451
+ )}
452
+
453
+ {hasMore && !loadingMore && (
454
+ <div className="flex justify-center py-2">
455
+ <button
456
+ onClick={onLoadMore}
457
+ className="text-xs text-foreground-secondary hover:text-foreground transition-colors"
458
+ >
459
+ Load older messages
460
+ </button>
461
+ </div>
462
+ )}
463
+
464
+ {/* Channel origin marker — shown when all history is loaded */}
465
+ {!hasMore && channelCreatedAt && (
466
+ <div className="flex flex-col items-center py-8 mb-2">
467
+ <CalendarDays className="h-9 w-9 text-foreground-secondary/40 mb-3" />
468
+ <span className="text-sm font-medium text-foreground-secondary">
469
+ Channel created on {formatDate(new Date(channelCreatedAt).getTime())}
470
+ </span>
471
+ <span className="text-xs text-foreground-secondary/60 mt-1">
472
+ This is the very beginning of the conversation
473
+ </span>
474
+ </div>
475
+ )}
476
+
477
+ {groupedContent.map((item, index) => {
478
+ if ("type" in item) {
479
+ if (item.type === "date") {
480
+ return (
481
+ <div
482
+ key={`date-${item.key}`}
483
+ className="flex items-center gap-3 py-1 my-[30px]"
484
+ >
485
+ <div className="flex-1 h-px bg-border" />
486
+ <span className="text-xs font-medium text-foreground-secondary shrink-0">
487
+ {item.label}
488
+ </span>
489
+ <div className="flex-1 h-px bg-border" />
490
+ </div>
491
+ );
492
+ }
493
+ if (item.type === "divider") {
494
+ return (
495
+ <SessionDivider
496
+ key={`divider-${item.session.id}`}
497
+ session={item.session}
498
+ />
499
+ );
500
+ }
501
+ }
502
+
503
+ const message = item as ChatMessage;
504
+ const agent = message.senderType === "agent"
505
+ ? agents.find((a) => a.id === message.senderId)
506
+ : undefined;
507
+
508
+ // Check if previous item was a message from the same sender (for grouping)
509
+ const prevItem = index > 0 ? groupedContent[index - 1] : null;
510
+ const prevMessage = prevItem && !("type" in prevItem) ? prevItem as ChatMessage : null;
511
+ const isSameSender = prevMessage
512
+ && prevMessage.senderType === message.senderType
513
+ && prevMessage.senderId === message.senderId;
514
+
515
+ // Determine if this message is compacted (before the boundary)
516
+ const isCompacted = compactionBoundaryMessageId
517
+ ? message.id !== compactionBoundaryMessageId &&
518
+ messages.indexOf(message) < messages.findIndex((m) => m.id === compactionBoundaryMessageId)
519
+ : false;
520
+
521
+ // Show compaction divider just before the boundary message
522
+ const showCompactionDivider = compactionBoundaryMessageId === message.id && (compactionCount ?? 0) > 0;
523
+
524
+ return (
525
+ <div key={message.id} id={`msg-${message.id}`}>
526
+ {showCompactionDivider && (
527
+ <div className="flex items-center gap-3 py-1 my-[20px]">
528
+ <div className="flex-1 h-px bg-yellow-500/30" />
529
+ <span className="text-[11px] text-yellow-600 dark:text-yellow-400 shrink-0 flex items-center gap-1.5">
530
+ <Zap className="h-3 w-3" />
531
+ Context compacted ({compactionCount} time{compactionCount !== 1 ? "s" : ""}) — agent has a summary of messages above
532
+ </span>
533
+ <div className="flex-1 h-px bg-yellow-500/30" />
534
+ </div>
535
+ )}
536
+ <div className={cn(isCompacted && "opacity-50")}>
537
+ <MessageBubble
538
+ message={message}
539
+ isAgent={message.senderType === "agent"}
540
+ agentName={agent?.name || getAgentName(message.senderId)}
541
+ agentAvatar={agent?.avatar || getAgentAvatar(message.senderId)}
542
+ userAvatar={userAvatar}
543
+ agents={agents}
544
+ showHeader={!isSameSender}
545
+ agentStatus={message.senderType === "agent" ? getAgentStatus(message.senderId) : undefined}
546
+ userStatus={message.senderType === "user" ? userStatus : undefined}
547
+ highlighted={highlightMessageId === message.id}
548
+ />
549
+ </div>
550
+ </div>
551
+ );
552
+ })}
553
+
554
+ {/* Loading newer messages indicator (anchor mode) */}
555
+ {loadingNewer && (
556
+ <div className="flex justify-center py-2">
557
+ <Loader2 className="h-4 w-4 animate-spin text-foreground-secondary" />
558
+ </div>
559
+ )}
560
+
561
+ {hasMoreAfter && !loadingNewer && (
562
+ <div className="flex justify-center py-2">
563
+ <button
564
+ onClick={onLoadNewer}
565
+ className="text-xs text-foreground-secondary hover:text-foreground transition-colors"
566
+ >
567
+ Load newer messages
568
+ </button>
569
+ </div>
570
+ )}
571
+
572
+ {/* Typing indicator — shows dots until the final message is persisted */}
573
+ {streamingMessages &&
574
+ Array.from(streamingMessages.values())
575
+ .filter((sm) => !messages.some((m) => m.runId === sm.runId && m.senderType === "agent"))
576
+ .map((sm) => (
577
+ <MessageBubble
578
+ key={`streaming-${sm.runId}`}
579
+ message={makeIndicatorMessage(sm.agentId, sm.agentName || getAgentName(sm.agentId))}
580
+ isAgent
581
+ agentName={sm.agentName || getAgentName(sm.agentId)}
582
+ agentAvatar={getAgentAvatar(sm.agentId)}
583
+ agents={agents}
584
+ agentStatus={getAgentStatus(sm.agentId)}
585
+ isTypingIndicator
586
+ />
587
+ ))}
588
+
589
+ {/* Fallback: show dots for agents in "thinking" state without active streaming.
590
+ This covers the case where the user navigated away and came back —
591
+ streamingMessages is empty but the agent status is still "thinking" in the DB.
592
+ We iterate agentStatuses directly instead of the agents prop because the
593
+ agents list (from useOpenClaw) may still be empty on the first render if
594
+ the gateway connection hasn't been confirmed yet. */}
595
+ {Object.entries(agentStatuses)
596
+ .filter(([agentId, status]) => {
597
+ if (status !== "thinking" || agentId === USER_STATUS_ID) return false;
598
+ // Only show indicator for agents thinking in THIS channel
599
+ const thinkingIn = getThinkingChannel(agentId);
600
+ if (thinkingIn && thinkingIn !== channelId) return false;
601
+ // Skip if already shown via streaming messages above
602
+ if (streamingMessages?.size) {
603
+ const alreadyStreaming = Array.from(streamingMessages.values())
604
+ .some((sm) => sm.agentId === agentId);
605
+ if (alreadyStreaming) return false;
606
+ }
607
+ // Skip if agent already responded after the last user message
608
+ const lastUserIdx = messages.findLastIndex((m) => m.senderType === "user");
609
+ const lastAgentIdx = messages.findLastIndex(
610
+ (m) => m.senderType === "agent" && m.senderId === agentId
611
+ );
612
+ if (lastAgentIdx > lastUserIdx) return false;
613
+ return true;
614
+ })
615
+ .map(([agentId]) => {
616
+ // Try to get display info from the agents prop first, then from messages
617
+ const agentInfo = agents.find((a) => a.id === agentId);
618
+ const fallbackName = agentInfo?.name
619
+ || messages.findLast((m) => m.senderType === "agent" && m.senderId === agentId)?.senderName
620
+ || agentId;
621
+ const fallbackAvatar = agentInfo?.avatar ?? null;
622
+ return (
623
+ <MessageBubble
624
+ key={`thinking-${agentId}`}
625
+ message={makeIndicatorMessage(agentId, fallbackName)}
626
+ isAgent
627
+ agentName={fallbackName}
628
+ agentAvatar={fallbackAvatar}
629
+ agents={agents}
630
+ agentStatus={getAgentStatus(agentId)}
631
+ isTypingIndicator
632
+ />
633
+ );
634
+ })}
635
+
636
+ <div ref={bottomRef} />
637
+ </div>
638
+ </div>
639
+
640
+ {/* Scroll to message start — appears when the last agent message's top is out of view */}
641
+ {showScrollToStart && (
642
+ <button
643
+ onClick={() => {
644
+ dismissedMsgId.current = lastAgentMsgId.current;
645
+ setShowScrollToStart(false);
646
+ // Scroll directly to the last agent message's start
647
+ if (lastAgentMsgId.current) {
648
+ const el = document.getElementById(`msg-${lastAgentMsgId.current}`);
649
+ const container = scrollContainerRef.current;
650
+ if (el && container) {
651
+ const containerRect = container.getBoundingClientRect();
652
+ const elRect = el.getBoundingClientRect();
653
+ const offset = elRect.top - containerRect.top + container.scrollTop - 8;
654
+ container.scrollTo({ top: offset, behavior: "smooth" });
655
+ }
656
+ }
657
+ }}
658
+ className="absolute bottom-3 right-0 h-12 w-12 flex items-center justify-center rounded-[var(--radius-sm)] bg-surface border border-border shadow-md text-foreground-secondary hover:text-foreground hover:border-border-hover transition-all cursor-pointer z-10"
659
+ title="Scroll to start of message (Shift+↑)"
660
+ >
661
+ <ChevronUp className="h-5 w-5" />
662
+ </button>
663
+ )}
664
+ </div>
665
+ );
666
+ }