@geminilight/mindos 0.6.57 → 0.6.59
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 -24
- 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 +1 -1
- 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 +2 -2
- 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 -2
- 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.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.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 -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.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 +5 -5
- 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.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.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.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_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route.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.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.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 +2 -2
- 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 +3 -3
- 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 +3 -3
- 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 +2 -2
- 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 +2 -2
- 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 +2 -8
- 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 +2 -2
- 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 +2 -2
- 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 -24
- package/_standalone/.next/server/chunks/1550.js +1 -1
- package/_standalone/.next/server/chunks/1750.js +1 -1
- package/_standalone/.next/server/chunks/3484.js +1 -1
- package/_standalone/.next/server/chunks/530.js +61 -62
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/{2159.js → 8343.js} +2 -2
- package/_standalone/.next/server/chunks/9787.js +2 -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.a7c127b2c73d1f70.js → 1814.a79b84d37df75c43.js} +1 -1
- package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +1 -0
- package/_standalone/.next/static/chunks/5581-dac72e9f16e5ea29.js +29 -0
- package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +1 -0
- package/_standalone/.next/static/chunks/7249-6cf8f2b78718c59e.js +11 -0
- package/_standalone/.next/static/chunks/8520-56ec9ff087c15204.js +22 -0
- package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-7bdeab5af8e4f5f2.js → page-35ea6de1af2be3b5.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/page-b172ea3743adb047.js +1 -0
- package/_standalone/.next/static/chunks/app/changes/{page-5a72144d1080a699.js → page-6d2f49651c0061f7.js} +1 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-84b95256f6e38aae.js +11 -0
- package/_standalone/.next/static/chunks/app/explore/{page-d3d99308146c2240.js → page-d9f58000bc445360.js} +2 -2
- package/_standalone/.next/static/chunks/app/help/{page-222df603080b5fab.js → page-f8cb806371b3175f.js} +1 -1
- package/_standalone/.next/static/chunks/app/inbox/history/{page-07819cf95cb0805f.js → page-26e71fb6f716a4c4.js} +1 -1
- package/_standalone/.next/static/chunks/app/layout-b89b0d955f39a753.js +164 -0
- package/_standalone/.next/static/chunks/app/login/{page-0eeef685052869a6.js → page-18fb00d568cd1f0e.js} +1 -1
- package/_standalone/.next/static/chunks/app/page-a8e6f085f38388bf.js +1 -0
- package/_standalone/.next/static/chunks/app/setup/{page-99fcfc460fa29733.js → page-821714e7477be46c.js} +1 -1
- package/_standalone/.next/static/chunks/app/trash/page-f92b728b78ac0f7e.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/{not-found-fc04c2bd4f35bc6f.js → not-found-6e0c75ad26ce8572.js} +1 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-f87f4901b5e1a88f.js +12 -0
- package/_standalone/.next/static/chunks/app/wiki/page-641edb1f3cff2f93.js +1 -0
- package/_standalone/.next/static/chunks/{webpack-2c19436659aa657b.js → webpack-72e8d9e9073fd1f9.js} +1 -1
- package/_standalone/.next/static/css/6c104b118d3bc9b7.css +1 -0
- package/_standalone/.next/trace +64 -64
- package/_standalone/__tests__/api/mcp-install.test.ts +3 -2
- package/_standalone/__tests__/ask/non-streaming-api.test.ts +281 -0
- package/_standalone/__tests__/core/skill-install-logic.test.ts +1 -0
- package/_standalone/app/globals.css +2 -1
- package/_standalone/components/AskFab.tsx +4 -4
- package/_standalone/components/AskModal.tsx +1 -1
- package/_standalone/components/GuideCard.tsx +101 -152
- package/_standalone/components/RightAskPanel.tsx +2 -2
- package/_standalone/components/agents/CustomAgentModal.tsx +32 -8
- package/_standalone/components/ask/AskContent.tsx +90 -51
- package/_standalone/components/ask/AskHeader.tsx +218 -18
- package/_standalone/components/ask/MessageList.tsx +66 -47
- package/_standalone/components/ask/SessionHistory.tsx +86 -60
- package/_standalone/components/ask/SessionTabBar.tsx +29 -21
- package/_standalone/components/ask/ThinkingBlock.tsx +6 -5
- package/_standalone/components/ask/ToolCallBlock.tsx +10 -9
- package/_standalone/components/settings/SettingsContent.tsx +1 -1
- package/_standalone/data/skills/mindos/SKILL.md +72 -15
- package/_standalone/data/skills/mindos-zh/SKILL.md +73 -8
- package/_standalone/hooks/useAskSession.ts +23 -1
- package/_standalone/lib/stores/locale-store.ts +20 -6
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/agents/custom/route.ts +8 -0
- package/app/app/api/ask/route.ts +171 -10
- package/app/app/api/mcp/agents/route.ts +5 -3
- package/app/app/api/settings/route.ts +9 -0
- package/app/app/api/settings/test-key/route.ts +13 -1
- package/app/app/globals.css +2 -1
- package/app/app/layout.tsx +16 -4
- package/app/components/AskFab.tsx +4 -4
- package/app/components/AskModal.tsx +1 -1
- package/app/components/GuideCard.tsx +101 -152
- package/app/components/HomeContent.tsx +116 -575
- package/app/components/RightAskPanel.tsx +2 -2
- package/app/components/WikiHomeContent.tsx +151 -3
- package/app/components/agents/CustomAgentModal.tsx +32 -8
- package/app/components/ask/AskContent.tsx +90 -51
- package/app/components/ask/AskHeader.tsx +218 -18
- package/app/components/ask/MessageList.tsx +66 -47
- package/app/components/ask/SessionHistory.tsx +86 -60
- package/app/components/ask/SessionTabBar.tsx +29 -21
- package/app/components/ask/ThinkingBlock.tsx +6 -5
- package/app/components/ask/ToolCallBlock.tsx +10 -9
- package/app/components/settings/SettingsContent.tsx +1 -1
- package/app/data/skills/mindos/SKILL.md +72 -15
- package/app/data/skills/mindos-zh/SKILL.md +73 -8
- package/app/hooks/useAskSession.ts +23 -1
- package/app/lib/custom-agents.ts +45 -2
- package/app/lib/i18n/modules/ai-chat.ts +97 -10
- package/app/lib/i18n/modules/onboarding.ts +12 -12
- package/app/lib/i18n/modules/panels.ts +10 -2
- package/app/lib/mcp-agents.ts +10 -0
- package/app/lib/stores/LocaleStoreInit.tsx +24 -1
- package/app/lib/stores/locale-store.ts +20 -6
- package/app/lib/types.ts +1 -0
- package/bin/lib/mcp-agents.js +10 -0
- package/package.json +1 -1
- package/skills/mindos/SKILL.md +69 -11
- package/skills/mindos/references/knowledge-health.md +120 -0
- package/skills/mindos-max/SKILL.md +238 -0
- package/skills/mindos-max-workspace/evals/evals.json +23 -0
- package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/eval_metadata.json +11 -0
- package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/outputs/transcript.md +203 -0
- package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/outputs/transcript.md +271 -0
- package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/eval_metadata.json +11 -0
- package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/outputs/transcript.md +121 -0
- package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/outputs/transcript.md +168 -0
- package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/eval_metadata.json +11 -0
- package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/outputs/transcript.md +143 -0
- package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/grading.json +28 -0
- package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/outputs/transcript.md +233 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/SKILL.md +165 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/README.md +12 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/post-task-hooks.md +27 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/preference-capture.md +41 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/sop-template.md +74 -0
- package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/write-supplement.md +119 -0
- package/skills/mindos-max-zh/SKILL.md +241 -0
- package/skills/mindos-zh/SKILL.md +72 -8
- package/_standalone/.next/server/chunks/2364.js +0 -2
- package/_standalone/.next/server/chunks/357.js +0 -1
- package/_standalone/.next/static/chunks/1053-5cb008a24930e271.js +0 -29
- package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +0 -1
- package/_standalone/.next/static/chunks/2218-d54538000574ffef.js +0 -1
- package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +0 -1
- package/_standalone/.next/static/chunks/7249-8cd568ad23656622.js +0 -11
- package/_standalone/.next/static/chunks/9274-296ab35f9f09e42e.js +0 -1
- package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-b0103509ce34444b.js +0 -11
- package/_standalone/.next/static/chunks/app/layout-b3919384ec2eb979.js +0 -186
- package/_standalone/.next/static/chunks/app/page-6436a99cda35132b.js +0 -7
- package/_standalone/.next/static/chunks/app/trash/page-8dc388695344fdd4.js +0 -1
- package/_standalone/.next/static/chunks/app/view/[...path]/page-b292b55305ecc021.js +0 -12
- package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +0 -1
- package/_standalone/.next/static/css/fd84c8316ead16eb.css +0 -1
- /package/_standalone/.next/static/{zOaEtgJbdRMncnCBucULp → u8p6oIRTcr_ns-ElNZ9rl}/_buildManifest.js +0 -0
- /package/_standalone/.next/static/{zOaEtgJbdRMncnCBucULp → u8p6oIRTcr_ns-ElNZ9rl}/_ssgManifest.js +0 -0
|
@@ -49,6 +49,7 @@ export async function POST(req: NextRequest) {
|
|
|
49
49
|
...(overrides.presenceDirs && { presenceDirs: overrides.presenceDirs }),
|
|
50
50
|
...(overrides.presenceCli && { presenceCli: overrides.presenceCli }),
|
|
51
51
|
...(overrides.globalNestedKey && { globalNestedKey: overrides.globalNestedKey }),
|
|
52
|
+
...(overrides.skillDir && { skillDir: overrides.skillDir }),
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
customs.push(agent);
|
|
@@ -106,6 +107,7 @@ export async function PUT(req: NextRequest) {
|
|
|
106
107
|
...(updates.preferredTransport && { preferredTransport: updates.preferredTransport }),
|
|
107
108
|
...(updates.presenceCli !== undefined && { presenceCli: updates.presenceCli || undefined }),
|
|
108
109
|
...(updates.globalNestedKey !== undefined && { globalNestedKey: updates.globalNestedKey || undefined }),
|
|
110
|
+
...(updates.skillDir !== undefined && { skillDir: updates.skillDir || undefined }),
|
|
109
111
|
};
|
|
110
112
|
|
|
111
113
|
// Update presenceDirs: explicit override takes priority, then baseDir-derived default
|
|
@@ -115,6 +117,12 @@ export async function PUT(req: NextRequest) {
|
|
|
115
117
|
updated.presenceDirs = [updates.baseDir.endsWith('/') ? updates.baseDir : updates.baseDir + '/'];
|
|
116
118
|
}
|
|
117
119
|
|
|
120
|
+
// Update skillDir default when baseDir changes and no explicit skillDir
|
|
121
|
+
if (!updates.skillDir && updates.baseDir) {
|
|
122
|
+
const bd = updates.baseDir.endsWith('/') ? updates.baseDir : updates.baseDir + '/';
|
|
123
|
+
updated.skillDir = bd + 'skills/';
|
|
124
|
+
}
|
|
125
|
+
|
|
118
126
|
customs[idx] = updated;
|
|
119
127
|
saveCustomAgents(customs);
|
|
120
128
|
|
package/app/app/api/ask/route.ts
CHANGED
|
@@ -405,6 +405,143 @@ function toPiCustomToolDefinitions(tools: AgentTool<any>[]): ToolDefinition<any,
|
|
|
405
405
|
// Non-streaming fallback for proxies that don't support stream + tools
|
|
406
406
|
// ---------------------------------------------------------------------------
|
|
407
407
|
|
|
408
|
+
/**
|
|
409
|
+
* Reassemble SSE chunks (from proxies that ignore stream:false) into a
|
|
410
|
+
* single OpenAI-style chat completion response.
|
|
411
|
+
*
|
|
412
|
+
* SSE format: data: {"choices":[{"delta":{"content":"He"}}]}
|
|
413
|
+
* Output: {"choices":[{"message":{"role":"assistant","content":"Hello!"},"finish_reason":"stop"}]}
|
|
414
|
+
*/
|
|
415
|
+
function reassembleSSE(sseText: string): any {
|
|
416
|
+
const lines = sseText.split('\n');
|
|
417
|
+
let content = '';
|
|
418
|
+
let role = 'assistant';
|
|
419
|
+
let finishReason = 'stop';
|
|
420
|
+
const toolCalls: Map<number, { id: string; type: string; function: { name: string; arguments: string } }> = new Map();
|
|
421
|
+
|
|
422
|
+
for (const line of lines) {
|
|
423
|
+
const trimmed = line.trim();
|
|
424
|
+
if (!trimmed.startsWith('data:')) continue;
|
|
425
|
+
const payload = trimmed.slice(5).trim();
|
|
426
|
+
if (payload === '[DONE]') break;
|
|
427
|
+
|
|
428
|
+
let chunk: any;
|
|
429
|
+
try {
|
|
430
|
+
chunk = JSON.parse(payload);
|
|
431
|
+
} catch {
|
|
432
|
+
continue; // skip unparseable lines
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const delta = chunk?.choices?.[0]?.delta;
|
|
436
|
+
if (!delta) continue;
|
|
437
|
+
|
|
438
|
+
if (delta.role) role = delta.role;
|
|
439
|
+
if (delta.content) content += delta.content;
|
|
440
|
+
if (chunk.choices[0].finish_reason) finishReason = chunk.choices[0].finish_reason;
|
|
441
|
+
|
|
442
|
+
// Accumulate tool calls (they arrive in incremental deltas)
|
|
443
|
+
if (delta.tool_calls) {
|
|
444
|
+
for (const tc of delta.tool_calls) {
|
|
445
|
+
const idx = tc.index ?? 0;
|
|
446
|
+
const existing = toolCalls.get(idx);
|
|
447
|
+
if (!existing) {
|
|
448
|
+
toolCalls.set(idx, {
|
|
449
|
+
id: tc.id ?? '',
|
|
450
|
+
type: tc.type ?? 'function',
|
|
451
|
+
function: {
|
|
452
|
+
name: tc.function?.name ?? '',
|
|
453
|
+
arguments: tc.function?.arguments ?? '',
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
} else {
|
|
457
|
+
if (tc.id) existing.id = tc.id;
|
|
458
|
+
if (tc.function?.name) existing.function.name += tc.function.name;
|
|
459
|
+
if (tc.function?.arguments) existing.function.arguments += tc.function.arguments;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
const message: any = { role, content: content || null };
|
|
466
|
+
if (toolCalls.size > 0) {
|
|
467
|
+
message.tool_calls = Array.from(toolCalls.values());
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
choices: [{ message, finish_reason: finishReason }],
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Convert pi-ai format messages to OpenAI API format.
|
|
477
|
+
* pi-ai messages have nested structures; OpenAI format is flatter with tool_calls array.
|
|
478
|
+
*/
|
|
479
|
+
function piMessagesToOpenAI(piMessages: any[]): any[] {
|
|
480
|
+
return piMessages.map(msg => {
|
|
481
|
+
const role = msg.role;
|
|
482
|
+
|
|
483
|
+
// Skip system role (will be added separately)
|
|
484
|
+
if (role === 'system') return null;
|
|
485
|
+
|
|
486
|
+
// Pass through user messages (simple string content)
|
|
487
|
+
if (role === 'user') {
|
|
488
|
+
return {
|
|
489
|
+
role: 'user',
|
|
490
|
+
content: typeof msg.content === 'string' ? msg.content : msg.content,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Assistant messages: flatten content array into text + tool_calls
|
|
495
|
+
if (role === 'assistant') {
|
|
496
|
+
const content = msg.content;
|
|
497
|
+
let textContent = '';
|
|
498
|
+
const toolCalls: any[] = [];
|
|
499
|
+
|
|
500
|
+
if (Array.isArray(content)) {
|
|
501
|
+
for (const part of content) {
|
|
502
|
+
if (part.type === 'text' && part.text) {
|
|
503
|
+
textContent += part.text;
|
|
504
|
+
} else if (part.type === 'toolCall') {
|
|
505
|
+
toolCalls.push({
|
|
506
|
+
id: part.id ?? `call_${Date.now()}`,
|
|
507
|
+
type: 'function',
|
|
508
|
+
function: {
|
|
509
|
+
name: part.name ?? 'unknown',
|
|
510
|
+
arguments: JSON.stringify(part.arguments ?? {}),
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
const result: any = { role: 'assistant' };
|
|
518
|
+
// Always include content (even if empty) for tool-call-only messages
|
|
519
|
+
// OpenAI API may handle this differently, but it's safer to include empty string
|
|
520
|
+
result.content = textContent || '';
|
|
521
|
+
if (toolCalls.length > 0) result.tool_calls = toolCalls;
|
|
522
|
+
return result;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// Tool result messages
|
|
526
|
+
if (role === 'toolResult') {
|
|
527
|
+
const contentText = Array.isArray(msg.content)
|
|
528
|
+
? msg.content
|
|
529
|
+
.filter((c: any) => c.type === 'text')
|
|
530
|
+
.map((c: any) => c.text ?? '')
|
|
531
|
+
.join('\n')
|
|
532
|
+
: String(msg.content ?? '');
|
|
533
|
+
|
|
534
|
+
return {
|
|
535
|
+
role: 'tool',
|
|
536
|
+
tool_call_id: msg.toolCallId ?? 'unknown',
|
|
537
|
+
content: contentText,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return null;
|
|
542
|
+
}).filter(Boolean);
|
|
543
|
+
}
|
|
544
|
+
|
|
408
545
|
/**
|
|
409
546
|
* Mini agent loop using non-streaming OpenAI-compatible API.
|
|
410
547
|
* Used when a proxy silently breaks stream+tools by returning plain text.
|
|
@@ -415,7 +552,7 @@ async function runNonStreamingFallback(opts: {
|
|
|
415
552
|
apiKey: string;
|
|
416
553
|
model: string;
|
|
417
554
|
systemPrompt: string;
|
|
418
|
-
historyMessages:
|
|
555
|
+
historyMessages: any[];
|
|
419
556
|
userContent: string;
|
|
420
557
|
tools: AgentTool<any>[];
|
|
421
558
|
send: (event: MindOSSSEvent) => void;
|
|
@@ -433,9 +570,12 @@ async function runNonStreamingFallback(opts: {
|
|
|
433
570
|
},
|
|
434
571
|
}));
|
|
435
572
|
|
|
436
|
-
|
|
573
|
+
// Convert pi-ai format messages to OpenAI format
|
|
574
|
+
const openaiMessages = piMessagesToOpenAI(historyMessages);
|
|
575
|
+
|
|
576
|
+
const messages: { role: string; content?: unknown; tool_calls?: unknown; tool_call_id?: string }[] = [
|
|
437
577
|
{ role: 'system', content: systemPrompt },
|
|
438
|
-
...
|
|
578
|
+
...openaiMessages,
|
|
439
579
|
{ role: 'user', content: userContent },
|
|
440
580
|
];
|
|
441
581
|
|
|
@@ -447,6 +587,9 @@ async function runNonStreamingFallback(opts: {
|
|
|
447
587
|
if (signal.aborted) throw new Error('Request aborted');
|
|
448
588
|
step++;
|
|
449
589
|
|
|
590
|
+
// Use stream:true and parse SSE ourselves.
|
|
591
|
+
// Many proxies ignore stream:false (returning SSE with empty choices or broken JSON).
|
|
592
|
+
// Using stream:true is the most universally compatible approach.
|
|
450
593
|
const resp = await fetch(endpoint, {
|
|
451
594
|
method: 'POST',
|
|
452
595
|
headers: {
|
|
@@ -458,7 +601,7 @@ async function runNonStreamingFallback(opts: {
|
|
|
458
601
|
messages,
|
|
459
602
|
tools: openaiTools.length > 0 ? openaiTools : undefined,
|
|
460
603
|
tool_choice: openaiTools.length > 0 ? 'auto' : undefined,
|
|
461
|
-
stream:
|
|
604
|
+
stream: true,
|
|
462
605
|
}),
|
|
463
606
|
signal,
|
|
464
607
|
});
|
|
@@ -468,11 +611,28 @@ async function runNonStreamingFallback(opts: {
|
|
|
468
611
|
throw new Error(`Non-streaming API error ${resp.status}: ${errText.slice(0, 200)}`);
|
|
469
612
|
}
|
|
470
613
|
|
|
471
|
-
|
|
614
|
+
// Read the full response body (SSE or JSON)
|
|
615
|
+
const rawText = await resp.text();
|
|
616
|
+
const trimmed = rawText.trimStart();
|
|
617
|
+
|
|
618
|
+
let data: any;
|
|
619
|
+
if (trimmed.startsWith('data:')) {
|
|
620
|
+
// Response is SSE — reassemble chunks into a single OpenAI response
|
|
621
|
+
data = reassembleSSE(trimmed);
|
|
622
|
+
} else {
|
|
623
|
+
// Some endpoints might still return plain JSON even with stream:true
|
|
624
|
+
try {
|
|
625
|
+
data = JSON.parse(rawText);
|
|
626
|
+
} catch {
|
|
627
|
+
throw new Error(`API returned invalid response: ${rawText.slice(0, 200)}`);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
472
631
|
const choice = data?.choices?.[0];
|
|
473
632
|
if (!choice) throw new Error('Empty response from API');
|
|
474
633
|
|
|
475
|
-
|
|
634
|
+
// reassembleSSE always produces .message; standard JSON may use .message or .delta
|
|
635
|
+
const msg = choice.message ?? choice.delta ?? {};
|
|
476
636
|
const finishReason: string = choice.finish_reason ?? 'stop';
|
|
477
637
|
|
|
478
638
|
// Emit text content in chunks to simulate streaming appearance
|
|
@@ -1185,11 +1345,12 @@ export async function POST(req: NextRequest) {
|
|
|
1185
1345
|
if (lastPromptError) throw lastPromptError;
|
|
1186
1346
|
|
|
1187
1347
|
metrics.recordRequest(Date.now() - requestStartTime);
|
|
1188
|
-
if (!hasContent && lastModelError) {
|
|
1189
|
-
// No content received —
|
|
1190
|
-
//
|
|
1348
|
+
if (!hasContent && (lastModelError || (baseUrl && provider === 'openai'))) {
|
|
1349
|
+
// No content received — either a model error or proxy compatibility issue.
|
|
1350
|
+
// For OpenAI-compatible endpoints with custom baseUrl, always try the fallback
|
|
1351
|
+
// even without an explicit error (some proxies silently return empty responses).
|
|
1191
1352
|
if (baseUrl && provider === 'openai') {
|
|
1192
|
-
send({ type: 'status', message: t.proxyCompatDetecting });
|
|
1353
|
+
send({ type: 'status', message: lastModelError ? t.proxyCompatDetecting : t.proxyCompatMode });
|
|
1193
1354
|
try {
|
|
1194
1355
|
await runNonStreamingFallback({
|
|
1195
1356
|
baseUrl,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
detectAgentInstalledSkills,
|
|
15
15
|
resolveSkillWorkspaceProfile,
|
|
16
16
|
} from '@/lib/mcp-agents';
|
|
17
|
-
import { getAllAgents, loadCustomAgents } from '@/lib/custom-agents';
|
|
17
|
+
import { getAllAgents, loadCustomAgents, scanCustomAgentSkills } from '@/lib/custom-agents';
|
|
18
18
|
import { readSettings } from '@/lib/settings';
|
|
19
19
|
import { scanSkillDirs } from '@/lib/pi-integration/skills';
|
|
20
20
|
import { getMindRoot } from '@/lib/fs';
|
|
@@ -105,7 +105,9 @@ export async function GET() {
|
|
|
105
105
|
status = detectInstalled(key);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
const skillProfile =
|
|
108
|
+
const skillProfile = isCustom
|
|
109
|
+
? { mode: 'additional' as const, skillAgentName: key, workspacePath: expandHome(customByKey[key]?.skillDir || agent.presenceDirs?.[0] + 'skills/') }
|
|
110
|
+
: resolveSkillWorkspaceProfile(key);
|
|
109
111
|
const runtime = isCustom
|
|
110
112
|
? { hiddenRootPath: '', hiddenRootPresent: false, conversationSignal: false, usageSignal: false, lastActivityAt: undefined }
|
|
111
113
|
: detectAgentRuntimeSignals(key);
|
|
@@ -113,7 +115,7 @@ export async function GET() {
|
|
|
113
115
|
? { servers: [] as string[], sources: [] as string[] }
|
|
114
116
|
: detectAgentConfiguredMcpServers(key);
|
|
115
117
|
const installedSkills = isCustom
|
|
116
|
-
?
|
|
118
|
+
? scanCustomAgentSkills(customByKey[key])
|
|
117
119
|
: detectAgentInstalledSkills(key);
|
|
118
120
|
|
|
119
121
|
return {
|
|
@@ -124,6 +124,15 @@ export async function POST(req: NextRequest) {
|
|
|
124
124
|
};
|
|
125
125
|
|
|
126
126
|
writeSettings(next);
|
|
127
|
+
// Clear proxy compat cache when AI config changes — stale cache causes
|
|
128
|
+
// the non-streaming fallback to be used even when streaming would work.
|
|
129
|
+
if (JSON.stringify(next.ai) !== JSON.stringify(current.ai)) {
|
|
130
|
+
const { readSettings: rs, writeSettings: ws } = await import('@/lib/settings');
|
|
131
|
+
const s = rs();
|
|
132
|
+
if (s.baseUrlCompat && Object.keys(s.baseUrlCompat).length > 0) {
|
|
133
|
+
ws({ ...s, baseUrlCompat: {} });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
127
136
|
if (next.mindRoot !== current.mindRoot) invalidateCache();
|
|
128
137
|
return NextResponse.json({ ok: true });
|
|
129
138
|
} catch (err) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const dynamic = 'force-dynamic';
|
|
2
2
|
import { NextRequest, NextResponse } from 'next/server';
|
|
3
3
|
import { complete } from '@mariozechner/pi-ai';
|
|
4
|
-
import { effectiveAiConfig } from '@/lib/settings';
|
|
4
|
+
import { effectiveAiConfig, readBaseUrlCompat, writeSettings, readSettings } from '@/lib/settings';
|
|
5
5
|
import { getModelConfig } from '@/lib/agent/model';
|
|
6
6
|
import { type ProviderId, isProviderId } from '@/lib/agent/providers';
|
|
7
7
|
|
|
@@ -84,6 +84,18 @@ export async function POST(req: NextRequest) {
|
|
|
84
84
|
signal: ctrl.signal,
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
+
// Clear stale proxy compat cache for this baseUrl on successful test.
|
|
88
|
+
// Prevents stale 'non-streaming' cache from forcing the fallback path.
|
|
89
|
+
if (baseUrl) {
|
|
90
|
+
const compat = readBaseUrlCompat();
|
|
91
|
+
if (compat[baseUrl]) {
|
|
92
|
+
const s = readSettings();
|
|
93
|
+
const updated = { ...(s.baseUrlCompat ?? {}) };
|
|
94
|
+
delete updated[baseUrl];
|
|
95
|
+
writeSettings({ ...s, baseUrlCompat: updated });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
87
99
|
return NextResponse.json({ ok: true, latency: Date.now() - start });
|
|
88
100
|
} catch (e) {
|
|
89
101
|
return NextResponse.json({ ok: false, ...classifyPiAiError(e) });
|
package/app/app/globals.css
CHANGED
|
@@ -180,7 +180,7 @@ body {
|
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
.prose {
|
|
183
|
-
font-family: var(--prose-font-override, '
|
|
183
|
+
font-family: var(--prose-font-override, 'IBM Plex Sans', system-ui, sans-serif);
|
|
184
184
|
color: var(--prose-body);
|
|
185
185
|
line-height: 1.85;
|
|
186
186
|
font-size: var(--prose-font-size-override, 0.95rem);
|
|
@@ -238,6 +238,7 @@ body {
|
|
|
238
238
|
|
|
239
239
|
/* Ask Panel — compact prose for side panel chat bubbles */
|
|
240
240
|
.prose.prose-panel {
|
|
241
|
+
font-family: 'IBM Plex Sans', system-ui, sans-serif;
|
|
241
242
|
font-size: 0.8125rem !important;
|
|
242
243
|
line-height: 1.6;
|
|
243
244
|
}
|
package/app/app/layout.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import ErrorBoundary from '@/components/ErrorBoundary';
|
|
|
9
9
|
import Toaster from '@/components/ui/Toaster';
|
|
10
10
|
import RegisterSW from './register-sw';
|
|
11
11
|
import UpdateOverlay from '@/components/UpdateOverlay';
|
|
12
|
-
import { cookies } from 'next/headers';
|
|
12
|
+
import { cookies, headers } from 'next/headers';
|
|
13
13
|
import type { Locale } from '@/lib/i18n';
|
|
14
14
|
import '@/lib/renderers/index'; // globally register built-in renderers once
|
|
15
15
|
|
|
@@ -67,9 +67,21 @@ export default async function RootLayout({
|
|
|
67
67
|
console.error('[RootLayout] Failed to load file tree:', err);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
// Read locale from cookie
|
|
70
|
+
// Read locale from cookie, or infer from Accept-Language header
|
|
71
|
+
// This matches the client pre-hydration script logic:
|
|
72
|
+
// localStorage > system language preference (via Accept-Language)
|
|
71
73
|
const cookieStore = await cookies();
|
|
72
|
-
const
|
|
74
|
+
const cookieLocale = cookieStore.get('locale')?.value;
|
|
75
|
+
let ssrLocale: Locale = 'en';
|
|
76
|
+
if (cookieLocale === 'zh') {
|
|
77
|
+
ssrLocale = 'zh';
|
|
78
|
+
} else if (cookieLocale !== 'en') {
|
|
79
|
+
// Cookie not set or invalid — infer from Accept-Language header
|
|
80
|
+
// (matches client: navigator.language.startsWith('zh') ? 'zh' : 'en')
|
|
81
|
+
const headerStore = await headers();
|
|
82
|
+
const acceptLanguage = headerStore.get('Accept-Language') || '';
|
|
83
|
+
ssrLocale = acceptLanguage.includes('zh') ? 'zh' : 'en';
|
|
84
|
+
}
|
|
73
85
|
|
|
74
86
|
return (
|
|
75
87
|
<html lang={ssrLocale} suppressHydrationWarning>
|
|
@@ -92,7 +104,7 @@ export default async function RootLayout({
|
|
|
92
104
|
{/* Apply user appearance settings before first paint, preventing flash */}
|
|
93
105
|
<script
|
|
94
106
|
dangerouslySetInnerHTML={{
|
|
95
|
-
__html: `(function(){try{var s=localStorage.getItem('theme');var dark=s&&s!=='system'?s==='dark':window.matchMedia('(prefers-color-scheme: dark)').matches;document.documentElement.classList.toggle('dark',dark);var cw=localStorage.getItem('content-width');if(cw)document.documentElement.style.setProperty('--content-width-override',cw);var pf=localStorage.getItem('prose-font');if(pf==='geist'){pf='inter';localStorage.setItem('prose-font','inter')}var fm={lora:'"Lora", Georgia, serif','ibm-plex-sans':'"IBM Plex Sans", sans-serif',inter:'var(--font-inter), sans-serif','ibm-plex-mono':'"IBM Plex Mono", monospace'};if(pf&&fm[pf])document.documentElement.style.setProperty('--prose-font-override',fm[pf]);var loc=localStorage.getItem('locale')||'system';var rl=loc==='system'?(navigator.language.startsWith('zh')?'zh':'en'):loc;document.documentElement.lang=rl==='zh'?'zh':'en';document.cookie='locale='+rl+';path=/;max-age=31536000;SameSite=Lax'}catch(e){}})();`,
|
|
107
|
+
__html: `(function(){try{var s=localStorage.getItem('theme');var dark=s&&s!=='system'?s==='dark':window.matchMedia('(prefers-color-scheme: dark)').matches;document.documentElement.classList.toggle('dark',dark);var cw=localStorage.getItem('content-width');if(cw)document.documentElement.style.setProperty('--content-width-override',cw);var pf=localStorage.getItem('prose-font');if(pf==='geist'){pf='inter';localStorage.setItem('prose-font','inter')}var fm={lora:'"Lora", Georgia, serif','ibm-plex-sans':'"IBM Plex Sans", sans-serif',inter:'var(--font-inter), sans-serif','ibm-plex-mono':'"IBM Plex Mono", monospace'};if(pf&&fm[pf])document.documentElement.style.setProperty('--prose-font-override',fm[pf]);var loc=localStorage.getItem('locale')||'system';var rl=loc==='system'?(navigator.language.startsWith('zh')?'zh':'en'):loc;window.__mindos_locale__=rl;document.documentElement.lang=rl==='zh'?'zh':'en';document.cookie='locale='+rl+';path=/;max-age=31536000;SameSite=Lax'}catch(e){}})();`,
|
|
96
108
|
}}
|
|
97
109
|
/>
|
|
98
110
|
</head>
|
|
@@ -22,11 +22,11 @@ export default function AskFab({ onToggle, askPanelOpen }: AskFabProps) {
|
|
|
22
22
|
fixed z-40 bottom-5 right-5
|
|
23
23
|
items-center justify-center
|
|
24
24
|
gap-0 hover:gap-2
|
|
25
|
-
p-3 rounded-
|
|
26
|
-
text-
|
|
27
|
-
shadow-
|
|
25
|
+
p-3 rounded-2xl
|
|
26
|
+
text-[var(--amber-foreground)] font-medium text-[13px]
|
|
27
|
+
shadow-md shadow-[var(--amber)]/15
|
|
28
28
|
transition-all duration-200 ease-out
|
|
29
|
-
hover:shadow-
|
|
29
|
+
hover:shadow-lg hover:shadow-[var(--amber)]/20
|
|
30
30
|
active:scale-95 cursor-pointer overflow-hidden
|
|
31
31
|
${askPanelOpen ? 'opacity-0 pointer-events-none translate-y-2' : 'opacity-100 translate-y-0'}
|
|
32
32
|
`}
|
|
@@ -29,7 +29,7 @@ export default function AskModal({ open, onClose, currentFile, initialMessage, i
|
|
|
29
29
|
role="dialog"
|
|
30
30
|
aria-modal="true"
|
|
31
31
|
aria-label={t.ask.title}
|
|
32
|
-
className="w-full md:max-w-2xl md:mx-4 bg-card border-t md:border border-border rounded-t-2xl md:rounded-
|
|
32
|
+
className="w-full md:max-w-2xl md:mx-4 bg-card border-t md:border border-border/60 rounded-t-2xl md:rounded-2xl shadow-2xl flex flex-col h-[92vh] md:h-auto md:max-h-[75vh]"
|
|
33
33
|
>
|
|
34
34
|
<AskContent
|
|
35
35
|
visible={open}
|