@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.
Files changed (293) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +24 -24
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +1 -1
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +2 -2
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +2 -2
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -1
  42. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/agents/custom/route.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/ask/route.js +5 -5
  46. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  47. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  62. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/settings/reset-token/route.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  97. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  98. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  100. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  106. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/skills/route.js +1 -1
  108. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  111. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  117. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/changes/page.js +2 -2
  119. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/echo/[segment]/page.js +3 -3
  122. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/echo/page.js +1 -1
  125. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/explore/page.js +3 -3
  128. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/help/page.js +2 -2
  131. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  134. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/login/page.js +2 -2
  137. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/page.js +2 -8
  140. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/setup/page.js +2 -2
  143. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/trash/page.js +3 -3
  146. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  149. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/wiki/page.js +2 -2
  152. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app-paths-manifest.json +24 -24
  155. package/_standalone/.next/server/chunks/1550.js +1 -1
  156. package/_standalone/.next/server/chunks/1750.js +1 -1
  157. package/_standalone/.next/server/chunks/3484.js +1 -1
  158. package/_standalone/.next/server/chunks/530.js +61 -62
  159. package/_standalone/.next/server/chunks/6539.js +1 -1
  160. package/_standalone/.next/server/chunks/{2159.js → 8343.js} +2 -2
  161. package/_standalone/.next/server/chunks/9787.js +2 -0
  162. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  163. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  164. package/_standalone/.next/server/pages/500.html +2 -2
  165. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  167. package/_standalone/.next/static/chunks/{1814.a7c127b2c73d1f70.js → 1814.a79b84d37df75c43.js} +1 -1
  168. package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +1 -0
  169. package/_standalone/.next/static/chunks/5581-dac72e9f16e5ea29.js +29 -0
  170. package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +1 -0
  171. package/_standalone/.next/static/chunks/7249-6cf8f2b78718c59e.js +11 -0
  172. package/_standalone/.next/static/chunks/8520-56ec9ff087c15204.js +22 -0
  173. package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +1 -0
  174. package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-7bdeab5af8e4f5f2.js → page-35ea6de1af2be3b5.js} +1 -1
  175. package/_standalone/.next/static/chunks/app/agents/page-b172ea3743adb047.js +1 -0
  176. package/_standalone/.next/static/chunks/app/changes/{page-5a72144d1080a699.js → page-6d2f49651c0061f7.js} +1 -1
  177. package/_standalone/.next/static/chunks/app/echo/[segment]/page-84b95256f6e38aae.js +11 -0
  178. package/_standalone/.next/static/chunks/app/explore/{page-d3d99308146c2240.js → page-d9f58000bc445360.js} +2 -2
  179. package/_standalone/.next/static/chunks/app/help/{page-222df603080b5fab.js → page-f8cb806371b3175f.js} +1 -1
  180. package/_standalone/.next/static/chunks/app/inbox/history/{page-07819cf95cb0805f.js → page-26e71fb6f716a4c4.js} +1 -1
  181. package/_standalone/.next/static/chunks/app/layout-b89b0d955f39a753.js +164 -0
  182. package/_standalone/.next/static/chunks/app/login/{page-0eeef685052869a6.js → page-18fb00d568cd1f0e.js} +1 -1
  183. package/_standalone/.next/static/chunks/app/page-a8e6f085f38388bf.js +1 -0
  184. package/_standalone/.next/static/chunks/app/setup/{page-99fcfc460fa29733.js → page-821714e7477be46c.js} +1 -1
  185. package/_standalone/.next/static/chunks/app/trash/page-f92b728b78ac0f7e.js +1 -0
  186. package/_standalone/.next/static/chunks/app/view/[...path]/{not-found-fc04c2bd4f35bc6f.js → not-found-6e0c75ad26ce8572.js} +1 -1
  187. package/_standalone/.next/static/chunks/app/view/[...path]/page-f87f4901b5e1a88f.js +12 -0
  188. package/_standalone/.next/static/chunks/app/wiki/page-641edb1f3cff2f93.js +1 -0
  189. package/_standalone/.next/static/chunks/{webpack-2c19436659aa657b.js → webpack-72e8d9e9073fd1f9.js} +1 -1
  190. package/_standalone/.next/static/css/6c104b118d3bc9b7.css +1 -0
  191. package/_standalone/.next/trace +64 -64
  192. package/_standalone/__tests__/api/mcp-install.test.ts +3 -2
  193. package/_standalone/__tests__/ask/non-streaming-api.test.ts +281 -0
  194. package/_standalone/__tests__/core/skill-install-logic.test.ts +1 -0
  195. package/_standalone/app/globals.css +2 -1
  196. package/_standalone/components/AskFab.tsx +4 -4
  197. package/_standalone/components/AskModal.tsx +1 -1
  198. package/_standalone/components/GuideCard.tsx +101 -152
  199. package/_standalone/components/RightAskPanel.tsx +2 -2
  200. package/_standalone/components/agents/CustomAgentModal.tsx +32 -8
  201. package/_standalone/components/ask/AskContent.tsx +90 -51
  202. package/_standalone/components/ask/AskHeader.tsx +218 -18
  203. package/_standalone/components/ask/MessageList.tsx +66 -47
  204. package/_standalone/components/ask/SessionHistory.tsx +86 -60
  205. package/_standalone/components/ask/SessionTabBar.tsx +29 -21
  206. package/_standalone/components/ask/ThinkingBlock.tsx +6 -5
  207. package/_standalone/components/ask/ToolCallBlock.tsx +10 -9
  208. package/_standalone/components/settings/SettingsContent.tsx +1 -1
  209. package/_standalone/data/skills/mindos/SKILL.md +72 -15
  210. package/_standalone/data/skills/mindos-zh/SKILL.md +73 -8
  211. package/_standalone/hooks/useAskSession.ts +23 -1
  212. package/_standalone/lib/stores/locale-store.ts +20 -6
  213. package/_standalone/tsconfig.tsbuildinfo +1 -1
  214. package/app/app/api/agents/custom/route.ts +8 -0
  215. package/app/app/api/ask/route.ts +171 -10
  216. package/app/app/api/mcp/agents/route.ts +5 -3
  217. package/app/app/api/settings/route.ts +9 -0
  218. package/app/app/api/settings/test-key/route.ts +13 -1
  219. package/app/app/globals.css +2 -1
  220. package/app/app/layout.tsx +16 -4
  221. package/app/components/AskFab.tsx +4 -4
  222. package/app/components/AskModal.tsx +1 -1
  223. package/app/components/GuideCard.tsx +101 -152
  224. package/app/components/HomeContent.tsx +116 -575
  225. package/app/components/RightAskPanel.tsx +2 -2
  226. package/app/components/WikiHomeContent.tsx +151 -3
  227. package/app/components/agents/CustomAgentModal.tsx +32 -8
  228. package/app/components/ask/AskContent.tsx +90 -51
  229. package/app/components/ask/AskHeader.tsx +218 -18
  230. package/app/components/ask/MessageList.tsx +66 -47
  231. package/app/components/ask/SessionHistory.tsx +86 -60
  232. package/app/components/ask/SessionTabBar.tsx +29 -21
  233. package/app/components/ask/ThinkingBlock.tsx +6 -5
  234. package/app/components/ask/ToolCallBlock.tsx +10 -9
  235. package/app/components/settings/SettingsContent.tsx +1 -1
  236. package/app/data/skills/mindos/SKILL.md +72 -15
  237. package/app/data/skills/mindos-zh/SKILL.md +73 -8
  238. package/app/hooks/useAskSession.ts +23 -1
  239. package/app/lib/custom-agents.ts +45 -2
  240. package/app/lib/i18n/modules/ai-chat.ts +97 -10
  241. package/app/lib/i18n/modules/onboarding.ts +12 -12
  242. package/app/lib/i18n/modules/panels.ts +10 -2
  243. package/app/lib/mcp-agents.ts +10 -0
  244. package/app/lib/stores/LocaleStoreInit.tsx +24 -1
  245. package/app/lib/stores/locale-store.ts +20 -6
  246. package/app/lib/types.ts +1 -0
  247. package/bin/lib/mcp-agents.js +10 -0
  248. package/package.json +1 -1
  249. package/skills/mindos/SKILL.md +69 -11
  250. package/skills/mindos/references/knowledge-health.md +120 -0
  251. package/skills/mindos-max/SKILL.md +238 -0
  252. package/skills/mindos-max-workspace/evals/evals.json +23 -0
  253. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/eval_metadata.json +11 -0
  254. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/grading.json +28 -0
  255. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/old_skill/outputs/transcript.md +203 -0
  256. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/grading.json +28 -0
  257. package/skills/mindos-max-workspace/iteration-1/capture-debugging-experience-en/with_skill/outputs/transcript.md +271 -0
  258. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/eval_metadata.json +11 -0
  259. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/grading.json +28 -0
  260. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/old_skill/outputs/transcript.md +121 -0
  261. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/grading.json +28 -0
  262. package/skills/mindos-max-workspace/iteration-1/save-meeting-decision-zh/with_skill/outputs/transcript.md +168 -0
  263. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/eval_metadata.json +11 -0
  264. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/grading.json +28 -0
  265. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/old_skill/outputs/transcript.md +143 -0
  266. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/grading.json +28 -0
  267. package/skills/mindos-max-workspace/iteration-1/search-past-decision-zh/with_skill/outputs/transcript.md +233 -0
  268. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/SKILL.md +165 -0
  269. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/README.md +12 -0
  270. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/post-task-hooks.md +27 -0
  271. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/preference-capture.md +41 -0
  272. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/sop-template.md +74 -0
  273. package/skills/mindos-max-workspace/skill-snapshot/mindos-original/references/write-supplement.md +119 -0
  274. package/skills/mindos-max-zh/SKILL.md +241 -0
  275. package/skills/mindos-zh/SKILL.md +72 -8
  276. package/_standalone/.next/server/chunks/2364.js +0 -2
  277. package/_standalone/.next/server/chunks/357.js +0 -1
  278. package/_standalone/.next/static/chunks/1053-5cb008a24930e271.js +0 -29
  279. package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +0 -1
  280. package/_standalone/.next/static/chunks/2218-d54538000574ffef.js +0 -1
  281. package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +0 -1
  282. package/_standalone/.next/static/chunks/7249-8cd568ad23656622.js +0 -11
  283. package/_standalone/.next/static/chunks/9274-296ab35f9f09e42e.js +0 -1
  284. package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +0 -1
  285. package/_standalone/.next/static/chunks/app/echo/[segment]/page-b0103509ce34444b.js +0 -11
  286. package/_standalone/.next/static/chunks/app/layout-b3919384ec2eb979.js +0 -186
  287. package/_standalone/.next/static/chunks/app/page-6436a99cda35132b.js +0 -7
  288. package/_standalone/.next/static/chunks/app/trash/page-8dc388695344fdd4.js +0 -1
  289. package/_standalone/.next/static/chunks/app/view/[...path]/page-b292b55305ecc021.js +0 -12
  290. package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +0 -1
  291. package/_standalone/.next/static/css/fd84c8316ead16eb.css +0 -1
  292. /package/_standalone/.next/static/{zOaEtgJbdRMncnCBucULp → u8p6oIRTcr_ns-ElNZ9rl}/_buildManifest.js +0 -0
  293. /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
 
@@ -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: { role: string; content: unknown }[];
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
- const messages: { role: string; content: unknown; tool_calls?: unknown; tool_call_id?: string }[] = [
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
- ...historyMessages,
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: false,
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
- const data = await resp.json() as any;
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
- const msg = choice.message;
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 — check if this looks like a proxy stream+tools incompatibility.
1190
- // Only attempt fallback for OpenAI-compatible endpoints with a custom baseUrl.
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 = resolveSkillWorkspaceProfile(key);
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
- ? { skills: [] as string[], sourcePath: '' }
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) });
@@ -180,7 +180,7 @@ body {
180
180
  }
181
181
 
182
182
  .prose {
183
- font-family: var(--prose-font-override, 'Lora', Georgia, serif);
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
  }
@@ -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 (set by pre-hydration script) so SSR matches client
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 ssrLocale: Locale = cookieStore.get('locale')?.value === 'zh' ? 'zh' : 'en';
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-xl
26
- text-white font-medium text-[13px]
27
- shadow-sm shadow-amber-900/10
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-md hover:shadow-amber-900/15
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-xl shadow-2xl flex flex-col h-[92vh] md:h-auto md:max-h-[75vh]"
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}