@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
@@ -2,12 +2,72 @@
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useState } from 'react';
4
4
  import Link from 'next/link';
5
- import { ChevronDown, ChevronRight, History, RefreshCw } from 'lucide-react';
5
+ import {
6
+ ChevronDown,
7
+ ChevronRight,
8
+ History,
9
+ RefreshCw,
10
+ FileText,
11
+ // Operation icons
12
+ FileUp,
13
+ FileMinus,
14
+ Pencil,
15
+ Copy,
16
+ Edit3,
17
+ Move,
18
+ Zap,
19
+ // Source icons
20
+ Bot,
21
+ User,
22
+ Cpu,
23
+ } from 'lucide-react';
6
24
  import { apiFetch } from '@/lib/api';
7
25
  import { useLocale } from '@/lib/stores/locale-store';
8
26
  import CustomSelect from '@/components/CustomSelect';
9
27
  import { collapseDiffContext, buildLineDiff } from './line-diff';
10
28
 
29
+ /** Icon mapping for different operations */
30
+ function getOpIcon(op: string): React.ReactNode {
31
+ if (op === 'create_file' || op === 'create_space') return <FileUp size={14} />;
32
+ if (op === 'delete_file') return <FileMinus size={14} />;
33
+ if (op === 'update_lines' || op === 'update_section') return <Edit3 size={14} />;
34
+ if (op === 'insert_lines' || op === 'insert_after_heading') return <Pencil size={14} />;
35
+ if (op === 'append_to_file' || op === 'append_csv') return <Copy size={14} />;
36
+ if (op === 'rename_file' || op === 'rename_space' || op === 'move_file') return <Move size={14} />;
37
+ if (op === 'import_file') return <Zap size={14} />;
38
+ return null;
39
+ }
40
+
41
+ /** Icon and color for source (User/Agent/System) */
42
+ function getSourceIcon(source: string): React.ReactNode {
43
+ if (source === 'agent') return <Bot size={13} />;
44
+ if (source === 'user') return <User size={13} />;
45
+ return <Cpu size={13} />;
46
+ }
47
+
48
+ function getSourceBgColor(source: string): string {
49
+ if (source === 'agent') return 'bg-blue-500/10 text-blue-700 border border-blue-200/50';
50
+ if (source === 'user') return 'bg-emerald-500/10 text-emerald-700 border border-emerald-200/50';
51
+ return 'bg-slate-500/10 text-slate-700 border border-slate-200/50';
52
+ }
53
+
54
+ /** Skeleton placeholder for loading state */
55
+ function ChangeCardSkeleton() {
56
+ return (
57
+ <div className="rounded-xl border border-border bg-card overflow-hidden animate-pulse">
58
+ <div className="px-4 py-3 space-y-2">
59
+ <div className="flex items-start gap-2">
60
+ <div className="w-4 h-4 bg-muted rounded mt-1" />
61
+ <div className="flex-1 space-y-2">
62
+ <div className="h-5 bg-muted rounded w-2/3" />
63
+ <div className="h-3 bg-muted rounded w-full" />
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ );
69
+ }
70
+
11
71
  /** Semantic color for operation type badges */
12
72
  function opColorClass(op: string): string {
13
73
  if (op.startsWith('create') || op === 'import_file') return 'text-success';
@@ -48,6 +108,58 @@ function relativeTime(ts: string, t: ReturnType<typeof useLocale>['t']): string
48
108
  return t.changes.relativeTime.daysAgo(Math.floor(hours / 24));
49
109
  }
50
110
 
111
+ /**
112
+ * Translate backend-generated English summaries to the current locale.
113
+ * Matches known patterns; returns the original string as fallback.
114
+ */
115
+ function translateSummary(summary: string, t: ReturnType<typeof useLocale>['t']): string {
116
+ const s = t.changes.summaries;
117
+ // Exact matches
118
+ if (summary === 'Updated file content') return s.updatedFileContent;
119
+ if (summary === 'Appended content to file') return s.appendedContent;
120
+ if (summary === 'Moved to trash') return s.movedToTrash;
121
+ if (summary === 'Created file') return s.createdFile;
122
+ if (summary === 'Created space') return s.createdSpace;
123
+ if (summary === 'Imported file into knowledge base') return s.importedFile;
124
+
125
+ // Pattern: "Inserted N line(s)"
126
+ const insertedLines = summary.match(/^Inserted (\d+) line\(s\)$/);
127
+ if (insertedLines) return s.insertedLines(Number(insertedLines[1]));
128
+
129
+ // Pattern: "Updated lines N-M"
130
+ const updatedLines = summary.match(/^Updated lines (\d+)-(\d+)$/);
131
+ if (updatedLines) return s.updatedLines(Number(updatedLines[1]), Number(updatedLines[2]));
132
+
133
+ // Pattern: 'Inserted content after heading "..."'
134
+ const insertedAfter = summary.match(/^Inserted content after heading "(.+)"$/);
135
+ if (insertedAfter) return s.insertedAfterHeading(insertedAfter[1]);
136
+
137
+ // Pattern: 'Updated section "..."'
138
+ const updatedSection = summary.match(/^Updated section "(.+)"$/);
139
+ if (updatedSection) return s.updatedSection(updatedSection[1]);
140
+
141
+ // Pattern: "Renamed file to ..."
142
+ const renamedFile = summary.match(/^Renamed file to (.+)$/);
143
+ if (renamedFile) return s.renamedFile(renamedFile[1]);
144
+
145
+ // Pattern: "Moved file to ..."
146
+ const movedFile = summary.match(/^Moved file to (.+)$/);
147
+ if (movedFile) return s.movedFile(movedFile[1]);
148
+
149
+ // Pattern: "Renamed space to ..."
150
+ const renamedSpace = summary.match(/^Renamed space to (.+)$/);
151
+ if (renamedSpace) return s.renamedSpace(renamedSpace[1]);
152
+
153
+ // Pattern: "Appended CSV row (N cell(s))"
154
+ const csvRow = summary.match(/^Appended CSV row \((\d+) cells?\)$/);
155
+ if (csvRow) return s.appendedCsvRow(Number(csvRow[1]));
156
+
157
+ // Pattern: "Imported legacy agent diff (...)"
158
+ if (summary.startsWith('Imported legacy agent diff')) return s.importedLegacyDiff;
159
+
160
+ return summary; // fallback: show original
161
+ }
162
+
51
163
  export default function ChangesContentPage({ initialPath = '' }: { initialPath?: string }) {
52
164
  const { t } = useLocale();
53
165
  const [pathFilter, setPathFilter] = useState(initialPath);
@@ -77,7 +189,7 @@ export default function ChangesContentPage({ initialPath = '' }: { initialPath?:
77
189
  setEvents(list.events);
78
190
  setSummary(summaryData);
79
191
  } catch (e) {
80
- setError(e instanceof Error ? e.message : 'Failed to load changes');
192
+ setError(e instanceof Error ? e.message : String(e));
81
193
  } finally {
82
194
  setLoading(false);
83
195
  }
@@ -117,7 +229,7 @@ export default function ChangesContentPage({ initialPath = '' }: { initialPath?:
117
229
  () =>
118
230
  opOptions.map((op) => ({
119
231
  value: op,
120
- label: op === 'all' ? t.changes.filters.operationAll : op,
232
+ label: op === 'all' ? t.changes.filters.operationAll : ((t.changes.operations as Record<string, string>)?.[op] ?? op),
121
233
  })),
122
234
  [opOptions, t],
123
235
  );
@@ -133,206 +245,294 @@ export default function ChangesContentPage({ initialPath = '' }: { initialPath?:
133
245
  }, [t]);
134
246
 
135
247
  return (
136
- <div className="min-h-screen">
248
+ <div className="min-h-screen bg-background">
249
+ {/* Header with icon in box */}
137
250
  <div className="px-4 md:px-6 pt-6 md:pt-8">
138
- <div className="content-width xl:mr-[220px] rounded-xl border border-border bg-card px-4 py-3 md:px-5 md:py-4">
139
- <div className="flex flex-wrap items-start justify-between gap-3">
140
- <div className="min-w-0">
141
- <div className="flex items-center gap-2 text-sm font-medium text-foreground">
142
- <History size={15} />
143
- {t.changes.title}
251
+ <div className="content-width xl:mr-[220px] rounded-xl border border-border/60 bg-card p-6 md:p-8 shadow-sm">
252
+ <div className="flex flex-wrap items-start justify-between gap-4">
253
+ <div className="min-w-0 flex-1">
254
+ {/* Title with icon in box (Settings pattern) */}
255
+ <div className="flex items-start gap-4">
256
+ <div className="w-10 h-10 rounded-lg bg-[var(--amber)]/8 flex items-center justify-center shrink-0 mt-0.5">
257
+ <History size={20} className="text-[var(--amber)]" />
258
+ </div>
259
+ <div className="flex-1 min-w-0">
260
+ <h1 className="text-2xl font-semibold text-foreground tracking-tight">{t.changes.title}</h1>
261
+ <p className="mt-1.5 text-sm text-muted-foreground leading-relaxed">{t.changes.subtitle}</p>
262
+ </div>
144
263
  </div>
145
- <p className="mt-1 text-xs text-muted-foreground">
146
- {t.changes.subtitle}
147
- </p>
148
- <div className="mt-2 flex items-center gap-2 text-xs">
149
- <span className="rounded-full bg-muted px-2 py-0.5 text-muted-foreground">{eventCountLabel}</span>
150
- <span className="rounded-full bg-[var(--amber-dim)] px-2 py-0.5 text-[var(--amber)]">
151
- {t.changes.unreadCount(summary.unreadCount)}
264
+
265
+ {/* Stats badges */}
266
+ <div className="mt-5 flex items-center gap-2">
267
+ <span className="px-3 py-1.5 rounded-full bg-muted/60 text-muted-foreground text-xs font-medium">
268
+ {eventCountLabel}
152
269
  </span>
270
+ {summary.unreadCount > 0 && (
271
+ <span className="px-3 py-1.5 rounded-full bg-[var(--amber)]/10 text-[var(--amber)] text-xs font-medium border border-[var(--amber)]/20">
272
+ {t.changes.unreadCount(summary.unreadCount)}
273
+ </span>
274
+ )}
153
275
  </div>
154
276
  </div>
155
- <div className="flex items-center gap-2">
277
+
278
+ {/* Action buttons with icon */}
279
+ <div className="flex items-center gap-2 shrink-0">
156
280
  <button
157
281
  type="button"
158
282
  onClick={() => void fetchData()}
159
- className="px-2.5 py-1.5 rounded-md text-xs font-medium bg-muted text-muted-foreground hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
283
+ className="inline-flex items-center gap-1.5 px-3 py-2 rounded-lg text-xs font-medium bg-muted/50 text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-150 focus-visible:ring-2 focus-visible:ring-[var(--amber)]"
284
+ title={t.changes.refresh}
160
285
  >
161
- <span className="inline-flex items-center gap-1"><RefreshCw size={12} /> {t.changes.refresh}</span>
286
+ <RefreshCw size={14} />
287
+ <span className="hidden sm:inline">{t.changes.refresh}</span>
162
288
  </button>
163
289
  <button
164
290
  type="button"
165
291
  onClick={() => void markSeen()}
166
- className="px-2.5 py-1.5 rounded-md text-xs font-medium bg-muted text-muted-foreground hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring"
292
+ className="inline-flex items-center gap-1.5 px-3 py-2 rounded-lg text-xs font-medium bg-muted/50 text-muted-foreground hover:text-foreground hover:bg-muted transition-all duration-150 focus-visible:ring-2 focus-visible:ring-[var(--amber)]"
293
+ title={t.changes.markAllRead}
167
294
  >
168
- {t.changes.markAllRead}
295
+ <span className="hidden sm:inline">{t.changes.markAllRead}</span>
296
+ <span className="inline sm:hidden">✓</span>
169
297
  </button>
170
298
  </div>
171
299
  </div>
172
300
  </div>
173
301
  </div>
174
302
 
303
+ {/* Filters Section (SettingCard pattern) */}
175
304
  <div className="px-4 md:px-6 py-4 md:py-6">
176
- <div className="content-width xl:mr-[220px] space-y-3">
177
- <div className="rounded-lg border border-border bg-card p-3">
178
- <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-2.5">
179
- <label className="block">
180
- <span className="text-xs text-muted-foreground">{t.changes.filters.filePath}</span>
181
- <input
182
- value={pathFilter}
183
- onChange={(e) => setPathFilter(e.target.value)}
184
- placeholder={t.changes.filters.filePathPlaceholder}
185
- className="mt-1 w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-lg text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring"
186
- />
187
- </label>
188
- <div className="block">
189
- <span className="text-xs text-muted-foreground">{t.changes.filters.source}</span>
190
- <CustomSelect
191
- value={sourceFilter}
192
- onChange={(v) => setSourceFilter(v as 'all' | 'agent' | 'user' | 'system')}
193
- options={sourceSelectOptions}
194
- className="mt-1"
195
- />
305
+ <div className="content-width xl:mr-[220px] space-y-4">
306
+ <div className="rounded-xl border border-border/60 bg-card/60 p-5 md:p-6 shadow-sm hover:border-border hover:shadow transition-all duration-150">
307
+ <div className="space-y-4">
308
+ {/* Row 1: File path + Source */}
309
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
310
+ <label className="block">
311
+ <span className="text-xs font-semibold text-muted-foreground uppercase tracking-wider block mb-2.5">
312
+ {t.changes.filters.filePath}
313
+ </span>
314
+ <input
315
+ value={pathFilter}
316
+ onChange={(e) => setPathFilter(e.target.value)}
317
+ placeholder={t.changes.filters.filePathPlaceholder}
318
+ className="w-full px-3 py-2.5 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground/40 outline-none focus-visible:ring-2 focus-visible:ring-[var(--amber)]/40 hover:border-border/80 transition-all"
319
+ />
320
+ </label>
321
+ <div className="block">
322
+ <span className="text-xs font-semibold text-muted-foreground uppercase tracking-wider block mb-2.5">
323
+ {t.changes.filters.source}
324
+ </span>
325
+ <CustomSelect
326
+ value={sourceFilter}
327
+ onChange={(v) => setSourceFilter(v as 'all' | 'agent' | 'user' | 'system')}
328
+ options={sourceSelectOptions}
329
+ />
330
+ </div>
196
331
  </div>
197
- <div className="block">
198
- <span className="text-xs text-muted-foreground">{t.changes.filters.operation}</span>
199
- <CustomSelect
200
- value={opFilter}
201
- onChange={setOpFilter}
202
- options={opSelectOptions}
203
- className="mt-1"
204
- />
332
+
333
+ {/* Row 2: Operation + Keyword */}
334
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
335
+ <div className="block">
336
+ <span className="text-xs font-semibold text-muted-foreground uppercase tracking-wider block mb-2.5">
337
+ {t.changes.filters.operation}
338
+ </span>
339
+ <CustomSelect
340
+ value={opFilter}
341
+ onChange={setOpFilter}
342
+ options={opSelectOptions}
343
+ />
344
+ </div>
345
+ <label className="block">
346
+ <span className="text-xs font-semibold text-muted-foreground uppercase tracking-wider block mb-2.5">
347
+ {t.changes.filters.keyword}
348
+ </span>
349
+ <input
350
+ value={queryFilter}
351
+ onChange={(e) => setQueryFilter(e.target.value)}
352
+ placeholder={t.changes.filters.keywordPlaceholder}
353
+ className="w-full px-3 py-2.5 text-sm bg-background border border-border rounded-lg text-foreground placeholder:text-muted-foreground/40 outline-none focus-visible:ring-2 focus-visible:ring-[var(--amber)]/40 hover:border-border/80 transition-all"
354
+ />
355
+ </label>
205
356
  </div>
206
- <label className="block">
207
- <span className="text-xs text-muted-foreground">{t.changes.filters.keyword}</span>
208
- <input
209
- value={queryFilter}
210
- onChange={(e) => setQueryFilter(e.target.value)}
211
- placeholder={t.changes.filters.keywordPlaceholder}
212
- className="mt-1 w-full px-2.5 py-1.5 text-sm bg-background border border-border rounded-lg text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring"
213
- />
214
- </label>
215
357
  </div>
216
358
  </div>
217
359
 
218
- {loading && <p className="text-sm text-muted-foreground">{t.changes.loading}</p>}
219
- {error && <p className="text-sm text-error">{error}</p>}
360
+ {/* Content Area */}
361
+ {loading && (
362
+ <div className="space-y-3">
363
+ <ChangeCardSkeleton />
364
+ <ChangeCardSkeleton />
365
+ <ChangeCardSkeleton />
366
+ </div>
367
+ )}
368
+
369
+ {!loading && error && (
370
+ <div className="rounded-lg border border-error/20 bg-error/5 p-4 text-sm text-error">
371
+ {error}
372
+ <button
373
+ onClick={() => void fetchData()}
374
+ className="ml-2 underline hover:no-underline font-medium"
375
+ >
376
+ {t.changes.refresh}
377
+ </button>
378
+ </div>
379
+ )}
380
+
220
381
  {!loading && !error && events.length === 0 && (
221
- <div className="rounded-lg border border-border bg-card p-6 text-center text-sm text-muted-foreground">
222
- {t.changes.empty}
382
+ <div className="rounded-xl border border-border/60 bg-card/60 p-8 md:p-12 shadow-sm">
383
+ <div className="flex flex-col items-center text-center">
384
+ <div className="mb-4 p-4 bg-muted/50 rounded-lg">
385
+ <FileText size={32} className="text-muted-foreground/60" />
386
+ </div>
387
+ <h3 className="text-base font-semibold text-foreground mb-1">{t.changes.empty}</h3>
388
+ <p className="text-sm text-muted-foreground max-w-sm">{t.changes.emptyHint}</p>
389
+ </div>
223
390
  </div>
224
391
  )}
225
392
 
226
- {!loading && !error && events.map((event) => {
227
- const open = !!expanded[event.id];
228
- const rawDiff = buildLineDiff(event.before ?? '', event.after ?? '');
229
- const rows = collapseDiffContext(rawDiff);
230
- const inserts = rawDiff.filter(r => r.type === 'insert').length;
231
- const deletes = rawDiff.filter(r => r.type === 'delete').length;
232
- return (
233
- <div key={event.id} className="rounded-xl border border-border bg-card overflow-hidden">
234
- <button
235
- type="button"
236
- onClick={() => setExpanded((prev) => ({ ...prev, [event.id]: !prev[event.id] }))}
237
- className="w-full px-3 py-3 text-left hover:bg-muted/30 focus-visible:ring-2 focus-visible:ring-ring"
238
- >
239
- <div className="flex items-start gap-2">
240
- <span className="pt-0.5 text-muted-foreground">{open ? <ChevronDown size={14} /> : <ChevronRight size={14} />}</span>
241
- <div className="min-w-0 flex-1">
242
- <div className="flex items-center gap-2">
243
- <span className="text-sm font-medium text-foreground font-display">{event.summary}</span>
244
- {(inserts > 0 || deletes > 0) && (
245
- <span className="text-xs font-mono text-muted-foreground">
246
- {inserts > 0 && <span className="text-success">+{inserts}</span>}
247
- {inserts > 0 && deletes > 0 && ' '}
248
- {deletes > 0 && <span className="text-error">-{deletes}</span>}
249
- </span>
250
- )}
251
- </div>
252
- <div className="mt-1 flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground">
253
- <span
254
- className="rounded-md px-2 py-0.5 font-medium"
255
- style={{
256
- background: 'color-mix(in srgb, var(--amber) 16%, var(--muted))',
257
- color: 'var(--foreground)',
258
- border: '1px solid color-mix(in srgb, var(--amber) 36%, var(--border))',
259
- }}
260
- >
261
- {event.path}
262
- </span>
263
- <span className={opColorClass(event.op)}>{opLabel(event.op)}</span>
264
- <span>·</span>
265
- <span>{sourceLabel(event.source)}</span>
266
- <span>·</span>
267
- <span>{relativeTime(event.ts, t)}</span>
268
- </div>
269
- </div>
270
- <Link
271
- href={`/view/${event.path.split('/').map(encodeURIComponent).join('/')}`}
272
- className="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium bg-[var(--amber-dim)] text-[var(--amber-text)] focus-visible:ring-2 focus-visible:ring-ring hover:opacity-90"
273
- onClick={(e) => e.stopPropagation()}
393
+ {/* Event Cards - Premium Design */}
394
+ {!loading && !error && events.length > 0 && (
395
+ <div className="space-y-2.5">
396
+ {events.map((event) => {
397
+ const open = !!expanded[event.id];
398
+ const rawDiff = buildLineDiff(event.before ?? '', event.after ?? '');
399
+ const rows = collapseDiffContext(rawDiff);
400
+ const inserts = rawDiff.filter(r => r.type === 'insert').length;
401
+ const deletes = rawDiff.filter(r => r.type === 'delete').length;
402
+ return (
403
+ <div
404
+ key={event.id}
405
+ className="group rounded-xl border border-border/60 bg-card/70 overflow-hidden transition-all duration-150 hover:border-border hover:bg-card hover:shadow-md"
406
+ >
407
+ <button
408
+ type="button"
409
+ onClick={() => setExpanded((prev) => ({ ...prev, [event.id]: !prev[event.id] }))}
410
+ className="w-full px-4 md:px-5 py-3.5 text-left focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--amber)] hover:bg-muted/30 transition-all"
274
411
  >
275
- {t.changes.open}
276
- </Link>
277
- </div>
278
- </button>
279
-
280
- {open && (() => {
281
- let oln = 1;
282
- let nln = 1;
283
- return (
284
- <div className="border-t border-border bg-background/70 max-h-80 overflow-y-auto">
285
- {rows.map((row, idx) => {
286
- if (row.type === 'gap') {
287
- oln += row.count;
288
- nln += row.count;
289
- return (
290
- <div key={`${event.id}-gap-${idx}`} className="px-3 py-1 text-2xs text-muted-foreground/60 border-y border-border/30 bg-muted/20 text-center">
291
- {t.changes.unchangedLines(row.count)}
412
+ <div className="flex items-start gap-3">
413
+ {/* Expand/Collapse indicator with left amber bar on open */}
414
+ <div className="pt-0.5 text-muted-foreground/60 shrink-0 relative">
415
+ {open && <div className="absolute -left-6 top-1 bottom-1 w-[3px] rounded-r-full bg-[var(--amber)]" />}
416
+ {open ? <ChevronDown size={16} /> : <ChevronRight size={16} />}
417
+ </div>
418
+
419
+ {/* Operation icon in box */}
420
+ <div className="w-8 h-8 rounded-md bg-muted/50 flex items-center justify-center shrink-0 mt-0.5 text-muted-foreground group-hover:bg-muted transition-all">
421
+ {getOpIcon(event.op)}
422
+ </div>
423
+
424
+ {/* Main content */}
425
+ <div className="min-w-0 flex-1">
426
+ {/* Summary + diff count */}
427
+ <div className="flex items-center gap-2 flex-wrap">
428
+ <span className="text-sm font-medium text-foreground">
429
+ {translateSummary(event.summary, t)}
430
+ </span>
431
+ {(inserts > 0 || deletes > 0) && (
432
+ <span className="text-xs font-mono text-muted-foreground/70">
433
+ {inserts > 0 && <span className="text-success font-semibold">+{inserts}</span>}
434
+ {inserts > 0 && deletes > 0 && <span className="mx-1">·</span>}
435
+ {deletes > 0 && <span className="text-error font-semibold">-{deletes}</span>}
436
+ </span>
437
+ )}
438
+ </div>
439
+
440
+ {/* Metadata row with source badge, op label, time */}
441
+ <div className="mt-2.5 flex flex-wrap items-center gap-2">
442
+ {/* File path badge */}
443
+ <span className="rounded-md px-2 py-1 bg-[var(--amber-dim)] text-[var(--amber)] text-xs font-medium truncate inline-block max-w-xs hover:bg-[var(--amber)]/20 transition-colors" title={event.path}>
444
+ {event.path}
445
+ </span>
446
+
447
+ {/* Source badge with icon */}
448
+ <span className={`inline-flex items-center gap-1 px-2 py-1 rounded-md text-xs font-medium ${getSourceBgColor(event.source)} transition-colors`}>
449
+ {getSourceIcon(event.source)}
450
+ {sourceLabel(event.source)}
451
+ </span>
452
+
453
+ {/* Operation label */}
454
+ <span className={`text-xs font-medium ${opColorClass(event.op)}`}>
455
+ {opLabel(event.op)}
456
+ </span>
457
+
458
+ {/* Time */}
459
+ <span className="text-xs text-muted-foreground/60 ml-auto shrink-0">
460
+ {relativeTime(event.ts, t)}
461
+ </span>
292
462
  </div>
293
- );
294
- }
295
- const prefix = row.type === 'insert' ? '+' : row.type === 'delete' ? '-' : ' ';
296
- const showOld = row.type !== 'insert' ? oln : '';
297
- const showNew = row.type !== 'delete' ? nln : '';
298
- if (row.type !== 'insert') oln++;
299
- if (row.type !== 'delete') nln++;
300
- return (
301
- <div
302
- key={`${event.id}-${idx}`}
303
- className={`flex items-start text-xs font-mono ${
304
- row.type === 'insert'
305
- ? 'bg-success/8'
306
- : row.type === 'delete'
307
- ? 'bg-error/8'
308
- : ''
309
- }`}
310
- >
311
- <span className="w-8 shrink-0 text-right pr-1 select-none text-muted-foreground/40 text-2xs leading-5">{showOld}</span>
312
- <span className="w-8 shrink-0 text-right pr-1 select-none text-muted-foreground/40 text-2xs leading-5">{showNew}</span>
313
- <span
314
- className={`w-3 shrink-0 text-center select-none leading-5 ${
315
- row.type === 'insert' ? 'text-success' : row.type === 'delete' ? 'text-error' : 'text-muted-foreground/30'
316
- }`}
317
- >
318
- {prefix}
319
- </span>
320
- <span
321
- className={`px-1 py-0.5 whitespace-pre-wrap break-all flex-1 ${
322
- row.type === 'insert' ? 'text-success' : row.type === 'delete' ? 'text-error' : 'text-muted-foreground'
323
- }`}
324
- >
325
- {row.text || '\u00A0'}
326
- </span>
327
463
  </div>
464
+
465
+ {/* Open button */}
466
+ <Link
467
+ href={`/view/${event.path.split('/').map(encodeURIComponent).join('/')}`}
468
+ className="inline-flex items-center px-2.5 py-1.5 rounded-md text-xs font-medium bg-[var(--amber)]/10 text-[var(--amber)] hover:bg-[var(--amber)] hover:text-white focus-visible:ring-2 focus-visible:ring-[var(--amber)] transition-all duration-150 shrink-0 group-hover:bg-[var(--amber)]/15"
469
+ onClick={(e) => e.stopPropagation()}
470
+ title={t.changes.open}
471
+ >
472
+ {t.changes.open}
473
+ </Link>
474
+ </div>
475
+ </button>
476
+
477
+ {/* Diff Viewer with premium styling */}
478
+ {open && (() => {
479
+ let oln = 1;
480
+ let nln = 1;
481
+ return (
482
+ <div className="border-t border-border/50 bg-background/60 max-h-96 overflow-y-auto">
483
+ {rows.map((row, idx) => {
484
+ if (row.type === 'gap') {
485
+ oln += row.count;
486
+ nln += row.count;
487
+ return (
488
+ <div key={`${event.id}-gap-${idx}`} className="px-4 py-2.5 text-xs text-muted-foreground/50 border-y border-border/30 bg-muted/10 text-center font-medium">
489
+ {t.changes.unchangedLines(row.count)}
490
+ </div>
491
+ );
492
+ }
493
+ const prefix = row.type === 'insert' ? '+' : row.type === 'delete' ? '-' : ' ';
494
+ const showOld = row.type !== 'insert' ? oln : '';
495
+ const showNew = row.type !== 'delete' ? nln : '';
496
+ if (row.type !== 'insert') oln++;
497
+ if (row.type !== 'delete') nln++;
498
+ return (
499
+ <div
500
+ key={`${event.id}-${idx}`}
501
+ className={`flex items-start text-xs font-mono leading-6 px-4 ${
502
+ row.type === 'insert'
503
+ ? 'bg-success/5 hover:bg-success/8'
504
+ : row.type === 'delete'
505
+ ? 'bg-error/5 hover:bg-error/8'
506
+ : 'hover:bg-muted/20'
507
+ } transition-colors`}
508
+ >
509
+ <span className="w-8 shrink-0 text-right pr-3 select-none text-muted-foreground/40 font-medium">{showOld}</span>
510
+ <span className="w-8 shrink-0 text-right pr-3 select-none text-muted-foreground/40 font-medium">{showNew}</span>
511
+ <span
512
+ className={`w-3 shrink-0 text-center select-none font-bold ${
513
+ row.type === 'insert' ? 'text-success' : row.type === 'delete' ? 'text-error' : 'text-muted-foreground/20'
514
+ }`}
515
+ >
516
+ {prefix}
517
+ </span>
518
+ <span
519
+ className={`flex-1 whitespace-pre-wrap break-all overflow-hidden ${
520
+ row.type === 'insert' ? 'text-success' : row.type === 'delete' ? 'text-error' : 'text-muted-foreground'
521
+ }`}
522
+ >
523
+ {row.text || '\u00A0'}
524
+ </span>
525
+ </div>
526
+ );
527
+ })}
528
+ </div>
328
529
  );
329
- })}
530
+ })()}
330
531
  </div>
331
- );
332
- })()}
333
- </div>
334
- );
335
- })}
532
+ );
533
+ })}
534
+ </div>
535
+ )}
336
536
  </div>
337
537
  </div>
338
538
  </div>
@@ -66,7 +66,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
66
66
 
67
67
  if (justOpened) {
68
68
  apiFetch<SettingsData>('/api/settings').then(d => { setData(d); dataLoaded.current = true; }).catch(() => setStatus('load-error'));
69
- setFont(localStorage.getItem('prose-font') === 'geist' ? 'inter' : localStorage.getItem('prose-font') ?? 'lora');
69
+ setFont(localStorage.getItem('prose-font') === 'geist' ? 'inter' : localStorage.getItem('prose-font') ?? 'ibm-plex-sans');
70
70
  setFontSize(localStorage.getItem('prose-font-size') ?? '15px');
71
71
  setContentWidth(localStorage.getItem('content-width') ?? '780px');
72
72
  const stored = localStorage.getItem('theme');
@@ -50,7 +50,9 @@ export default function WalkthroughTooltip({ stepIndex, rect, position }: Walkth
50
50
 
51
51
  return (
52
52
  <div
53
- className="fixed z-[102] w-[280px] rounded-xl border shadow-lg animate-in fade-in slide-in-from-left-2 duration-200"
53
+ className={`fixed z-[102] w-[280px] rounded-xl border shadow-lg animate-in fade-in duration-200 ${
54
+ position === 'right' ? 'slide-in-from-left-2' : 'slide-in-from-top-2'
55
+ }`}
54
56
  style={{
55
57
  top: `${top}px`,
56
58
  left: `${left}px`,
@@ -18,6 +18,6 @@ export interface WalkthroughStep {
18
18
  */
19
19
  export const walkthroughSteps: WalkthroughStep[] = [
20
20
  { anchor: 'files-panel', position: 'right' },
21
- { anchor: 'ask-button', position: 'right' },
21
+ { anchor: 'ask-button', position: 'bottom' },
22
22
  { anchor: 'agents-panel', position: 'right' },
23
23
  ];