@geminilight/mindos 0.6.58 → 0.6.60

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 (410) 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 +23 -22
  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/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +2 -2
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agents/copy-skill/route.js +1 -0
  41. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -0
  42. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -0
  43. package/_standalone/.next/server/app/api/agents/custom/detect/route.js +1 -1
  44. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/route.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/ask/route.js +18 -7
  48. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  56. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  67. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/changes/page.js +2 -2
  95. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  96. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/echo/[segment]/page.js +3 -3
  98. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  99. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/echo/page.js +1 -1
  101. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/explore/page.js +2 -2
  104. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  105. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/help/page.js +2 -2
  107. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  108. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  110. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  111. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/login/page.js +2 -2
  113. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  114. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/page.js +2 -8
  116. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  117. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/setup/page.js +2 -2
  119. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/trash/page.js +3 -3
  122. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  125. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/wiki/page.js +2 -2
  128. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app-paths-manifest.json +23 -22
  131. package/_standalone/.next/server/chunks/1550.js +1 -1
  132. package/_standalone/.next/server/chunks/3484.js +1 -1
  133. package/_standalone/.next/server/chunks/530.js +70 -71
  134. package/_standalone/.next/server/chunks/{6793.js → 9753.js} +2 -2
  135. package/_standalone/.next/server/chunks/9787.js +2 -0
  136. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  137. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  138. package/_standalone/.next/server/pages/500.html +2 -2
  139. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  141. package/_standalone/.next/static/K3wZNf5bj_AFYwtqcRXIf/_buildManifest.js +1 -0
  142. package/_standalone/.next/static/chunks/1369-7d0ac5d1564eed1e.js +1 -0
  143. package/_standalone/.next/static/chunks/{1814.a7c127b2c73d1f70.js → 1814.a79b84d37df75c43.js} +1 -1
  144. package/_standalone/.next/static/chunks/3427-2e61a5df1f5e55fb.js +1 -0
  145. package/_standalone/.next/static/chunks/{1053-fe009233cff06e72.js → 5581-974dfb26d1d1b38f.js} +3 -3
  146. package/_standalone/.next/static/chunks/6297-085daa21037d5f81.js +1 -0
  147. package/_standalone/.next/static/chunks/7249-b0a9c77b9a84b11c.js +11 -0
  148. package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +1 -0
  149. package/_standalone/.next/static/chunks/8520-76d1b05072178b43.js +22 -0
  150. package/_standalone/.next/static/chunks/9186-ead47513192f658b.js +1 -0
  151. package/_standalone/.next/static/chunks/9905-a19d379cb225246e.js +1 -0
  152. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
  153. package/_standalone/.next/static/chunks/app/_global-error/{page-2f4705aa66819b86.js → page-2ceea6eabf25b1f2.js} +1 -1
  154. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-0ea3571c8fbae823.js +1 -0
  155. package/_standalone/.next/static/chunks/app/agents/page-66858acbcd1d4bf8.js +1 -0
  156. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
  157. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-2f4705aa66819b86.js → route-2ceea6eabf25b1f2.js} +1 -1
  158. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2ceea6eabf25b1f2.js +1 -0
  159. package/_standalone/.next/static/chunks/app/api/a2a/route-2ceea6eabf25b1f2.js +1 -0
  160. package/_standalone/.next/static/chunks/app/api/acp/config/route-2ceea6eabf25b1f2.js +1 -0
  161. package/_standalone/.next/static/chunks/app/api/acp/detect/route-2ceea6eabf25b1f2.js +1 -0
  162. package/_standalone/.next/static/chunks/app/api/acp/install/route-2ceea6eabf25b1f2.js +1 -0
  163. package/_standalone/.next/static/chunks/app/api/acp/registry/route-2ceea6eabf25b1f2.js +1 -0
  164. package/_standalone/.next/static/chunks/app/api/acp/session/route-2ceea6eabf25b1f2.js +1 -0
  165. package/_standalone/.next/static/chunks/app/api/agent-activity/route-2ceea6eabf25b1f2.js +1 -0
  166. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-2ceea6eabf25b1f2.js +1 -0
  167. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2ceea6eabf25b1f2.js +1 -0
  168. package/_standalone/.next/static/chunks/app/api/agents/custom/route-2ceea6eabf25b1f2.js +1 -0
  169. package/_standalone/.next/static/chunks/app/api/ask/route-2ceea6eabf25b1f2.js +1 -0
  170. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2ceea6eabf25b1f2.js +1 -0
  171. package/_standalone/.next/static/chunks/app/api/auth/route-2ceea6eabf25b1f2.js +1 -0
  172. package/_standalone/.next/static/chunks/app/api/backlinks/route-2ceea6eabf25b1f2.js +1 -0
  173. package/_standalone/.next/static/chunks/app/api/bootstrap/route-2ceea6eabf25b1f2.js +1 -0
  174. package/_standalone/.next/static/chunks/app/api/changes/route-2ceea6eabf25b1f2.js +1 -0
  175. package/_standalone/.next/static/chunks/app/api/export/route-2ceea6eabf25b1f2.js +1 -0
  176. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2ceea6eabf25b1f2.js +1 -0
  177. package/_standalone/.next/static/chunks/app/api/file/import/route-2ceea6eabf25b1f2.js +1 -0
  178. package/_standalone/.next/static/chunks/app/api/file/raw/route-2ceea6eabf25b1f2.js +1 -0
  179. package/_standalone/.next/static/chunks/app/api/file/route-2ceea6eabf25b1f2.js +1 -0
  180. package/_standalone/.next/static/chunks/app/api/files/route-2ceea6eabf25b1f2.js +1 -0
  181. package/_standalone/.next/static/chunks/app/api/git/route-2ceea6eabf25b1f2.js +1 -0
  182. package/_standalone/.next/static/chunks/app/api/graph/route-2ceea6eabf25b1f2.js +1 -0
  183. package/_standalone/.next/static/chunks/app/api/health/route-2ceea6eabf25b1f2.js +1 -0
  184. package/_standalone/.next/static/chunks/app/api/inbox/route-2ceea6eabf25b1f2.js +1 -0
  185. package/_standalone/.next/static/chunks/app/api/init/route-2ceea6eabf25b1f2.js +1 -0
  186. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2ceea6eabf25b1f2.js +1 -0
  187. package/_standalone/.next/static/chunks/app/api/mcp/install/route-2ceea6eabf25b1f2.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2ceea6eabf25b1f2.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2ceea6eabf25b1f2.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/mcp/status/route-2ceea6eabf25b1f2.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2ceea6eabf25b1f2.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/monitoring/route-2ceea6eabf25b1f2.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/recent-files/route-2ceea6eabf25b1f2.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/restart/route-2ceea6eabf25b1f2.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/search/route-2ceea6eabf25b1f2.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2ceea6eabf25b1f2.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2ceea6eabf25b1f2.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/settings/route-2ceea6eabf25b1f2.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2ceea6eabf25b1f2.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2ceea6eabf25b1f2.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2ceea6eabf25b1f2.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2ceea6eabf25b1f2.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/setup/ls/route-2ceea6eabf25b1f2.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/setup/route-2ceea6eabf25b1f2.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/skills/route-2ceea6eabf25b1f2.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/sync/route-2ceea6eabf25b1f2.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/tree-version/route-2ceea6eabf25b1f2.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/uninstall/route-2ceea6eabf25b1f2.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/update/route-2ceea6eabf25b1f2.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/update-check/route-2ceea6eabf25b1f2.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/update-status/route-2ceea6eabf25b1f2.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/workflows/route-2ceea6eabf25b1f2.js +1 -0
  213. package/_standalone/.next/static/chunks/app/changes/page-dd0b00a7b81f74e2.js +1 -0
  214. package/_standalone/.next/static/chunks/app/echo/[segment]/page-bf5c290fa3ccff09.js +11 -0
  215. package/_standalone/.next/static/chunks/app/echo/page-2ceea6eabf25b1f2.js +1 -0
  216. package/_standalone/.next/static/chunks/app/explore/{page-d3d99308146c2240.js → page-d9f58000bc445360.js} +2 -2
  217. package/_standalone/.next/static/chunks/app/help/{page-222df603080b5fab.js → page-f8cb806371b3175f.js} +1 -1
  218. package/_standalone/.next/static/chunks/app/inbox/history/{page-07819cf95cb0805f.js → page-3279585360df132c.js} +1 -1
  219. package/_standalone/.next/static/chunks/app/layout-6a0169582db11a08.js +164 -0
  220. package/_standalone/.next/static/chunks/app/loading-2ceea6eabf25b1f2.js +1 -0
  221. package/_standalone/.next/static/chunks/app/login/{page-0eeef685052869a6.js → page-18fb00d568cd1f0e.js} +1 -1
  222. package/_standalone/.next/static/chunks/app/page-6a1f8d21c12b829e.js +1 -0
  223. package/_standalone/.next/static/chunks/app/setup/{page-99fcfc460fa29733.js → page-821714e7477be46c.js} +1 -1
  224. package/_standalone/.next/static/chunks/app/trash/page-ed7ba3b0b50223a6.js +1 -0
  225. package/_standalone/.next/static/chunks/app/view/[...path]/loading-2ceea6eabf25b1f2.js +1 -0
  226. package/_standalone/.next/static/chunks/app/view/[...path]/{not-found-fc04c2bd4f35bc6f.js → not-found-6e0c75ad26ce8572.js} +1 -1
  227. package/_standalone/.next/static/chunks/app/view/[...path]/page-678139779971cfcb.js +12 -0
  228. package/_standalone/.next/static/chunks/app/wiki/page-194ae9af2d461481.js +1 -0
  229. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2ceea6eabf25b1f2.js +1 -0
  230. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2ceea6eabf25b1f2.js +1 -0
  231. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2ceea6eabf25b1f2.js +1 -0
  232. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2ceea6eabf25b1f2.js +1 -0
  233. package/_standalone/.next/static/chunks/{webpack-2c19436659aa657b.js → webpack-72e8d9e9073fd1f9.js} +1 -1
  234. package/_standalone/.next/static/css/9c558c42831fae58.css +1 -0
  235. package/_standalone/.next/trace +65 -64
  236. package/_standalone/.next/types/routes.d.ts +2 -1
  237. package/_standalone/.next/types/validator.ts +9 -0
  238. package/_standalone/__tests__/api/mcp-install.test.ts +4 -2
  239. package/_standalone/app/globals.css +2 -1
  240. package/_standalone/components/AskFab.tsx +11 -5
  241. package/_standalone/components/AskModal.tsx +1 -1
  242. package/_standalone/components/FileTree.tsx +83 -1
  243. package/_standalone/components/GuideCard.tsx +101 -152
  244. package/_standalone/components/Panel.tsx +6 -1
  245. package/_standalone/components/RightAskPanel.tsx +2 -2
  246. package/_standalone/components/agents/AgentsOverviewSection.tsx +13 -11
  247. package/_standalone/components/agents/CustomAgentModal.tsx +72 -18
  248. package/_standalone/components/ask/AskContent.tsx +109 -54
  249. package/_standalone/components/ask/AskHeader.tsx +218 -18
  250. package/_standalone/components/ask/FileChip.tsx +93 -12
  251. package/_standalone/components/ask/MessageList.tsx +66 -47
  252. package/_standalone/components/ask/SessionHistory.tsx +86 -60
  253. package/_standalone/components/ask/SessionTabBar.tsx +29 -21
  254. package/_standalone/components/ask/ThinkingBlock.tsx +6 -5
  255. package/_standalone/components/ask/ToolCallBlock.tsx +10 -9
  256. package/_standalone/components/changes/ChangesBanner.tsx +1 -1
  257. package/_standalone/components/settings/SettingsContent.tsx +1 -1
  258. package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +3 -1
  259. package/_standalone/components/walkthrough/steps.ts +1 -1
  260. package/_standalone/data/skills/mindos/SKILL.md +67 -15
  261. package/_standalone/data/skills/mindos-zh/SKILL.md +67 -11
  262. package/_standalone/hooks/useAskChat.ts +10 -8
  263. package/_standalone/hooks/useAskSession.ts +23 -1
  264. package/_standalone/hooks/useFileUpload.ts +97 -43
  265. package/_standalone/hooks/useImageUpload.ts +1 -1
  266. package/_standalone/lib/inbox-upload.ts +86 -0
  267. package/_standalone/lib/stores/locale-store.ts +20 -6
  268. package/_standalone/package-lock.json +2 -2
  269. package/_standalone/package.json +1 -1
  270. package/_standalone/scripts/extract-pdf.cjs +110 -3
  271. package/_standalone/tsconfig.tsbuildinfo +1 -1
  272. package/app/app/api/agents/copy-skill/route.ts +110 -0
  273. package/app/app/api/agents/custom/detect/route.ts +16 -1
  274. package/app/app/api/ask/route.ts +7 -1
  275. package/app/app/api/extract-pdf/route.ts +12 -5
  276. package/app/app/api/mcp/agents/route.ts +64 -2
  277. package/app/app/globals.css +2 -1
  278. package/app/app/layout.tsx +16 -4
  279. package/app/components/AskFab.tsx +11 -5
  280. package/app/components/AskModal.tsx +1 -1
  281. package/app/components/FileTree.tsx +83 -1
  282. package/app/components/GuideCard.tsx +101 -152
  283. package/app/components/HomeContent.tsx +123 -574
  284. package/app/components/Panel.tsx +6 -1
  285. package/app/components/RightAskPanel.tsx +2 -2
  286. package/app/components/WikiHomeContent.tsx +151 -3
  287. package/app/components/agents/AgentDetailContent.tsx +58 -1
  288. package/app/components/agents/AgentsOverviewSection.tsx +13 -11
  289. package/app/components/agents/CustomAgentModal.tsx +72 -18
  290. package/app/components/ask/AskContent.tsx +109 -54
  291. package/app/components/ask/AskHeader.tsx +218 -18
  292. package/app/components/ask/FileChip.tsx +93 -12
  293. package/app/components/ask/MessageList.tsx +66 -47
  294. package/app/components/ask/SessionHistory.tsx +86 -60
  295. package/app/components/ask/SessionTabBar.tsx +29 -21
  296. package/app/components/ask/ThinkingBlock.tsx +6 -5
  297. package/app/components/ask/ToolCallBlock.tsx +10 -9
  298. package/app/components/changes/ChangesBanner.tsx +1 -1
  299. package/app/components/changes/ChangesContentPage.tsx +368 -168
  300. package/app/components/settings/SettingsContent.tsx +1 -1
  301. package/app/components/walkthrough/WalkthroughTooltip.tsx +3 -1
  302. package/app/components/walkthrough/steps.ts +1 -1
  303. package/app/data/skills/mindos/SKILL.md +67 -15
  304. package/app/data/skills/mindos-zh/SKILL.md +67 -11
  305. package/app/hooks/useAskChat.ts +10 -8
  306. package/app/hooks/useAskSession.ts +23 -1
  307. package/app/hooks/useFileUpload.ts +97 -43
  308. package/app/hooks/useImageUpload.ts +1 -1
  309. package/app/lib/agent/prompt.ts +15 -4
  310. package/app/lib/custom-agents.ts +109 -1
  311. package/app/lib/file-ops.ts +58 -0
  312. package/app/lib/i18n/modules/ai-chat.ts +134 -10
  313. package/app/lib/i18n/modules/knowledge.ts +2 -0
  314. package/app/lib/i18n/modules/onboarding.ts +12 -12
  315. package/app/lib/inbox-upload.ts +86 -0
  316. package/app/lib/mcp-agents.ts +21 -1
  317. package/app/lib/stores/LocaleStoreInit.tsx +24 -1
  318. package/app/lib/stores/locale-store.ts +20 -6
  319. package/app/lib/types.ts +13 -0
  320. package/app/package.json +1 -1
  321. package/app/scripts/extract-pdf.cjs +110 -3
  322. package/package.json +1 -1
  323. package/skills/mindos/SKILL.md +67 -15
  324. package/skills/mindos/references/knowledge-health.md +120 -0
  325. package/skills/mindos-max/SKILL.md +52 -5
  326. package/skills/mindos-max-zh/SKILL.md +55 -6
  327. package/skills/mindos-zh/SKILL.md +67 -11
  328. package/_standalone/.next/server/chunks/2364.js +0 -2
  329. package/_standalone/.next/server/chunks/357.js +0 -1
  330. package/_standalone/.next/static/2ksXveDzEcnCMRIElDkLq/_buildManifest.js +0 -1
  331. package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +0 -1
  332. package/_standalone/.next/static/chunks/2218-d54538000574ffef.js +0 -1
  333. package/_standalone/.next/static/chunks/2549-e63cf57fa927a41d.js +0 -1
  334. package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +0 -1
  335. package/_standalone/.next/static/chunks/6878-e2c5459e1c608f89.js +0 -1
  336. package/_standalone/.next/static/chunks/7249-fa98ca10e9a10f39.js +0 -11
  337. package/_standalone/.next/static/chunks/9274-296ab35f9f09e42e.js +0 -1
  338. package/_standalone/.next/static/chunks/9286-5b09baa5200318c2.js +0 -1
  339. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-7bdeab5af8e4f5f2.js +0 -1
  340. package/_standalone/.next/static/chunks/app/agents/page-5d1446665ddb3801.js +0 -1
  341. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-2f4705aa66819b86.js +0 -1
  342. package/_standalone/.next/static/chunks/app/api/a2a/route-2f4705aa66819b86.js +0 -1
  343. package/_standalone/.next/static/chunks/app/api/acp/config/route-2f4705aa66819b86.js +0 -1
  344. package/_standalone/.next/static/chunks/app/api/acp/detect/route-2f4705aa66819b86.js +0 -1
  345. package/_standalone/.next/static/chunks/app/api/acp/install/route-2f4705aa66819b86.js +0 -1
  346. package/_standalone/.next/static/chunks/app/api/acp/registry/route-2f4705aa66819b86.js +0 -1
  347. package/_standalone/.next/static/chunks/app/api/acp/session/route-2f4705aa66819b86.js +0 -1
  348. package/_standalone/.next/static/chunks/app/api/agent-activity/route-2f4705aa66819b86.js +0 -1
  349. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-2f4705aa66819b86.js +0 -1
  350. package/_standalone/.next/static/chunks/app/api/agents/custom/route-2f4705aa66819b86.js +0 -1
  351. package/_standalone/.next/static/chunks/app/api/ask/route-2f4705aa66819b86.js +0 -1
  352. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-2f4705aa66819b86.js +0 -1
  353. package/_standalone/.next/static/chunks/app/api/auth/route-2f4705aa66819b86.js +0 -1
  354. package/_standalone/.next/static/chunks/app/api/backlinks/route-2f4705aa66819b86.js +0 -1
  355. package/_standalone/.next/static/chunks/app/api/bootstrap/route-2f4705aa66819b86.js +0 -1
  356. package/_standalone/.next/static/chunks/app/api/changes/route-2f4705aa66819b86.js +0 -1
  357. package/_standalone/.next/static/chunks/app/api/export/route-2f4705aa66819b86.js +0 -1
  358. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-2f4705aa66819b86.js +0 -1
  359. package/_standalone/.next/static/chunks/app/api/file/import/route-2f4705aa66819b86.js +0 -1
  360. package/_standalone/.next/static/chunks/app/api/file/raw/route-2f4705aa66819b86.js +0 -1
  361. package/_standalone/.next/static/chunks/app/api/file/route-2f4705aa66819b86.js +0 -1
  362. package/_standalone/.next/static/chunks/app/api/files/route-2f4705aa66819b86.js +0 -1
  363. package/_standalone/.next/static/chunks/app/api/git/route-2f4705aa66819b86.js +0 -1
  364. package/_standalone/.next/static/chunks/app/api/graph/route-2f4705aa66819b86.js +0 -1
  365. package/_standalone/.next/static/chunks/app/api/health/route-2f4705aa66819b86.js +0 -1
  366. package/_standalone/.next/static/chunks/app/api/inbox/route-2f4705aa66819b86.js +0 -1
  367. package/_standalone/.next/static/chunks/app/api/init/route-2f4705aa66819b86.js +0 -1
  368. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-2f4705aa66819b86.js +0 -1
  369. package/_standalone/.next/static/chunks/app/api/mcp/install/route-2f4705aa66819b86.js +0 -1
  370. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-2f4705aa66819b86.js +0 -1
  371. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-2f4705aa66819b86.js +0 -1
  372. package/_standalone/.next/static/chunks/app/api/mcp/status/route-2f4705aa66819b86.js +0 -1
  373. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-2f4705aa66819b86.js +0 -1
  374. package/_standalone/.next/static/chunks/app/api/monitoring/route-2f4705aa66819b86.js +0 -1
  375. package/_standalone/.next/static/chunks/app/api/recent-files/route-2f4705aa66819b86.js +0 -1
  376. package/_standalone/.next/static/chunks/app/api/restart/route-2f4705aa66819b86.js +0 -1
  377. package/_standalone/.next/static/chunks/app/api/search/route-2f4705aa66819b86.js +0 -1
  378. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-2f4705aa66819b86.js +0 -1
  379. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-2f4705aa66819b86.js +0 -1
  380. package/_standalone/.next/static/chunks/app/api/settings/route-2f4705aa66819b86.js +0 -1
  381. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-2f4705aa66819b86.js +0 -1
  382. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-2f4705aa66819b86.js +0 -1
  383. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-2f4705aa66819b86.js +0 -1
  384. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-2f4705aa66819b86.js +0 -1
  385. package/_standalone/.next/static/chunks/app/api/setup/ls/route-2f4705aa66819b86.js +0 -1
  386. package/_standalone/.next/static/chunks/app/api/setup/route-2f4705aa66819b86.js +0 -1
  387. package/_standalone/.next/static/chunks/app/api/skills/route-2f4705aa66819b86.js +0 -1
  388. package/_standalone/.next/static/chunks/app/api/sync/route-2f4705aa66819b86.js +0 -1
  389. package/_standalone/.next/static/chunks/app/api/tree-version/route-2f4705aa66819b86.js +0 -1
  390. package/_standalone/.next/static/chunks/app/api/uninstall/route-2f4705aa66819b86.js +0 -1
  391. package/_standalone/.next/static/chunks/app/api/update/route-2f4705aa66819b86.js +0 -1
  392. package/_standalone/.next/static/chunks/app/api/update-check/route-2f4705aa66819b86.js +0 -1
  393. package/_standalone/.next/static/chunks/app/api/update-status/route-2f4705aa66819b86.js +0 -1
  394. package/_standalone/.next/static/chunks/app/api/workflows/route-2f4705aa66819b86.js +0 -1
  395. package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +0 -1
  396. package/_standalone/.next/static/chunks/app/echo/[segment]/page-b0103509ce34444b.js +0 -11
  397. package/_standalone/.next/static/chunks/app/echo/page-2f4705aa66819b86.js +0 -1
  398. package/_standalone/.next/static/chunks/app/layout-7e02ddf4144b01f1.js +0 -186
  399. package/_standalone/.next/static/chunks/app/loading-2f4705aa66819b86.js +0 -1
  400. package/_standalone/.next/static/chunks/app/page-6a6a12bd6d6812d0.js +0 -7
  401. package/_standalone/.next/static/chunks/app/trash/page-54cbd5c98d9de69b.js +0 -1
  402. package/_standalone/.next/static/chunks/app/view/[...path]/loading-2f4705aa66819b86.js +0 -1
  403. package/_standalone/.next/static/chunks/app/view/[...path]/page-ca7bdcbf27f88a46.js +0 -12
  404. package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +0 -1
  405. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-2f4705aa66819b86.js +0 -1
  406. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-2f4705aa66819b86.js +0 -1
  407. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-2f4705aa66819b86.js +0 -1
  408. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-2f4705aa66819b86.js +0 -1
  409. package/_standalone/.next/static/css/fd84c8316ead16eb.css +0 -1
  410. /package/_standalone/.next/static/{2ksXveDzEcnCMRIElDkLq → K3wZNf5bj_AFYwtqcRXIf}/_ssgManifest.js +0 -0
@@ -1,6 +1,9 @@
1
- import { memo } from 'react';
2
- import { Sparkles, SquarePen, History, X, Maximize2, Minimize2, PanelRight, AppWindow } from 'lucide-react';
1
+ import { memo, useState, useRef, useEffect, useCallback } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+ import { Sparkles, SquarePen, History, X, Maximize2, Minimize2, PanelRight, AppWindow, ChevronDown, Check, Trash2, Pencil, Pin, PinOff } from 'lucide-react';
3
4
  import { useLocale } from '@/lib/stores/locale-store';
5
+ import type { ChatSession } from '@/lib/types';
6
+ import { sessionTitle } from '@/hooks/useAskSession';
4
7
 
5
8
  interface AskHeaderProps {
6
9
  isPanel: boolean;
@@ -13,49 +16,246 @@ interface AskHeaderProps {
13
16
  askMode?: 'panel' | 'popup';
14
17
  onModeSwitch?: () => void;
15
18
  onClose?: () => void;
19
+ hideTitle?: boolean;
20
+ /** Session switching — inline in header when >=2 sessions */
21
+ sessions?: ChatSession[];
22
+ activeSessionId?: string | null;
23
+ onLoadSession?: (id: string) => void;
24
+ onDeleteSession?: (id: string) => void;
25
+ onRenameSession?: (id: string, name: string) => void;
26
+ onTogglePinSession?: (id: string) => void;
16
27
  }
17
28
 
18
29
  export default memo(function AskHeader({
19
30
  isPanel, showHistory, onToggleHistory, onReset, isLoading,
20
- maximized, onMaximize, askMode, onModeSwitch, onClose,
31
+ maximized, onMaximize, askMode, onModeSwitch, onClose, hideTitle,
32
+ sessions, activeSessionId, onLoadSession, onDeleteSession, onRenameSession, onTogglePinSession,
21
33
  }: AskHeaderProps) {
22
34
  const { t } = useLocale();
23
- const iconSize = isPanel ? 13 : 14;
35
+ const iconSize = 14;
36
+ const hasMultipleSessions = sessions && sessions.length >= 1;
37
+ const activeSession = sessions?.find(s => s.id === activeSessionId);
38
+ const activeTitle = activeSession ? sessionTitle(activeSession) : null;
39
+
40
+ // Session switcher dropdown state
41
+ const [switcherOpen, setSwitcherOpen] = useState(false);
42
+ const switcherRef = useRef<HTMLButtonElement>(null);
43
+ const dropdownRef = useRef<HTMLDivElement>(null);
44
+
45
+ // Inline rename state
46
+ const [renamingId, setRenamingId] = useState<string | null>(null);
47
+ const [renameValue, setRenameValue] = useState('');
48
+ const renameInputRef = useRef<HTMLInputElement>(null);
49
+
50
+ // Close on outside click
51
+ useEffect(() => {
52
+ if (!switcherOpen) return;
53
+ const handler = (e: MouseEvent) => {
54
+ const target = e.target as Node;
55
+ if (
56
+ switcherRef.current && !switcherRef.current.contains(target) &&
57
+ dropdownRef.current && !dropdownRef.current.contains(target)
58
+ ) {
59
+ setSwitcherOpen(false);
60
+ setRenamingId(null);
61
+ }
62
+ };
63
+ document.addEventListener('mousedown', handler);
64
+ return () => document.removeEventListener('mousedown', handler);
65
+ }, [switcherOpen]);
66
+
67
+ useEffect(() => {
68
+ if (!switcherOpen) return;
69
+ const handler = (e: KeyboardEvent) => {
70
+ if (e.key === 'Escape') {
71
+ if (renamingId) { setRenamingId(null); } else { setSwitcherOpen(false); }
72
+ }
73
+ };
74
+ document.addEventListener('keydown', handler);
75
+ return () => document.removeEventListener('keydown', handler);
76
+ }, [switcherOpen, renamingId]);
77
+
78
+ // Focus rename input when it appears
79
+ useEffect(() => {
80
+ if (renamingId) setTimeout(() => renameInputRef.current?.focus(), 0);
81
+ }, [renamingId]);
82
+
83
+ const handleSelectSession = useCallback((id: string) => {
84
+ onLoadSession?.(id);
85
+ setSwitcherOpen(false);
86
+ }, [onLoadSession]);
87
+
88
+ const handleStartRename = useCallback((id: string, currentTitle: string) => {
89
+ setRenamingId(id);
90
+ setRenameValue(currentTitle === '(empty session)' ? '' : currentTitle);
91
+ }, []);
92
+
93
+ const handleCommitRename = useCallback(() => {
94
+ if (renamingId && onRenameSession && renameValue.trim()) {
95
+ onRenameSession(renamingId, renameValue.trim());
96
+ }
97
+ setRenamingId(null);
98
+ }, [renamingId, renameValue, onRenameSession]);
99
+
100
+ // Position dropdown below trigger
101
+ const [dropPos, setDropPos] = useState<{ top: number; left: number; width: number } | null>(null);
102
+ useEffect(() => {
103
+ if (!switcherOpen || !switcherRef.current) return;
104
+ const rect = switcherRef.current.getBoundingClientRect();
105
+ setDropPos({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 240) });
106
+ }, [switcherOpen]);
107
+
108
+ const switcherDropdown = switcherOpen && dropPos && sessions ? createPortal(
109
+ <div
110
+ ref={dropdownRef}
111
+ className="fixed z-50 rounded-xl border border-border/50 bg-card shadow-lg py-1 animate-in fade-in-0 slide-in-from-top-1 duration-100"
112
+ style={{ top: dropPos.top, left: dropPos.left, minWidth: dropPos.width, maxWidth: 320 }}
113
+ role="listbox"
114
+ >
115
+ {sessions.map((s) => {
116
+ const isActive = s.id === activeSessionId;
117
+ const title = sessionTitle(s);
118
+ const displayTitle = title === '(empty session)' ? (t.hints?.newChat ?? 'New chat') : title;
119
+
120
+ if (renamingId === s.id) {
121
+ return (
122
+ <div key={s.id} className="flex items-center gap-1 px-2 py-1.5">
123
+ <input
124
+ ref={renameInputRef}
125
+ type="text"
126
+ value={renameValue}
127
+ onChange={(e) => setRenameValue(e.target.value)}
128
+ onKeyDown={(e) => {
129
+ if (e.key === 'Enter') handleCommitRename();
130
+ if (e.key === 'Escape') setRenamingId(null);
131
+ }}
132
+ onBlur={handleCommitRename}
133
+ className="flex-1 min-w-0 px-2 py-1 text-xs rounded-md border border-border bg-background text-foreground outline-none focus:border-[var(--amber)]/50"
134
+ placeholder="Session name..."
135
+ />
136
+ </div>
137
+ );
138
+ }
139
+
140
+ return (
141
+ <div key={s.id} className="group/item flex items-center">
142
+ <button
143
+ type="button"
144
+ role="option"
145
+ aria-selected={isActive}
146
+ onClick={() => handleSelectSession(s.id)}
147
+ className={`flex-1 min-w-0 flex items-center gap-2 px-3 py-2 text-xs text-left transition-colors ${
148
+ isActive ? 'text-foreground font-medium' : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'
149
+ }`}
150
+ >
151
+ {s.pinned && <Pin size={10} className="shrink-0 text-[var(--amber)]/60 -rotate-45" />}
152
+ {isActive && !s.pinned && <Check size={11} className="shrink-0 text-[var(--amber)]" />}
153
+ <span className="truncate">{displayTitle}</span>
154
+ </button>
155
+ <div className="shrink-0 flex items-center gap-0.5 mr-1 opacity-0 group-hover/item:opacity-100 transition-opacity">
156
+ {onTogglePinSession && (
157
+ <button
158
+ type="button"
159
+ onClick={(e) => { e.stopPropagation(); onTogglePinSession(s.id); }}
160
+ className={`p-1.5 rounded-md transition-colors ${s.pinned ? 'text-[var(--amber)] hover:text-muted-foreground hover:bg-muted/60' : 'text-muted-foreground/40 hover:text-[var(--amber)] hover:bg-[var(--amber)]/5'}`}
161
+ aria-label={s.pinned ? 'Unpin' : 'Pin'}
162
+ >
163
+ {s.pinned ? <PinOff size={10} /> : <Pin size={10} />}
164
+ </button>
165
+ )}
166
+ {onRenameSession && (
167
+ <button
168
+ type="button"
169
+ onClick={(e) => { e.stopPropagation(); handleStartRename(s.id, title); }}
170
+ className="p-1.5 rounded-md text-muted-foreground/40 hover:text-foreground hover:bg-muted/60"
171
+ aria-label={`Rename: ${displayTitle}`}
172
+ >
173
+ <Pencil size={10} />
174
+ </button>
175
+ )}
176
+ {sessions.length > 1 && onDeleteSession && (
177
+ <button
178
+ type="button"
179
+ onClick={(e) => { e.stopPropagation(); onDeleteSession(s.id); }}
180
+ className="p-1.5 rounded-md text-muted-foreground/40 hover:text-error hover:bg-error/5"
181
+ aria-label={`Delete: ${displayTitle}`}
182
+ >
183
+ <Trash2 size={10} />
184
+ </button>
185
+ )}
186
+ </div>
187
+ </div>
188
+ );
189
+ })}
190
+ </div>,
191
+ document.body,
192
+ ) : null;
24
193
 
25
194
  return (
26
- <div className="flex items-center justify-between px-4 py-3 border-b border-border shrink-0">
195
+ <div className="flex items-center justify-between px-4 py-2.5 shrink-0">
27
196
  {!isPanel && (
28
197
  <div className="absolute top-2 left-1/2 -translate-x-1/2 w-8 h-1 rounded-full bg-muted-foreground/20 md:hidden" />
29
198
  )}
30
- <div className="flex items-center gap-2 text-sm font-medium text-foreground">
31
- <Sparkles size={isPanel ? 14 : 15} className="text-[var(--amber)]" />
32
- <span className={isPanel ? 'text-xs uppercase tracking-wider text-muted-foreground' : ''}>
33
- {isPanel ? 'MindOS Agent' : t.ask.title}
34
- </span>
35
- </div>
199
+ {!hideTitle && (
200
+ <div className="flex items-center gap-2 min-w-0">
201
+ <div className="w-6 h-6 rounded-lg bg-[var(--amber)]/10 flex items-center justify-center shrink-0">
202
+ <Sparkles size={13} className="text-[var(--amber)]" />
203
+ </div>
204
+ {hasMultipleSessions && activeTitle ? (
205
+ <button
206
+ ref={switcherRef}
207
+ type="button"
208
+ onClick={() => {
209
+ if (sessions && sessions.length >= 2) {
210
+ setSwitcherOpen(v => !v);
211
+ } else {
212
+ onToggleHistory();
213
+ }
214
+ }}
215
+ className="flex items-center gap-1 min-w-0 text-sm font-medium text-[var(--amber)] hover:text-[var(--amber)]/80 transition-colors"
216
+ aria-expanded={switcherOpen}
217
+ aria-haspopup="listbox"
218
+ >
219
+ <span className="truncate max-w-[180px]">{activeTitle === '(empty session)' ? (t.hints?.newChat ?? 'New chat') : activeTitle}</span>
220
+ <ChevronDown size={12} className={`shrink-0 text-muted-foreground transition-transform duration-150 ${switcherOpen ? 'rotate-180' : ''}`} />
221
+ </button>
222
+ ) : activeTitle ? (
223
+ <span className="text-sm font-medium text-muted-foreground/60 truncate max-w-[180px]">
224
+ {activeTitle === '(empty session)' ? (t.hints?.newChat ?? 'New chat') : activeTitle}
225
+ </span>
226
+ ) : (
227
+ /* Placeholder while sessions load — avoids flash of "MindOS Agent" text */
228
+ <span className="text-sm font-medium text-muted-foreground/40">
229
+ {t.hints?.newChat ?? 'New chat'}
230
+ </span>
231
+ )}
232
+ </div>
233
+ )}
234
+ {hideTitle && <div />}
36
235
  <div className="flex items-center gap-1 shrink-0">
37
- <button type="button" onClick={(e) => { e.stopPropagation(); onToggleHistory(); }} aria-pressed={showHistory} className={`p-2 rounded transition-colors ${showHistory ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground hover:bg-muted'}`} title={t.hints.sessionHistory}>
236
+ <button type="button" onClick={(e) => { e.stopPropagation(); onToggleHistory(); }} aria-pressed={showHistory} className={`p-2 rounded-lg transition-colors ${showHistory ? 'bg-[var(--amber)]/10 text-[var(--amber)]' : 'text-muted-foreground hover:text-foreground hover:bg-muted'}`} title={t.hints.sessionHistory}>
38
237
  <History size={iconSize} />
39
238
  </button>
40
- <button type="button" onClick={(e) => { e.stopPropagation(); onReset(); }} disabled={isLoading} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40" title={t.hints.newSession}>
239
+ <button type="button" onClick={(e) => { e.stopPropagation(); onReset(); }} disabled={isLoading} className="p-2 rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40" title={t.hints.newSession}>
41
240
  <SquarePen size={iconSize} />
42
241
  </button>
43
- {isPanel && onMaximize && (
44
- <button type="button" onClick={(e) => { e.stopPropagation(); onMaximize(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={maximized ? t.hints.restorePanel : t.hints.maximizePanel}>
242
+ {onMaximize && (
243
+ <button type="button" onClick={(e) => { e.stopPropagation(); onMaximize(); }} className="p-2 rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={maximized ? t.hints.restorePanel : t.hints.maximizePanel}>
45
244
  {maximized ? <Minimize2 size={iconSize} /> : <Maximize2 size={iconSize} />}
46
245
  </button>
47
246
  )}
48
247
  {onModeSwitch && (
49
- <button type="button" onClick={(e) => { e.stopPropagation(); onModeSwitch(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={askMode === 'popup' ? t.hints.dockToSide : t.hints.openAsPopup}>
248
+ <button type="button" onClick={(e) => { e.stopPropagation(); onModeSwitch(); }} className="p-2 rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={askMode === 'popup' ? t.hints.dockToSide : t.hints.openAsPopup}>
50
249
  {askMode === 'popup' ? <PanelRight size={iconSize} /> : <AppWindow size={iconSize} />}
51
250
  </button>
52
251
  )}
53
252
  {onClose && (
54
- <button type="button" onClick={(e) => { e.stopPropagation(); onClose(); }} className="p-2 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={t.hints.closePanel} aria-label="Close">
55
- <X size={isPanel ? iconSize : 15} />
253
+ <button type="button" onClick={(e) => { e.stopPropagation(); onClose(); }} className="p-2 rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors" title={t.hints.closePanel} aria-label="Close">
254
+ <X size={iconSize} />
56
255
  </button>
57
256
  )}
58
257
  </div>
258
+ {typeof document !== 'undefined' && switcherDropdown}
59
259
  </div>
60
260
  );
61
261
  });
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useState, useRef, useEffect } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
- import { X, FileText, Table, Paperclip, ImageIcon, Zap, Bot, Folder } from 'lucide-react';
5
+ import { X, FileText, Table, Paperclip, ImageIcon, Zap, Bot, Folder, Loader2, CheckCircle2, AlertCircle, AlertTriangle } from 'lucide-react';
6
6
 
7
7
  interface FileChipProps {
8
8
  path: string;
@@ -12,6 +12,16 @@ interface FileChipProps {
12
12
  imageData?: string;
13
13
  /** MIME type for image preview */
14
14
  imageMime?: string;
15
+ /** Extraction status for uploaded files (e.g. PDF). */
16
+ status?: 'loading' | 'success' | 'error';
17
+ /** Human-readable error message shown on hover when status='error'. */
18
+ error?: string;
19
+ /** Present when the PDF text was truncated due to length. */
20
+ truncatedInfo?: {
21
+ totalChars: number;
22
+ includedChars: number;
23
+ totalPages: number;
24
+ };
15
25
  }
16
26
 
17
27
  const VARIANT_ICON = {
@@ -30,11 +40,13 @@ const VARIANT_STYLE = {
30
40
  agent: 'border-[var(--amber)]/25 bg-[var(--amber)]/10 text-foreground',
31
41
  } as const;
32
42
 
33
- export default function FileChip({ path, onRemove, variant = 'kb', imageData, imageMime }: FileChipProps) {
43
+ export default function FileChip({ path, onRemove, variant = 'kb', imageData, imageMime, status, error, truncatedInfo }: FileChipProps) {
34
44
  const [showPreview, setShowPreview] = useState(false);
45
+ const [showTooltip, setShowTooltip] = useState(false);
35
46
  const [mounted, setMounted] = useState(false);
36
47
  const chipRef = useRef<HTMLSpanElement>(null);
37
48
  const [previewPos, setPreviewPos] = useState<{ top: number; left: number } | null>(null);
49
+ const [tooltipPos, setTooltipPos] = useState<{ top: number; left: number } | null>(null);
38
50
 
39
51
  useEffect(() => setMounted(true), []);
40
52
 
@@ -42,23 +54,63 @@ export default function FileChip({ path, onRemove, variant = 'kb', imageData, im
42
54
  const cleanPath = isDir ? path.slice(0, -1) : path;
43
55
  const name = cleanPath.split('/').pop() ?? cleanPath;
44
56
  const isCsv = variant === 'kb' && !isDir && name.endsWith('.csv');
45
- const { icon: Icon, cls: iconClass } = isDir
57
+
58
+ // Determine the base icon from variant / file type
59
+ const { icon: BaseIcon, cls: baseIconCls } = isDir
46
60
  ? { icon: Folder, cls: 'text-yellow-400' }
47
61
  : isCsv
48
62
  ? { icon: Table, cls: 'text-success' }
49
63
  : VARIANT_ICON[variant];
50
- const style = VARIANT_STYLE[variant];
51
64
 
52
- // Position preview above the chip using getBoundingClientRect
65
+ // Determine status trailing indicator
66
+ const isTruncated = !!truncatedInfo;
67
+ let StatusIndicator: React.ComponentType<{ size: number; className?: string }> | null = null;
68
+ let statusIndicatorCls = '';
69
+ if (status === 'loading') {
70
+ StatusIndicator = Loader2;
71
+ statusIndicatorCls = 'text-muted-foreground animate-spin';
72
+ } else if (status === 'error') {
73
+ StatusIndicator = AlertCircle;
74
+ statusIndicatorCls = 'text-destructive';
75
+ } else if (isTruncated) {
76
+ StatusIndicator = AlertTriangle;
77
+ statusIndicatorCls = 'text-amber-500';
78
+ } else if (status === 'success') {
79
+ StatusIndicator = CheckCircle2;
80
+ statusIndicatorCls = 'text-emerald-500';
81
+ }
82
+
83
+ const style = status === 'error'
84
+ ? 'border-destructive/30 bg-destructive/5 text-foreground'
85
+ : isTruncated
86
+ ? 'border-amber-500/30 bg-amber-500/5 text-foreground'
87
+ : VARIANT_STYLE[variant];
88
+
89
+ // Build tooltip text
90
+ let tooltipText: string | null = null;
91
+ if (status === 'error' && error) {
92
+ tooltipText = error;
93
+ } else if (isTruncated) {
94
+ const pct = truncatedInfo.totalChars > 0
95
+ ? Math.round((truncatedInfo.includedChars / truncatedInfo.totalChars) * 100)
96
+ : 0;
97
+ tooltipText = `Document truncated — only ${pct}% included (${Math.round(truncatedInfo.includedChars / 1000)}K / ${Math.round(truncatedInfo.totalChars / 1000)}K chars, ${truncatedInfo.totalPages} pages total)`;
98
+ }
99
+
100
+ // Position image preview above the chip
53
101
  useEffect(() => {
54
102
  if (!showPreview || !chipRef.current) { setPreviewPos(null); return; }
55
103
  const rect = chipRef.current.getBoundingClientRect();
56
- setPreviewPos({
57
- top: rect.top - 8, // 8px gap above chip
58
- left: rect.left,
59
- });
104
+ setPreviewPos({ top: rect.top - 8, left: rect.left });
60
105
  }, [showPreview]);
61
106
 
107
+ // Position tooltip above the chip
108
+ useEffect(() => {
109
+ if (!showTooltip || !chipRef.current) { setTooltipPos(null); return; }
110
+ const rect = chipRef.current.getBoundingClientRect();
111
+ setTooltipPos({ top: rect.top - 8, left: rect.left });
112
+ }, [showTooltip]);
113
+
62
114
  const preview = showPreview && previewPos && imageData && imageMime ? (
63
115
  <div
64
116
  className="fixed z-50 p-1 rounded-lg border border-border bg-card shadow-lg pointer-events-none"
@@ -75,16 +127,44 @@ export default function FileChip({ path, onRemove, variant = 'kb', imageData, im
75
127
  </div>
76
128
  ) : null;
77
129
 
130
+ const tooltipBorderCls = status === 'error'
131
+ ? 'border-destructive/20 text-destructive'
132
+ : 'border-amber-500/20 text-amber-600 dark:text-amber-400';
133
+
134
+ const tooltip = showTooltip && tooltipPos && tooltipText ? (
135
+ <div
136
+ className={`fixed z-50 px-2.5 py-1.5 rounded-lg border bg-card text-xs shadow-lg pointer-events-none max-w-[280px] ${tooltipBorderCls}`}
137
+ style={{
138
+ left: tooltipPos.left,
139
+ bottom: window.innerHeight - tooltipPos.top,
140
+ }}
141
+ >
142
+ {tooltipText}
143
+ </div>
144
+ ) : null;
145
+
146
+ const handleMouseEnter = () => {
147
+ if (imageData) setShowPreview(true);
148
+ if (tooltipText) setShowTooltip(true);
149
+ };
150
+ const handleMouseLeave = () => {
151
+ setShowPreview(false);
152
+ setShowTooltip(false);
153
+ };
154
+
78
155
  return (
79
156
  <>
80
157
  <span
81
158
  ref={chipRef}
82
159
  className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-md text-xs border max-w-[220px] ${style}`}
83
- onMouseEnter={() => imageData && setShowPreview(true)}
84
- onMouseLeave={() => setShowPreview(false)}
160
+ onMouseEnter={handleMouseEnter}
161
+ onMouseLeave={handleMouseLeave}
85
162
  >
86
- <Icon size={11} className={`${iconClass} shrink-0`} />
163
+ <BaseIcon size={11} className={`${baseIconCls} shrink-0`} />
87
164
  <span className="truncate" title={isDir ? cleanPath : path}>{name}</span>
165
+ {StatusIndicator && (
166
+ <StatusIndicator size={10} className={`${statusIndicatorCls} shrink-0`} />
167
+ )}
88
168
  <button
89
169
  type="button"
90
170
  onClick={onRemove}
@@ -95,6 +175,7 @@ export default function FileChip({ path, onRemove, variant = 'kb', imageData, im
95
175
  </button>
96
176
  </span>
97
177
  {mounted && preview && createPortal(preview, document.body)}
178
+ {mounted && tooltip && createPortal(tooltip, document.body)}
98
179
  </>
99
180
  );
100
181
  }