@geminilight/mindos 0.6.69 → 0.6.70
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/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +22 -21
- package/_standalone/.next/build-manifest.json +3 -3
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/react-loadable-manifest.json +7 -7
- package/_standalone/.next/routes-manifest.json +6 -0
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +1 -1
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +1 -1
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +13 -13
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
- package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js +1 -1
- package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +1 -1
- package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +1 -1
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +1 -1
- package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/help/page.js +1 -1
- package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/login/page.js +1 -1
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +1 -1
- package/_standalone/.next/server/app/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/setup/page.js +1 -1
- package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/trash/page.js +3 -3
- package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +22 -21
- package/_standalone/.next/server/chunks/3437.js +2 -2
- package/_standalone/.next/server/chunks/5299.js +1 -0
- package/_standalone/.next/server/chunks/6022.js +42 -42
- package/_standalone/.next/server/chunks/6133.js +54 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8326.js +1 -0
- package/_standalone/.next/server/chunks/8388.js +5 -3
- package/_standalone/.next/server/chunks/953.js +6 -4
- package/_standalone/.next/server/chunks/9938.js +24 -0
- package/_standalone/.next/server/middleware-build-manifest.js +1 -1
- package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
- package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
- package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
- package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
- package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
- package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
- package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
- package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
- package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
- package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
- package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
- package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
- package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
- package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
- package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
- package/_standalone/.next/trace +72 -71
- package/_standalone/.next/types/routes.d.ts +2 -1
- package/_standalone/.next/types/validator.ts +9 -0
- package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
- package/_standalone/__tests__/acp/session.test.ts +346 -167
- package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
- package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
- package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
- package/_standalone/__tests__/api/test-key.test.ts +15 -3
- package/_standalone/__tests__/channel-mgmt.test.js +11 -0
- package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
- package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
- package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
- package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
- package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
- package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
- package/_standalone/components/Breadcrumb.tsx +11 -11
- package/_standalone/components/FindInPage.tsx +1 -1
- package/_standalone/components/MarkdownView.tsx +4 -0
- package/_standalone/components/Panel.tsx +17 -10
- package/_standalone/components/TableOfContents.tsx +9 -9
- package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
- package/_standalone/components/ask/AskContent.tsx +68 -28
- package/_standalone/components/ask/AskHeader.tsx +6 -2
- package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
- package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
- package/_standalone/components/settings/AiTab.tsx +5 -1
- package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
- package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
- package/_standalone/components/settings/McpPortSection.tsx +207 -0
- package/_standalone/components/settings/McpTab.tsx +1 -5
- package/_standalone/components/settings/TestButton.tsx +1 -0
- package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/_standalone/components/settings/types.ts +12 -0
- package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
- package/_standalone/data/skills/mindos/SKILL.md +45 -1
- package/_standalone/hooks/useAcpDetection.ts +1 -1
- package/_standalone/hooks/useAcpRegistry.ts +1 -1
- package/_standalone/hooks/useFileImport.ts +7 -2
- package/_standalone/hooks/useFileUpload.ts +17 -10
- package/_standalone/lib/acp/index.ts +3 -7
- package/_standalone/lib/acp/types.ts +0 -29
- package/_standalone/lib/im/platforms.ts +6 -2
- package/_standalone/lib/pdf-extract.ts +6 -2
- package/_standalone/package-lock.json +12 -2
- package/_standalone/package.json +2 -1
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
- package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
- package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
- package/app/app/api/channels/verify/route.ts +54 -0
- package/app/app/api/extract-pdf/route.ts +17 -3
- package/app/app/api/settings/list-models/route.ts +40 -44
- package/app/app/api/settings/route.ts +16 -0
- package/app/app/api/settings/test-key/route.ts +5 -2
- package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
- package/app/components/Breadcrumb.tsx +11 -11
- package/app/components/DirView.tsx +1 -1
- package/app/components/FindInPage.tsx +1 -1
- package/app/components/InboxView.tsx +2 -2
- package/app/components/MarkdownView.tsx +4 -0
- package/app/components/Panel.tsx +17 -10
- package/app/components/TableOfContents.tsx +9 -9
- package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
- package/app/components/agents/AgentsContentChannels.tsx +22 -22
- package/app/components/ask/AskContent.tsx +68 -28
- package/app/components/ask/AskHeader.tsx +6 -2
- package/app/components/ask/ProviderModelCapsule.tsx +11 -9
- package/app/components/ask/SessionHistoryPanel.tsx +398 -0
- package/app/components/settings/AiTab.tsx +5 -1
- package/app/components/settings/KnowledgeTab.tsx +92 -1
- package/app/components/settings/McpConnectGuides.tsx +4 -0
- package/app/components/settings/McpPortSection.tsx +207 -0
- package/app/components/settings/McpTab.tsx +1 -5
- package/app/components/settings/TestButton.tsx +1 -0
- package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
- package/app/components/settings/types.ts +12 -0
- package/app/components/settings/useCustomProviderForm.ts +2 -2
- package/app/data/skills/mindos/SKILL.md +45 -1
- package/app/hooks/useAcpDetection.ts +1 -1
- package/app/hooks/useAcpRegistry.ts +1 -1
- package/app/hooks/useFileImport.ts +7 -2
- package/app/hooks/useFileUpload.ts +17 -10
- package/app/lib/acp/agent-descriptors.ts +18 -0
- package/app/lib/acp/index.ts +3 -7
- package/app/lib/acp/registry.ts +1 -1
- package/app/lib/acp/session.ts +237 -530
- package/app/lib/acp/subprocess.ts +224 -427
- package/app/lib/acp/types.ts +0 -29
- package/app/lib/agent/model.ts +20 -4
- package/app/lib/agent/non-streaming.ts +37 -20
- package/app/lib/agent/providers.ts +31 -0
- package/app/lib/agent/tools.ts +2 -1
- package/app/lib/core/embedding-index.ts +285 -0
- package/app/lib/core/embedding-provider.ts +164 -0
- package/app/lib/core/hybrid-search.ts +160 -0
- package/app/lib/core/search.ts +11 -21
- package/app/lib/i18n/modules/ai-chat.ts +26 -0
- package/app/lib/i18n/modules/panels.ts +14 -0
- package/app/lib/i18n/modules/settings.ts +2 -0
- package/app/lib/im/platforms.ts +6 -2
- package/app/lib/im/verify.ts +94 -0
- package/app/lib/pdf-extract.ts +6 -2
- package/app/lib/settings.ts +23 -0
- package/app/package.json +2 -1
- package/bin/cli.js +3 -1
- package/bin/commands/channel.js +342 -0
- package/bin/commands/update.js +11 -4
- package/bin/lib/build.js +34 -16
- package/bin/lib/channel-config.js +168 -0
- package/bin/lib/channel-constants.js +88 -0
- package/bin/lib/channel-mgmt.js +244 -0
- package/bin/lib/channel-prompts.js +72 -0
- package/bin/lib/channel-validate.js +57 -0
- package/bin/lib/safe-rm.js +165 -0
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +45 -1
- package/_standalone/.next/server/chunks/1750.js +0 -1
- package/_standalone/.next/server/chunks/7200.js +0 -52
- package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
- package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
- package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
- package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
- package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
- package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
- package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
- package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
- package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
- package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
- package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
- package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
- package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
- package/app/lib/core/synonym-dict.ts +0 -139
- /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,7 @@ import { useState, useEffect, useCallback } from 'react';
|
|
|
4
4
|
import Link from 'next/link';
|
|
5
5
|
import {
|
|
6
6
|
ArrowLeft, CheckCircle2, XCircle, Loader2, Send,
|
|
7
|
-
Eye, EyeOff, Settings2, Trash2, AlertTriangle, AlertCircle, RefreshCw,
|
|
7
|
+
Eye, EyeOff, Settings2, Trash2, AlertTriangle, AlertCircle, RefreshCw, ExternalLink,
|
|
8
8
|
} from 'lucide-react';
|
|
9
9
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
10
10
|
import { getPlatform, type PlatformDef, type PlatformStatus } from '@/lib/im/platforms';
|
|
@@ -40,13 +40,15 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
40
40
|
setError(false);
|
|
41
41
|
try {
|
|
42
42
|
const res = await fetch('/api/im/status');
|
|
43
|
-
if (res.ok) {
|
|
44
|
-
const data = await res.json();
|
|
45
|
-
const platforms: PlatformStatus[] = data.platforms ?? [];
|
|
46
|
-
setStatus(platforms.find(s => s.platform === platformId) ?? null);
|
|
47
|
-
} else {
|
|
43
|
+
if (!res.ok) {
|
|
48
44
|
setError(true);
|
|
45
|
+
setLoading(false);
|
|
46
|
+
return;
|
|
49
47
|
}
|
|
48
|
+
|
|
49
|
+
const data = await res.json();
|
|
50
|
+
const platforms: PlatformStatus[] = data.platforms ?? [];
|
|
51
|
+
setStatus(platforms.find(s => s.platform === platformId) ?? null);
|
|
50
52
|
} catch {
|
|
51
53
|
setError(true);
|
|
52
54
|
}
|
|
@@ -67,6 +69,7 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
const isConnected = status?.connected ?? false;
|
|
72
|
+
const hasExistingCredentials = isConnected;
|
|
70
73
|
|
|
71
74
|
const handleSave = async () => {
|
|
72
75
|
setSaving(true);
|
|
@@ -166,19 +169,19 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
166
169
|
</Link>
|
|
167
170
|
|
|
168
171
|
{/* Platform header */}
|
|
169
|
-
<div className="flex items-
|
|
170
|
-
<span className="text-
|
|
171
|
-
<div>
|
|
172
|
-
<h2 className="text-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
<
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
im.notConfigured
|
|
180
|
-
|
|
181
|
-
|
|
172
|
+
<div className="flex items-start gap-3 mb-6">
|
|
173
|
+
<span className="text-3xl shrink-0">{platform.icon}</span>
|
|
174
|
+
<div className="flex-1">
|
|
175
|
+
<h2 className="text-xl font-semibold text-foreground">{platform.name}</h2>
|
|
176
|
+
{isConnected ? (
|
|
177
|
+
<span className="inline-flex items-center gap-1.5 mt-1 text-xs font-medium px-2 py-0.5 rounded-md bg-success/10 text-success">
|
|
178
|
+
<CheckCircle2 size={14} /> {im.statusConnected}
|
|
179
|
+
</span>
|
|
180
|
+
) : (
|
|
181
|
+
<span className="inline-flex items-center gap-1.5 mt-1 text-xs font-medium px-2 py-0.5 rounded-md bg-muted text-muted-foreground">
|
|
182
|
+
{im.notConfigured}
|
|
183
|
+
</span>
|
|
184
|
+
)}
|
|
182
185
|
</div>
|
|
183
186
|
</div>
|
|
184
187
|
|
|
@@ -186,60 +189,133 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
186
189
|
/* ─── Connected View ─── */
|
|
187
190
|
<div className="flex flex-col gap-6">
|
|
188
191
|
{/* Status info */}
|
|
189
|
-
<div className="rounded-lg border border-border bg-
|
|
192
|
+
<div className="rounded-lg border border-border bg-muted/30 p-4 shadow-sm">
|
|
190
193
|
<h3 className="text-sm font-medium text-foreground mb-3">{im.tabStatus}</h3>
|
|
191
194
|
{status?.botName && (
|
|
192
|
-
<div className="flex items-center gap-2 mb-
|
|
193
|
-
<span className="text-
|
|
195
|
+
<div className="flex items-center gap-2 mb-3">
|
|
196
|
+
<span className="text-xs font-medium text-muted-foreground">Bot</span>
|
|
194
197
|
<span className="text-sm text-foreground font-mono">{status.botName}</span>
|
|
195
198
|
</div>
|
|
196
199
|
)}
|
|
197
200
|
{status?.capabilities && status.capabilities.length > 0 && (
|
|
198
201
|
<div className="flex flex-wrap gap-1.5">
|
|
199
202
|
{status.capabilities.map(cap => (
|
|
200
|
-
<span key={cap} className="text-
|
|
203
|
+
<span key={cap} className="text-xs px-2 py-1 rounded-md bg-muted text-muted-foreground">{cap}</span>
|
|
201
204
|
))}
|
|
202
205
|
</div>
|
|
203
206
|
)}
|
|
204
207
|
</div>
|
|
205
208
|
|
|
209
|
+
{/* Credential update */}
|
|
210
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
211
|
+
<h3 className="text-sm font-medium text-foreground mb-2">{im.editCredentials}</h3>
|
|
212
|
+
<p className="text-sm text-muted-foreground leading-6 mb-4 max-w-prose">{platform.editHint || im.editCredentialsHint}</p>
|
|
213
|
+
{hasExistingCredentials && (
|
|
214
|
+
<p className="text-xs text-muted-foreground/80 leading-5 mb-4 max-w-prose">{im.savedValuesHint}</p>
|
|
215
|
+
)}
|
|
216
|
+
<div className="flex flex-col gap-4">
|
|
217
|
+
{platform.fields.map(field => (
|
|
218
|
+
<div key={field.key} className="flex flex-col gap-1.5">
|
|
219
|
+
<label className="text-xs font-medium text-muted-foreground">
|
|
220
|
+
{field.label}
|
|
221
|
+
<span className="text-muted-foreground/50 font-normal"> ({im.required})</span>
|
|
222
|
+
</label>
|
|
223
|
+
<div className="relative">
|
|
224
|
+
<input
|
|
225
|
+
type={showSecrets ? 'text' : 'password'}
|
|
226
|
+
placeholder={field.placeholder}
|
|
227
|
+
value={formValues[field.key] ?? ''}
|
|
228
|
+
onChange={e => setFormValues(prev => ({ ...prev, [field.key]: e.target.value }))}
|
|
229
|
+
className="h-11 w-full px-3 pr-10 text-sm font-mono bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
230
|
+
autoComplete="off"
|
|
231
|
+
aria-required="true"
|
|
232
|
+
aria-describedby={field.hint ? `connected-hint-${field.key}` : undefined}
|
|
233
|
+
/>
|
|
234
|
+
<button
|
|
235
|
+
type="button"
|
|
236
|
+
onClick={() => setShowSecrets(!showSecrets)}
|
|
237
|
+
className="absolute right-2.5 top-1/2 -translate-y-1/2 p-1.5 text-muted-foreground hover:text-foreground rounded transition-colors"
|
|
238
|
+
aria-label={showSecrets ? im.hideSecret : im.showSecret}
|
|
239
|
+
title={showSecrets ? im.hideSecret : im.showSecret}
|
|
240
|
+
>
|
|
241
|
+
{showSecrets ? <EyeOff size={16} /> : <Eye size={16} />}
|
|
242
|
+
</button>
|
|
243
|
+
</div>
|
|
244
|
+
{field.hint && (
|
|
245
|
+
<span id={`connected-hint-${field.key}`} className="text-xs text-muted-foreground">{field.hint}</span>
|
|
246
|
+
)}
|
|
247
|
+
</div>
|
|
248
|
+
))}
|
|
249
|
+
<div className="flex items-center gap-3 pt-1">
|
|
250
|
+
<button
|
|
251
|
+
type="button"
|
|
252
|
+
onClick={handleSave}
|
|
253
|
+
disabled={saving || !isFormComplete}
|
|
254
|
+
className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
|
|
255
|
+
aria-label={saving ? im.saving : im.saveConfig}
|
|
256
|
+
>
|
|
257
|
+
{saving ? <Loader2 size={14} className="animate-spin" /> : <Settings2 size={14} />}
|
|
258
|
+
{saving ? im.saving : im.saveConfig}
|
|
259
|
+
</button>
|
|
260
|
+
</div>
|
|
261
|
+
{saveResult && (
|
|
262
|
+
<div
|
|
263
|
+
role="alert"
|
|
264
|
+
aria-live="polite"
|
|
265
|
+
className={`flex items-start gap-1.5 text-sm ${saveResult.ok ? 'text-success' : 'text-error'}`}
|
|
266
|
+
>
|
|
267
|
+
{saveResult.ok ? <CheckCircle2 size={16} className="shrink-0 mt-0.5" /> : <XCircle size={16} className="shrink-0 mt-0.5" />}
|
|
268
|
+
<span className="break-all">{saveResult.msg}</span>
|
|
269
|
+
</div>
|
|
270
|
+
)}
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
|
|
206
274
|
{/* Test send */}
|
|
207
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
275
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
208
276
|
<h3 className="text-sm font-medium text-foreground mb-3">{im.testSend}</h3>
|
|
209
277
|
<div className="flex flex-col gap-3">
|
|
210
278
|
<div>
|
|
211
|
-
<label className="text-
|
|
279
|
+
<label className="text-xs font-medium text-muted-foreground block mb-1.5">{im.recipientPlaceholder}</label>
|
|
212
280
|
<input
|
|
213
281
|
type="text"
|
|
214
282
|
placeholder={im.recipientPlaceholder}
|
|
215
283
|
value={testRecipient}
|
|
216
284
|
onChange={e => setTestRecipient(e.target.value)}
|
|
217
|
-
className="h-
|
|
285
|
+
className="h-11 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
286
|
+
aria-label={im.recipientPlaceholder}
|
|
218
287
|
/>
|
|
288
|
+
<p className="text-xs text-muted-foreground mt-1.5 leading-5">{im.recipientHint}</p>
|
|
219
289
|
</div>
|
|
220
290
|
<div>
|
|
221
|
-
<label className="text-
|
|
291
|
+
<label className="text-xs font-medium text-muted-foreground block mb-1.5">{im.messagePlaceholder}</label>
|
|
222
292
|
<input
|
|
223
293
|
type="text"
|
|
224
294
|
placeholder={im.messagePlaceholder}
|
|
225
295
|
value={testMsg}
|
|
226
296
|
onChange={e => setTestMsg(e.target.value)}
|
|
227
|
-
className="h-
|
|
297
|
+
className="h-11 w-full px-3 text-sm bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
298
|
+
aria-label={im.messagePlaceholder}
|
|
228
299
|
/>
|
|
229
300
|
</div>
|
|
230
|
-
<div className="flex items-center gap-3">
|
|
301
|
+
<div className="flex items-center gap-3 pt-1">
|
|
231
302
|
<button
|
|
232
303
|
type="button"
|
|
233
304
|
onClick={handleTest}
|
|
234
305
|
disabled={testStatus === 'sending' || !testRecipient.trim()}
|
|
235
|
-
className="h-
|
|
306
|
+
className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
|
|
307
|
+
aria-label={im.sendTest}
|
|
236
308
|
>
|
|
237
309
|
{testStatus === 'sending' ? <Loader2 size={14} className="animate-spin" /> : <Send size={14} />}
|
|
238
310
|
{im.sendTest}
|
|
239
311
|
</button>
|
|
240
312
|
</div>
|
|
241
313
|
{testResult && (
|
|
242
|
-
<div
|
|
314
|
+
<div
|
|
315
|
+
role="alert"
|
|
316
|
+
aria-live="polite"
|
|
317
|
+
className={`flex items-start gap-1.5 text-sm ${testStatus === 'success' ? 'text-success' : 'text-error'}`}
|
|
318
|
+
>
|
|
243
319
|
{testStatus === 'success' ? <CheckCircle2 size={16} className="shrink-0 mt-0.5" /> : <XCircle size={16} className="shrink-0 mt-0.5" />}
|
|
244
320
|
<span className="break-all">{testResult}</span>
|
|
245
321
|
</div>
|
|
@@ -248,18 +324,19 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
248
324
|
</div>
|
|
249
325
|
|
|
250
326
|
{/* Disconnect */}
|
|
251
|
-
<div className="rounded-lg border border-error/20 bg-card p-4">
|
|
327
|
+
<div className="rounded-lg border border-error/20 bg-card p-4 shadow-sm">
|
|
252
328
|
<h3 className="text-sm font-medium text-foreground mb-2">{im.disconnect}</h3>
|
|
253
|
-
<p className="text-
|
|
329
|
+
<p className="text-xs text-muted-foreground mb-3">{im.disconnectHint}</p>
|
|
254
330
|
<button
|
|
255
331
|
type="button"
|
|
256
332
|
onClick={handleDisconnect}
|
|
257
333
|
disabled={deleting}
|
|
258
|
-
className={`h-
|
|
334
|
+
className={`h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 border transition-colors ${
|
|
259
335
|
confirmDelete
|
|
260
336
|
? 'text-error border-error/40 bg-error/5 hover:bg-error/10'
|
|
261
337
|
: 'text-muted-foreground border-border hover:text-error hover:border-error/30'
|
|
262
338
|
}`}
|
|
339
|
+
aria-label={im.disconnect}
|
|
263
340
|
>
|
|
264
341
|
{deleting ? <Loader2 size={14} className="animate-spin" />
|
|
265
342
|
: confirmDelete ? <><AlertTriangle size={14} /> {im.confirmDisconnect}</>
|
|
@@ -270,60 +347,97 @@ export default function AgentsContentChannelDetail({ platformId }: { platformId:
|
|
|
270
347
|
</div>
|
|
271
348
|
) : (
|
|
272
349
|
/* ─── Not Configured View ─── */
|
|
273
|
-
<div className="flex flex-col gap-
|
|
350
|
+
<div className="flex flex-col gap-6">
|
|
274
351
|
{/* Guide */}
|
|
275
352
|
{platform.guide && (
|
|
276
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
277
|
-
<
|
|
278
|
-
|
|
279
|
-
{platform.
|
|
353
|
+
<div className="rounded-lg border border-border border-l-4 border-l-[var(--amber)] bg-card p-4 shadow-sm">
|
|
354
|
+
<div className="flex items-start justify-between gap-3 mb-3">
|
|
355
|
+
<h3 className="text-sm font-medium text-foreground">{im.setupGuide}</h3>
|
|
356
|
+
{platform.guideUrl && (
|
|
357
|
+
<Link
|
|
358
|
+
href={platform.guideUrl}
|
|
359
|
+
target="_blank"
|
|
360
|
+
rel="noreferrer"
|
|
361
|
+
className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs bg-[var(--amber-dim)] text-[var(--amber)] hover:bg-[var(--amber-dim)]/80 shrink-0 transition-colors"
|
|
362
|
+
>
|
|
363
|
+
{im.guideLink}
|
|
364
|
+
<ExternalLink size={12} />
|
|
365
|
+
</Link>
|
|
366
|
+
)}
|
|
367
|
+
</div>
|
|
368
|
+
<div className="text-sm text-muted-foreground leading-7 space-y-1.5 max-w-prose">
|
|
369
|
+
{platform.guide.split('\n').map((line, idx) => (
|
|
370
|
+
<div key={idx}>{line}</div>
|
|
371
|
+
))}
|
|
280
372
|
</div>
|
|
281
373
|
</div>
|
|
282
374
|
)}
|
|
283
375
|
|
|
284
376
|
{/* Credential form */}
|
|
285
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
286
|
-
<h3 className="text-sm font-medium text-foreground mb-
|
|
287
|
-
<div className="flex flex-col gap-
|
|
377
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
378
|
+
<h3 className="text-sm font-medium text-foreground mb-4">{im.tabConfigure}</h3>
|
|
379
|
+
<div className="flex flex-col gap-4">
|
|
288
380
|
{platform.fields.map(field => (
|
|
289
|
-
<div key={field.key} className="flex flex-col gap-1">
|
|
290
|
-
<label className="text-
|
|
381
|
+
<div key={field.key} className="flex flex-col gap-1.5">
|
|
382
|
+
<label className="text-xs font-medium text-muted-foreground">
|
|
383
|
+
{field.label}
|
|
384
|
+
<span className="text-muted-foreground/50 font-normal"> ({im.required})</span>
|
|
385
|
+
</label>
|
|
291
386
|
<div className="relative">
|
|
292
387
|
<input
|
|
293
388
|
type={showSecrets ? 'text' : 'password'}
|
|
294
389
|
placeholder={field.placeholder}
|
|
295
390
|
value={formValues[field.key] ?? ''}
|
|
296
391
|
onChange={e => setFormValues(prev => ({ ...prev, [field.key]: e.target.value }))}
|
|
297
|
-
className="h-
|
|
392
|
+
className="h-11 w-full px-3 pr-10 text-sm font-mono bg-background border border-border rounded-md focus:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
298
393
|
autoComplete="off"
|
|
394
|
+
aria-required="true"
|
|
395
|
+
aria-describedby={field.hint ? `hint-${field.key}` : undefined}
|
|
299
396
|
/>
|
|
300
397
|
<button
|
|
301
398
|
type="button"
|
|
302
399
|
onClick={() => setShowSecrets(!showSecrets)}
|
|
303
|
-
className="absolute right-2 top-1/2 -translate-y-1/2 p-
|
|
400
|
+
className="absolute right-2.5 top-1/2 -translate-y-1/2 p-1.5 text-muted-foreground hover:text-foreground rounded transition-colors"
|
|
304
401
|
aria-label={showSecrets ? im.hideSecret : im.showSecret}
|
|
402
|
+
title={showSecrets ? im.hideSecret : im.showSecret}
|
|
305
403
|
>
|
|
306
|
-
{showSecrets ? <EyeOff size={
|
|
404
|
+
{showSecrets ? <EyeOff size={16} /> : <Eye size={16} />}
|
|
307
405
|
</button>
|
|
308
406
|
</div>
|
|
309
|
-
{field.hint &&
|
|
407
|
+
{field.hint && (
|
|
408
|
+
<span id={`hint-${field.key}`} className="text-xs text-muted-foreground">{field.hint}</span>
|
|
409
|
+
)}
|
|
310
410
|
</div>
|
|
311
411
|
))}
|
|
312
|
-
<div className="flex items-center gap-3 pt-
|
|
412
|
+
<div className="flex items-center gap-3 pt-2">
|
|
313
413
|
<button
|
|
314
414
|
type="button"
|
|
315
415
|
onClick={handleSave}
|
|
316
416
|
disabled={saving || !isFormComplete}
|
|
317
|
-
className="h-
|
|
417
|
+
className="h-11 px-4 text-sm rounded-md inline-flex items-center gap-1.5 bg-[var(--amber)] text-[var(--amber-foreground)] shadow-sm hover:opacity-90 hover:shadow disabled:opacity-50 disabled:cursor-not-allowed transition-all"
|
|
418
|
+
aria-label={saving ? im.saving : im.saveConfig}
|
|
318
419
|
>
|
|
319
420
|
{saving ? <Loader2 size={14} className="animate-spin" /> : <Settings2 size={14} />}
|
|
320
|
-
{im.saveConfig}
|
|
421
|
+
{saving ? im.saving : im.saveConfig}
|
|
321
422
|
</button>
|
|
322
423
|
</div>
|
|
323
424
|
{saveResult && (
|
|
324
|
-
<div
|
|
325
|
-
|
|
326
|
-
|
|
425
|
+
<div
|
|
426
|
+
role="alert"
|
|
427
|
+
aria-live="polite"
|
|
428
|
+
className={`flex items-start gap-1.5 text-sm ${saveResult.ok ? 'text-success' : 'text-error'}`}
|
|
429
|
+
>
|
|
430
|
+
{saveResult.ok ? (
|
|
431
|
+
<>
|
|
432
|
+
<CheckCircle2 size={16} className="shrink-0 mt-0.5" />
|
|
433
|
+
<span className="break-all">{saveResult.msg}</span>
|
|
434
|
+
</>
|
|
435
|
+
) : (
|
|
436
|
+
<>
|
|
437
|
+
<XCircle size={16} className="shrink-0 mt-0.5" />
|
|
438
|
+
<span className="break-all">{saveResult.msg}</span>
|
|
439
|
+
</>
|
|
440
|
+
)}
|
|
327
441
|
</div>
|
|
328
442
|
)}
|
|
329
443
|
</div>
|
|
@@ -80,22 +80,22 @@ function ChannelsOverview() {
|
|
|
80
80
|
const getStatus = (id: string) => statuses.find(s => s.platform === id);
|
|
81
81
|
|
|
82
82
|
return (
|
|
83
|
-
<div className="max-w-
|
|
83
|
+
<div className="max-w-4xl">
|
|
84
84
|
{/* Stats row */}
|
|
85
|
-
<div className="grid grid-cols-3 gap-4 mb-8">
|
|
86
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
87
|
-
<div className="text-
|
|
88
|
-
<div className="text-
|
|
89
|
-
{connected}<span className="text-sm text-muted-foreground font-normal">/{total}</span>
|
|
85
|
+
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 mb-8">
|
|
86
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
87
|
+
<div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsConnected}</div>
|
|
88
|
+
<div className="text-3xl font-semibold text-foreground tabular-nums">
|
|
89
|
+
{connected}<span className="text-sm text-muted-foreground font-normal ml-1">/ {total}</span>
|
|
90
90
|
</div>
|
|
91
91
|
</div>
|
|
92
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
93
|
-
<div className="text-
|
|
94
|
-
<div className="text-
|
|
92
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
93
|
+
<div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsSupported}</div>
|
|
94
|
+
<div className="text-3xl font-semibold text-foreground tabular-nums">{total}</div>
|
|
95
95
|
</div>
|
|
96
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
97
|
-
<div className="text-
|
|
98
|
-
<div className="text-sm text-foreground
|
|
96
|
+
<div className="rounded-lg border border-border bg-card p-4 shadow-sm">
|
|
97
|
+
<div className="text-xs font-medium text-muted-foreground uppercase tracking-wide mb-2">{im.statsStatus}</div>
|
|
98
|
+
<div className="text-sm text-foreground">
|
|
99
99
|
{connected > 0 ? (
|
|
100
100
|
<span className="inline-flex items-center gap-1.5 text-success">
|
|
101
101
|
<CheckCircle2 size={14} /> {im.statsReady}
|
|
@@ -108,8 +108,8 @@ function ChannelsOverview() {
|
|
|
108
108
|
</div>
|
|
109
109
|
|
|
110
110
|
{/* Platform grid — clickable */}
|
|
111
|
-
<h2 className="text-sm font-medium text-foreground mb-
|
|
112
|
-
<div className="grid grid-cols-2 gap-3">
|
|
111
|
+
<h2 className="text-sm font-medium text-foreground mb-4">{im.platformsTitle}</h2>
|
|
112
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
|
113
113
|
{PLATFORMS.map(({ id, name, icon }) => {
|
|
114
114
|
const status = getStatus(id);
|
|
115
115
|
const isConnected = status?.connected ?? false;
|
|
@@ -118,28 +118,28 @@ function ChannelsOverview() {
|
|
|
118
118
|
<Link
|
|
119
119
|
key={id}
|
|
120
120
|
href={`/agents?tab=channels&platform=${id}`}
|
|
121
|
-
className="flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3 hover:border-[var(--amber)]/
|
|
121
|
+
className="flex items-center gap-3 rounded-lg border border-border bg-card px-4 py-3 shadow-sm hover:border-[var(--amber)]/50 hover:bg-card/80 hover:shadow transition-all"
|
|
122
122
|
>
|
|
123
|
-
<span className="text-
|
|
123
|
+
<span className="text-xl shrink-0">{icon}</span>
|
|
124
124
|
<div className="flex-1 min-w-0">
|
|
125
125
|
<div className="text-sm font-medium text-foreground">{name}</div>
|
|
126
126
|
{isConnected && status?.botName ? (
|
|
127
|
-
<div className="text-
|
|
127
|
+
<div className="text-xs text-muted-foreground font-mono truncate">{status.botName}</div>
|
|
128
128
|
) : (
|
|
129
|
-
<div className="text-
|
|
129
|
+
<div className="text-xs text-muted-foreground">{isConnected ? im.statusConnected : im.notConfigured}</div>
|
|
130
130
|
)}
|
|
131
131
|
{isConnected && status?.capabilities && status.capabilities.length > 0 && (
|
|
132
|
-
<div className="flex flex-wrap gap-1 mt-1">
|
|
132
|
+
<div className="flex flex-wrap gap-1 mt-1.5">
|
|
133
133
|
{status.capabilities.slice(0, 3).map(cap => (
|
|
134
|
-
<span key={cap} className="text-
|
|
134
|
+
<span key={cap} className="text-xs px-2 py-0.5 rounded-md bg-muted text-muted-foreground">{cap}</span>
|
|
135
135
|
))}
|
|
136
136
|
</div>
|
|
137
137
|
)}
|
|
138
138
|
</div>
|
|
139
139
|
{isConnected ? (
|
|
140
|
-
<CheckCircle2 size={
|
|
140
|
+
<CheckCircle2 size={18} className="text-success shrink-0" />
|
|
141
141
|
) : (
|
|
142
|
-
<Circle size={
|
|
142
|
+
<Circle size={18} className="text-border shrink-0" />
|
|
143
143
|
)}
|
|
144
144
|
</Link>
|
|
145
145
|
);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useEffect, useLayoutEffect, useRef, useState, useCallback, useMemo } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
4
5
|
import { Send, StopCircle, X, Plus, FileText, ImageIcon } from 'lucide-react';
|
|
5
6
|
import { useLocale } from '@/lib/stores/locale-store';
|
|
6
7
|
import type { AskMode, Message } from '@/lib/types';
|
|
@@ -15,6 +16,7 @@ import MessageList from '@/components/ask/MessageList';
|
|
|
15
16
|
import MentionPopover from '@/components/ask/MentionPopover';
|
|
16
17
|
import SlashCommandPopover from '@/components/ask/SlashCommandPopover';
|
|
17
18
|
import SessionHistory from '@/components/ask/SessionHistory';
|
|
19
|
+
import SessionHistoryPanel from '@/components/ask/SessionHistoryPanel';
|
|
18
20
|
import AskHeader from '@/components/ask/AskHeader';
|
|
19
21
|
import FileChip from '@/components/ask/FileChip';
|
|
20
22
|
import AgentSelectorCapsule from '@/components/ask/AgentSelectorCapsule';
|
|
@@ -97,6 +99,8 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
97
99
|
const [showHistory, setShowHistory] = useState(false);
|
|
98
100
|
const [isDragOver, setIsDragOver] = useState(false);
|
|
99
101
|
const [showAttachMenu, setShowAttachMenu] = useState(false);
|
|
102
|
+
const attachButtonRef = useRef<HTMLButtonElement>(null);
|
|
103
|
+
const [attachMenuPos, setAttachMenuPos] = useState<{ top: number; left: number } | null>(null);
|
|
100
104
|
|
|
101
105
|
const [selectedSkill, setSelectedSkill] = useState<SlashItem | null>(null);
|
|
102
106
|
const selectedSkillRef = useRef(selectedSkill);
|
|
@@ -182,6 +186,31 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
182
186
|
return () => window.removeEventListener('mindos:inject-ask-files', handler);
|
|
183
187
|
}, []);
|
|
184
188
|
|
|
189
|
+
// Position the attach menu popover above the button (using Portal to avoid clipping)
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
if (!showAttachMenu || !attachButtonRef.current) {
|
|
192
|
+
setAttachMenuPos(null);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const rect = attachButtonRef.current.getBoundingClientRect();
|
|
196
|
+
setAttachMenuPos({
|
|
197
|
+
top: rect.top - 8, // 8px above button
|
|
198
|
+
left: rect.left,
|
|
199
|
+
});
|
|
200
|
+
}, [showAttachMenu]);
|
|
201
|
+
|
|
202
|
+
// Close attach menu when clicking outside
|
|
203
|
+
useEffect(() => {
|
|
204
|
+
if (!showAttachMenu) return;
|
|
205
|
+
const handleClickOutside = (e: MouseEvent) => {
|
|
206
|
+
if (attachButtonRef.current && !attachButtonRef.current.contains(e.target as Node)) {
|
|
207
|
+
setShowAttachMenu(false);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
211
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
212
|
+
}, [showAttachMenu]);
|
|
213
|
+
|
|
185
214
|
// Home suggestion chip click — inject text into input
|
|
186
215
|
useEffect(() => {
|
|
187
216
|
if (!isHome) return;
|
|
@@ -534,7 +563,7 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
534
563
|
/>
|
|
535
564
|
|
|
536
565
|
{showHistory && (
|
|
537
|
-
<
|
|
566
|
+
<SessionHistoryPanel
|
|
538
567
|
sessions={session.sessions}
|
|
539
568
|
activeSessionId={session.activeSessionId}
|
|
540
569
|
onLoad={handleLoadSession}
|
|
@@ -542,16 +571,13 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
542
571
|
onRename={session.renameSession}
|
|
543
572
|
onTogglePin={session.togglePinSession}
|
|
544
573
|
onClearAll={session.clearAllSessions}
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
clearAll: t.ask.clearAll ?? 'Clear all',
|
|
548
|
-
confirmClear: t.ask.confirmClear ?? 'Confirm clear?',
|
|
549
|
-
noSessions: t.ask.noSessions ?? 'No saved sessions.',
|
|
550
|
-
rename: t.ask.renameSession ?? 'Rename',
|
|
551
|
-
}}
|
|
574
|
+
onClose={() => setShowHistory(false)}
|
|
575
|
+
onNewChat={handleResetSession}
|
|
552
576
|
/>
|
|
553
577
|
)}
|
|
554
578
|
|
|
579
|
+
{!showHistory && (
|
|
580
|
+
<>
|
|
555
581
|
{/* Messages — home variant hides empty state unless maximized (suggestions rendered externally in normal mode) */}
|
|
556
582
|
<div className="flex-1 min-h-0 flex flex-col">
|
|
557
583
|
{!isHome && (
|
|
@@ -664,6 +690,7 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
664
690
|
{/* + attach button with mini menu */}
|
|
665
691
|
<div className="relative shrink-0">
|
|
666
692
|
<button
|
|
693
|
+
ref={attachButtonRef}
|
|
667
694
|
type="button"
|
|
668
695
|
onClick={() => setShowAttachMenu(v => !v)}
|
|
669
696
|
className="p-2 rounded-lg text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors"
|
|
@@ -671,28 +698,39 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
671
698
|
>
|
|
672
699
|
<Plus size={inputIconSize} />
|
|
673
700
|
</button>
|
|
674
|
-
{showAttachMenu && (
|
|
675
|
-
<div className="absolute bottom-full left-0 mb-1.5 py-1 rounded-xl border border-border/60 bg-card shadow-lg z-50 min-w-[150px] animate-in fade-in-0 slide-in-from-bottom-2 duration-150">
|
|
676
|
-
<button
|
|
677
|
-
type="button"
|
|
678
|
-
className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
|
|
679
|
-
onClick={() => { setShowAttachMenu(false); upload.uploadInputRef.current?.click(); }}
|
|
680
|
-
>
|
|
681
|
-
<FileText size={12} className="shrink-0 text-muted-foreground" />
|
|
682
|
-
{t.ask.attachFileLabel}
|
|
683
|
-
</button>
|
|
684
|
-
<button
|
|
685
|
-
type="button"
|
|
686
|
-
className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
|
|
687
|
-
onClick={() => { setShowAttachMenu(false); imageInputRef.current?.click(); }}
|
|
688
|
-
>
|
|
689
|
-
<ImageIcon size={12} className="shrink-0 text-muted-foreground" />
|
|
690
|
-
{t.ask.attachImageLabel}
|
|
691
|
-
</button>
|
|
692
|
-
</div>
|
|
693
|
-
)}
|
|
694
701
|
</div>
|
|
695
702
|
|
|
703
|
+
{/* Attach menu rendered as Portal to avoid clipping by overflow-hidden parent */}
|
|
704
|
+
{mounted && showAttachMenu && attachMenuPos && createPortal(
|
|
705
|
+
<div
|
|
706
|
+
className="fixed py-1 rounded-xl border border-border/60 bg-card shadow-lg z-50 min-w-[150px] animate-in fade-in-0 slide-in-from-bottom-2 duration-150"
|
|
707
|
+
style={{
|
|
708
|
+
top: `${attachMenuPos.top}px`,
|
|
709
|
+
left: `${attachMenuPos.left}px`,
|
|
710
|
+
transform: 'translateY(-100%)', // Position above the button
|
|
711
|
+
}}
|
|
712
|
+
onClick={(e) => e.stopPropagation()}
|
|
713
|
+
>
|
|
714
|
+
<button
|
|
715
|
+
type="button"
|
|
716
|
+
className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
|
|
717
|
+
onClick={() => { setShowAttachMenu(false); upload.uploadInputRef.current?.click(); }}
|
|
718
|
+
>
|
|
719
|
+
<FileText size={12} className="shrink-0 text-muted-foreground" />
|
|
720
|
+
{t.ask.attachFileLabel}
|
|
721
|
+
</button>
|
|
722
|
+
<button
|
|
723
|
+
type="button"
|
|
724
|
+
className="flex w-full items-center gap-2.5 px-3 py-2 text-xs hover:bg-muted transition-colors text-left rounded-lg"
|
|
725
|
+
onClick={() => { setShowAttachMenu(false); imageInputRef.current?.click(); }}
|
|
726
|
+
>
|
|
727
|
+
<ImageIcon size={12} className="shrink-0 text-muted-foreground" />
|
|
728
|
+
{t.ask.attachImageLabel}
|
|
729
|
+
</button>
|
|
730
|
+
</div>,
|
|
731
|
+
document.body
|
|
732
|
+
)}
|
|
733
|
+
|
|
696
734
|
<input
|
|
697
735
|
ref={upload.uploadInputRef}
|
|
698
736
|
type="file"
|
|
@@ -773,6 +811,8 @@ export default function AskContent({ visible, currentFile, initialMessage, initi
|
|
|
773
811
|
</div>
|
|
774
812
|
</div>
|
|
775
813
|
</div>
|
|
814
|
+
</>
|
|
815
|
+
)}
|
|
776
816
|
</div>
|
|
777
817
|
);
|
|
778
818
|
}
|
|
@@ -205,9 +205,13 @@ export default memo(function AskHeader({
|
|
|
205
205
|
{!hideTitle && (
|
|
206
206
|
<div className="flex items-center gap-2 min-w-0">
|
|
207
207
|
<div className="w-6 h-6 rounded-lg bg-[var(--amber)]/10 flex items-center justify-center shrink-0">
|
|
208
|
-
<Sparkles size={13} className="text-[var(--amber)]" />
|
|
208
|
+
{showHistory ? <History size={13} className="text-[var(--amber)]" /> : <Sparkles size={13} className="text-[var(--amber)]" />}
|
|
209
209
|
</div>
|
|
210
|
-
{
|
|
210
|
+
{showHistory ? (
|
|
211
|
+
<span className="text-sm font-medium text-[var(--amber)]">
|
|
212
|
+
{t.ask?.sessionHistory ?? 'Session History'}
|
|
213
|
+
</span>
|
|
214
|
+
) : hasMultipleSessions && activeTitle ? (
|
|
211
215
|
<button
|
|
212
216
|
ref={switcherRef}
|
|
213
217
|
type="button"
|