@geminilight/mindos 0.6.55 → 0.6.57
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 +24 -22
- 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 +12 -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 +2 -6
- 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_client-reference-manifest.js +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/custom/detect/route.js +1 -0
- package/_standalone/.next/server/app/api/agents/custom/detect/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/agents/custom/route.js +1 -0
- package/_standalone/.next/server/app/api/agents/custom/route.js.nft.json +1 -0
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -0
- package/_standalone/.next/server/app/api/ask/route.js +3 -3
- 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/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_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/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/mcp/agents/route.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/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/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.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/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/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 +24 -22
- package/_standalone/.next/server/chunks/2159.js +52 -0
- package/_standalone/.next/server/chunks/{2190.js → 3484.js} +1 -1
- package/_standalone/.next/server/chunks/530.js +31 -31
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +3 -3
- package/_standalone/.next/server/chunks/953.js +2 -2
- 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/1053-5cb008a24930e271.js +29 -0
- package/_standalone/.next/static/chunks/1477.33df3cce509578c2.js +1 -0
- package/_standalone/.next/static/chunks/{1814.b08e9fb85dd3b13c.js → 1814.a7c127b2c73d1f70.js} +1 -1
- package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +1 -0
- package/_standalone/.next/static/chunks/{1007.c11404e50b39d165.js → 2647.e0b67d0c432ad7e7.js} +10 -10
- package/_standalone/.next/static/chunks/362.3978790a2e636c3c.js +2 -0
- package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +1 -0
- package/_standalone/.next/static/chunks/54a60aa6.7a74f547ec1bdd5a.js +79 -0
- package/_standalone/.next/static/chunks/6087.4b6102dc0bcd07a7.js +1 -0
- package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +1 -0
- package/_standalone/.next/static/chunks/7249-8cd568ad23656622.js +11 -0
- package/_standalone/.next/static/chunks/8252-e5ae7ced3a41e0ed.js +1 -0
- package/_standalone/.next/static/chunks/{8753-ea9db680b0f70f25.js → 8658-16ff58b75ae37fbb.js} +1 -1
- package/_standalone/.next/static/chunks/{7322-d67d05067544864c.js → 9274-296ab35f9f09e42e.js} +1 -1
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/_global-error/page-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/echo/[segment]/{page-6710da1f581b2854.js → page-b0103509ce34444b.js} +4 -4
- package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/{layout-45e66033ba1bdb05.js → layout-b3919384ec2eb979.js} +45 -45
- package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/{page-71bd113f66bd7617.js → page-6436a99cda35132b.js} +2 -2
- package/_standalone/.next/static/chunks/app/setup/{page-9a81fa4d82c6351b.js → page-99fcfc460fa29733.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-8dc388695344fdd4.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/page-b292b55305ecc021.js +12 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +1 -0
- package/_standalone/.next/static/chunks/webpack-2c19436659aa657b.js +1 -0
- package/_standalone/.next/static/css/fd84c8316ead16eb.css +1 -0
- package/_standalone/.next/static/zOaEtgJbdRMncnCBucULp/_buildManifest.js +1 -0
- package/_standalone/.next/trace +64 -64
- package/_standalone/.next/types/routes.d.ts +3 -1
- package/_standalone/.next/types/validator.ts +18 -0
- package/_standalone/components/Breadcrumb.tsx +10 -6
- package/_standalone/components/Editor.tsx +124 -6
- package/_standalone/components/MarkdownView.tsx +3 -1
- package/_standalone/components/WysiwygEditor.tsx +90 -0
- package/_standalone/components/agents/AgentsOverviewSection.tsx +100 -8
- package/_standalone/components/agents/CustomAgentModal.tsx +613 -0
- package/_standalone/components/settings/types.ts +4 -0
- package/_standalone/hooks/useEditorImageUpload.ts +113 -0
- package/_standalone/lib/image.ts +47 -0
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/agents/custom/detect/route.ts +31 -0
- package/app/app/api/agents/custom/route.ts +150 -0
- package/app/app/api/file/import/route.ts +42 -0
- package/app/app/api/mcp/agents/route.ts +59 -7
- package/app/app/api/settings/list-models/route.ts +16 -2
- package/app/components/Breadcrumb.tsx +10 -6
- package/app/components/Editor.tsx +124 -6
- package/app/components/MarkdownView.tsx +3 -1
- package/app/components/WysiwygEditor.tsx +90 -0
- package/app/components/agents/AgentDetailContent.tsx +74 -1
- package/app/components/agents/AgentsContentPage.tsx +76 -1
- package/app/components/agents/AgentsOverviewSection.tsx +100 -8
- package/app/components/agents/CustomAgentModal.tsx +613 -0
- package/app/components/settings/types.ts +4 -0
- package/app/hooks/useEditorImageUpload.ts +113 -0
- package/app/lib/agent/model.ts +7 -1
- package/app/lib/agent/providers.ts +31 -6
- package/app/lib/core/organize.ts +1 -1
- package/app/lib/core/tree.ts +1 -1
- package/app/lib/custom-agents.ts +279 -0
- package/app/lib/fs.ts +1 -1
- package/app/lib/i18n/modules/panels.ts +96 -0
- package/app/lib/image.ts +47 -0
- package/app/lib/settings.ts +4 -0
- package/bin/commands/start.js +5 -4
- package/bin/commands/update.js +6 -2
- package/bin/lib/clean-env.js +1 -1
- package/bin/lib/gateway.js +6 -2
- package/mcp/dist/index.cjs +1 -1
- package/mcp/src/index.ts +6 -1
- package/package.json +1 -1
- package/_standalone/.next/server/chunks/1981.js +0 -52
- package/_standalone/.next/static/QXZErVsiRQxfqUnWMUsH6/_buildManifest.js +0 -1
- package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +0 -29
- package/_standalone/.next/static/chunks/1880-7abf971bcfd2389b.js +0 -11
- package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +0 -1
- package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +0 -1
- package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +0 -1
- package/_standalone/.next/static/chunks/54a60aa6.b97ba5e6900c089b.js +0 -79
- package/_standalone/.next/static/chunks/6087.0c32d26d0262c8e7.js +0 -1
- package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +0 -1
- package/_standalone/.next/static/chunks/8131.5e0bdb36bb91f212.js +0 -1
- package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/_global-error/page-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +0 -5
- package/_standalone/.next/static/chunks/app/api/a2a/agents/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-ba3802cf675d029a.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-35da7f9f5a009292.js +0 -12
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +0 -1
- package/_standalone/.next/static/chunks/webpack-73c9da80c6c1ebfe.js +0 -1
- package/_standalone/.next/static/css/66f8a81e4eda06d4.css +0 -1
- /package/_standalone/.next/static/{QXZErVsiRQxfqUnWMUsH6 → zOaEtgJbdRMncnCBucULp}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Do not edit this file manually
|
|
3
3
|
|
|
4
4
|
type AppRoutes = "/" | "/agents" | "/agents/[agentKey]" | "/changes" | "/echo" | "/echo/[segment]" | "/explore" | "/help" | "/inbox/history" | "/login" | "/setup" | "/trash" | "/view/[...path]" | "/wiki"
|
|
5
|
-
type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/file/raw" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/inbox" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/mcp/uninstall" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
|
|
5
|
+
type AppRouteHandlerRoutes = "/.well-known/agent-card.json" | "/api/a2a" | "/api/a2a/agents" | "/api/a2a/delegations" | "/api/a2a/discover" | "/api/acp/config" | "/api/acp/detect" | "/api/acp/install" | "/api/acp/registry" | "/api/acp/session" | "/api/agent-activity" | "/api/agents/custom" | "/api/agents/custom/detect" | "/api/ask" | "/api/ask-sessions" | "/api/auth" | "/api/backlinks" | "/api/bootstrap" | "/api/changes" | "/api/export" | "/api/extract-pdf" | "/api/file" | "/api/file/import" | "/api/file/raw" | "/api/files" | "/api/git" | "/api/graph" | "/api/health" | "/api/inbox" | "/api/init" | "/api/mcp/agents" | "/api/mcp/install" | "/api/mcp/install-skill" | "/api/mcp/restart" | "/api/mcp/status" | "/api/mcp/uninstall" | "/api/monitoring" | "/api/recent-files" | "/api/restart" | "/api/search" | "/api/settings" | "/api/settings/list-models" | "/api/settings/reset-token" | "/api/settings/test-key" | "/api/setup" | "/api/setup/check-path" | "/api/setup/check-port" | "/api/setup/generate-token" | "/api/setup/ls" | "/api/skills" | "/api/sync" | "/api/tree-version" | "/api/uninstall" | "/api/update" | "/api/update-check" | "/api/update-status" | "/api/workflows"
|
|
6
6
|
type PageRoutes = never
|
|
7
7
|
type LayoutRoutes = "/"
|
|
8
8
|
type RedirectRoutes = never
|
|
@@ -25,6 +25,8 @@ interface ParamMap {
|
|
|
25
25
|
"/api/acp/registry": {}
|
|
26
26
|
"/api/acp/session": {}
|
|
27
27
|
"/api/agent-activity": {}
|
|
28
|
+
"/api/agents/custom": {}
|
|
29
|
+
"/api/agents/custom/detect": {}
|
|
28
30
|
"/api/ask": {}
|
|
29
31
|
"/api/ask-sessions": {}
|
|
30
32
|
"/api/auth": {}
|
|
@@ -272,6 +272,24 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
272
272
|
type __Unused = __Check
|
|
273
273
|
}
|
|
274
274
|
|
|
275
|
+
// Validate ../../app/api/agents/custom/detect/route.ts
|
|
276
|
+
{
|
|
277
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agents/custom/detect">> = Specific
|
|
278
|
+
const handler = {} as typeof import("../../app/api/agents/custom/detect/route.js")
|
|
279
|
+
type __Check = __IsExpected<typeof handler>
|
|
280
|
+
// @ts-ignore
|
|
281
|
+
type __Unused = __Check
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Validate ../../app/api/agents/custom/route.ts
|
|
285
|
+
{
|
|
286
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agents/custom">> = Specific
|
|
287
|
+
const handler = {} as typeof import("../../app/api/agents/custom/route.js")
|
|
288
|
+
type __Check = __IsExpected<typeof handler>
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
type __Unused = __Check
|
|
291
|
+
}
|
|
292
|
+
|
|
275
293
|
// Validate ../../app/api/ask-sessions/route.ts
|
|
276
294
|
{
|
|
277
295
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/ask-sessions">> = Specific
|
|
@@ -13,23 +13,27 @@ function FileTypeIcon({ name }: { name: string }) {
|
|
|
13
13
|
export default function Breadcrumb({ filePath }: { filePath: string }) {
|
|
14
14
|
const parts = filePath.split('/');
|
|
15
15
|
return (
|
|
16
|
-
<nav className="flex items-center gap-
|
|
17
|
-
<Link
|
|
16
|
+
<nav className="flex items-center gap-0.5 text-xs text-muted-foreground flex-wrap">
|
|
17
|
+
<Link
|
|
18
|
+
href="/"
|
|
19
|
+
className="p-1.5 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors"
|
|
20
|
+
title="Home"
|
|
21
|
+
>
|
|
18
22
|
<Home size={14} />
|
|
19
23
|
</Link>
|
|
20
24
|
{parts.map((part, i) => {
|
|
21
25
|
const isLast = i === parts.length - 1;
|
|
22
26
|
const href = '/view/' + parts.slice(0, i + 1).map(encodeURIComponent).join('/');
|
|
23
27
|
return (
|
|
24
|
-
<span key={i} className="flex items-center gap-
|
|
25
|
-
<ChevronRight size={12} className="text-muted-foreground/50" />
|
|
28
|
+
<span key={i} className="flex items-center gap-0.5">
|
|
29
|
+
<ChevronRight size={12} className="text-muted-foreground/50 shrink-0" />
|
|
26
30
|
{isLast ? (
|
|
27
|
-
<span className="flex items-center gap-1.5 text-foreground font-medium">
|
|
31
|
+
<span className="flex items-center gap-1.5 px-2 py-1 text-foreground font-medium">
|
|
28
32
|
<FileTypeIcon name={part} />
|
|
29
33
|
<span suppressHydrationWarning>{part}</span>
|
|
30
34
|
</span>
|
|
31
35
|
) : (
|
|
32
|
-
<Link href={href} className="px-2 py-
|
|
36
|
+
<Link href={href} className="px-2 py-1 rounded-md hover:bg-muted/50 hover:text-foreground transition-colors truncate max-w-[200px]" title={part}>
|
|
33
37
|
<span suppressHydrationWarning>{part}</span>
|
|
34
38
|
</Link>
|
|
35
39
|
)}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect, useRef, useCallback } from 'react';
|
|
3
|
+
import { useEffect, useRef, useCallback, useState } from 'react';
|
|
4
4
|
import { EditorView, basicSetup } from 'codemirror';
|
|
5
5
|
import { markdown } from '@codemirror/lang-markdown';
|
|
6
6
|
import { oneDark } from '@codemirror/theme-one-dark';
|
|
7
7
|
import { EditorState } from '@codemirror/state';
|
|
8
|
+
import { Image as ImageIcon } from 'lucide-react';
|
|
9
|
+
import { useEditorImageUpload } from '@/hooks/useEditorImageUpload';
|
|
10
|
+
import { toast } from '@/lib/toast';
|
|
8
11
|
|
|
9
12
|
interface EditorProps {
|
|
10
13
|
value: string;
|
|
@@ -65,6 +68,54 @@ export default function Editor({ value, onChange, language = 'markdown' }: Edito
|
|
|
65
68
|
// Track whether update is from external value change
|
|
66
69
|
const isExternalUpdate = useRef(false);
|
|
67
70
|
|
|
71
|
+
const { uploadToMedia, isUploading } = useEditorImageUpload();
|
|
72
|
+
const uploadRef = useRef(uploadToMedia);
|
|
73
|
+
uploadRef.current = uploadToMedia;
|
|
74
|
+
const [isMarkdown] = useState(language === 'markdown');
|
|
75
|
+
|
|
76
|
+
// Stable image insertion function via ref
|
|
77
|
+
const insertImagesRef = useRef(async (files: File[]) => {});
|
|
78
|
+
insertImagesRef.current = async (files: File[]) => {
|
|
79
|
+
const view = viewRef.current;
|
|
80
|
+
if (!view) return;
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const uploadedPaths = await uploadRef.current(files);
|
|
84
|
+
|
|
85
|
+
for (const p of uploadedPaths) {
|
|
86
|
+
const md = `\n`;
|
|
87
|
+
view.dispatch({
|
|
88
|
+
changes: {
|
|
89
|
+
from: view.state.selection.main.head,
|
|
90
|
+
insert: md,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
toast.success('Images inserted');
|
|
96
|
+
} catch (err) {
|
|
97
|
+
toast.error('Failed to insert images');
|
|
98
|
+
console.error(err);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Handle file picker (image button click)
|
|
103
|
+
const handlePickImages = useCallback(() => {
|
|
104
|
+
if (!isMarkdown) return;
|
|
105
|
+
|
|
106
|
+
const input = document.createElement('input');
|
|
107
|
+
input.type = 'file';
|
|
108
|
+
input.multiple = true;
|
|
109
|
+
input.accept = 'image/*';
|
|
110
|
+
input.onchange = (e) => {
|
|
111
|
+
const files = Array.from((e.target as HTMLInputElement).files ?? []);
|
|
112
|
+
if (files.length > 0) {
|
|
113
|
+
insertImagesRef.current(files);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
input.click();
|
|
117
|
+
}, [isMarkdown]);
|
|
118
|
+
|
|
68
119
|
useEffect(() => {
|
|
69
120
|
if (!containerRef.current) return;
|
|
70
121
|
|
|
@@ -100,6 +151,52 @@ export default function Editor({ value, onChange, language = 'markdown' }: Edito
|
|
|
100
151
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
101
152
|
}, []);
|
|
102
153
|
|
|
154
|
+
// Set up paste and drag/drop handlers
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
if (!isMarkdown) return;
|
|
157
|
+
|
|
158
|
+
const container = containerRef.current;
|
|
159
|
+
if (!container) return;
|
|
160
|
+
|
|
161
|
+
const handlePaste = (e: ClipboardEvent) => {
|
|
162
|
+
const items = e.clipboardData?.items;
|
|
163
|
+
if (!items) return;
|
|
164
|
+
|
|
165
|
+
const files: File[] = [];
|
|
166
|
+
for (let i = 0; i < items.length; i++) {
|
|
167
|
+
const item = items[i];
|
|
168
|
+
if (item.kind === 'file' && item.type.startsWith('image/')) {
|
|
169
|
+
const file = item.getAsFile();
|
|
170
|
+
if (file) files.push(file);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (files.length > 0) {
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
insertImagesRef.current(files);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const handleDrop = (e: DragEvent) => {
|
|
181
|
+
const files = Array.from(e.dataTransfer?.files ?? []).filter((f) =>
|
|
182
|
+
f.type.startsWith('image/'),
|
|
183
|
+
);
|
|
184
|
+
if (files.length > 0) {
|
|
185
|
+
e.preventDefault();
|
|
186
|
+
e.stopPropagation();
|
|
187
|
+
insertImagesRef.current(files);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
container.addEventListener('paste', handlePaste as EventListener);
|
|
192
|
+
container.addEventListener('drop', handleDrop as EventListener);
|
|
193
|
+
|
|
194
|
+
return () => {
|
|
195
|
+
container.removeEventListener('paste', handlePaste as EventListener);
|
|
196
|
+
container.removeEventListener('drop', handleDrop as EventListener);
|
|
197
|
+
};
|
|
198
|
+
}, [isMarkdown]);
|
|
199
|
+
|
|
103
200
|
// Sync external value changes to editor
|
|
104
201
|
useEffect(() => {
|
|
105
202
|
const view = viewRef.current;
|
|
@@ -115,10 +212,31 @@ export default function Editor({ value, onChange, language = 'markdown' }: Edito
|
|
|
115
212
|
}, [value]);
|
|
116
213
|
|
|
117
214
|
return (
|
|
118
|
-
<div
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
215
|
+
<div className="relative h-full w-full flex flex-col">
|
|
216
|
+
{/* Image insert button for markdown mode */}
|
|
217
|
+
{isMarkdown && (
|
|
218
|
+
<div className="px-2 py-1.5 border-b border-zinc-800 bg-zinc-900/50 flex items-center gap-1">
|
|
219
|
+
<button
|
|
220
|
+
onClick={handlePickImages}
|
|
221
|
+
disabled={isUploading}
|
|
222
|
+
className="p-1.5 rounded hover:bg-zinc-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground"
|
|
223
|
+
title="Insert images (Ctrl+V or drag & drop)"
|
|
224
|
+
>
|
|
225
|
+
<ImageIcon size={14} />
|
|
226
|
+
<span>Images</span>
|
|
227
|
+
</button>
|
|
228
|
+
{isUploading && (
|
|
229
|
+
<span className="text-xs text-muted-foreground ml-2">Uploading...</span>
|
|
230
|
+
)}
|
|
231
|
+
</div>
|
|
232
|
+
)}
|
|
233
|
+
|
|
234
|
+
{/* Editor container */}
|
|
235
|
+
<div
|
|
236
|
+
ref={containerRef}
|
|
237
|
+
className="h-full w-full overflow-hidden rounded-lg border border-zinc-800"
|
|
238
|
+
style={{ minHeight: '400px' }}
|
|
239
|
+
/>
|
|
240
|
+
</div>
|
|
123
241
|
);
|
|
124
242
|
}
|
|
@@ -9,6 +9,7 @@ import { useState, useCallback } from 'react';
|
|
|
9
9
|
import { Copy, Check, X } from 'lucide-react';
|
|
10
10
|
import { copyToClipboard } from '@/lib/clipboard';
|
|
11
11
|
import { toast } from '@/lib/toast';
|
|
12
|
+
import { resolveImagePath } from '@/lib/image';
|
|
12
13
|
import type { Components } from 'react-markdown';
|
|
13
14
|
|
|
14
15
|
interface MarkdownViewProps {
|
|
@@ -118,8 +119,9 @@ const components: Components = {
|
|
|
118
119
|
img({ src, alt, node, ...rest }) {
|
|
119
120
|
void node;
|
|
120
121
|
if (!src) return null;
|
|
122
|
+
const resolvedSrc = typeof src === 'string' ? resolveImagePath(src) : src;
|
|
121
123
|
// eslint-disable-next-line @next/next/no-img-element
|
|
122
|
-
return <img src={
|
|
124
|
+
return <img src={resolvedSrc} alt={alt ?? ''} {...stripNonDom(rest)} />;
|
|
123
125
|
},
|
|
124
126
|
};
|
|
125
127
|
|
|
@@ -7,11 +7,27 @@ import Placeholder from '@tiptap/extension-placeholder';
|
|
|
7
7
|
import TaskList from '@tiptap/extension-task-list';
|
|
8
8
|
import TaskItem from '@tiptap/extension-task-item';
|
|
9
9
|
import Link from '@tiptap/extension-link';
|
|
10
|
+
import Image from '@tiptap/extension-image';
|
|
10
11
|
import { Table } from '@tiptap/extension-table';
|
|
11
12
|
import { TableRow } from '@tiptap/extension-table';
|
|
12
13
|
import { TableCell } from '@tiptap/extension-table';
|
|
13
14
|
import { TableHeader } from '@tiptap/extension-table';
|
|
14
15
|
import { Markdown } from 'tiptap-markdown';
|
|
16
|
+
import { useEditorImageUpload } from '@/hooks/useEditorImageUpload';
|
|
17
|
+
import { resolveImagePath } from '@/lib/image';
|
|
18
|
+
import { toast } from '@/lib/toast';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Custom Image extension that resolves `/.media/` paths to API URLs in the DOM,
|
|
22
|
+
* while keeping the raw path in the markdown serialization.
|
|
23
|
+
*/
|
|
24
|
+
const ResolvedImage = Image.extend({
|
|
25
|
+
renderHTML({ HTMLAttributes }) {
|
|
26
|
+
const src = HTMLAttributes.src;
|
|
27
|
+
const resolvedSrc = typeof src === 'string' ? resolveImagePath(src) : src;
|
|
28
|
+
return ['img', { ...HTMLAttributes, src: resolvedSrc }];
|
|
29
|
+
},
|
|
30
|
+
});
|
|
15
31
|
|
|
16
32
|
interface WysiwygEditorProps {
|
|
17
33
|
value: string;
|
|
@@ -22,6 +38,10 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
|
|
|
22
38
|
const onChangeRef = useRef(onChange);
|
|
23
39
|
onChangeRef.current = onChange;
|
|
24
40
|
|
|
41
|
+
const { uploadToMedia, isUploading } = useEditorImageUpload();
|
|
42
|
+
const uploadRef = useRef(uploadToMedia);
|
|
43
|
+
uploadRef.current = uploadToMedia;
|
|
44
|
+
|
|
25
45
|
const editor = useEditor({
|
|
26
46
|
extensions: [
|
|
27
47
|
StarterKit.configure({
|
|
@@ -36,6 +56,9 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
|
|
|
36
56
|
TaskList,
|
|
37
57
|
TaskItem.configure({ nested: true }),
|
|
38
58
|
Link.configure({ openOnClick: false, autolink: true }),
|
|
59
|
+
ResolvedImage.configure({
|
|
60
|
+
HTMLAttributes: { class: 'rounded-md max-w-full' },
|
|
61
|
+
}),
|
|
39
62
|
Table.configure({ resizable: false }),
|
|
40
63
|
TableRow,
|
|
41
64
|
TableHeader,
|
|
@@ -55,6 +78,65 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
|
|
|
55
78
|
immediatelyRender: false,
|
|
56
79
|
});
|
|
57
80
|
|
|
81
|
+
// Set up drag/drop and paste handlers on editor mount
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
if (!editor) return;
|
|
84
|
+
|
|
85
|
+
const editorDom = editor.view.dom;
|
|
86
|
+
|
|
87
|
+
const handleImageInsert = async (files: File[]) => {
|
|
88
|
+
if (!editor) return;
|
|
89
|
+
try {
|
|
90
|
+
const uploadedPaths = await uploadRef.current(files);
|
|
91
|
+
for (const p of uploadedPaths) {
|
|
92
|
+
editor.chain().focus().setImage({ src: p }).run();
|
|
93
|
+
}
|
|
94
|
+
toast.success('Images inserted');
|
|
95
|
+
} catch (err) {
|
|
96
|
+
toast.error('Failed to insert images');
|
|
97
|
+
console.error(err);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const handleDrop = (e: DragEvent) => {
|
|
102
|
+
const files = Array.from(e.dataTransfer?.files ?? []).filter((f) =>
|
|
103
|
+
f.type.startsWith('image/'),
|
|
104
|
+
);
|
|
105
|
+
if (files.length > 0) {
|
|
106
|
+
e.preventDefault();
|
|
107
|
+
e.stopPropagation();
|
|
108
|
+
handleImageInsert(files);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const handlePaste = (e: ClipboardEvent) => {
|
|
113
|
+
const items = e.clipboardData?.items;
|
|
114
|
+
if (!items) return;
|
|
115
|
+
|
|
116
|
+
const files: File[] = [];
|
|
117
|
+
for (let i = 0; i < items.length; i++) {
|
|
118
|
+
const item = items[i];
|
|
119
|
+
if (item.kind === 'file' && item.type.startsWith('image/')) {
|
|
120
|
+
const file = item.getAsFile();
|
|
121
|
+
if (file) files.push(file);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (files.length > 0) {
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
handleImageInsert(files);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
editorDom.addEventListener('drop', handleDrop as EventListener);
|
|
132
|
+
editorDom.addEventListener('paste', handlePaste as EventListener);
|
|
133
|
+
|
|
134
|
+
return () => {
|
|
135
|
+
editorDom.removeEventListener('drop', handleDrop as EventListener);
|
|
136
|
+
editorDom.removeEventListener('paste', handlePaste as EventListener);
|
|
137
|
+
};
|
|
138
|
+
}, [editor]);
|
|
139
|
+
|
|
58
140
|
// Sync external value changes (e.g. cancel → revert) without full re-mount
|
|
59
141
|
const lastMd = useRef(value);
|
|
60
142
|
useEffect(() => {
|
|
@@ -69,6 +151,14 @@ export default function WysiwygEditor({ value, onChange }: WysiwygEditorProps) {
|
|
|
69
151
|
|
|
70
152
|
return (
|
|
71
153
|
<div className="wysiwyg-wrapper h-full overflow-y-auto px-8 py-6">
|
|
154
|
+
{isUploading && (
|
|
155
|
+
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
|
|
156
|
+
<div className="bg-card border border-border rounded-lg px-6 py-4 text-center shadow-lg">
|
|
157
|
+
<div className="animate-spin inline-block w-5 h-5 border-2 border-primary border-t-transparent rounded-full" />
|
|
158
|
+
<p className="mt-2 text-sm text-muted-foreground">Uploading images...</p>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
)}
|
|
72
162
|
<EditorContent editor={editor} />
|
|
73
163
|
</div>
|
|
74
164
|
);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import Link from 'next/link';
|
|
4
|
-
import { useMemo, useState } from 'react';
|
|
4
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
5
5
|
import {
|
|
6
6
|
AlertTriangle,
|
|
7
7
|
Cable,
|
|
8
8
|
ChevronDown,
|
|
9
9
|
Globe,
|
|
10
|
+
MoreHorizontal,
|
|
11
|
+
Plus,
|
|
10
12
|
Server,
|
|
11
13
|
Zap,
|
|
12
14
|
} from 'lucide-react';
|
|
@@ -66,6 +68,9 @@ export default function AgentsOverviewSection({
|
|
|
66
68
|
allAgents,
|
|
67
69
|
pulseCopy,
|
|
68
70
|
a2aCount,
|
|
71
|
+
onAddCustomAgent,
|
|
72
|
+
onEditCustomAgent,
|
|
73
|
+
onRemoveCustomAgent,
|
|
69
74
|
}: {
|
|
70
75
|
copy: OverviewCopy;
|
|
71
76
|
buckets: AgentBuckets;
|
|
@@ -78,6 +83,9 @@ export default function AgentsOverviewSection({
|
|
|
78
83
|
allAgents: AgentInfo[];
|
|
79
84
|
pulseCopy: PulseCopy;
|
|
80
85
|
a2aCount?: number;
|
|
86
|
+
onAddCustomAgent?: () => void;
|
|
87
|
+
onEditCustomAgent?: (agent: AgentInfo) => void;
|
|
88
|
+
onRemoveCustomAgent?: (agent: AgentInfo) => void;
|
|
81
89
|
}) {
|
|
82
90
|
const allHealthy = riskQueue.length === 0 && (!mcpEnabled || mcpRunning);
|
|
83
91
|
const [riskOpen, setRiskOpen] = useState(false);
|
|
@@ -85,7 +93,7 @@ export default function AgentsOverviewSection({
|
|
|
85
93
|
const sortedAgents = useMemo(
|
|
86
94
|
() =>
|
|
87
95
|
[...allAgents]
|
|
88
|
-
.filter(a => a.present) //
|
|
96
|
+
.filter(a => a.present || a.isCustom) // custom agents always visible
|
|
89
97
|
.sort((a, b) => {
|
|
90
98
|
const rank = (x: AgentInfo) => (x.installed ? 0 : 1);
|
|
91
99
|
return rank(a) - rank(b) || a.name.localeCompare(b.name);
|
|
@@ -216,8 +224,36 @@ export default function AgentsOverviewSection({
|
|
|
216
224
|
</div>
|
|
217
225
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
|
|
218
226
|
{sortedAgents.map((agent, i) => (
|
|
219
|
-
<AgentCard
|
|
227
|
+
<AgentCard
|
|
228
|
+
key={agent.key}
|
|
229
|
+
agent={agent}
|
|
230
|
+
copy={copy}
|
|
231
|
+
index={i}
|
|
232
|
+
mcpEnabled={mcpEnabled}
|
|
233
|
+
onEdit={agent.isCustom ? onEditCustomAgent : undefined}
|
|
234
|
+
onRemove={agent.isCustom ? onRemoveCustomAgent : undefined}
|
|
235
|
+
/>
|
|
220
236
|
))}
|
|
237
|
+
{onAddCustomAgent && (
|
|
238
|
+
<button
|
|
239
|
+
type="button"
|
|
240
|
+
onClick={onAddCustomAgent}
|
|
241
|
+
className="group rounded-xl border-2 border-dashed border-border/60 bg-transparent p-3.5
|
|
242
|
+
hover:border-[var(--amber)]/30 hover:bg-muted/20
|
|
243
|
+
active:scale-[0.98]
|
|
244
|
+
transition-all duration-150
|
|
245
|
+
flex flex-col items-center justify-center gap-2 min-h-[100px]
|
|
246
|
+
cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
247
|
+
aria-label={copy.addCustomAgent as string}
|
|
248
|
+
>
|
|
249
|
+
<div className="w-8 h-8 rounded-full border-2 border-dashed border-muted-foreground/30 flex items-center justify-center group-hover:border-[var(--amber)]/50 transition-colors duration-150">
|
|
250
|
+
<Plus size={16} className="text-muted-foreground/50 group-hover:text-[var(--amber)] transition-colors duration-150" />
|
|
251
|
+
</div>
|
|
252
|
+
<span className="text-xs text-muted-foreground/60 group-hover:text-muted-foreground transition-colors duration-150">
|
|
253
|
+
{copy.addCustomAgent as string}
|
|
254
|
+
</span>
|
|
255
|
+
</button>
|
|
256
|
+
)}
|
|
221
257
|
</div>
|
|
222
258
|
</section>
|
|
223
259
|
) : (
|
|
@@ -298,16 +334,23 @@ function AgentCard({
|
|
|
298
334
|
copy,
|
|
299
335
|
index,
|
|
300
336
|
mcpEnabled = true,
|
|
337
|
+
onEdit,
|
|
338
|
+
onRemove,
|
|
301
339
|
}: {
|
|
302
340
|
agent: AgentInfo;
|
|
303
341
|
copy: OverviewCopy;
|
|
304
342
|
index: number;
|
|
305
343
|
mcpEnabled?: boolean;
|
|
344
|
+
onEdit?: (agent: AgentInfo) => void;
|
|
345
|
+
onRemove?: (agent: AgentInfo) => void;
|
|
306
346
|
}) {
|
|
347
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
348
|
+
const menuRef = useRef<HTMLDivElement>(null);
|
|
307
349
|
const status = resolveAgentStatus(agent);
|
|
308
350
|
const mcpCount = agent.configuredMcpServerCount ?? agent.configuredMcpServers?.length ?? 0;
|
|
309
351
|
const skillCount = agent.installedSkillCount ?? agent.installedSkillNames?.length ?? 0;
|
|
310
352
|
const hasRuntime = agent.runtimeConversationSignal || agent.runtimeUsageSignal;
|
|
353
|
+
const isCustom = agent.isCustom;
|
|
311
354
|
|
|
312
355
|
const statusLabel =
|
|
313
356
|
status === 'connected' ? copy.connected : status === 'detected' ? copy.detected : copy.notFound;
|
|
@@ -318,15 +361,64 @@ function AgentCard({
|
|
|
318
361
|
? 'bg-[var(--amber-dim)] text-[var(--amber-text)]'
|
|
319
362
|
: 'bg-error/10 text-error';
|
|
320
363
|
|
|
364
|
+
// Close menu on outside click
|
|
365
|
+
useEffect(() => {
|
|
366
|
+
if (!menuOpen) return;
|
|
367
|
+
const handler = (e: MouseEvent) => {
|
|
368
|
+
if (menuRef.current && !menuRef.current.contains(e.target as Node)) setMenuOpen(false);
|
|
369
|
+
};
|
|
370
|
+
document.addEventListener('mousedown', handler);
|
|
371
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
372
|
+
}, [menuOpen]);
|
|
373
|
+
|
|
321
374
|
return (
|
|
322
375
|
<Link
|
|
323
376
|
href={`/agents/${encodeURIComponent(agent.key)}`}
|
|
324
|
-
className={
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
377
|
+
className={cn(
|
|
378
|
+
'group relative rounded-xl border border-border bg-card p-3.5',
|
|
379
|
+
'hover:border-[var(--amber)]/30 hover:shadow-[0_2px_8px_rgba(0,0,0,0.04)]',
|
|
380
|
+
'active:scale-[0.98]',
|
|
381
|
+
'transition-all duration-150',
|
|
382
|
+
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
383
|
+
isCustom && 'border-l-2 border-l-[var(--amber)]/40',
|
|
384
|
+
)}
|
|
329
385
|
>
|
|
386
|
+
{/* Custom agent "..." menu */}
|
|
387
|
+
{isCustom && (onEdit || onRemove) && (
|
|
388
|
+
<div ref={menuRef} className="absolute top-2.5 right-2.5 z-10">
|
|
389
|
+
<button
|
|
390
|
+
type="button"
|
|
391
|
+
onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(!menuOpen); }}
|
|
392
|
+
className="w-6 h-6 rounded-md flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted opacity-0 group-hover:opacity-100 transition-all duration-150 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:opacity-100"
|
|
393
|
+
aria-label="Agent options"
|
|
394
|
+
>
|
|
395
|
+
<MoreHorizontal size={14} />
|
|
396
|
+
</button>
|
|
397
|
+
{menuOpen && (
|
|
398
|
+
<div className="absolute right-0 top-full mt-1 w-32 bg-card border border-border rounded-lg shadow-lg py-1 animate-in fade-in-0 zoom-in-95 duration-100">
|
|
399
|
+
{onEdit && (
|
|
400
|
+
<button
|
|
401
|
+
type="button"
|
|
402
|
+
onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(false); onEdit(agent); }}
|
|
403
|
+
className="w-full text-left px-3 py-1.5 text-sm text-foreground hover:bg-muted transition-colors duration-100 cursor-pointer"
|
|
404
|
+
>
|
|
405
|
+
{copy.customAgentEdit as string}
|
|
406
|
+
</button>
|
|
407
|
+
)}
|
|
408
|
+
{onRemove && (
|
|
409
|
+
<button
|
|
410
|
+
type="button"
|
|
411
|
+
onClick={(e) => { e.preventDefault(); e.stopPropagation(); setMenuOpen(false); onRemove(agent); }}
|
|
412
|
+
className="w-full text-left px-3 py-1.5 text-sm text-destructive hover:bg-muted transition-colors duration-100 cursor-pointer"
|
|
413
|
+
>
|
|
414
|
+
{copy.customAgentRemove as string}
|
|
415
|
+
</button>
|
|
416
|
+
)}
|
|
417
|
+
</div>
|
|
418
|
+
)}
|
|
419
|
+
</div>
|
|
420
|
+
)}
|
|
421
|
+
|
|
330
422
|
{/* Top row: avatar + name + status */}
|
|
331
423
|
<div className="flex items-center gap-2.5 mb-3">
|
|
332
424
|
<AgentAvatar name={agent.name} status={status} size="sm" />
|