@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
|
@@ -21,7 +21,7 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
|
|
|
21
21
|
|
|
22
22
|
if (friendly) {
|
|
23
23
|
return (
|
|
24
|
-
<nav className="flex items-center gap-
|
|
24
|
+
<nav className="flex min-w-0 items-center gap-1 text-xs text-muted-foreground flex-nowrap overflow-hidden">
|
|
25
25
|
<Link
|
|
26
26
|
href="/"
|
|
27
27
|
className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
|
|
@@ -30,17 +30,17 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
|
|
|
30
30
|
<Home size={14} />
|
|
31
31
|
</Link>
|
|
32
32
|
<ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
|
|
33
|
-
<
|
|
33
|
+
<span className="min-w-0 flex items-center gap-1.5 text-foreground font-medium">
|
|
34
34
|
{friendly.icon}
|
|
35
|
-
<span>{friendly.getLabel(t)}</span>
|
|
36
|
-
</
|
|
35
|
+
<span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]">{friendly.getLabel(t)}</span>
|
|
36
|
+
</span>
|
|
37
37
|
</nav>
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const parts = filePath.split('/');
|
|
42
42
|
return (
|
|
43
|
-
<nav className="flex items-center gap-
|
|
43
|
+
<nav className="flex min-w-0 items-center gap-1 text-xs text-muted-foreground flex-nowrap overflow-hidden">
|
|
44
44
|
<Link
|
|
45
45
|
href="/"
|
|
46
46
|
className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors shrink-0"
|
|
@@ -52,19 +52,19 @@ export default function Breadcrumb({ filePath }: { filePath: string }) {
|
|
|
52
52
|
const isLast = i === parts.length - 1;
|
|
53
53
|
const href = '/view/' + parts.slice(0, i + 1).map(encodeURIComponent).join('/');
|
|
54
54
|
return (
|
|
55
|
-
<
|
|
55
|
+
<span key={i} className="flex items-center gap-1 min-w-0">
|
|
56
56
|
<ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
|
|
57
57
|
{isLast ? (
|
|
58
|
-
<
|
|
58
|
+
<span className="min-w-0 flex items-center gap-1.5 px-1 py-0.5 text-foreground font-medium">
|
|
59
59
|
<FileTypeIcon name={part} />
|
|
60
|
-
<span suppressHydrationWarning>{part}</span>
|
|
61
|
-
</
|
|
60
|
+
<span className="block truncate max-w-[180px] sm:max-w-[260px] md:max-w-[360px]" suppressHydrationWarning>{part}</span>
|
|
61
|
+
</span>
|
|
62
62
|
) : (
|
|
63
|
-
<Link href={href} className="px-
|
|
63
|
+
<Link href={href} className="block px-1 py-0.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors truncate max-w-[120px] sm:max-w-[160px] md:max-w-[200px]" title={part}>
|
|
64
64
|
<span suppressHydrationWarning>{part}</span>
|
|
65
65
|
</Link>
|
|
66
66
|
)}
|
|
67
|
-
</
|
|
67
|
+
</span>
|
|
68
68
|
);
|
|
69
69
|
})}
|
|
70
70
|
</nav>
|
|
@@ -163,7 +163,7 @@ export default function FindInPage({ containerRef, onClose }: FindInPageProps) {
|
|
|
163
163
|
outline: 2px solid rgba(250, 204, 21, 0.5);
|
|
164
164
|
}
|
|
165
165
|
`}</style>
|
|
166
|
-
<div className="sticky top-[
|
|
166
|
+
<div className="sticky top-[98px] md:top-[46px] z-30 flex justify-end px-4 md:px-6 pointer-events-none" data-find-in-page>
|
|
167
167
|
<div className="pointer-events-auto flex items-center gap-1.5 px-3 py-1.5 rounded-lg border border-border bg-card shadow-lg">
|
|
168
168
|
<input
|
|
169
169
|
ref={inputRef}
|
|
@@ -102,6 +102,10 @@ const components: Components = {
|
|
|
102
102
|
void node;
|
|
103
103
|
return <p {...stripNonDom(rest)} suppressHydrationWarning>{children}</p>;
|
|
104
104
|
},
|
|
105
|
+
span({ children, node, ...rest }) {
|
|
106
|
+
void node;
|
|
107
|
+
return <span {...stripNonDom(rest)} suppressHydrationWarning>{children}</span>;
|
|
108
|
+
},
|
|
105
109
|
a({ href, children, node, ...rest }) {
|
|
106
110
|
void node;
|
|
107
111
|
const isExternal = href?.startsWith('http');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
|
-
import { ChevronsDownUp, ChevronsUpDown, Plus, Import, FileText, Layers, MoreHorizontal, Eye, EyeOff, Trash2, Inbox } from 'lucide-react';
|
|
5
|
+
import { ChevronsDownUp, ChevronsUpDown, Plus, Import, FileText, Layers, MoreHorizontal, Eye, EyeOff, Trash2, Inbox, History } from 'lucide-react';
|
|
6
6
|
import type { PanelId } from './ActivityBar';
|
|
7
7
|
import type { FileNode } from '@/lib/types';
|
|
8
8
|
import FileTree, { setShowHiddenFiles, useShowHiddenFiles } from './FileTree';
|
|
@@ -284,15 +284,6 @@ export default function Panel({
|
|
|
284
284
|
ref={morePopoverRef}
|
|
285
285
|
className="absolute top-full right-0 mt-1 min-w-[172px] bg-card border border-border rounded-lg shadow-lg py-1 z-50"
|
|
286
286
|
>
|
|
287
|
-
<button
|
|
288
|
-
className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
|
|
289
|
-
onClick={() => { setShowHiddenFiles(!showHidden); }}
|
|
290
|
-
>
|
|
291
|
-
{showHidden ? <EyeOff size={14} className="shrink-0" /> : <Eye size={14} className="shrink-0" />}
|
|
292
|
-
<span className="flex-1">{t.sidebar.showHiddenFiles}</span>
|
|
293
|
-
{showHidden && <span className="text-[var(--amber)] text-xs">✓</span>}
|
|
294
|
-
</button>
|
|
295
|
-
<div className="my-1 border-t border-border/50" />
|
|
296
287
|
<button
|
|
297
288
|
className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
|
|
298
289
|
onClick={() => { setMorePopover(false); router.push('/view/Inbox/'); }}
|
|
@@ -303,6 +294,13 @@ export default function Panel({
|
|
|
303
294
|
<span className="text-2xs font-medium tabular-nums px-1.5 py-px rounded-full bg-[var(--amber)]/10 text-[var(--amber)]/70">{inboxCount}</span>
|
|
304
295
|
)}
|
|
305
296
|
</button>
|
|
297
|
+
<button
|
|
298
|
+
className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
|
|
299
|
+
onClick={() => { setMorePopover(false); router.push('/view/.mindos/change-log.json'); }}
|
|
300
|
+
>
|
|
301
|
+
<History size={14} className="shrink-0 text-[var(--amber)]" />
|
|
302
|
+
<span className="flex-1">{t.changes.title}</span>
|
|
303
|
+
</button>
|
|
306
304
|
<button
|
|
307
305
|
className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
|
|
308
306
|
onClick={() => { setMorePopover(false); router.push('/trash'); }}
|
|
@@ -313,6 +311,15 @@ export default function Panel({
|
|
|
313
311
|
<span className="text-xs text-muted-foreground tabular-nums">{trashCount}</span>
|
|
314
312
|
)}
|
|
315
313
|
</button>
|
|
314
|
+
<div className="my-1 border-t border-border/50" />
|
|
315
|
+
<button
|
|
316
|
+
className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors text-left"
|
|
317
|
+
onClick={() => { setShowHiddenFiles(!showHidden); }}
|
|
318
|
+
>
|
|
319
|
+
{showHidden ? <EyeOff size={14} className="shrink-0" /> : <Eye size={14} className="shrink-0" />}
|
|
320
|
+
<span className="flex-1">{t.sidebar.showHiddenFiles}</span>
|
|
321
|
+
{showHidden && <span className="text-[var(--amber)] text-xs">✓</span>}
|
|
322
|
+
</button>
|
|
316
323
|
</div>
|
|
317
324
|
)}
|
|
318
325
|
</div>
|
|
@@ -34,7 +34,7 @@ function parseHeadings(content: string): Heading[] {
|
|
|
34
34
|
return headings;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
const TOPBAR_H =
|
|
37
|
+
const TOPBAR_H = 46;
|
|
38
38
|
const SCROLL_OFFSET = TOPBAR_H + 12;
|
|
39
39
|
const NAV_W = 212;
|
|
40
40
|
|
|
@@ -122,7 +122,7 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
|
|
|
122
122
|
{/* Collapse / expand toggle — separate from aside so it stays visible */}
|
|
123
123
|
<button
|
|
124
124
|
onClick={() => setCollapsed(v => !v)}
|
|
125
|
-
className="hidden xl:flex fixed z-10 top-[
|
|
125
|
+
className="hidden xl:flex fixed z-10 top-[46px] flex items-center justify-center w-5 h-8 rounded-l-md border border-r-0 border-border hover:bg-muted transition-colors"
|
|
126
126
|
style={{
|
|
127
127
|
right: `calc(var(--right-panel-width, 0px) + ${collapsed ? 0 : NAV_W}px)`,
|
|
128
128
|
background: 'var(--background)',
|
|
@@ -149,17 +149,17 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
|
|
|
149
149
|
transition: 'transform 200ms ease-in-out, right 200ms ease-out',
|
|
150
150
|
}}
|
|
151
151
|
>
|
|
152
|
+
<div className="flex items-center h-[46px] px-4 border-l border-b border-border" style={{ background: 'var(--background)' }}>
|
|
153
|
+
<p className="text-2xs font-semibold uppercase tracking-wider text-muted-foreground/55 shrink-0">
|
|
154
|
+
{t.view.tocTitle}
|
|
155
|
+
</p>
|
|
156
|
+
</div>
|
|
152
157
|
<nav
|
|
153
158
|
ref={navRef}
|
|
154
159
|
aria-label={t.view.tocTitle}
|
|
155
|
-
className="flex flex-col gap-0.5 overflow-y-auto min-h-0 flex-1
|
|
160
|
+
className="flex flex-col gap-0.5 overflow-y-auto min-h-0 flex-1 pt-3 pb-5 pl-2 pr-3 border-l border-border"
|
|
156
161
|
style={{ background: 'var(--background)' }}
|
|
157
162
|
>
|
|
158
|
-
<p
|
|
159
|
-
className="text-2xs font-semibold uppercase tracking-wider px-2 mb-1 text-muted-foreground/50 shrink-0"
|
|
160
|
-
>
|
|
161
|
-
{t.view.tocTitle}
|
|
162
|
-
</p>
|
|
163
163
|
{headings.map((heading, i) => {
|
|
164
164
|
const indent = (heading.level - minLevel) * 14;
|
|
165
165
|
const isActive = activeId === heading.id;
|
|
@@ -194,7 +194,7 @@ export default function TableOfContents({ content }: TableOfContentsProps) {
|
|
|
194
194
|
}}
|
|
195
195
|
title={heading.text}
|
|
196
196
|
>
|
|
197
|
-
<span className="
|
|
197
|
+
<span className="block truncate" suppressHydrationWarning>
|
|
198
198
|
{heading.text}
|
|
199
199
|
</span>
|
|
200
200
|
</a>
|
|
@@ -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
|
);
|