@geminilight/mindos 0.6.53 → 0.6.54

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 (508) hide show
  1. package/README.md +27 -5
  2. package/README_zh.md +27 -5
  3. package/_standalone/.mindos-build-version +1 -1
  4. package/_standalone/.next/BUILD_ID +1 -1
  5. package/_standalone/.next/app-path-routes-manifest.json +23 -20
  6. package/_standalone/.next/build-manifest.json +3 -3
  7. package/_standalone/.next/cache/.previewinfo +1 -1
  8. package/_standalone/.next/cache/.rscinfo +1 -1
  9. package/_standalone/.next/cache/config.json +3 -3
  10. package/_standalone/.next/prerender-manifest.json +3 -3
  11. package/_standalone/.next/react-loadable-manifest.json +18 -2
  12. package/_standalone/.next/routes-manifest.json +18 -0
  13. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  14. package/_standalone/.next/server/app/_global-error/page.js +1 -1
  15. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  16. package/_standalone/.next/server/app/_global-error.html +2 -2
  17. package/_standalone/.next/server/app/_global-error.rsc +2 -2
  18. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  19. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  25. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/agents/page.js +3 -3
  31. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  32. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/ask/route.js +5 -5
  44. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/changes/route.js.nft.json +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.js +2 -2
  55. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  59. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/file/raw/route.js +1 -0
  61. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -0
  62. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -0
  63. package/_standalone/.next/server/app/api/file/route.js +1 -1
  64. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  65. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  67. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/inbox/route.js +1 -1
  74. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  75. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  77. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  84. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  104. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/sync/route.js +1 -1
  107. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  109. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  115. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/changes/page.js +2 -2
  117. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  118. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/echo/[segment]/page.js +3 -3
  120. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  121. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/echo/page.js +1 -1
  123. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/explore/page.js +2 -2
  126. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/help/page.js +2 -2
  129. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  130. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/inbox/history/page.js +2 -0
  132. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -0
  133. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -0
  134. package/_standalone/.next/server/app/login/page.js +2 -2
  135. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  136. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  137. package/_standalone/.next/server/app/page.js +3 -3
  138. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  139. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/setup/page.js +2 -2
  141. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  142. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/trash/page.js +3 -3
  144. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  147. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/wiki/page.js +2 -0
  150. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -0
  151. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -0
  152. package/_standalone/.next/server/app-paths-manifest.json +23 -20
  153. package/_standalone/.next/server/chunks/2190.js +2 -2
  154. package/_standalone/.next/server/chunks/2364.js +2 -0
  155. package/_standalone/.next/server/chunks/357.js +1 -0
  156. package/_standalone/.next/server/chunks/530.js +219 -0
  157. package/_standalone/.next/server/chunks/6054.js +52 -0
  158. package/_standalone/.next/server/chunks/6539.js +1 -1
  159. package/_standalone/.next/server/chunks/8388.js +2 -2
  160. package/_standalone/.next/server/chunks/953.js +4 -4
  161. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  162. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  163. package/_standalone/.next/server/next-font-manifest.js +1 -1
  164. package/_standalone/.next/server/next-font-manifest.json +1 -1
  165. package/_standalone/.next/server/pages/500.html +2 -2
  166. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  167. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  168. package/_standalone/.next/static/2hrwFOLEOZhHQHfrIt-Dw/_buildManifest.js +1 -0
  169. package/_standalone/.next/static/chunks/1053-2874859f7caefa0f.js +29 -0
  170. package/_standalone/.next/static/chunks/178-105779afb62d36d9.js +1 -0
  171. package/_standalone/.next/static/chunks/1814.b08e9fb85dd3b13c.js +1 -0
  172. package/_standalone/.next/static/chunks/{1880-3ec02adc80531825.js → 1880-7abf971bcfd2389b.js} +2 -2
  173. package/_standalone/.next/static/chunks/{3160-83a7e0b94414b3ac.js → 2218-d54538000574ffef.js} +1 -1
  174. package/_standalone/.next/static/chunks/254-32719a9bea2e74f0.js +1 -0
  175. package/_standalone/.next/static/chunks/362.a77be2f206db7b19.js +1 -0
  176. package/_standalone/.next/static/chunks/4237-ffc6e7c15d4007b6.js +1 -0
  177. package/_standalone/.next/static/chunks/7035-2af69391c7b1ad95.js +1 -0
  178. package/_standalone/.next/static/chunks/7322-d67d05067544864c.js +1 -0
  179. package/_standalone/.next/static/chunks/{6926-4af497b83952fa87.js → 8409-de5726a4a278d28f.js} +1 -1
  180. package/_standalone/.next/static/chunks/8753-ea9db680b0f70f25.js +1 -0
  181. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  182. package/_standalone/.next/static/chunks/app/_global-error/{page-b07a5983e85bc5e3.js → page-e240db6d5049d336.js} +1 -1
  183. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-f006a70f6889eb56.js +1 -0
  184. package/_standalone/.next/static/chunks/app/agents/page-bd522e428e3acb78.js +5 -0
  185. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  186. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-b07a5983e85bc5e3.js → route-e240db6d5049d336.js} +1 -1
  187. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e240db6d5049d336.js +1 -0
  188. package/_standalone/.next/static/chunks/app/api/a2a/route-e240db6d5049d336.js +1 -0
  189. package/_standalone/.next/static/chunks/app/api/acp/config/route-e240db6d5049d336.js +1 -0
  190. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e240db6d5049d336.js +1 -0
  191. package/_standalone/.next/static/chunks/app/api/acp/install/route-e240db6d5049d336.js +1 -0
  192. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e240db6d5049d336.js +1 -0
  193. package/_standalone/.next/static/chunks/app/api/acp/session/route-e240db6d5049d336.js +1 -0
  194. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e240db6d5049d336.js +1 -0
  195. package/_standalone/.next/static/chunks/app/api/ask/route-e240db6d5049d336.js +1 -0
  196. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e240db6d5049d336.js +1 -0
  197. package/_standalone/.next/static/chunks/app/api/auth/route-e240db6d5049d336.js +1 -0
  198. package/_standalone/.next/static/chunks/app/api/backlinks/route-e240db6d5049d336.js +1 -0
  199. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e240db6d5049d336.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/changes/route-e240db6d5049d336.js +1 -0
  201. package/_standalone/.next/static/chunks/app/api/export/route-e240db6d5049d336.js +1 -0
  202. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e240db6d5049d336.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/file/import/route-e240db6d5049d336.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/file/raw/route-e240db6d5049d336.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/file/route-e240db6d5049d336.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/files/route-e240db6d5049d336.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/git/route-e240db6d5049d336.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/graph/route-e240db6d5049d336.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/health/route-e240db6d5049d336.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/inbox/route-e240db6d5049d336.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/init/route-e240db6d5049d336.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e240db6d5049d336.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e240db6d5049d336.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e240db6d5049d336.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e240db6d5049d336.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e240db6d5049d336.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e240db6d5049d336.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/monitoring/route-e240db6d5049d336.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/recent-files/route-e240db6d5049d336.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/restart/route-e240db6d5049d336.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/search/route-e240db6d5049d336.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e240db6d5049d336.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e240db6d5049d336.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/settings/route-e240db6d5049d336.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e240db6d5049d336.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e240db6d5049d336.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e240db6d5049d336.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e240db6d5049d336.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e240db6d5049d336.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/setup/route-e240db6d5049d336.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/skills/route-e240db6d5049d336.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/sync/route-e240db6d5049d336.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/tree-version/route-e240db6d5049d336.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/uninstall/route-e240db6d5049d336.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/update/route-e240db6d5049d336.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/update-check/route-e240db6d5049d336.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/update-status/route-e240db6d5049d336.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/workflows/route-e240db6d5049d336.js +1 -0
  239. package/_standalone/.next/static/chunks/app/changes/page-5a72144d1080a699.js +1 -0
  240. package/_standalone/.next/static/chunks/app/echo/[segment]/{page-88df174dd64b2c76.js → page-6710da1f581b2854.js} +2 -2
  241. package/_standalone/.next/static/chunks/app/echo/page-e240db6d5049d336.js +1 -0
  242. package/_standalone/.next/static/chunks/app/explore/{page-5eb2835e9e3ab4bb.js → page-d3d99308146c2240.js} +1 -1
  243. package/_standalone/.next/static/chunks/app/global-error-c37d50db6128ec01.js +1 -0
  244. package/_standalone/.next/static/chunks/app/help/page-222df603080b5fab.js +1 -0
  245. package/_standalone/.next/static/chunks/app/inbox/history/page-07819cf95cb0805f.js +1 -0
  246. package/_standalone/.next/static/chunks/app/layout-8eacff5813458190.js +186 -0
  247. package/_standalone/.next/static/chunks/app/loading-e240db6d5049d336.js +1 -0
  248. package/_standalone/.next/static/chunks/app/login/{page-24236460fa7c11d0.js → page-0eeef685052869a6.js} +1 -1
  249. package/_standalone/.next/static/chunks/app/page-5a6c9455efe8a0df.js +7 -0
  250. package/_standalone/.next/static/chunks/app/setup/{page-99f40e9337388cda.js → page-9a81fa4d82c6351b.js} +1 -1
  251. package/_standalone/.next/static/chunks/app/trash/page-72d0ae3649ac4b6c.js +1 -0
  252. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e240db6d5049d336.js +1 -0
  253. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-fc04c2bd4f35bc6f.js +1 -0
  254. package/_standalone/.next/static/chunks/app/view/[...path]/page-e8699f96589c0979.js +12 -0
  255. package/_standalone/.next/static/chunks/app/wiki/page-d492256a93f0b8bc.js +1 -0
  256. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e240db6d5049d336.js +1 -0
  257. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e240db6d5049d336.js +1 -0
  258. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e240db6d5049d336.js +1 -0
  259. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e240db6d5049d336.js +1 -0
  260. package/_standalone/.next/static/chunks/{webpack-bbd44cbc83dc0aa4.js → webpack-73c9da80c6c1ebfe.js} +1 -1
  261. package/_standalone/.next/static/css/66f8a81e4eda06d4.css +1 -0
  262. package/_standalone/.next/static/css/a4a2b71142b311af.css +31 -0
  263. package/_standalone/.next/trace +64 -64
  264. package/_standalone/.next/types/routes.d.ts +5 -2
  265. package/_standalone/.next/types/validator.ts +27 -0
  266. package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +1 -0
  267. package/_standalone/__tests__/agents/agents-content-model.test.ts +13 -0
  268. package/_standalone/__tests__/core/inbox.test.ts +168 -0
  269. package/_standalone/__tests__/core/sync.test.ts +37 -0
  270. package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +1 -0
  271. package/_standalone/app/globals.css +29 -3
  272. package/_standalone/components/ActivityBar.tsx +9 -9
  273. package/_standalone/components/AskFab.tsx +1 -1
  274. package/_standalone/components/Backlinks.tsx +1 -1
  275. package/_standalone/components/Breadcrumb.tsx +1 -1
  276. package/_standalone/components/CreateSpaceModal.tsx +1 -1
  277. package/_standalone/components/EchoSpotlight.tsx +14 -10
  278. package/_standalone/components/Editor.tsx +1 -1
  279. package/_standalone/components/ExportModal.tsx +3 -3
  280. package/_standalone/components/FileTree.tsx +6 -11
  281. package/_standalone/components/GuideCard.tsx +1 -1
  282. package/_standalone/components/ImportModal.tsx +1 -2
  283. package/_standalone/components/KeyboardShortcuts.tsx +1 -1
  284. package/_standalone/components/MarkdownEditor.tsx +1 -1
  285. package/_standalone/components/OnboardingView.tsx +2 -2
  286. package/_standalone/components/OrganizeToast.tsx +3 -1
  287. package/_standalone/components/Panel.tsx +27 -6
  288. package/_standalone/components/Sidebar.tsx +1 -1
  289. package/_standalone/components/SidebarLayout.tsx +30 -7
  290. package/_standalone/components/SystemPulse.tsx +16 -16
  291. package/_standalone/components/agents/AgentsOverviewSection.tsx +18 -92
  292. package/_standalone/components/agents/AgentsPanelA2aTab.tsx +67 -66
  293. package/_standalone/components/agents/AgentsPrimitives.tsx +1 -1
  294. package/_standalone/components/agents/RecentActivityFeed.tsx +6 -6
  295. package/_standalone/components/agents/SkillDetailPopover.tsx +1 -1
  296. package/_standalone/components/ask/AskHeader.tsx +1 -1
  297. package/_standalone/components/echo/EchoHero.tsx +1 -1
  298. package/_standalone/components/echo/EchoPageSections.tsx +1 -1
  299. package/_standalone/components/explore/UseCaseCard.tsx +1 -1
  300. package/_standalone/components/home/InboxSection.tsx +262 -54
  301. package/_standalone/components/panels/AgentsPanel.tsx +4 -3
  302. package/_standalone/components/panels/AgentsPanelAgentDetail.tsx +1 -1
  303. package/_standalone/components/panels/AgentsPanelHubNav.tsx +10 -6
  304. package/_standalone/components/panels/PanelHeader.tsx +1 -1
  305. package/_standalone/components/renderers/audio/AudioRenderer.tsx +79 -0
  306. package/_standalone/components/renderers/image/ImageRenderer.tsx +203 -0
  307. package/_standalone/components/renderers/pdf/PdfRenderer.tsx +57 -0
  308. package/_standalone/components/renderers/video/VideoRenderer.tsx +91 -0
  309. package/_standalone/components/settings/McpTab.tsx +154 -28
  310. package/_standalone/components/settings/PluginsTab.tsx +1 -1
  311. package/_standalone/components/settings/SettingsContent.tsx +41 -7
  312. package/_standalone/components/settings/types.ts +7 -1
  313. package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +1 -1
  314. package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +1 -1
  315. package/_standalone/hooks/useAiOrganize.ts +14 -1
  316. package/_standalone/lib/organize-history.ts +6 -0
  317. package/_standalone/tsconfig.tsbuildinfo +1 -1
  318. package/app/app/api/file/raw/route.ts +121 -0
  319. package/app/app/api/file/route.ts +21 -0
  320. package/app/app/api/inbox/route.ts +38 -2
  321. package/app/app/api/mcp/status/route.ts +1 -0
  322. package/app/app/api/settings/route.ts +13 -0
  323. package/app/app/api/setup/route.ts +11 -1
  324. package/app/app/api/sync/route.ts +36 -13
  325. package/app/app/global-error.tsx +3 -3
  326. package/app/app/globals.css +29 -3
  327. package/app/app/inbox/history/page.tsx +250 -0
  328. package/app/app/layout.tsx +5 -11
  329. package/app/app/login/page.tsx +1 -1
  330. package/app/app/view/[...path]/ViewPageClient.tsx +15 -10
  331. package/app/app/view/[...path]/not-found.tsx +1 -1
  332. package/app/app/view/[...path]/page.tsx +32 -1
  333. package/app/app/wiki/page.tsx +58 -0
  334. package/app/components/ActivityBar.tsx +9 -9
  335. package/app/components/AskFab.tsx +1 -1
  336. package/app/components/Backlinks.tsx +1 -1
  337. package/app/components/Breadcrumb.tsx +1 -1
  338. package/app/components/CreateSpaceModal.tsx +1 -1
  339. package/app/components/DirView.tsx +2 -2
  340. package/app/components/EchoSpotlight.tsx +14 -10
  341. package/app/components/Editor.tsx +1 -1
  342. package/app/components/ExportModal.tsx +3 -3
  343. package/app/components/FileTree.tsx +6 -11
  344. package/app/components/GuideCard.tsx +1 -1
  345. package/app/components/HomeContent.tsx +50 -39
  346. package/app/components/ImportModal.tsx +1 -2
  347. package/app/components/KeyboardShortcuts.tsx +1 -1
  348. package/app/components/MarkdownEditor.tsx +1 -1
  349. package/app/components/OnboardingView.tsx +2 -2
  350. package/app/components/OrganizeToast.tsx +3 -1
  351. package/app/components/Panel.tsx +27 -6
  352. package/app/components/Sidebar.tsx +1 -1
  353. package/app/components/SidebarLayout.tsx +30 -7
  354. package/app/components/SystemPulse.tsx +16 -16
  355. package/app/components/TrashPageClient.tsx +8 -6
  356. package/app/components/UpdateOverlay.tsx +1 -1
  357. package/app/components/WikiHomeContent.tsx +273 -0
  358. package/app/components/agents/AgentDetailContent.tsx +5 -5
  359. package/app/components/agents/AgentsContentPage.tsx +14 -3
  360. package/app/components/agents/AgentsOverviewSection.tsx +18 -92
  361. package/app/components/agents/AgentsPanelA2aTab.tsx +67 -66
  362. package/app/components/agents/AgentsPrimitives.tsx +1 -1
  363. package/app/components/agents/RecentActivityFeed.tsx +6 -6
  364. package/app/components/agents/SkillDetailPopover.tsx +1 -1
  365. package/app/components/agents/agents-content-model.ts +4 -1
  366. package/app/components/ask/AskHeader.tsx +1 -1
  367. package/app/components/changes/ChangesContentPage.tsx +10 -6
  368. package/app/components/echo/EchoHero.tsx +1 -1
  369. package/app/components/echo/EchoPageSections.tsx +1 -1
  370. package/app/components/explore/ExploreContent.tsx +1 -1
  371. package/app/components/explore/UseCaseCard.tsx +1 -1
  372. package/app/components/help/HelpContent.tsx +3 -3
  373. package/app/components/home/InboxSection.tsx +262 -54
  374. package/app/components/panels/AgentsPanel.tsx +4 -3
  375. package/app/components/panels/AgentsPanelAgentDetail.tsx +1 -1
  376. package/app/components/panels/AgentsPanelHubNav.tsx +10 -6
  377. package/app/components/panels/PanelHeader.tsx +1 -1
  378. package/app/components/renderers/audio/AudioRenderer.tsx +79 -0
  379. package/app/components/renderers/audio/manifest.ts +17 -0
  380. package/app/components/renderers/image/ImageRenderer.tsx +203 -0
  381. package/app/components/renderers/image/manifest.ts +17 -0
  382. package/app/components/renderers/pdf/PdfRenderer.tsx +57 -0
  383. package/app/components/renderers/pdf/manifest.ts +15 -0
  384. package/app/components/renderers/video/VideoRenderer.tsx +91 -0
  385. package/app/components/renderers/video/manifest.ts +17 -0
  386. package/app/components/settings/McpTab.tsx +154 -28
  387. package/app/components/settings/PluginsTab.tsx +1 -1
  388. package/app/components/settings/SettingsContent.tsx +41 -7
  389. package/app/components/settings/types.ts +7 -1
  390. package/app/components/setup/index.tsx +4 -3
  391. package/app/components/walkthrough/WalkthroughOverlay.tsx +1 -1
  392. package/app/components/walkthrough/WalkthroughTooltip.tsx +1 -1
  393. package/app/hooks/useAiOrganize.ts +14 -1
  394. package/app/lib/core/inbox.ts +131 -2
  395. package/app/lib/core/pdf-text.ts +28 -0
  396. package/app/lib/core/search-index.ts +29 -5
  397. package/app/lib/core/tree.ts +6 -1
  398. package/app/lib/fs.ts +31 -3
  399. package/app/lib/i18n/modules/ai-chat.ts +34 -0
  400. package/app/lib/i18n/modules/knowledge.ts +30 -0
  401. package/app/lib/i18n/modules/navigation.ts +4 -2
  402. package/app/lib/i18n/modules/panels.ts +22 -4
  403. package/app/lib/i18n/modules/settings.ts +26 -0
  404. package/app/lib/organize-history.ts +6 -0
  405. package/app/lib/renderers/index.ts +5 -1
  406. package/app/lib/settings.ts +28 -0
  407. package/bin/commands/doctor.js +12 -6
  408. package/bin/commands/file.js +7 -4
  409. package/bin/commands/logs.js +39 -4
  410. package/bin/commands/onboard.js +1 -1
  411. package/bin/commands/open.js +6 -1
  412. package/bin/commands/space.js +7 -4
  413. package/bin/commands/update.js +8 -18
  414. package/bin/lib/build.js +19 -8
  415. package/bin/lib/cli-shim.js +67 -2
  416. package/bin/lib/config.js +4 -5
  417. package/bin/lib/gateway.js +10 -23
  418. package/bin/lib/jsonc.js +7 -2
  419. package/bin/lib/mcp-agents.js +26 -5
  420. package/bin/lib/path-expand.js +6 -3
  421. package/bin/lib/port.js +5 -1
  422. package/bin/lib/stop.js +72 -51
  423. package/bin/lib/sync.js +1 -1
  424. package/package.json +1 -1
  425. package/scripts/setup.js +7 -5
  426. package/_standalone/.next/server/chunks/3436.js +0 -52
  427. package/_standalone/.next/server/chunks/5648.js +0 -2
  428. package/_standalone/.next/server/chunks/8408.js +0 -219
  429. package/_standalone/.next/static/W-wLgvhPtPJ5Psq9V4i3M/_buildManifest.js +0 -1
  430. package/_standalone/.next/static/chunks/1053-17786066ecd6f216.js +0 -29
  431. package/_standalone/.next/static/chunks/1814.72f7fe7c61e2b647.js +0 -1
  432. package/_standalone/.next/static/chunks/362.4c226d7887d5f696.js +0 -1
  433. package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +0 -1
  434. package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +0 -1
  435. package/_standalone/.next/static/chunks/7035-032641fb6f4e07b2.js +0 -1
  436. package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +0 -1
  437. package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +0 -1
  438. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-074d6aafc2606561.js +0 -1
  439. package/_standalone/.next/static/chunks/app/agents/page-710d8c80fa86e93e.js +0 -5
  440. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-b07a5983e85bc5e3.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/a2a/route-b07a5983e85bc5e3.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/acp/config/route-b07a5983e85bc5e3.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/acp/detect/route-b07a5983e85bc5e3.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/acp/install/route-b07a5983e85bc5e3.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/acp/registry/route-b07a5983e85bc5e3.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/acp/session/route-b07a5983e85bc5e3.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/agent-activity/route-b07a5983e85bc5e3.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/ask/route-b07a5983e85bc5e3.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-b07a5983e85bc5e3.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/auth/route-b07a5983e85bc5e3.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/backlinks/route-b07a5983e85bc5e3.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/bootstrap/route-b07a5983e85bc5e3.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/changes/route-b07a5983e85bc5e3.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/export/route-b07a5983e85bc5e3.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-b07a5983e85bc5e3.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/file/import/route-b07a5983e85bc5e3.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/file/route-b07a5983e85bc5e3.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/files/route-b07a5983e85bc5e3.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/git/route-b07a5983e85bc5e3.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/graph/route-b07a5983e85bc5e3.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/health/route-b07a5983e85bc5e3.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/inbox/route-b07a5983e85bc5e3.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/init/route-b07a5983e85bc5e3.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-b07a5983e85bc5e3.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/mcp/install/route-b07a5983e85bc5e3.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-b07a5983e85bc5e3.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-b07a5983e85bc5e3.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/mcp/status/route-b07a5983e85bc5e3.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-b07a5983e85bc5e3.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/monitoring/route-b07a5983e85bc5e3.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/recent-files/route-b07a5983e85bc5e3.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/restart/route-b07a5983e85bc5e3.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/search/route-b07a5983e85bc5e3.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-b07a5983e85bc5e3.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-b07a5983e85bc5e3.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/settings/route-b07a5983e85bc5e3.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-b07a5983e85bc5e3.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-b07a5983e85bc5e3.js +0 -1
  479. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-b07a5983e85bc5e3.js +0 -1
  480. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-b07a5983e85bc5e3.js +0 -1
  481. package/_standalone/.next/static/chunks/app/api/setup/ls/route-b07a5983e85bc5e3.js +0 -1
  482. package/_standalone/.next/static/chunks/app/api/setup/route-b07a5983e85bc5e3.js +0 -1
  483. package/_standalone/.next/static/chunks/app/api/skills/route-b07a5983e85bc5e3.js +0 -1
  484. package/_standalone/.next/static/chunks/app/api/sync/route-b07a5983e85bc5e3.js +0 -1
  485. package/_standalone/.next/static/chunks/app/api/tree-version/route-b07a5983e85bc5e3.js +0 -1
  486. package/_standalone/.next/static/chunks/app/api/uninstall/route-b07a5983e85bc5e3.js +0 -1
  487. package/_standalone/.next/static/chunks/app/api/update/route-b07a5983e85bc5e3.js +0 -1
  488. package/_standalone/.next/static/chunks/app/api/update-check/route-b07a5983e85bc5e3.js +0 -1
  489. package/_standalone/.next/static/chunks/app/api/update-status/route-b07a5983e85bc5e3.js +0 -1
  490. package/_standalone/.next/static/chunks/app/api/workflows/route-b07a5983e85bc5e3.js +0 -1
  491. package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +0 -1
  492. package/_standalone/.next/static/chunks/app/echo/page-b07a5983e85bc5e3.js +0 -1
  493. package/_standalone/.next/static/chunks/app/global-error-e1ad0e18236ba26c.js +0 -1
  494. package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +0 -1
  495. package/_standalone/.next/static/chunks/app/layout-e5d2fb384207d821.js +0 -186
  496. package/_standalone/.next/static/chunks/app/loading-b07a5983e85bc5e3.js +0 -1
  497. package/_standalone/.next/static/chunks/app/page-54edd045d3448df5.js +0 -7
  498. package/_standalone/.next/static/chunks/app/trash/page-6372bb3f5463affa.js +0 -1
  499. package/_standalone/.next/static/chunks/app/view/[...path]/loading-b07a5983e85bc5e3.js +0 -1
  500. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +0 -1
  501. package/_standalone/.next/static/chunks/app/view/[...path]/page-f3d1d87190dcfe28.js +0 -12
  502. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b07a5983e85bc5e3.js +0 -1
  503. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b07a5983e85bc5e3.js +0 -1
  504. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b07a5983e85bc5e3.js +0 -1
  505. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b07a5983e85bc5e3.js +0 -1
  506. package/_standalone/.next/static/css/bbf51803eade6c50.css +0 -31
  507. package/_standalone/.next/static/css/ef1151f74f00d91a.css +0 -1
  508. /package/_standalone/.next/static/{W-wLgvhPtPJ5Psq9V4i3M → 2hrwFOLEOZhHQHfrIt-Dw}/_ssgManifest.js +0 -0
@@ -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') ?? 'lora');
69
+ setFont(localStorage.getItem('prose-font') === 'geist' ? 'inter' : localStorage.getItem('prose-font') ?? 'lora');
70
70
  setFontSize(localStorage.getItem('prose-font-size') ?? '15px');
71
71
  setContentWidth(localStorage.getItem('content-width') ?? '780px');
72
72
  const stored = localStorage.getItem('theme');
@@ -90,7 +90,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
90
90
  const fontMap: Record<string, string> = {
91
91
  'lora': "'Lora', Georgia, serif",
92
92
  'ibm-plex-sans': "'IBM Plex Sans', sans-serif",
93
- 'geist': 'var(--font-geist-sans), sans-serif',
93
+ 'inter': 'var(--font-inter), sans-serif',
94
94
  'ibm-plex-mono': "'IBM Plex Mono', monospace",
95
95
  };
96
96
  document.documentElement.style.setProperty('--prose-font-override', fontMap[font] ?? '');
@@ -134,13 +134,47 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
134
134
  }
135
135
  }, []);
136
136
 
137
+ // Track unsaved data so we can flush on close/unmount
138
+ const pendingData = useRef<SettingsData | null>(null);
139
+
137
140
  useEffect(() => {
138
141
  if (!data || !dataLoaded.current) return;
142
+ pendingData.current = data;
139
143
  clearTimeout(saveTimer.current);
140
- saveTimer.current = setTimeout(() => doSave(data), 800);
144
+ saveTimer.current = setTimeout(() => {
145
+ pendingData.current = null;
146
+ doSave(data);
147
+ }, 800);
141
148
  return () => clearTimeout(saveTimer.current);
142
149
  }, [data, doSave]);
143
150
 
151
+ // Flush unsaved changes when panel hides (panel variant)
152
+ useEffect(() => {
153
+ if (!visible && pendingData.current) {
154
+ const d = pendingData.current;
155
+ pendingData.current = null;
156
+ clearTimeout(saveTimer.current);
157
+ doSave(d);
158
+ }
159
+ }, [visible, doSave]);
160
+
161
+ // Flush unsaved changes on unmount (modal variant: SettingsModal returns null when !open)
162
+ useEffect(() => {
163
+ return () => {
164
+ if (pendingData.current) {
165
+ clearTimeout(saveTimer.current);
166
+ const d = pendingData.current;
167
+ pendingData.current = null;
168
+ apiFetch('/api/settings', {
169
+ method: 'POST',
170
+ headers: { 'Content-Type': 'application/json' },
171
+ body: JSON.stringify({ ai: d.ai, agent: d.agent, mindRoot: d.mindRoot, webPassword: d.webPassword, authToken: d.authToken }),
172
+ }).catch(() => {});
173
+ }
174
+ };
175
+ // eslint-disable-next-line react-hooks/exhaustive-deps
176
+ }, []);
177
+
144
178
  const updateAi = useCallback((patch: Partial<AiSettings>) => {
145
179
  setData(d => d ? { ...d, ai: { ...d.ai, ...patch } } : d);
146
180
  }, []);
@@ -250,7 +284,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
250
284
  <div className="flex items-center justify-between px-4 py-3 border-b border-border shrink-0">
251
285
  <div className="flex items-center gap-2 text-sm font-medium text-foreground">
252
286
  <Settings size={14} className="text-muted-foreground" />
253
- <span className="text-xs font-medium text-muted-foreground uppercase tracking-wider font-display">Settings</span>
287
+ <span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">Settings</span>
254
288
  </div>
255
289
  <div className="flex items-center gap-1.5">
256
290
  <div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
@@ -295,7 +329,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
295
329
  </div>
296
330
  <div className="flex items-center gap-2 text-sm font-medium text-foreground">
297
331
  <Settings size={15} className="text-muted-foreground" />
298
- <span className="font-display">{t.settings.title}</span>
332
+ <span>{t.settings.title}</span>
299
333
  </div>
300
334
  <div className="flex items-center gap-1.5">
301
335
  <div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
@@ -345,7 +379,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
345
379
  <div className="w-[180px] shrink-0 border-r border-border flex flex-col">
346
380
  <div className="flex items-center gap-2 px-4 py-3 border-b border-border">
347
381
  <Settings size={15} className="text-muted-foreground" />
348
- <span className="text-sm font-medium font-display text-foreground">{t.settings.title}</span>
382
+ <span className="text-sm font-medium text-foreground">{t.settings.title}</span>
349
383
  </div>
350
384
  <nav className="flex-1 overflow-y-auto py-1.5">
351
385
  {TABS.map(tabItem => (
@@ -383,7 +417,7 @@ export default function SettingsContent({ visible, initialTab, variant, onClose
383
417
  <div className="flex-1 flex flex-col min-w-0 min-h-0">
384
418
  {/* Right header: tab title + status + close */}
385
419
  <div className="flex items-center justify-between px-5 py-3 border-b border-border shrink-0">
386
- <span className="text-sm font-medium text-foreground font-display">{activeTabLabel}</span>
420
+ <span className="text-sm font-medium text-foreground">{activeTabLabel}</span>
387
421
  <div className="flex items-center gap-1.5">
388
422
  <div className="flex items-center gap-1.5 text-[10px]" role="status" aria-live="polite">
389
423
  {saving && <Loader2 size={12} className="animate-spin text-muted-foreground" />}
@@ -51,12 +51,17 @@ export const FONT_SIZES = [
51
51
  export const FONTS = [
52
52
  { value: 'lora', label: 'Lora', category: 'Serif', style: { fontFamily: 'Lora, Georgia, serif' } },
53
53
  { value: 'ibm-plex-sans', label: 'IBM Plex Sans', category: 'Sans', style: { fontFamily: "'IBM Plex Sans', sans-serif" } },
54
- { value: 'geist', label: 'Geist', category: 'Sans', style: { fontFamily: 'var(--font-geist-sans), sans-serif' } },
54
+ { value: 'inter', label: 'Inter', category: 'Sans', style: { fontFamily: 'var(--font-inter), sans-serif' } },
55
55
  { value: 'ibm-plex-mono', label: 'IBM Plex Mono', category: 'Mono', style: { fontFamily: "'IBM Plex Mono', monospace" } },
56
56
  ];
57
57
 
58
58
  /* ── MCP Types ────────────────────────────────────────────────── */
59
59
 
60
+ export interface ConnectionMode {
61
+ cli: boolean;
62
+ mcp: boolean;
63
+ }
64
+
60
65
  export interface McpStatus {
61
66
  running: boolean;
62
67
  transport: string;
@@ -67,6 +72,7 @@ export interface McpStatus {
67
72
  maskedToken?: string;
68
73
  authToken?: string;
69
74
  localIP?: string | null;
75
+ connectionMode?: ConnectionMode;
70
76
  }
71
77
 
72
78
  export interface AgentInfo {
@@ -47,7 +47,7 @@ function parseInstallResult(
47
47
  // ─── Phase runners (pure async, no setState — results consumed by caller) ────
48
48
 
49
49
  /** Phase 1: Save setup config. Returns whether restart is needed. Throws on failure. */
50
- async function saveConfig(state: SetupState): Promise<boolean> {
50
+ async function saveConfig(state: SetupState, connectionMode?: { cli: boolean; mcp: boolean }): Promise<boolean> {
51
51
  // Build providers dict from dynamic providerConfigs
52
52
  const providers: Record<string, { apiKey: string; model: string; baseUrl?: string }> = {};
53
53
  if (state.provider !== 'skip') {
@@ -72,6 +72,7 @@ async function saveConfig(state: SetupState): Promise<boolean> {
72
72
  provider: state.provider,
73
73
  providers,
74
74
  },
75
+ connectionMode: connectionMode ?? { cli: true, mcp: false },
75
76
  };
76
77
  const res = await fetch('/api/setup', {
77
78
  method: 'POST',
@@ -355,7 +356,7 @@ export default function SetupWizard() {
355
356
  setSetupPhase('saving');
356
357
  let restartNeeded = false;
357
358
  try {
358
- restartNeeded = await saveConfig(finalState);
359
+ restartNeeded = await saveConfig(finalState, connectionMode);
359
360
  if (restartNeeded) setNeedsRestart(true);
360
361
  } catch (e) {
361
362
  setError(e instanceof Error ? e.message : String(e));
@@ -440,7 +441,7 @@ export default function SetupWizard() {
440
441
  <div className="text-center mb-3">
441
442
  <div className="inline-flex items-center gap-2">
442
443
  <Sparkles size={18} style={{ color: 'var(--amber)' }} />
443
- <h1 id="setup-title" className="text-2xl font-semibold tracking-tight font-display" style={{ color: 'var(--foreground)' }}>
444
+ <h1 id="setup-title" className="text-2xl font-brand" style={{ color: 'var(--foreground)' }}>
444
445
  MindOS
445
446
  </h1>
446
447
  </div>
@@ -224,7 +224,7 @@ function MobileWalkthroughSheet() {
224
224
  </div>
225
225
 
226
226
  <h3
227
- className="text-base font-semibold font-display mb-1"
227
+ className="text-base font-semibold mb-1"
228
228
  style={{ color: 'var(--foreground)' }}
229
229
  >
230
230
  {stepData.title}
@@ -72,7 +72,7 @@ export default function WalkthroughTooltip({ stepIndex, rect, position }: Walkth
72
72
 
73
73
  {/* Content */}
74
74
  <h3
75
- className="text-sm font-semibold font-display mb-1"
75
+ className="text-sm font-semibold mb-1"
76
76
  style={{ color: 'var(--foreground)' }}
77
77
  >
78
78
  {stepData.title}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useState, useCallback, useRef } from 'react';
4
4
  import type { LocalAttachment, Message } from '@/lib/types';
5
+ import type { OrganizeSource } from '@/lib/organize-history';
5
6
 
6
7
  // ---------------------------------------------------------------------------
7
8
  // Types
@@ -248,8 +249,11 @@ export function useAiOrganize() {
248
249
  const lastEventRef = useRef<number>(0);
249
250
  const snapshotsRef = useRef<FileSnapshots>(new Map());
250
251
  const [sourceFileNames, setSourceFileNames] = useState<string[]>([]);
252
+ const [source, setSource] = useState<OrganizeSource>('upload');
253
+ const startTimeRef = useRef<number>(0);
254
+ const [durationMs, setDurationMs] = useState<number>(0);
251
255
 
252
- const start = useCallback(async (files: LocalAttachment[], prompt: string) => {
256
+ const start = useCallback(async (files: LocalAttachment[], prompt: string, organizeSource: OrganizeSource = 'upload') => {
253
257
  setPhase('organizing');
254
258
  setChanges([]);
255
259
  setCurrentTool(null);
@@ -258,6 +262,9 @@ export function useAiOrganize() {
258
262
  setError(null);
259
263
  setToolCallCount(0);
260
264
  setSourceFileNames(files.map(f => f.name));
265
+ setSource(organizeSource);
266
+ startTimeRef.current = Date.now();
267
+ setDurationMs(0);
261
268
  snapshotsRef.current = new Map();
262
269
  lastEventRef.current = Date.now();
263
270
 
@@ -318,6 +325,7 @@ export function useAiOrganize() {
318
325
  setSummary(result.summary);
319
326
  setToolCallCount(result.toolCallCount);
320
327
  setCurrentTool(null);
328
+ setDurationMs(Date.now() - startTimeRef.current);
321
329
  setPhase('done');
322
330
  } catch (err) {
323
331
  if ((err as Error).name === 'AbortError') {
@@ -426,6 +434,9 @@ export function useAiOrganize() {
426
434
  setError(null);
427
435
  setToolCallCount(0);
428
436
  setSourceFileNames([]);
437
+ setSource('upload');
438
+ setDurationMs(0);
439
+ startTimeRef.current = 0;
429
440
  snapshotsRef.current = new Map();
430
441
  lastEventRef.current = 0;
431
442
  }, []);
@@ -439,6 +450,8 @@ export function useAiOrganize() {
439
450
  error,
440
451
  toolCallCount,
441
452
  sourceFileNames,
453
+ source,
454
+ durationMs,
442
455
  snapshots: snapshotsRef,
443
456
  start,
444
457
  abort,
@@ -44,6 +44,7 @@ export interface InboxFileInfo {
44
44
  export interface InboxSaveResult {
45
45
  saved: Array<{ original: string; path: string }>;
46
46
  skipped: Array<{ name: string; reason: string }>;
47
+ source?: string;
47
48
  }
48
49
 
49
50
  export interface InboxSaveInput {
@@ -133,11 +134,139 @@ function resolveUniqueName(inboxDir: string, targetName: string): string {
133
134
  return targetName;
134
135
  }
135
136
 
137
+ export interface InboxDeleteResult {
138
+ deleted: string[];
139
+ notFound: string[];
140
+ }
141
+
142
+ /**
143
+ * Deletes files from the Inbox directory by name.
144
+ * Only deletes user files — never INSTRUCTION.md or README.md.
145
+ */
146
+ export function deleteFromInbox(mindRoot: string, names: string[]): InboxDeleteResult {
147
+ const inboxDir = path.resolve(mindRoot, INBOX_DIR);
148
+ const deleted: string[] = [];
149
+ const notFound: string[] = [];
150
+
151
+ for (const name of names) {
152
+ if (!name || typeof name !== 'string') continue;
153
+ const lower = name.toLowerCase();
154
+ if (lower === 'instruction.md' || lower === 'readme.md') continue;
155
+
156
+ const filePath = path.join(inboxDir, path.basename(name));
157
+ try {
158
+ resolveSafe(mindRoot, `${INBOX_DIR}/${path.basename(name)}`);
159
+ if (fs.existsSync(filePath)) {
160
+ fs.unlinkSync(filePath);
161
+ deleted.push(name);
162
+ } else {
163
+ notFound.push(name);
164
+ }
165
+ } catch {
166
+ notFound.push(name);
167
+ }
168
+ }
169
+
170
+ return { deleted, notFound };
171
+ }
172
+
173
+ const PROCESSED_DIR = '.processed';
174
+
175
+ export interface InboxArchiveResult {
176
+ archived: Array<{ original: string; archivedPath: string }>;
177
+ notFound: string[];
178
+ }
179
+
180
+ /**
181
+ * Moves files from Inbox/ to Inbox/.processed/ with a timestamp prefix.
182
+ * Preserves originals so users can recover them from the processed folder.
183
+ */
184
+ export function archiveFromInbox(mindRoot: string, names: string[]): InboxArchiveResult {
185
+ const inboxDir = path.resolve(mindRoot, INBOX_DIR);
186
+ const processedDir = path.join(inboxDir, PROCESSED_DIR);
187
+ fs.mkdirSync(processedDir, { recursive: true });
188
+
189
+ const archived: InboxArchiveResult['archived'] = [];
190
+ const notFound: string[] = [];
191
+ const now = new Date();
192
+ const ts = now.toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);
193
+
194
+ for (const name of names) {
195
+ if (!name || typeof name !== 'string') continue;
196
+ const lower = name.toLowerCase();
197
+ if (lower === 'instruction.md' || lower === 'readme.md') continue;
198
+
199
+ const baseName = path.basename(name);
200
+ const srcPath = path.join(inboxDir, baseName);
201
+
202
+ try {
203
+ resolveSafe(mindRoot, `${INBOX_DIR}/${baseName}`);
204
+ if (!fs.existsSync(srcPath)) {
205
+ notFound.push(name);
206
+ continue;
207
+ }
208
+
209
+ const archivedName = `${ts}_${baseName}`;
210
+ const destPath = path.join(processedDir, archivedName);
211
+ fs.renameSync(srcPath, destPath);
212
+ archived.push({
213
+ original: name,
214
+ archivedPath: `${INBOX_DIR}/${PROCESSED_DIR}/${archivedName}`,
215
+ });
216
+ } catch {
217
+ notFound.push(name);
218
+ }
219
+ }
220
+
221
+ return { archived, notFound };
222
+ }
223
+
224
+ export interface ProcessedFileInfo {
225
+ name: string;
226
+ originalName: string;
227
+ path: string;
228
+ size: number;
229
+ archivedAt: string;
230
+ }
231
+
232
+ /**
233
+ * Lists files in Inbox/.processed/ with metadata.
234
+ * Returns files sorted by archive time (newest first).
235
+ */
236
+ export function listProcessedFiles(mindRoot: string): ProcessedFileInfo[] {
237
+ const processedDir = path.resolve(mindRoot, INBOX_DIR, PROCESSED_DIR);
238
+ if (!fs.existsSync(processedDir)) return [];
239
+
240
+ const entries = fs.readdirSync(processedDir, { withFileTypes: true });
241
+ const results: ProcessedFileInfo[] = [];
242
+
243
+ for (const entry of entries) {
244
+ if (!entry.isFile()) continue;
245
+ if (entry.name.startsWith('.')) continue;
246
+
247
+ const filePath = path.join(processedDir, entry.name);
248
+ try {
249
+ const stat = fs.statSync(filePath);
250
+ const originalName = entry.name.replace(/^\d{8}-\d{6}_/, '');
251
+ results.push({
252
+ name: entry.name,
253
+ originalName,
254
+ path: `${INBOX_DIR}/${PROCESSED_DIR}/${entry.name}`,
255
+ size: stat.size,
256
+ archivedAt: stat.mtime.toISOString(),
257
+ });
258
+ } catch { /* skip */ }
259
+ }
260
+
261
+ results.sort((a, b) => new Date(b.archivedAt).getTime() - new Date(a.archivedAt).getTime());
262
+ return results;
263
+ }
264
+
136
265
  /**
137
266
  * Saves files to the Inbox directory.
138
267
  * Handles format conversion (txt→md, html→md, etc.) and deduplication.
139
268
  */
140
- export function saveToInbox(mindRoot: string, files: InboxSaveInput[]): InboxSaveResult {
269
+ export function saveToInbox(mindRoot: string, files: InboxSaveInput[], source?: string): InboxSaveResult {
141
270
  const inboxDir = ensureInboxSpace(mindRoot);
142
271
  const saved: InboxSaveResult['saved'] = [];
143
272
  const skipped: InboxSaveResult['skipped'] = [];
@@ -177,5 +306,5 @@ export function saveToInbox(mindRoot: string, files: InboxSaveInput[]): InboxSav
177
306
  }
178
307
  }
179
308
 
180
- return { saved, skipped };
309
+ return { saved, skipped, source };
181
310
  }
@@ -0,0 +1,28 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { execFileSync } from 'child_process';
4
+
5
+ /**
6
+ * Extract text from a PDF file via pdfjs-dist (child process).
7
+ * Spawns extract-pdf.cjs to avoid Turbopack/pdfjs-dist worker conflicts.
8
+ * Returns extracted text, or empty string if extraction fails.
9
+ */
10
+ export function extractPdfText(absolutePath: string): string {
11
+ try {
12
+ const appDir = process.env.MINDOS_PROJECT_ROOT
13
+ ? path.join(process.env.MINDOS_PROJECT_ROOT, 'app')
14
+ : path.resolve(process.cwd());
15
+ const scriptPath = path.join(appDir, 'scripts', 'extract-pdf.cjs');
16
+ if (!fs.existsSync(scriptPath)) return '';
17
+
18
+ const stdout = execFileSync('node', [scriptPath, absolutePath], {
19
+ encoding: 'utf-8',
20
+ timeout: 15_000,
21
+ maxBuffer: 5 * 1024 * 1024,
22
+ });
23
+ const result = JSON.parse(stdout) as { text: string; pages: number };
24
+ return result.text || '';
25
+ } catch {
26
+ return '';
27
+ }
28
+ }
@@ -2,6 +2,8 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { collectAllFiles } from './tree';
4
4
  import { readFile } from './fs-ops';
5
+ import { resolveSafe } from './security';
6
+ import { extractPdfText } from './pdf-text';
5
7
  import { CJK_CHAR_REGEX } from './cjk';
6
8
 
7
9
  const MAX_CONTENT_LENGTH = 50_000;
@@ -111,10 +113,23 @@ export class SearchIndex {
111
113
 
112
114
  for (const filePath of allFiles) {
113
115
  let content: string;
114
- try {
115
- content = readFile(mindRoot, filePath);
116
- } catch {
117
- continue;
116
+ const ext = path.extname(filePath).toLowerCase();
117
+
118
+ if (ext === '.pdf') {
119
+ // PDF: extract text from binary via pdfjs-dist child process
120
+ try {
121
+ const resolved = resolveSafe(mindRoot, filePath);
122
+ content = extractPdfText(resolved);
123
+ if (!content) continue;
124
+ } catch {
125
+ continue;
126
+ }
127
+ } else {
128
+ try {
129
+ content = readFile(mindRoot, filePath);
130
+ } catch {
131
+ continue;
132
+ }
118
133
  }
119
134
 
120
135
  // Store original length for BM25 before truncation
@@ -191,7 +206,16 @@ export class SearchIndex {
191
206
  if (!this.invertedIndex) return;
192
207
 
193
208
  let content: string;
194
- try { content = readFile(mindRoot, filePath); } catch { return; }
209
+ const ext = path.extname(filePath).toLowerCase();
210
+ if (ext === '.pdf') {
211
+ try {
212
+ const resolved = resolveSafe(mindRoot, filePath);
213
+ content = extractPdfText(resolved);
214
+ if (!content) return;
215
+ } catch { return; }
216
+ } else {
217
+ try { content = readFile(mindRoot, filePath); } catch { return; }
218
+ }
195
219
 
196
220
  // Update BM25 stats
197
221
  this.docLengths.set(filePath, content.length);
@@ -4,7 +4,12 @@ import path from 'path';
4
4
  import type { FileNode } from './types';
5
5
 
6
6
  const DEFAULT_IGNORED_DIRS = new Set(['.git', 'node_modules', 'app', '.next', '.DS_Store', 'mcp']);
7
- const DEFAULT_ALLOWED_EXTENSIONS = new Set(['.md', '.csv']);
7
+ const DEFAULT_ALLOWED_EXTENSIONS = new Set([
8
+ '.md', '.csv', '.pdf',
9
+ '.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.ico',
10
+ '.mp3', '.wav', '.m4a', '.ogg', '.flac', '.aac',
11
+ '.mp4', '.webm', '.mov', '.mkv',
12
+ ]);
8
13
  const SYSTEM_FILES = new Set(['INSTRUCTION.md', 'README.md', 'CONFIG.json', 'CHANGELOG.md']);
9
14
 
10
15
  export interface TreeOptions {
package/app/lib/fs.ts CHANGED
@@ -33,12 +33,14 @@ import {
33
33
  listContentChanges as coreListContentChanges,
34
34
  markContentChangesSeen as coreMarkContentChangesSeen,
35
35
  getContentChangeSummary as coreGetContentChangeSummary,
36
+ resolveSafe,
36
37
  } from './core';
37
38
  import type { MindSpaceSummary } from './core';
38
39
  import type { ContentChangeEvent, ContentChangeInput, ContentChangeSummary } from './core';
39
40
  import { FileNode, SpacePreview } from './core/types';
40
41
  import { SearchMatch } from './types';
41
42
  import { effectiveSopRoot } from './settings';
43
+ import { extractPdfText } from './core/pdf-text';
42
44
 
43
45
  // ─── Root helpers ─────────────────────────────────────────────────────────────
44
46
 
@@ -48,7 +50,12 @@ export function getMindRoot(): string {
48
50
  }
49
51
 
50
52
  const IGNORED_DIRS = new Set(['.git', 'node_modules', 'app', '.next', '.DS_Store']);
51
- const ALLOWED_EXTENSIONS = new Set(['.md', '.csv', '.json']);
53
+ const ALLOWED_EXTENSIONS = new Set([
54
+ '.md', '.csv', '.json', '.pdf',
55
+ '.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.ico',
56
+ '.mp3', '.wav', '.m4a', '.ogg', '.flac', '.aac',
57
+ '.mp4', '.webm', '.mov', '.mkv',
58
+ ]);
52
59
  const SYSTEM_FILES = new Set(['INSTRUCTION.md', 'README.md', 'CONFIG.json', 'CHANGELOG.md']);
53
60
 
54
61
  // ─── In-memory cache ──────────────────────────────────────────────────────────
@@ -463,9 +470,30 @@ export function getRecentlyModified(limit = 10): Array<{ path: string; mtime: nu
463
470
 
464
471
  // ─── Public API: File operations (delegated to @mindos/core) ─────────────────
465
472
 
466
- /** Reads the content of a file given a relative path from MIND_ROOT. */
473
+ /** Reads the content of a file given a relative path from MIND_ROOT.
474
+ * PDF files are automatically extracted to text via pdfjs-dist. */
467
475
  export function getFileContent(filePath: string): string {
468
- return coreReadFile(getMindRoot(), filePath);
476
+ const root = getMindRoot();
477
+ if (path.extname(filePath).toLowerCase() === '.pdf') {
478
+ const resolved = resolveSafe(root, filePath);
479
+ if (!fs.existsSync(resolved)) {
480
+ throw new MindOSError(
481
+ ErrorCodes.FILE_NOT_FOUND,
482
+ `File not found: ${filePath}`,
483
+ { filePath },
484
+ );
485
+ }
486
+ const text = extractPdfText(resolved);
487
+ if (!text) {
488
+ throw new MindOSError(
489
+ ErrorCodes.INTERNAL_ERROR,
490
+ `Could not extract text from PDF: ${filePath}`,
491
+ { filePath },
492
+ );
493
+ }
494
+ return text;
495
+ }
496
+ return coreReadFile(root, filePath);
469
497
  }
470
498
 
471
499
  /** Atomically writes content to a file given a relative path from MIND_ROOT. */
@@ -83,6 +83,23 @@ export const aiChatEn = {
83
83
  empty: 'No content changes yet.',
84
84
  open: 'Open',
85
85
  unchangedLines: (n: number) => `... ${n} unchanged lines ...`,
86
+ operations: {
87
+ save_file: 'Save file',
88
+ append_to_file: 'Append to file',
89
+ insert_lines: 'Insert lines',
90
+ update_lines: 'Update lines',
91
+ insert_after_heading: 'Insert after heading',
92
+ update_section: 'Update section',
93
+ create_file: 'Create file',
94
+ delete_file: 'Delete file',
95
+ rename_file: 'Rename file',
96
+ move_file: 'Move file',
97
+ create_space: 'Create space',
98
+ rename_space: 'Rename space',
99
+ append_csv: 'Append to CSV',
100
+ import_file: 'Import file',
101
+ legacy_agent_diff_import: 'Import from Agent Diff',
102
+ },
86
103
  relativeTime: {
87
104
  justNow: 'just now',
88
105
  minutesAgo: (n: number) => `${n}m ago`,
@@ -205,6 +222,23 @@ export const aiChatZh = {
205
222
  empty: '暂无内容变更。',
206
223
  open: '打开',
207
224
  unchangedLines: (n: number) => `... ${n} 行未变更 ...`,
225
+ operations: {
226
+ save_file: '保存文件',
227
+ append_to_file: '追加到文件',
228
+ insert_lines: '插入行',
229
+ update_lines: '更新行',
230
+ insert_after_heading: '标题后插入',
231
+ update_section: '更新章节',
232
+ create_file: '创建文件',
233
+ delete_file: '删除文件',
234
+ rename_file: '重命名文件',
235
+ move_file: '移动文件',
236
+ create_space: '创建空间',
237
+ rename_space: '重命名空间',
238
+ append_csv: '追加到 CSV',
239
+ import_file: '导入文件',
240
+ legacy_agent_diff_import: '从 Agent Diff 导入',
241
+ },
208
242
  relativeTime: {
209
243
  justNow: '刚刚',
210
244
  minutesAgo: (n: number) => `${n} 分钟前`,