@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.
- package/.next/standalone/.next/BUILD_ID +1 -0
- package/.next/standalone/.next/app-path-routes-manifest.json +29 -0
- package/.next/standalone/.next/build-manifest.json +20 -0
- package/.next/standalone/.next/package.json +1 -0
- package/.next/standalone/.next/prerender-manifest.json +186 -0
- package/.next/standalone/.next/required-server-files.json +322 -0
- package/.next/standalone/.next/routes-manifest.json +213 -0
- package/.next/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/_global-error/page.js +10 -0
- package/.next/standalone/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/_global-error.html +2 -0
- package/.next/standalone/.next/server/app/_global-error.meta +15 -0
- package/.next/standalone/.next/server/app/_global-error.rsc +12 -0
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +12 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/_not-found/page.js +15 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/_not-found.html +1 -0
- package/.next/standalone/.next/server/app/_not-found.meta +16 -0
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route.js +9 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/avatars/[id]/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js +9 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/[id]/avatar/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route.js +9 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js +13 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/agents/status/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js +13 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/attachments/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js +13 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/channels/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route.js +14 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js +13 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/search/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js +13 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/chat/storage/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route.js +9 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/config/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route.js +8 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/events/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route.js +8 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/logs/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route.js +9 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/ping/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route.js +7 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/restart/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js +14 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/context/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js +8 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/session/status/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js +8 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/openclaw/sessions/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route.js +13 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/settings/avatar/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/settings/route.js +13 -0
- package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page.js +18 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page.js.map +5 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/chat/[channelId]/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/chat/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/chat/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/chat/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/chat/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/chat/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/chat/page.js +18 -0
- package/.next/standalone/.next/server/app/chat/page.js.map +5 -0
- package/.next/standalone/.next/server/app/chat/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/chat/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/chat.html +1 -0
- package/.next/standalone/.next/server/app/chat.meta +15 -0
- package/.next/standalone/.next/server/app/chat.rsc +26 -0
- package/.next/standalone/.next/server/app/chat.segments/_full.segment.rsc +26 -0
- package/.next/standalone/.next/server/app/chat.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/chat.segments/_index.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/chat.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/chat.segments/chat.segment.rsc +7 -0
- package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/icon.png/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/icon.png/route.js +8 -0
- package/.next/standalone/.next/server/app/icon.png/route.js.map +5 -0
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/icon.png.body +0 -0
- package/.next/standalone/.next/server/app/icon.png.meta +1 -0
- package/.next/standalone/.next/server/app/index.html +1 -0
- package/.next/standalone/.next/server/app/index.meta +14 -0
- package/.next/standalone/.next/server/app/index.rsc +23 -0
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +23 -0
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/page.js +17 -0
- package/.next/standalone/.next/server/app/page.js.map +5 -0
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/settings/page.js +17 -0
- package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/settings.html +1 -0
- package/.next/standalone/.next/server/app/settings.meta +15 -0
- package/.next/standalone/.next/server/app/settings.rsc +23 -0
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +23 -0
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/ui-kit/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/ui-kit/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/ui-kit/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/ui-kit/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/ui-kit/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/ui-kit/page.js +17 -0
- package/.next/standalone/.next/server/app/ui-kit/page.js.map +5 -0
- package/.next/standalone/.next/server/app/ui-kit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/ui-kit/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/ui-kit.html +1 -0
- package/.next/standalone/.next/server/app/ui-kit.meta +15 -0
- package/.next/standalone/.next/server/app/ui-kit.rsc +23 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/_full.segment.rsc +23 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/_index.segment.rsc +8 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/ui-kit/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/ui-kit.segments/ui-kit.segment.rsc +4 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +29 -0
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_a6d89067._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2824c41d._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__28c35c7d._.js +11 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2aa60cfc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e91224f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__361bce14._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__36b434e7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__47efedcd._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4b157e5a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__56815e49._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5ef29d48._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5f6aa90c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__7114163c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8f5ebbc3._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__93758a40._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__a80a1099._.js +31 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__af3cebf7._.js +138 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b3182da1._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b39f673e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bbd3b47c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c223b7d3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c7ce1c43._.js +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e50da949._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f41df55c._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__faf9ad2e._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fe76fb40._.js +3 -0
- package/.next/standalone/.next/server/chunks/[turbopack]_runtime.js +795 -0
- package/.next/standalone/.next/server/chunks/_b137597c._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_avatars_[id]_route_actions_21e11acd.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_[id]_avatar_route_actions_1cb9863b.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_route_actions_82d135b1.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_agents_status_route_actions_0b88c8a6.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_attachments_route_actions_07ce0270.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_channels_route_actions_945f54a8.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_route_actions_cd398c8d.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_search_route_actions_d1599780.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_chat_storage_route_actions_fd3e7369.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_config_route_actions_3c2a30de.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_events_route_actions_24b1acfe.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_logs_route_actions_151f8335.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_ping_route_actions_3079a70c.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_restart_route_actions_25b671bb.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_session_context_route_actions_14ebc427.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_session_status_route_actions_060ba4f4.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_openclaw_sessions_route_actions_0c00f4a9.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_avatar_route_actions_e222d284.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_a476013b.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_fa3562e2.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_a549359e._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_f8415f57._.js +4 -0
- package/.next/standalone/.next/server/chunks/node_modules_drizzle-orm_index_d5f6a514.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_1402a1da._.js +17 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_97dac613.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03219135._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f7b131d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1690ee0d._.js +10 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__31de57f6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__4e637dc9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__55ece10e._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__69f5a83d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__a5ce2f72._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__aecdcbb6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__b4ed2322._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ca05f4a0._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e2f86be8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__e375a3a7._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ea12eca9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__ed06de41._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__f907a2ce._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +795 -0
- package/.next/standalone/.next/server/chunks/ssr/_0bb5ce6a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_30d6fdaa._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_3b2b917b._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_3bf0a72b._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_539da066._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_6caa74c9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_7a67de23._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_7b52fbee._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_84fe35ec._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_ac1c4494._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_ca23d3b0._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_d04daf62._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_e6db8164._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_ef4d503b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_75761787.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_554ec2bf.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_chat_[channelId]_page_actions_6220414d.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_chat_page_actions_c92d15a6.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_page_actions_39d4fc33.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_840229cd.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_ui-kit_page_actions_8486bfbd.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_45598cbe._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d3586d0c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_95f27697._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_08570d7f._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_65e60196._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_681edc0a._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_9774470f._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_15817684.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02f39477.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_f9713a08._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_0c8a77b8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_chat_layout_tsx_31cd0231._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_chat_layout_tsx_be09920b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_chat_page_tsx_2a0793ad._.js +3 -0
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__25fe7590._.js +15 -0
- package/.next/standalone/.next/server/edge/chunks/node_modules_next_dist_esm_build_templates_edge-wrapper_78fa9d6a.js +3 -0
- package/.next/standalone/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_99e3e1b8.js +6 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +6 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +21 -0
- package/.next/standalone/.next/server/middleware-manifest.json +33 -0
- package/.next/standalone/.next/server/next-font-manifest.js +1 -0
- package/.next/standalone/.next/server/next-font-manifest.json +31 -0
- package/.next/standalone/.next/server/pages/404.html +1 -0
- package/.next/standalone/.next/server/pages/500.html +2 -0
- package/.next/standalone/.next/server/pages-manifest.json +4 -0
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/server-reference-manifest.json +5 -0
- package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_buildManifest.js +11 -0
- package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_clientMiddlewareManifest.json +6 -0
- package/.next/standalone/.next/static/IDGX3MGCjqUE6NQVlug5A/_ssgManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/1c362778d42e76b0.js +1 -0
- package/.next/standalone/.next/static/chunks/2b48886a383c2e37.js +1 -0
- package/.next/standalone/.next/static/chunks/3c2b51fd3ab2ac34.css +3 -0
- package/.next/standalone/.next/static/chunks/3fef23e63934711e.js +1 -0
- package/.next/standalone/.next/static/chunks/5781c606560d6f13.js +1 -0
- package/.next/standalone/.next/static/chunks/5a1105a61e9390f8.js +1 -0
- package/.next/standalone/.next/static/chunks/6468938847443ae8.js +1 -0
- package/.next/standalone/.next/static/chunks/76c064224d953678.js +4 -0
- package/.next/standalone/.next/static/chunks/77868ed664ba62d2.js +1 -0
- package/.next/standalone/.next/static/chunks/7de9141b1af425c3.js +1 -0
- package/.next/standalone/.next/static/chunks/868f09ea8b0a7649.js +1 -0
- package/.next/standalone/.next/static/chunks/97d384ea34b6283a.js +1 -0
- package/.next/standalone/.next/static/chunks/a6dad97d9634a72d.js +1 -0
- package/.next/standalone/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- package/.next/standalone/.next/static/chunks/afd967a636289a73.js +1 -0
- package/.next/standalone/.next/static/chunks/bffbc071b1075ac3.js +1 -0
- package/.next/standalone/.next/static/chunks/d11263c7e8894d27.js +1 -0
- package/.next/standalone/.next/static/chunks/f1f489dad7e35d90.js +2 -0
- package/.next/standalone/.next/static/chunks/turbopack-1da073e19f58dee0.js +4 -0
- package/.next/standalone/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/.next/standalone/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/.next/standalone/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/.next/standalone/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/.next/standalone/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- package/.next/standalone/.next/static/media/icon.4cc5e0bd.png +0 -0
- package/.next/standalone/CHANGELOG.md +194 -0
- package/.next/standalone/CONTRIBUTING.md +46 -0
- package/.next/standalone/LICENSE +21 -0
- package/.next/standalone/README.md +54 -0
- package/.next/standalone/SECURITY.md +80 -0
- package/.next/standalone/bin/castle.js +193 -0
- package/.next/standalone/castle_secrets.py +29 -0
- package/.next/standalone/drizzle.config.ts +7 -0
- package/.next/standalone/index.js +1 -0
- package/.next/standalone/install.ps1 +437 -0
- package/.next/standalone/install.sh +780 -0
- package/.next/standalone/next.config.ts +9 -0
- package/.next/standalone/package-lock.json +8115 -0
- package/.next/standalone/package.json +106 -0
- package/.next/standalone/postcss.config.mjs +7 -0
- package/.next/standalone/server.js +44 -0
- package/.next/standalone/src/app/api/avatars/[id]/route.ts +172 -0
- package/.next/standalone/src/app/api/openclaw/agents/[id]/avatar/route.ts +216 -0
- package/.next/standalone/src/app/api/openclaw/agents/route.ts +149 -0
- package/.next/standalone/src/app/api/openclaw/agents/status/route.ts +55 -0
- package/.next/standalone/src/app/api/openclaw/chat/attachments/route.ts +230 -0
- package/.next/standalone/src/app/api/openclaw/chat/channels/route.ts +217 -0
- package/.next/standalone/src/app/api/openclaw/chat/route.ts +283 -0
- package/.next/standalone/src/app/api/openclaw/chat/search/route.ts +150 -0
- package/.next/standalone/src/app/api/openclaw/chat/storage/route.ts +75 -0
- package/.next/standalone/src/app/api/openclaw/config/route.ts +137 -0
- package/.next/standalone/src/app/api/openclaw/events/route.ts +140 -0
- package/.next/standalone/src/app/api/openclaw/logs/route.ts +74 -0
- package/.next/standalone/src/app/api/openclaw/ping/route.ts +73 -0
- package/.next/standalone/src/app/api/openclaw/restart/route.ts +73 -0
- package/.next/standalone/src/app/api/openclaw/session/context/route.ts +163 -0
- package/.next/standalone/src/app/api/openclaw/session/status/route.ts +210 -0
- package/.next/standalone/src/app/api/openclaw/sessions/route.ts +64 -0
- package/.next/standalone/src/app/api/settings/avatar/route.ts +190 -0
- package/.next/standalone/src/app/api/settings/route.ts +88 -0
- package/.next/standalone/src/app/chat/[channelId]/error-boundary.tsx +64 -0
- package/.next/standalone/src/app/chat/[channelId]/page.tsx +385 -0
- package/.next/standalone/src/app/chat/layout.tsx +96 -0
- package/.next/standalone/src/app/chat/page.tsx +52 -0
- package/.next/standalone/src/app/globals.css +383 -0
- package/.next/standalone/src/app/icon.png +0 -0
- package/.next/standalone/src/app/layout.tsx +48 -0
- package/.next/standalone/src/app/page.tsx +390 -0
- package/.next/standalone/src/app/settings/page.tsx +300 -0
- package/.next/standalone/src/app/ui-kit/page.tsx +684 -0
- package/.next/standalone/src/cli/onboarding.ts +883 -0
- package/.next/standalone/src/components/chat/agent-mention-popup.tsx +89 -0
- package/.next/standalone/src/components/chat/archived-channels.tsx +190 -0
- package/.next/standalone/src/components/chat/channel-list.tsx +140 -0
- package/.next/standalone/src/components/chat/chat-input.tsx +328 -0
- package/.next/standalone/src/components/chat/create-channel-dialog.tsx +171 -0
- package/.next/standalone/src/components/chat/markdown-content.tsx +205 -0
- package/.next/standalone/src/components/chat/message-bubble.tsx +168 -0
- package/.next/standalone/src/components/chat/message-list.tsx +666 -0
- package/.next/standalone/src/components/chat/message-queue.tsx +68 -0
- package/.next/standalone/src/components/chat/session-divider.tsx +61 -0
- package/.next/standalone/src/components/chat/session-stats-panel.tsx +444 -0
- package/.next/standalone/src/components/chat/storage-indicator.tsx +76 -0
- package/.next/standalone/src/components/dashboard/agent-status.tsx +107 -0
- package/.next/standalone/src/components/dashboard/glass-card.tsx +28 -0
- package/.next/standalone/src/components/dashboard/goal-widget.tsx +174 -0
- package/.next/standalone/src/components/dashboard/greeting-widget.tsx +78 -0
- package/.next/standalone/src/components/dashboard/index.ts +7 -0
- package/.next/standalone/src/components/dashboard/stat-widget.tsx +61 -0
- package/.next/standalone/src/components/dashboard/stock-widget.tsx +164 -0
- package/.next/standalone/src/components/dashboard/weather-widget.tsx +68 -0
- package/.next/standalone/src/components/icons/castle-icon.tsx +21 -0
- package/.next/standalone/src/components/kanban/index.ts +3 -0
- package/.next/standalone/src/components/kanban/kanban-board.tsx +391 -0
- package/.next/standalone/src/components/kanban/kanban-card.tsx +137 -0
- package/.next/standalone/src/components/kanban/kanban-column.tsx +98 -0
- package/.next/standalone/src/components/layout/index.ts +4 -0
- package/.next/standalone/src/components/layout/page-header.tsx +20 -0
- package/.next/standalone/src/components/layout/sidebar.tsx +209 -0
- package/.next/standalone/src/components/layout/theme-toggle.tsx +59 -0
- package/.next/standalone/src/components/layout/user-menu.tsx +97 -0
- package/.next/standalone/src/components/providers/presence-provider.tsx +8 -0
- package/.next/standalone/src/components/providers/search-provider.tsx +110 -0
- package/.next/standalone/src/components/search/search-dialog.tsx +269 -0
- package/.next/standalone/src/components/ui/alert.tsx +72 -0
- package/.next/standalone/src/components/ui/avatar.tsx +89 -0
- package/.next/standalone/src/components/ui/badge.tsx +39 -0
- package/.next/standalone/src/components/ui/button.tsx +43 -0
- package/.next/standalone/src/components/ui/card.tsx +107 -0
- package/.next/standalone/src/components/ui/checkbox.tsx +56 -0
- package/.next/standalone/src/components/ui/clock.tsx +171 -0
- package/.next/standalone/src/components/ui/dialog.tsx +111 -0
- package/.next/standalone/src/components/ui/index.ts +34 -0
- package/.next/standalone/src/components/ui/input.tsx +112 -0
- package/.next/standalone/src/components/ui/option-card.tsx +151 -0
- package/.next/standalone/src/components/ui/progress.tsx +103 -0
- package/.next/standalone/src/components/ui/radio.tsx +109 -0
- package/.next/standalone/src/components/ui/select.tsx +46 -0
- package/.next/standalone/src/components/ui/slider.tsx +62 -0
- package/.next/standalone/src/components/ui/tabs.tsx +132 -0
- package/.next/standalone/src/components/ui/toggle-group.tsx +85 -0
- package/.next/standalone/src/components/ui/toggle.tsx +78 -0
- package/.next/standalone/src/components/ui/tooltip.tsx +162 -0
- package/.next/standalone/src/components/ui/twemoji-text.tsx +37 -0
- package/.next/standalone/src/components/ui/uptime.tsx +106 -0
- package/.next/standalone/src/lib/api-security.ts +188 -0
- package/.next/standalone/src/lib/config.ts +227 -0
- package/.next/standalone/src/lib/date-utils.ts +79 -0
- package/.next/standalone/src/lib/db/index.ts +652 -0
- package/.next/standalone/src/lib/db/queries.ts +1144 -0
- package/.next/standalone/src/lib/db/schema.ts +164 -0
- package/.next/standalone/src/lib/device-identity.ts +303 -0
- package/.next/standalone/src/lib/gateway-connection.ts +649 -0
- package/.next/standalone/src/lib/hooks/use-agent-status.ts +251 -0
- package/.next/standalone/src/lib/hooks/use-chat.ts +753 -0
- package/.next/standalone/src/lib/hooks/use-compaction-events.ts +132 -0
- package/.next/standalone/src/lib/hooks/use-context-boundary.ts +82 -0
- package/.next/standalone/src/lib/hooks/use-openclaw.ts +185 -0
- package/.next/standalone/src/lib/hooks/use-search.ts +114 -0
- package/.next/standalone/src/lib/hooks/use-session-stats.ts +60 -0
- package/.next/standalone/src/lib/hooks/use-user-settings.ts +46 -0
- package/.next/standalone/src/lib/sse-singleton.ts +184 -0
- package/.next/standalone/src/lib/types/chat.ts +202 -0
- package/.next/standalone/src/lib/types/search.ts +60 -0
- package/.next/standalone/src/lib/utils.ts +6 -0
- package/.next/standalone/src/middleware.ts +52 -0
- package/.next/standalone/tsconfig.json +34 -0
- package/.next/standalone/vitest.config.ts +14 -0
- package/.next/standalone/vitest.stress.config.ts +14 -0
- package/.next/standalone/zizmor.yml +17 -0
- package/.next/static/IDGX3MGCjqUE6NQVlug5A/_buildManifest.js +11 -0
- package/.next/static/IDGX3MGCjqUE6NQVlug5A/_clientMiddlewareManifest.json +6 -0
- package/.next/static/IDGX3MGCjqUE6NQVlug5A/_ssgManifest.js +1 -0
- package/.next/static/chunks/1c362778d42e76b0.js +1 -0
- package/.next/static/chunks/2b48886a383c2e37.js +1 -0
- package/.next/static/chunks/3c2b51fd3ab2ac34.css +3 -0
- package/.next/static/chunks/3fef23e63934711e.js +1 -0
- package/.next/static/chunks/5781c606560d6f13.js +1 -0
- package/.next/static/chunks/5a1105a61e9390f8.js +1 -0
- package/.next/static/chunks/6468938847443ae8.js +1 -0
- package/.next/static/chunks/76c064224d953678.js +4 -0
- package/.next/static/chunks/77868ed664ba62d2.js +1 -0
- package/.next/static/chunks/7de9141b1af425c3.js +1 -0
- package/.next/static/chunks/868f09ea8b0a7649.js +1 -0
- package/.next/static/chunks/97d384ea34b6283a.js +1 -0
- package/.next/static/chunks/a6dad97d9634a72d.js +1 -0
- package/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- package/.next/static/chunks/afd967a636289a73.js +1 -0
- package/.next/static/chunks/bffbc071b1075ac3.js +1 -0
- package/.next/static/chunks/d11263c7e8894d27.js +1 -0
- package/.next/static/chunks/f1f489dad7e35d90.js +2 -0
- package/.next/static/chunks/turbopack-1da073e19f58dee0.js +4 -0
- package/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- package/.next/static/media/icon.4cc5e0bd.png +0 -0
- package/bin/castle.js +17 -0
- package/install.ps1 +437 -0
- package/install.sh +4 -0
- package/next.config.ts +1 -0
- package/package.json +6 -1
- 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
|
+
}
|