@geminilight/mindos 0.6.38 → 0.6.40

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 (715) hide show
  1. package/README.md +37 -9
  2. package/README_zh.md +37 -9
  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 +21 -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 +68 -6
  12. package/_standalone/.next/routes-manifest.json +6 -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_client-reference-manifest.js +1 -1
  15. package/_standalone/.next/server/app/_global-error.html +2 -2
  16. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/_standalone/.next/server/app/_not-found/page.js +2 -2
  24. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page.js +2 -2
  27. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/agents/page.js +3 -3
  30. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  31. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/config/route.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/config/route.js.nft.json +1 -1
  38. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/detect/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/detect/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  45. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +1 -1
  46. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/agent-activity/route.js +1 -1
  48. package/_standalone/.next/server/app/api/agent-activity/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask/route.js +133 -95
  51. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/backlinks/route.js +1 -1
  56. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/bootstrap/route.js +1 -1
  59. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/changes/route.js +1 -1
  62. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/export/route.js +3 -3
  65. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route.js +2 -19
  69. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js +1 -18
  72. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/files/route.js +1 -1
  75. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/git/route.js +1 -1
  78. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  79. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/graph/route.js +1 -1
  81. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  82. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/inbox/route.js +1 -0
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -0
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -0
  87. package/_standalone/.next/server/app/api/init/route.js +1 -1
  88. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  89. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  91. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  92. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route.js.nft.json +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/status/route.js.nft.json +1 -1
  100. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route.js +1 -1
  102. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/recent-files/route.js +1 -1
  105. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/search/route.js +1 -1
  109. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  110. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  112. package/_standalone/.next/server/app/api/settings/list-models/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/reset-token/route.js +1 -1
  115. package/_standalone/.next/server/app/api/settings/reset-token/route.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  118. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  119. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  121. package/_standalone/.next/server/app/api/settings/test-key/route.js.nft.json +1 -1
  122. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  123. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  128. package/_standalone/.next/server/app/api/setup/route.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/skills/route.js +2 -2
  131. package/_standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/api/sync/route.js +1 -1
  134. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app/api/tree-version/route.js +1 -1
  136. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  137. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  140. package/_standalone/.next/server/app/api/update-check/route.js +1 -1
  141. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/app/api/workflows/route.js +2 -2
  144. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  145. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  146. package/_standalone/.next/server/app/changes/page.js +2 -2
  147. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  148. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  149. package/_standalone/.next/server/app/echo/[segment]/page.js +6 -6
  150. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  151. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  152. package/_standalone/.next/server/app/echo/page.js +2 -2
  153. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  154. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  155. package/_standalone/.next/server/app/explore/page.js +3 -3
  156. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  157. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  158. package/_standalone/.next/server/app/help/page.js +2 -2
  159. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  160. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  161. package/_standalone/.next/server/app/login/page.js +2 -2
  162. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  163. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  164. package/_standalone/.next/server/app/page.js +3 -3
  165. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  166. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  167. package/_standalone/.next/server/app/setup/page.js +2 -2
  168. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  169. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  170. package/_standalone/.next/server/app/trash/page.js +3 -3
  171. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  172. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  173. package/_standalone/.next/server/app/view/[...path]/page.js +4 -4
  174. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  175. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  176. package/_standalone/.next/server/app-paths-manifest.json +21 -20
  177. package/_standalone/.next/server/chunks/1550.js +1 -1
  178. package/_standalone/.next/server/chunks/1750.js +1 -0
  179. package/_standalone/.next/server/chunks/1955.js +11 -0
  180. package/_standalone/.next/server/chunks/3680.js +1 -0
  181. package/_standalone/.next/server/chunks/4497.js +219 -0
  182. package/_standalone/.next/server/chunks/5560.js +2 -0
  183. package/_standalone/.next/server/chunks/6365.js +52 -0
  184. package/_standalone/.next/server/chunks/6539.js +1 -1
  185. package/_standalone/.next/server/chunks/8388.js +15 -0
  186. package/_standalone/.next/server/chunks/953.js +42 -2
  187. package/_standalone/.next/server/functions-config-manifest.json +2 -1
  188. package/_standalone/.next/server/instrumentation.js +1 -1
  189. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  190. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  191. package/_standalone/.next/server/next-font-manifest.js +1 -1
  192. package/_standalone/.next/server/next-font-manifest.json +1 -1
  193. package/_standalone/.next/server/pages/500.html +2 -2
  194. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  195. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  196. package/_standalone/.next/static/chunks/1053-0adaccc98a752a58.js +29 -0
  197. package/_standalone/.next/static/chunks/1239.10a0710c2772ab34.js +1 -0
  198. package/_standalone/.next/static/chunks/{1814.e2da5460ded71d71.js → 1814.2ee1d03297c0bccd.js} +1 -1
  199. package/_standalone/.next/static/chunks/{1a258343-030e4d6735874dd4.js → 1a258343-9803591e4aaee1f6.js} +1 -1
  200. package/_standalone/.next/static/chunks/2631.dc56e83472bde281.js +1 -0
  201. package/_standalone/.next/static/chunks/2872.045858d00bd8307f.js +8 -0
  202. package/_standalone/.next/static/chunks/2968.f10ccee9e7e2324d.js +2 -0
  203. package/_standalone/.next/static/chunks/3160-83a7e0b94414b3ac.js +1 -0
  204. package/_standalone/.next/static/chunks/{3637.4bcd01a4db78b894.js → 3637.f9a42cca59fd5bb5.js} +1 -1
  205. package/_standalone/.next/static/chunks/4033.6666700547b20141.js +1 -0
  206. package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +6 -0
  207. package/_standalone/.next/static/chunks/516.24ee058b1d4b1fed.js +8 -0
  208. package/_standalone/.next/static/chunks/5627.c4337d7289acb31f.js +1 -0
  209. package/_standalone/.next/static/chunks/5956.b445072b35915129.js +1 -0
  210. package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +1 -0
  211. package/_standalone/.next/static/chunks/6357-c645842834c0d4cd.js +1 -0
  212. package/_standalone/.next/static/chunks/6826.7b7d94dd0fd83812.js +1 -0
  213. package/_standalone/.next/static/chunks/{8409-de5726a4a278d28f.js → 6926-4af497b83952fa87.js} +1 -1
  214. package/_standalone/.next/static/chunks/7266-bb7be1128eccd48e.js +13 -0
  215. package/_standalone/.next/static/chunks/7753.63831cfc54a55fbb.js +1 -0
  216. package/_standalone/.next/static/chunks/862.9f526e964489e2e5.js +1 -0
  217. package/_standalone/.next/static/chunks/{1384-55276d40a9da4e88.js → 8663-de911d2d395622be.js} +2 -2
  218. package/_standalone/.next/static/chunks/9300.118b8c840634383f.js +28 -0
  219. package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +1 -0
  220. package/_standalone/.next/static/chunks/95247769.3b5caae1c1a76ce1.js +4 -0
  221. package/_standalone/.next/static/chunks/9602-423291fdb36396d1.js +1 -0
  222. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-400c3c09b1540c14.js +1 -0
  223. package/_standalone/.next/static/chunks/app/_global-error/page-400c3c09b1540c14.js +1 -0
  224. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +1 -0
  225. package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +5 -0
  226. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-400c3c09b1540c14.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-400c3c09b1540c14.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-400c3c09b1540c14.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/a2a/route-400c3c09b1540c14.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/acp/config/route-400c3c09b1540c14.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/acp/detect/route-400c3c09b1540c14.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/acp/install/route-400c3c09b1540c14.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/acp/registry/route-400c3c09b1540c14.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/acp/session/route-400c3c09b1540c14.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/agent-activity/route-400c3c09b1540c14.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/ask/route-400c3c09b1540c14.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-400c3c09b1540c14.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/auth/route-400c3c09b1540c14.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/backlinks/route-400c3c09b1540c14.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/bootstrap/route-400c3c09b1540c14.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/changes/route-400c3c09b1540c14.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/export/route-400c3c09b1540c14.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-400c3c09b1540c14.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/file/import/route-400c3c09b1540c14.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/file/route-400c3c09b1540c14.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/files/route-400c3c09b1540c14.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/git/route-400c3c09b1540c14.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/graph/route-400c3c09b1540c14.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/health/route-400c3c09b1540c14.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/inbox/route-400c3c09b1540c14.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/init/route-400c3c09b1540c14.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-400c3c09b1540c14.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/mcp/install/route-400c3c09b1540c14.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-400c3c09b1540c14.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-400c3c09b1540c14.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/mcp/status/route-400c3c09b1540c14.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/monitoring/route-400c3c09b1540c14.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/recent-files/route-400c3c09b1540c14.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/restart/route-400c3c09b1540c14.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/search/route-400c3c09b1540c14.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-400c3c09b1540c14.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-400c3c09b1540c14.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/settings/route-400c3c09b1540c14.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-400c3c09b1540c14.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-400c3c09b1540c14.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-400c3c09b1540c14.js +1 -0
  267. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-400c3c09b1540c14.js +1 -0
  268. package/_standalone/.next/static/chunks/app/api/setup/ls/route-400c3c09b1540c14.js +1 -0
  269. package/_standalone/.next/static/chunks/app/api/setup/route-400c3c09b1540c14.js +1 -0
  270. package/_standalone/.next/static/chunks/app/api/skills/route-400c3c09b1540c14.js +1 -0
  271. package/_standalone/.next/static/chunks/app/api/sync/route-400c3c09b1540c14.js +1 -0
  272. package/_standalone/.next/static/chunks/app/api/tree-version/route-400c3c09b1540c14.js +1 -0
  273. package/_standalone/.next/static/chunks/app/api/uninstall/route-400c3c09b1540c14.js +1 -0
  274. package/_standalone/.next/static/chunks/app/api/update/route-400c3c09b1540c14.js +1 -0
  275. package/_standalone/.next/static/chunks/app/api/update-check/route-400c3c09b1540c14.js +1 -0
  276. package/_standalone/.next/static/chunks/app/api/update-status/route-400c3c09b1540c14.js +1 -0
  277. package/_standalone/.next/static/chunks/app/api/workflows/route-400c3c09b1540c14.js +1 -0
  278. package/_standalone/.next/static/chunks/app/changes/page-350992cf5091bc5b.js +1 -0
  279. package/_standalone/.next/static/chunks/app/echo/[segment]/page-addf014fcf23fad5.js +11 -0
  280. package/_standalone/.next/static/chunks/app/echo/page-400c3c09b1540c14.js +1 -0
  281. package/_standalone/.next/static/chunks/app/explore/page-5eb2835e9e3ab4bb.js +4 -0
  282. package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +1 -0
  283. package/_standalone/.next/static/chunks/app/layout-9378c1c8d3e5761b.js +186 -0
  284. package/_standalone/.next/static/chunks/app/login/page-24236460fa7c11d0.js +1 -0
  285. package/_standalone/.next/static/chunks/app/page-9bae420fbbdc5fff.js +7 -0
  286. package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +1 -0
  287. package/_standalone/.next/static/chunks/app/trash/page-b61ef2d5cd4f8d73.js +1 -0
  288. package/_standalone/.next/static/chunks/app/view/[...path]/loading-400c3c09b1540c14.js +1 -0
  289. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-61474670d6bb6116.js +1 -0
  290. package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +12 -0
  291. package/_standalone/.next/static/chunks/e71f6c19-4df85185bf989b49.js +1 -0
  292. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-400c3c09b1540c14.js +1 -0
  293. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-400c3c09b1540c14.js +1 -0
  294. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-400c3c09b1540c14.js +1 -0
  295. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-400c3c09b1540c14.js +1 -0
  296. package/_standalone/.next/static/chunks/webpack-c28c55d0a6021a6b.js +1 -0
  297. package/_standalone/.next/static/css/d300701f384db50d.css +1 -0
  298. package/_standalone/.next/static/rZLs1krFuduixvcVNe6q3/_buildManifest.js +1 -0
  299. package/_standalone/.next/trace +63 -53
  300. package/_standalone/.next/types/routes.d.ts +2 -1
  301. package/_standalone/.next/types/validator.ts +9 -0
  302. package/_standalone/__tests__/agent/chat-mode.test.ts +103 -0
  303. package/_standalone/__tests__/agents/agents-content-dashboard.test.tsx +4 -3
  304. package/_standalone/__tests__/api/bootstrap.test.ts +0 -2
  305. package/_standalone/__tests__/api/file.test.ts +22 -1
  306. package/_standalone/__tests__/api/install-skill.test.ts +2 -2
  307. package/_standalone/__tests__/api/mcp-install.test.ts +9 -10
  308. package/_standalone/__tests__/api/setup.test.ts +2 -2
  309. package/_standalone/__tests__/api/test-key.test.ts +73 -147
  310. package/_standalone/__tests__/ask/ask-content-input-during-run.test.tsx +1 -1
  311. package/_standalone/__tests__/ask/mode-capsule.test.ts +95 -0
  312. package/_standalone/__tests__/core/inbox.test.ts +250 -0
  313. package/_standalone/__tests__/core/skill-install-logic.test.ts +3 -3
  314. package/_standalone/__tests__/core/sync-status.test.ts +1 -1
  315. package/_standalone/__tests__/core/tools.test.ts +11 -6
  316. package/_standalone/__tests__/lib/echo-pages-visual-i18n.test.ts +2 -2
  317. package/_standalone/__tests__/lib/i18n-new-keys.test.ts +2 -2
  318. package/_standalone/__tests__/panels/agents-panel-hub.test.tsx +2 -2
  319. package/_standalone/__tests__/settings/activity-bar-update-badge.test.tsx +1 -1
  320. package/_standalone/__tests__/settings/settings-update-badge.test.tsx +1 -1
  321. package/_standalone/__tests__/settings/update-tab-availability-sync.test.tsx +1 -1
  322. package/_standalone/__tests__/settings/update-tab-browser.test.tsx +1 -1
  323. package/_standalone/__tests__/settings/update-tab-desktop.test.tsx +1 -1
  324. package/_standalone/__tests__/setup.ts +3 -5
  325. package/_standalone/app/globals.css +11 -1
  326. package/_standalone/components/ActivityBar.tsx +26 -10
  327. package/_standalone/components/AskFab.tsx +1 -1
  328. package/_standalone/components/AskModal.tsx +1 -1
  329. package/_standalone/components/Backlinks.tsx +1 -1
  330. package/_standalone/components/CreateSpaceModal.tsx +7 -55
  331. package/_standalone/components/EchoSpotlight.tsx +1 -1
  332. package/_standalone/components/ExportModal.tsx +1 -1
  333. package/_standalone/components/FileTree.tsx +64 -79
  334. package/_standalone/components/FindInPage.tsx +1 -1
  335. package/_standalone/components/GuideCard.tsx +1 -1
  336. package/_standalone/components/ImportModal.tsx +1 -1
  337. package/_standalone/components/KeyboardShortcuts.tsx +1 -1
  338. package/_standalone/components/MarkdownView.tsx +11 -1
  339. package/_standalone/components/OnboardingView.tsx +1 -1
  340. package/_standalone/components/OrganizeToast.tsx +1 -1
  341. package/_standalone/components/Panel.tsx +82 -4
  342. package/_standalone/components/QuickSuggestion.tsx +1 -1
  343. package/_standalone/components/RightAgentDetailPanel.tsx +2 -2
  344. package/_standalone/components/RightAskPanel.tsx +58 -22
  345. package/_standalone/components/SearchModal.tsx +1 -1
  346. package/_standalone/components/Sidebar.tsx +1 -1
  347. package/_standalone/components/SidebarLayout.tsx +52 -16
  348. package/_standalone/components/SpaceInitToast.tsx +1 -1
  349. package/_standalone/components/SyncStatusBar.tsx +2 -2
  350. package/_standalone/components/SystemPulse.tsx +12 -6
  351. package/_standalone/components/TableOfContents.tsx +86 -39
  352. package/_standalone/components/agents/AgentActivitySection.tsx +225 -0
  353. package/_standalone/components/agents/AgentsMcpSection.tsx +7 -16
  354. package/_standalone/components/agents/AgentsOverviewSection.tsx +28 -27
  355. package/_standalone/components/agents/AgentsPanelA2aTab.tsx +1 -1
  356. package/_standalone/components/agents/AgentsPanelSessionsTab.tsx +6 -1
  357. package/_standalone/components/agents/AgentsSkillsSection.tsx +1 -1
  358. package/_standalone/components/agents/DiscoverAgentModal.tsx +1 -1
  359. package/_standalone/components/agents/RecentActivityFeed.tsx +49 -88
  360. package/_standalone/components/agents/agent-activity-shared.tsx +110 -0
  361. package/_standalone/components/ask/AgentSelectorCapsule.tsx +1 -1
  362. package/_standalone/components/ask/AskContent.tsx +332 -486
  363. package/_standalone/components/ask/AskHeader.tsx +61 -0
  364. package/_standalone/components/ask/FileChip.tsx +9 -5
  365. package/_standalone/components/ask/MessageList.tsx +88 -21
  366. package/_standalone/components/ask/ModeCapsule.tsx +180 -0
  367. package/_standalone/components/ask/ProviderModelCapsule.tsx +284 -0
  368. package/_standalone/components/ask/SessionHistory.tsx +63 -10
  369. package/_standalone/components/ask/SessionTabBar.tsx +1 -1
  370. package/_standalone/components/ask/ThinkingBlock.tsx +1 -1
  371. package/_standalone/components/ask/ToolCallBlock.tsx +28 -24
  372. package/_standalone/components/changes/ChangesBanner.tsx +1 -1
  373. package/_standalone/components/echo/EchoInsightCollapsible.tsx +1 -1
  374. package/_standalone/components/echo/EchoSegmentNav.tsx +1 -1
  375. package/_standalone/components/home/InboxSection.tsx +268 -0
  376. package/_standalone/components/panels/AgentsPanel.tsx +3 -2
  377. package/_standalone/components/panels/AgentsPanelHubNav.tsx +2 -6
  378. package/_standalone/components/panels/DiscoverPanel.tsx +1 -1
  379. package/_standalone/components/panels/EchoPanel.tsx +1 -1
  380. package/_standalone/components/panels/EchoSidebarStats.tsx +1 -1
  381. package/_standalone/components/panels/ImportHistoryPanel.tsx +1 -1
  382. package/_standalone/components/panels/PanelHeader.tsx +1 -1
  383. package/_standalone/components/panels/PluginsPanel.tsx +1 -1
  384. package/_standalone/components/panels/SearchPanel.tsx +5 -2
  385. package/_standalone/components/panels/SyncPopover.tsx +1 -1
  386. package/_standalone/components/panels/WorkflowsPanel.tsx +1 -1
  387. package/_standalone/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
  388. package/_standalone/components/renderers/agent-inspector/manifest.ts +16 -0
  389. package/_standalone/components/renderers/todo/TodoRenderer.tsx +489 -75
  390. package/_standalone/components/settings/AiTab.tsx +198 -127
  391. package/_standalone/components/settings/AppearanceTab.tsx +48 -50
  392. package/_standalone/components/settings/KnowledgeTab.tsx +92 -27
  393. package/_standalone/components/settings/McpAgentInstall.tsx +1 -1
  394. package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
  395. package/_standalone/components/settings/McpTab.tsx +145 -7
  396. package/_standalone/components/settings/PluginsTab.tsx +1 -1
  397. package/_standalone/components/settings/SettingsContent.tsx +5 -2
  398. package/_standalone/components/settings/SyncTab.tsx +615 -230
  399. package/_standalone/components/settings/UninstallTab.tsx +1 -1
  400. package/_standalone/components/settings/UpdateTab.tsx +373 -109
  401. package/_standalone/components/settings/types.ts +4 -5
  402. package/_standalone/components/setup/StepAI.tsx +70 -49
  403. package/_standalone/components/setup/StepDots.tsx +1 -1
  404. package/_standalone/components/setup/StepReview.tsx +176 -8
  405. package/_standalone/components/setup/types.ts +11 -8
  406. package/_standalone/components/shared/ProviderSelect.tsx +134 -0
  407. package/_standalone/components/walkthrough/WalkthroughOverlay.tsx +2 -2
  408. package/_standalone/components/walkthrough/WalkthroughTooltip.tsx +2 -2
  409. package/_standalone/components/walkthrough/index.ts +1 -1
  410. package/_standalone/data/skills/mindos/SKILL.md +27 -12
  411. package/_standalone/data/skills/mindos-zh/SKILL.md +27 -12
  412. package/_standalone/hooks/useAcpDetection.ts +1 -1
  413. package/_standalone/hooks/useAskChat.ts +248 -0
  414. package/_standalone/hooks/useAskPanel.ts +24 -4
  415. package/_standalone/hooks/useAskSession.ts +15 -0
  416. package/_standalone/lib/acp/types.ts +1 -1
  417. package/_standalone/lib/api.ts +3 -1
  418. package/_standalone/lib/core/types.ts +2 -0
  419. package/_standalone/lib/i18n/modules/ai-chat.ts +35 -13
  420. package/_standalone/lib/i18n/modules/features.ts +2 -2
  421. package/_standalone/lib/i18n/modules/knowledge.ts +82 -2
  422. package/_standalone/lib/i18n/modules/navigation.ts +6 -2
  423. package/_standalone/lib/i18n/modules/onboarding.ts +39 -9
  424. package/_standalone/lib/i18n/modules/panels.ts +78 -29
  425. package/_standalone/lib/i18n/modules/settings.ts +236 -20
  426. package/_standalone/lib/inbox-upload.ts +93 -0
  427. package/_standalone/lib/settings-ai-client.ts +13 -12
  428. package/_standalone/lib/space-ai-init.ts +66 -0
  429. package/_standalone/lib/stores/McpStoreInit.tsx +18 -0
  430. package/_standalone/lib/stores/WalkthroughInit.tsx +20 -0
  431. package/_standalone/lib/stores/locale-store.ts +55 -0
  432. package/_standalone/lib/stores/mcp-store.ts +156 -0
  433. package/_standalone/lib/stores/walkthrough-store.ts +118 -0
  434. package/_standalone/package-lock.json +40 -8
  435. package/_standalone/package.json +3 -1
  436. package/_standalone/tsconfig.json +1 -1
  437. package/_standalone/tsconfig.tsbuildinfo +1 -1
  438. package/app/app/api/acp/detect/route.ts +29 -20
  439. package/app/app/api/agent-activity/route.ts +1 -1
  440. package/app/app/api/ask/route.ts +115 -31
  441. package/app/app/api/ask-sessions/route.ts +1 -0
  442. package/app/app/api/bootstrap/route.ts +1 -3
  443. package/app/app/api/file/route.ts +34 -4
  444. package/app/app/api/inbox/route.ts +61 -0
  445. package/app/app/api/settings/list-models/route.ts +73 -53
  446. package/app/app/api/settings/route.ts +46 -55
  447. package/app/app/api/settings/test-key/route.ts +57 -114
  448. package/app/app/api/setup/route.ts +31 -21
  449. package/app/app/api/sync/route.ts +122 -12
  450. package/app/app/api/update-check/route.ts +2 -2
  451. package/app/app/globals.css +11 -1
  452. package/app/app/layout.tsx +2 -3
  453. package/app/app/login/page.tsx +1 -1
  454. package/app/app/view/[...path]/ViewPageClient.tsx +10 -10
  455. package/app/app/view/[...path]/not-found.tsx +1 -1
  456. package/app/components/ActivityBar.tsx +26 -10
  457. package/app/components/AskFab.tsx +1 -1
  458. package/app/components/AskModal.tsx +1 -1
  459. package/app/components/Backlinks.tsx +1 -1
  460. package/app/components/CreateSpaceModal.tsx +7 -55
  461. package/app/components/DirView.tsx +93 -11
  462. package/app/components/EchoSpotlight.tsx +1 -1
  463. package/app/components/ExportModal.tsx +1 -1
  464. package/app/components/FileTree.tsx +64 -79
  465. package/app/components/FindInPage.tsx +1 -1
  466. package/app/components/GuideCard.tsx +1 -1
  467. package/app/components/HomeContent.tsx +21 -14
  468. package/app/components/ImportModal.tsx +1 -1
  469. package/app/components/KeyboardShortcuts.tsx +1 -1
  470. package/app/components/MarkdownView.tsx +11 -1
  471. package/app/components/OnboardingView.tsx +1 -1
  472. package/app/components/OrganizeToast.tsx +1 -1
  473. package/app/components/Panel.tsx +82 -4
  474. package/app/components/QuickSuggestion.tsx +1 -1
  475. package/app/components/RightAgentDetailPanel.tsx +2 -2
  476. package/app/components/RightAskPanel.tsx +58 -22
  477. package/app/components/SearchModal.tsx +1 -1
  478. package/app/components/Sidebar.tsx +1 -1
  479. package/app/components/SidebarLayout.tsx +52 -16
  480. package/app/components/SpaceInitToast.tsx +1 -1
  481. package/app/components/SyncStatusBar.tsx +2 -2
  482. package/app/components/SystemPulse.tsx +12 -6
  483. package/app/components/TableOfContents.tsx +86 -39
  484. package/app/components/TrashPageClient.tsx +1 -1
  485. package/app/components/UpdateOverlay.tsx +2 -2
  486. package/app/components/agents/AgentActivitySection.tsx +225 -0
  487. package/app/components/agents/AgentDetailContent.tsx +234 -3
  488. package/app/components/agents/AgentsContentPage.tsx +13 -2
  489. package/app/components/agents/AgentsMcpSection.tsx +7 -16
  490. package/app/components/agents/AgentsOverviewSection.tsx +28 -27
  491. package/app/components/agents/AgentsPanelA2aTab.tsx +1 -1
  492. package/app/components/agents/AgentsPanelSessionsTab.tsx +6 -1
  493. package/app/components/agents/AgentsSkillsSection.tsx +1 -1
  494. package/app/components/agents/DiscoverAgentModal.tsx +1 -1
  495. package/app/components/agents/RecentActivityFeed.tsx +49 -88
  496. package/app/components/agents/agent-activity-shared.tsx +110 -0
  497. package/app/components/agents/agents-content-model.ts +2 -2
  498. package/app/components/ask/AgentSelectorCapsule.tsx +1 -1
  499. package/app/components/ask/AskContent.tsx +332 -486
  500. package/app/components/ask/AskHeader.tsx +61 -0
  501. package/app/components/ask/FileChip.tsx +9 -5
  502. package/app/components/ask/MessageList.tsx +88 -21
  503. package/app/components/ask/ModeCapsule.tsx +180 -0
  504. package/app/components/ask/ProviderModelCapsule.tsx +284 -0
  505. package/app/components/ask/SessionHistory.tsx +63 -10
  506. package/app/components/ask/SessionTabBar.tsx +1 -1
  507. package/app/components/ask/ThinkingBlock.tsx +1 -1
  508. package/app/components/ask/ToolCallBlock.tsx +28 -24
  509. package/app/components/changes/ChangesBanner.tsx +1 -1
  510. package/app/components/changes/ChangesContentPage.tsx +1 -1
  511. package/app/components/echo/EchoInsightCollapsible.tsx +1 -1
  512. package/app/components/echo/EchoSegmentNav.tsx +1 -1
  513. package/app/components/echo/EchoSegmentPageClient.tsx +1 -1
  514. package/app/components/explore/ExploreContent.tsx +1 -1
  515. package/app/components/help/HelpContent.tsx +1 -1
  516. package/app/components/home/InboxSection.tsx +268 -0
  517. package/app/components/panels/AgentsPanel.tsx +3 -2
  518. package/app/components/panels/AgentsPanelHubNav.tsx +2 -6
  519. package/app/components/panels/DiscoverPanel.tsx +1 -1
  520. package/app/components/panels/EchoPanel.tsx +1 -1
  521. package/app/components/panels/EchoSidebarStats.tsx +1 -1
  522. package/app/components/panels/ImportHistoryPanel.tsx +1 -1
  523. package/app/components/panels/PanelHeader.tsx +1 -1
  524. package/app/components/panels/PluginsPanel.tsx +1 -1
  525. package/app/components/panels/SearchPanel.tsx +5 -2
  526. package/app/components/panels/SyncPopover.tsx +1 -1
  527. package/app/components/panels/WorkflowsPanel.tsx +1 -1
  528. package/app/components/renderers/agent-inspector/AgentInspectorRenderer.tsx +18 -0
  529. package/app/components/renderers/todo/TodoRenderer.tsx +489 -75
  530. package/app/components/settings/AiTab.tsx +198 -127
  531. package/app/components/settings/AppearanceTab.tsx +48 -50
  532. package/app/components/settings/KnowledgeTab.tsx +92 -27
  533. package/app/components/settings/McpAgentInstall.tsx +1 -1
  534. package/app/components/settings/McpSkillsSection.tsx +1 -1
  535. package/app/components/settings/McpTab.tsx +145 -7
  536. package/app/components/settings/PluginsTab.tsx +1 -1
  537. package/app/components/settings/SettingsContent.tsx +5 -2
  538. package/app/components/settings/SyncTab.tsx +615 -230
  539. package/app/components/settings/UninstallTab.tsx +1 -1
  540. package/app/components/settings/UpdateTab.tsx +373 -109
  541. package/app/components/settings/types.ts +4 -5
  542. package/app/components/setup/StepAI.tsx +70 -49
  543. package/app/components/setup/StepDots.tsx +1 -1
  544. package/app/components/setup/StepReview.tsx +176 -8
  545. package/app/components/setup/index.tsx +73 -39
  546. package/app/components/setup/types.ts +11 -8
  547. package/app/components/shared/ProviderSelect.tsx +134 -0
  548. package/app/components/walkthrough/WalkthroughOverlay.tsx +2 -2
  549. package/app/components/walkthrough/WalkthroughTooltip.tsx +2 -2
  550. package/app/components/walkthrough/index.ts +1 -1
  551. package/app/data/skills/mindos/SKILL.md +27 -12
  552. package/app/data/skills/mindos-zh/SKILL.md +27 -12
  553. package/app/hooks/useAcpDetection.ts +1 -1
  554. package/app/hooks/useAskChat.ts +248 -0
  555. package/app/hooks/useAskPanel.ts +24 -4
  556. package/app/hooks/useAskSession.ts +15 -0
  557. package/app/lib/acp/types.ts +1 -1
  558. package/app/lib/actions.ts +13 -0
  559. package/app/lib/agent/log.ts +2 -0
  560. package/app/lib/agent/model.ts +69 -81
  561. package/app/lib/agent/prompt.ts +27 -0
  562. package/app/lib/agent/providers.ts +299 -0
  563. package/app/lib/agent/tools.ts +26 -4
  564. package/app/lib/api.ts +3 -1
  565. package/app/lib/core/agent-audit-log.ts +7 -0
  566. package/app/lib/core/fs-ops.ts +9 -4
  567. package/app/lib/core/inbox.ts +181 -0
  568. package/app/lib/core/index.ts +4 -0
  569. package/app/lib/core/tree.ts +3 -0
  570. package/app/lib/core/types.ts +2 -0
  571. package/app/lib/fs.ts +26 -2
  572. package/app/lib/i18n/modules/ai-chat.ts +35 -13
  573. package/app/lib/i18n/modules/features.ts +2 -2
  574. package/app/lib/i18n/modules/knowledge.ts +82 -2
  575. package/app/lib/i18n/modules/navigation.ts +6 -2
  576. package/app/lib/i18n/modules/onboarding.ts +39 -9
  577. package/app/lib/i18n/modules/panels.ts +78 -29
  578. package/app/lib/i18n/modules/settings.ts +236 -20
  579. package/app/lib/inbox-upload.ts +93 -0
  580. package/app/lib/mcp-agents.ts +6 -7
  581. package/app/lib/renderers/index.ts +1 -2
  582. package/app/lib/settings-ai-client.ts +13 -12
  583. package/app/lib/settings.ts +48 -33
  584. package/app/lib/space-ai-init.ts +66 -0
  585. package/app/lib/stores/LocaleStoreInit.tsx +18 -0
  586. package/app/lib/stores/McpStoreInit.tsx +18 -0
  587. package/app/lib/stores/WalkthroughInit.tsx +20 -0
  588. package/app/lib/stores/locale-store.ts +55 -0
  589. package/app/lib/stores/mcp-store.ts +156 -0
  590. package/app/lib/stores/walkthrough-store.ts +118 -0
  591. package/app/lib/types.ts +20 -0
  592. package/app/package.json +3 -1
  593. package/app/tsconfig.json +1 -1
  594. package/bin/cli.js +46 -27
  595. package/bin/commands/file.js +7 -4
  596. package/bin/commands/space.js +4 -0
  597. package/bin/lib/mcp-agents.js +26 -2
  598. package/bin/lib/mcp-install.js +11 -3
  599. package/bin/lib/sync.js +140 -34
  600. package/mcp/README.md +2 -2
  601. package/mcp/dist/index.cjs +43 -43
  602. package/mcp/package.json +1 -1
  603. package/mcp/src/index.ts +77 -61
  604. package/package.json +1 -1
  605. package/scripts/build-runtime-archive.sh +113 -0
  606. package/scripts/setup.js +1 -1
  607. package/skills/mindos/SKILL.md +27 -12
  608. package/skills/mindos/references/preference-capture.md +4 -4
  609. package/skills/mindos/references/write-supplement.md +46 -4
  610. package/skills/mindos-zh/SKILL.md +27 -12
  611. package/skills/mindos-zh/references/preference-capture.md +4 -4
  612. package/skills/mindos-zh/references/write-supplement.md +47 -5
  613. package/templates/empty/INSTRUCTION.md +0 -1
  614. package/templates/en/INSTRUCTION.md +0 -1
  615. package/templates/template-generation-skill.md +0 -1
  616. package/templates/zh/INSTRUCTION.md +0 -1
  617. package/_standalone/.next/server/chunks/248.js +0 -15
  618. package/_standalone/.next/server/chunks/359.js +0 -2
  619. package/_standalone/.next/server/chunks/4931.js +0 -202
  620. package/_standalone/.next/server/chunks/7670.js +0 -1
  621. package/_standalone/.next/server/chunks/8407.js +0 -52
  622. package/_standalone/.next/server/chunks/9414.js +0 -11
  623. package/_standalone/.next/static/VAb8MoUUpoXjVJalRJogO/_buildManifest.js +0 -1
  624. package/_standalone/.next/static/chunks/1038-ed04d6651ec92312.js +0 -1
  625. package/_standalone/.next/static/chunks/1263-79beb8734dee7bbd.js +0 -25
  626. package/_standalone/.next/static/chunks/275-ebcaaedabe706903.js +0 -1
  627. package/_standalone/.next/static/chunks/5637-b97c869adf70c82e.js +0 -1
  628. package/_standalone/.next/static/chunks/5681-a53362a1cd629dc6.js +0 -1
  629. package/_standalone/.next/static/chunks/9602-35ca17b688f1a4fe.js +0 -1
  630. package/_standalone/.next/static/chunks/9670-d59e4d45ed705f58.js +0 -6
  631. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/route-d4762cc48529e566.js +0 -1
  632. package/_standalone/.next/static/chunks/app/_global-error/page-d4762cc48529e566.js +0 -1
  633. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-519d4da1142db5ef.js +0 -1
  634. package/_standalone/.next/static/chunks/app/agents/page-b709cf3103321609.js +0 -5
  635. package/_standalone/.next/static/chunks/app/api/a2a/agents/route-d4762cc48529e566.js +0 -1
  636. package/_standalone/.next/static/chunks/app/api/a2a/delegations/route-d4762cc48529e566.js +0 -1
  637. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-d4762cc48529e566.js +0 -1
  638. package/_standalone/.next/static/chunks/app/api/a2a/route-d4762cc48529e566.js +0 -1
  639. package/_standalone/.next/static/chunks/app/api/acp/config/route-d4762cc48529e566.js +0 -1
  640. package/_standalone/.next/static/chunks/app/api/acp/detect/route-d4762cc48529e566.js +0 -1
  641. package/_standalone/.next/static/chunks/app/api/acp/install/route-d4762cc48529e566.js +0 -1
  642. package/_standalone/.next/static/chunks/app/api/acp/registry/route-d4762cc48529e566.js +0 -1
  643. package/_standalone/.next/static/chunks/app/api/acp/session/route-d4762cc48529e566.js +0 -1
  644. package/_standalone/.next/static/chunks/app/api/agent-activity/route-d4762cc48529e566.js +0 -1
  645. package/_standalone/.next/static/chunks/app/api/ask/route-d4762cc48529e566.js +0 -1
  646. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-d4762cc48529e566.js +0 -1
  647. package/_standalone/.next/static/chunks/app/api/auth/route-d4762cc48529e566.js +0 -1
  648. package/_standalone/.next/static/chunks/app/api/backlinks/route-d4762cc48529e566.js +0 -1
  649. package/_standalone/.next/static/chunks/app/api/bootstrap/route-d4762cc48529e566.js +0 -1
  650. package/_standalone/.next/static/chunks/app/api/changes/route-d4762cc48529e566.js +0 -1
  651. package/_standalone/.next/static/chunks/app/api/export/route-d4762cc48529e566.js +0 -1
  652. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-d4762cc48529e566.js +0 -1
  653. package/_standalone/.next/static/chunks/app/api/file/import/route-d4762cc48529e566.js +0 -1
  654. package/_standalone/.next/static/chunks/app/api/file/route-d4762cc48529e566.js +0 -1
  655. package/_standalone/.next/static/chunks/app/api/files/route-d4762cc48529e566.js +0 -1
  656. package/_standalone/.next/static/chunks/app/api/git/route-d4762cc48529e566.js +0 -1
  657. package/_standalone/.next/static/chunks/app/api/graph/route-d4762cc48529e566.js +0 -1
  658. package/_standalone/.next/static/chunks/app/api/health/route-d4762cc48529e566.js +0 -1
  659. package/_standalone/.next/static/chunks/app/api/init/route-d4762cc48529e566.js +0 -1
  660. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-d4762cc48529e566.js +0 -1
  661. package/_standalone/.next/static/chunks/app/api/mcp/install/route-d4762cc48529e566.js +0 -1
  662. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-d4762cc48529e566.js +0 -1
  663. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-d4762cc48529e566.js +0 -1
  664. package/_standalone/.next/static/chunks/app/api/mcp/status/route-d4762cc48529e566.js +0 -1
  665. package/_standalone/.next/static/chunks/app/api/monitoring/route-d4762cc48529e566.js +0 -1
  666. package/_standalone/.next/static/chunks/app/api/recent-files/route-d4762cc48529e566.js +0 -1
  667. package/_standalone/.next/static/chunks/app/api/restart/route-d4762cc48529e566.js +0 -1
  668. package/_standalone/.next/static/chunks/app/api/search/route-d4762cc48529e566.js +0 -1
  669. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-d4762cc48529e566.js +0 -1
  670. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-d4762cc48529e566.js +0 -1
  671. package/_standalone/.next/static/chunks/app/api/settings/route-d4762cc48529e566.js +0 -1
  672. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-d4762cc48529e566.js +0 -1
  673. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-d4762cc48529e566.js +0 -1
  674. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-d4762cc48529e566.js +0 -1
  675. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-d4762cc48529e566.js +0 -1
  676. package/_standalone/.next/static/chunks/app/api/setup/ls/route-d4762cc48529e566.js +0 -1
  677. package/_standalone/.next/static/chunks/app/api/setup/route-d4762cc48529e566.js +0 -1
  678. package/_standalone/.next/static/chunks/app/api/skills/route-d4762cc48529e566.js +0 -1
  679. package/_standalone/.next/static/chunks/app/api/sync/route-d4762cc48529e566.js +0 -1
  680. package/_standalone/.next/static/chunks/app/api/tree-version/route-d4762cc48529e566.js +0 -1
  681. package/_standalone/.next/static/chunks/app/api/uninstall/route-d4762cc48529e566.js +0 -1
  682. package/_standalone/.next/static/chunks/app/api/update/route-d4762cc48529e566.js +0 -1
  683. package/_standalone/.next/static/chunks/app/api/update-check/route-d4762cc48529e566.js +0 -1
  684. package/_standalone/.next/static/chunks/app/api/update-status/route-d4762cc48529e566.js +0 -1
  685. package/_standalone/.next/static/chunks/app/api/workflows/route-d4762cc48529e566.js +0 -1
  686. package/_standalone/.next/static/chunks/app/changes/page-def5210095f8698d.js +0 -1
  687. package/_standalone/.next/static/chunks/app/echo/[segment]/page-be28eff31b1a186e.js +0 -11
  688. package/_standalone/.next/static/chunks/app/echo/page-d4762cc48529e566.js +0 -1
  689. package/_standalone/.next/static/chunks/app/explore/page-e4b8098dca200389.js +0 -4
  690. package/_standalone/.next/static/chunks/app/help/page-d5e57d73d94bad19.js +0 -1
  691. package/_standalone/.next/static/chunks/app/layout-aab90c2b4faf8d57.js +0 -173
  692. package/_standalone/.next/static/chunks/app/login/page-321875768b70938a.js +0 -1
  693. package/_standalone/.next/static/chunks/app/page-9a15cf85f0962c59.js +0 -7
  694. package/_standalone/.next/static/chunks/app/setup/page-01ab1f549d636057.js +0 -1
  695. package/_standalone/.next/static/chunks/app/trash/page-7df0139c6b0f87e0.js +0 -1
  696. package/_standalone/.next/static/chunks/app/view/[...path]/loading-d4762cc48529e566.js +0 -1
  697. package/_standalone/.next/static/chunks/app/view/[...path]/not-found-f22c513bbc348cc8.js +0 -1
  698. package/_standalone/.next/static/chunks/app/view/[...path]/page-35811d7e49e08157.js +0 -12
  699. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d4762cc48529e566.js +0 -1
  700. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d4762cc48529e566.js +0 -1
  701. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d4762cc48529e566.js +0 -1
  702. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d4762cc48529e566.js +0 -1
  703. package/_standalone/.next/static/chunks/webpack-3489a2b6c2882b0c.js +0 -1
  704. package/_standalone/.next/static/css/f16595bc58a16d5d.css +0 -1
  705. package/_standalone/components/walkthrough/WalkthroughProvider.tsx +0 -133
  706. package/_standalone/hooks/useMcpData.tsx +0 -169
  707. package/_standalone/lib/i18n-en.ts +0 -2
  708. package/_standalone/lib/i18n-zh.ts +0 -2
  709. package/_standalone/lib/types.ts +0 -70
  710. package/app/components/walkthrough/WalkthroughProvider.tsx +0 -133
  711. package/app/hooks/useMcpData.tsx +0 -169
  712. package/app/lib/LocaleContext.tsx +0 -60
  713. package/app/lib/i18n-en.ts +0 -2
  714. package/app/lib/i18n-zh.ts +0 -2
  715. /package/_standalone/.next/static/{VAb8MoUUpoXjVJalRJogO → rZLs1krFuduixvcVNe6q3}/_ssgManifest.js +0 -0
package/mcp/package.json CHANGED
@@ -10,12 +10,12 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@modelcontextprotocol/sdk": "^1.25.0",
13
- "tsx": "^4.19.0",
14
13
  "zod": "^3.23.8"
15
14
  },
16
15
  "devDependencies": {
17
16
  "@types/node": "^22",
18
17
  "esbuild": "^0.25.0",
18
+ "tsx": "^4.19.0",
19
19
  "typescript": "^5"
20
20
  }
21
21
  }
package/mcp/src/index.ts CHANGED
@@ -30,31 +30,33 @@ const MCP_PORT = parseInt(process.env.MCP_PORT ?? "8781", 10);
30
30
  const MCP_ENDPOINT = process.env.MCP_ENDPOINT ?? "/mcp";
31
31
  const CHARACTER_LIMIT = 25_000;
32
32
 
33
- function headers(): Record<string, string> {
33
+ function headers(agentName?: string): Record<string, string> {
34
34
  const h: Record<string, string> = { "Content-Type": "application/json" };
35
35
  if (AUTH_TOKEN) h["Authorization"] = `Bearer ${AUTH_TOKEN}`;
36
+ // Sanitize: strip control chars, limit to 100 chars
37
+ if (agentName) h["x-mindos-agent"] = agentName.replace(/[\x00-\x1f]/g, '').slice(0, 100);
36
38
  return h;
37
39
  }
38
40
 
39
41
  // ─── HTTP helpers ────────────────────────────────────────────────────────────
40
42
 
41
- async function get(path: string, params?: Record<string, string>): Promise<Record<string, unknown>> {
43
+ async function get(path: string, params?: Record<string, string>, agentName?: string): Promise<Record<string, unknown>> {
42
44
  const url = new URL(path, BASE_URL);
43
45
  if (params) {
44
46
  for (const [k, v] of Object.entries(params)) {
45
47
  if (v !== undefined && v !== null) url.searchParams.set(k, v);
46
48
  }
47
49
  }
48
- const res = await fetch(url.toString(), { headers: headers() });
50
+ const res = await fetch(url.toString(), { headers: headers(agentName) });
49
51
  const json = await res.json() as Record<string, unknown>;
50
52
  if (!res.ok) throw new Error((json.error as string) ?? `HTTP ${res.status}`);
51
53
  return json;
52
54
  }
53
55
 
54
- async function post(path: string, body: Record<string, unknown>): Promise<Record<string, unknown>> {
56
+ async function post(path: string, body: Record<string, unknown>, agentName?: string): Promise<Record<string, unknown>> {
55
57
  const res = await fetch(new URL(path, BASE_URL).toString(), {
56
58
  method: "POST",
57
- headers: headers(),
59
+ headers: headers(agentName),
58
60
  body: JSON.stringify(body),
59
61
  });
60
62
  const json = await res.json() as Record<string, unknown>;
@@ -77,14 +79,14 @@ function truncate(text: string, limit = CHARACTER_LIMIT): string {
77
79
 
78
80
  // ─── Agent operation logging ────────────────────────────────────────────────
79
81
 
80
- async function logOp(tool: string, params: Record<string, unknown>, result: 'ok' | 'error', message: string) {
82
+ async function logOp(tool: string, params: Record<string, unknown>, result: 'ok' | 'error', message: string, agentName?: string) {
81
83
  try {
82
- const entry = { ts: new Date().toISOString(), tool, params, result, message: message.slice(0, 200) };
84
+ const entry = { ts: new Date().toISOString(), tool, params, result, message: message.slice(0, 200), agentName: agentName || undefined };
83
85
  const line = JSON.stringify(entry) + '\n';
84
86
  // Append to .agent-log.json via the app API
85
87
  await fetch(new URL("/api/file", BASE_URL).toString(), {
86
88
  method: "POST",
87
- headers: headers(),
89
+ headers: headers(agentName),
88
90
  body: JSON.stringify({ op: "append_to_file", path: ".agent-log.json", content: line }),
89
91
  }).catch(() => {});
90
92
  } catch {
@@ -96,6 +98,17 @@ async function logOp(tool: string, params: Record<string, unknown>, result: 'ok'
96
98
 
97
99
  function registerTools(server: McpServer) {
98
100
 
101
+ /** Get the MCP client name for this server session (e.g. "claude-code", "cursor"). */
102
+ function clientName(): string | undefined {
103
+ return server.server.getClientVersion()?.name || undefined;
104
+ }
105
+
106
+ // Session-aware wrappers that auto-inject client identity into every API call
107
+ const _get = (path: string, params?: Record<string, string>) => get(path, params, clientName());
108
+ const _post = (path: string, body: Record<string, unknown>) => post(path, body, clientName());
109
+ const _logOp = (tool: string, params: Record<string, unknown>, result: 'ok' | 'error', msg: string) =>
110
+ logOp(tool, params, result, msg, clientName());
111
+
99
112
  // ── mindos_list_files ───────────────────────────────────────────────────────
100
113
 
101
114
  server.registerTool("mindos_list_files", {
@@ -107,11 +120,11 @@ server.registerTool("mindos_list_files", {
107
120
  annotations: { readOnlyHint: true },
108
121
  }, async ({ response_format }) => {
109
122
  try {
110
- const json = await get("/api/files", { format: response_format });
123
+ const json = await _get("/api/files", { format: response_format });
111
124
  const result = typeof json.tree === "string" ? json.tree : JSON.stringify(json.tree ?? json, null, 2);
112
- logOp("mindos_list_files", { response_format }, "ok", `${result.length} chars`);
125
+ _logOp("mindos_list_files", { response_format }, "ok", `${result.length} chars`);
113
126
  return ok(result);
114
- } catch (e) { logOp("mindos_list_files", { response_format }, "error", String(e)); return error(String(e)); }
127
+ } catch (e) { _logOp("mindos_list_files", { response_format }, "error", String(e)); return error(String(e)); }
115
128
  });
116
129
 
117
130
  // ── mindos_list_spaces ──────────────────────────────────────────────────────
@@ -126,20 +139,20 @@ server.registerTool("mindos_list_spaces", {
126
139
  annotations: { readOnlyHint: true },
127
140
  }, async ({ response_format }) => {
128
141
  try {
129
- const json = await get("/api/file", { op: "list_spaces" });
142
+ const json = await _get("/api/file", { op: "list_spaces" });
130
143
  const spaces = json.spaces as Array<{ name: string; path: string; fileCount: number; description: string }>;
131
144
  if (response_format === "json") {
132
- logOp("mindos_list_spaces", { response_format }, "ok", `${spaces?.length ?? 0} spaces`);
145
+ _logOp("mindos_list_spaces", { response_format }, "ok", `${spaces?.length ?? 0} spaces`);
133
146
  return ok(JSON.stringify({ spaces: spaces ?? [] }, null, 2));
134
147
  }
135
148
  const lines = (spaces ?? []).map(
136
149
  (s) => `- **${s.name}** (\`${s.path}/\`) — ${s.fileCount} file(s)${s.description ? ` — ${s.description}` : ""}`,
137
150
  );
138
151
  const text = lines.length ? lines.join("\n") : "(no top-level spaces in tree)";
139
- logOp("mindos_list_spaces", { response_format }, "ok", `${spaces?.length ?? 0} spaces`);
152
+ _logOp("mindos_list_spaces", { response_format }, "ok", `${spaces?.length ?? 0} spaces`);
140
153
  return ok(text);
141
154
  } catch (e) {
142
- logOp("mindos_list_spaces", { response_format }, "error", String(e));
155
+ _logOp("mindos_list_spaces", { response_format }, "error", String(e));
143
156
  return error(String(e));
144
157
  }
145
158
  });
@@ -157,16 +170,16 @@ server.registerTool("mindos_read_file", {
157
170
  annotations: { readOnlyHint: true },
158
171
  }, async ({ path, offset, limit }) => {
159
172
  try {
160
- const json = await get("/api/file", { path, op: "read_file" });
173
+ const json = await _get("/api/file", { path, op: "read_file" });
161
174
  const content = json.content as string;
162
175
  const slice = content.slice(offset, offset + limit);
163
176
  const hasMore = offset + limit < content.length;
164
177
  const header = hasMore
165
178
  ? `[Showing characters ${offset}–${offset + slice.length} of ${content.length}. Use offset=${offset + limit} for next page.]\n\n`
166
179
  : offset > 0 ? `[Showing characters ${offset}–${offset + slice.length} of ${content.length}]\n\n` : "";
167
- logOp("mindos_read_file", { path }, "ok", `${content.length} chars`);
180
+ _logOp("mindos_read_file", { path }, "ok", `${content.length} chars`);
168
181
  return ok(header + slice);
169
- } catch (e) { logOp("mindos_read_file", { path }, "error", String(e)); return error(String(e)); }
182
+ } catch (e) { _logOp("mindos_read_file", { path }, "error", String(e)); return error(String(e)); }
170
183
  });
171
184
 
172
185
  // ── mindos_write_file ───────────────────────────────────────────────────────
@@ -180,10 +193,10 @@ server.registerTool("mindos_write_file", {
180
193
  }),
181
194
  }, async ({ path, content }) => {
182
195
  try {
183
- await post("/api/file", { op: "save_file", path, content });
184
- logOp("mindos_write_file", { path }, "ok", `Wrote ${content.length} chars`);
196
+ await _post("/api/file", { op: "save_file", path, content });
197
+ _logOp("mindos_write_file", { path }, "ok", `Wrote ${content.length} chars`);
185
198
  return ok(`Successfully wrote ${content.length} characters to "${path}"`);
186
- } catch (e) { logOp("mindos_write_file", { path }, "error", String(e)); return error(String(e)); }
199
+ } catch (e) { _logOp("mindos_write_file", { path }, "error", String(e)); return error(String(e)); }
187
200
  });
188
201
 
189
202
  // ── mindos_create_file ──────────────────────────────────────────────────────
@@ -197,10 +210,10 @@ server.registerTool("mindos_create_file", {
197
210
  }),
198
211
  }, async ({ path, content }) => {
199
212
  try {
200
- await post("/api/file", { op: "create_file", path, content });
201
- logOp("mindos_create_file", { path }, "ok", `Created ${content.length} chars`);
213
+ await _post("/api/file", { op: "create_file", path, content });
214
+ _logOp("mindos_create_file", { path }, "ok", `Created ${content.length} chars`);
202
215
  return ok(`Created "${path}" (${content.length} characters)`);
203
- } catch (e) { logOp("mindos_create_file", { path }, "error", String(e)); return error(String(e)); }
216
+ } catch (e) { _logOp("mindos_create_file", { path }, "error", String(e)); return error(String(e)); }
204
217
  });
205
218
 
206
219
  // ── mindos_batch_create_files ────────────────────────────────────────────────
@@ -220,7 +233,7 @@ server.registerTool("mindos_batch_create_files", {
220
233
  const errors: string[] = [];
221
234
  for (const file of files) {
222
235
  try {
223
- await post("/api/file", { op: "create_file", path: file.path, content: file.content });
236
+ await _post("/api/file", { op: "create_file", path: file.path, content: file.content });
224
237
  created.push(file.path);
225
238
  } catch (e) {
226
239
  errors.push(`${file.path}: ${String(e)}`);
@@ -228,7 +241,7 @@ server.registerTool("mindos_batch_create_files", {
228
241
  }
229
242
  let msg = `Batch creation complete.\nCreated ${created.length} file(s): ${created.join(", ")}`;
230
243
  if (errors.length > 0) msg += `\n\nFailed to create ${errors.length} file(s):\n${errors.join("\n")}`;
231
- logOp("mindos_batch_create_files", { count: files.length }, created.length === files.length ? "ok" : "error", msg.slice(0, 200));
244
+ _logOp("mindos_batch_create_files", { count: files.length }, created.length === files.length ? "ok" : "error", msg.slice(0, 200));
232
245
  return created.length === files.length ? ok(msg) : error(msg);
233
246
  });
234
247
 
@@ -245,7 +258,7 @@ server.registerTool("mindos_create_space", {
245
258
  }),
246
259
  }, async ({ name, description, parent_path }) => {
247
260
  try {
248
- const json = await post("/api/file", {
261
+ const json = await _post("/api/file", {
249
262
  op: "create_space",
250
263
  path: "_",
251
264
  name,
@@ -253,10 +266,10 @@ server.registerTool("mindos_create_space", {
253
266
  parent_path,
254
267
  });
255
268
  const p = json.path as string;
256
- logOp("mindos_create_space", { name, parent_path }, "ok", p);
269
+ _logOp("mindos_create_space", { name, parent_path }, "ok", p);
257
270
  return ok(`Created Mind Space at "${p}"`);
258
271
  } catch (e) {
259
- logOp("mindos_create_space", { name, parent_path }, "error", String(e));
272
+ _logOp("mindos_create_space", { name, parent_path }, "error", String(e));
260
273
  return error(String(e));
261
274
  }
262
275
  });
@@ -273,11 +286,11 @@ server.registerTool("mindos_rename_space", {
273
286
  }),
274
287
  }, async ({ path: spacePath, new_name }) => {
275
288
  try {
276
- const json = await post("/api/file", { op: "rename_space", path: spacePath, new_name });
277
- logOp("mindos_rename_space", { path: spacePath, new_name }, "ok", String(json.newPath));
289
+ const json = await _post("/api/file", { op: "rename_space", path: spacePath, new_name });
290
+ _logOp("mindos_rename_space", { path: spacePath, new_name }, "ok", String(json.newPath));
278
291
  return ok(`Renamed space "${spacePath}" → "${json.newPath}"`);
279
292
  } catch (e) {
280
- logOp("mindos_rename_space", { path: spacePath, new_name }, "error", String(e));
293
+ _logOp("mindos_rename_space", { path: spacePath, new_name }, "error", String(e));
281
294
  return error(String(e));
282
295
  }
283
296
  });
@@ -286,17 +299,18 @@ server.registerTool("mindos_rename_space", {
286
299
 
287
300
  server.registerTool("mindos_delete_file", {
288
301
  title: "Delete File",
289
- description: "Permanently delete a file from the knowledge base.",
302
+ description: "Delete a file from the knowledge base. The file is moved to trash and can be recovered within 30 days.",
290
303
  inputSchema: z.object({
291
304
  path: z.string().min(1),
292
305
  }),
293
306
  annotations: { destructiveHint: true },
294
307
  }, async ({ path }) => {
295
308
  try {
296
- await post("/api/file", { op: "delete_file", path });
297
- logOp("mindos_delete_file", { path }, "ok", `Deleted "${path}"`);
298
- return ok(`Deleted "${path}"`);
299
- } catch (e) { logOp("mindos_delete_file", { path }, "error", String(e)); return error(String(e)); }
309
+ const res = await _post("/api/file", { op: "delete_file", path });
310
+ const trashId = res?.trashId ? ` (trashId: ${res.trashId})` : '';
311
+ _logOp("mindos_delete_file", { path }, "ok", `Moved to trash: "${path}"${trashId}`);
312
+ return ok(`Moved to trash: "${path}"${trashId}`);
313
+ } catch (e) { _logOp("mindos_delete_file", { path }, "error", String(e)); return error(String(e)); }
300
314
  });
301
315
 
302
316
  // ── mindos_rename_file ──────────────────────────────────────────────────────
@@ -310,7 +324,7 @@ server.registerTool("mindos_rename_file", {
310
324
  }),
311
325
  }, async ({ path, new_name }) => {
312
326
  try {
313
- const json = await post("/api/file", { op: "rename_file", path, new_name });
327
+ const json = await _post("/api/file", { op: "rename_file", path, new_name });
314
328
  return ok(`Renamed "${path}" → "${json.newPath}"`);
315
329
  } catch (e) { return error(String(e)); }
316
330
  });
@@ -326,7 +340,7 @@ server.registerTool("mindos_move_file", {
326
340
  }),
327
341
  }, async ({ from_path, to_path }) => {
328
342
  try {
329
- const json = await post("/api/file", { op: "move_file", path: from_path, to_path });
343
+ const json = await _post("/api/file", { op: "move_file", path: from_path, to_path });
330
344
  const affected = json.affectedFiles as string[] ?? [];
331
345
  const lines = [`Moved "${from_path}" → "${json.newPath}"`];
332
346
  if (affected.length > 0) {
@@ -358,10 +372,10 @@ server.registerTool("mindos_search_notes", {
358
372
  if (file_type !== "all") params.file_type = file_type;
359
373
  if (modified_after) params.modified_after = modified_after;
360
374
  if (response_format) params.format = response_format;
361
- const json = await get("/api/search", params);
362
- logOp("mindos_search_notes", { query, limit }, "ok", `Search completed`);
375
+ const json = await _get("/api/search", params);
376
+ _logOp("mindos_search_notes", { query, limit }, "ok", `Search completed`);
363
377
  return ok(truncate(JSON.stringify(json, null, 2)));
364
- } catch (e) { logOp("mindos_search_notes", { query }, "error", String(e)); return error(String(e)); }
378
+ } catch (e) { _logOp("mindos_search_notes", { query }, "error", String(e)); return error(String(e)); }
365
379
  });
366
380
 
367
381
  // ── mindos_get_recent ───────────────────────────────────────────────────────
@@ -376,7 +390,7 @@ server.registerTool("mindos_get_recent", {
376
390
  annotations: { readOnlyHint: true },
377
391
  }, async ({ limit, response_format }) => {
378
392
  try {
379
- const json = await get("/api/recent-files", { limit: String(limit), format: response_format });
393
+ const json = await _get("/api/recent-files", { limit: String(limit), format: response_format });
380
394
  return ok(JSON.stringify(json, null, 2));
381
395
  } catch (e) { return error(String(e)); }
382
396
  });
@@ -392,7 +406,7 @@ server.registerTool("mindos_read_lines", {
392
406
  annotations: { readOnlyHint: true },
393
407
  }, async ({ path }) => {
394
408
  try {
395
- const json = await get("/api/file", { path, op: "read_lines" });
409
+ const json = await _get("/api/file", { path, op: "read_lines" });
396
410
  const lines = json.lines as string[];
397
411
  const numbered = lines.map((l, i) => `${i}: ${l}`).join("\n");
398
412
  return ok(`${lines.length} lines total:\n\n${numbered}`);
@@ -411,7 +425,7 @@ server.registerTool("mindos_insert_lines", {
411
425
  }),
412
426
  }, async ({ path, after_index, lines }) => {
413
427
  try {
414
- await post("/api/file", { op: "insert_lines", path, after_index, lines });
428
+ await _post("/api/file", { op: "insert_lines", path, after_index, lines });
415
429
  return ok(`Inserted ${lines.length} line(s) after index ${after_index} in "${path}"`);
416
430
  } catch (e) { return error(String(e)); }
417
431
  });
@@ -429,7 +443,7 @@ server.registerTool("mindos_update_lines", {
429
443
  }),
430
444
  }, async ({ path, start, end, lines }) => {
431
445
  try {
432
- await post("/api/file", { op: "update_lines", path, start, end, lines });
446
+ await _post("/api/file", { op: "update_lines", path, start, end, lines });
433
447
  return ok(`Replaced lines ${start}–${end} in "${path}" with ${lines.length} new line(s)`);
434
448
  } catch (e) { return error(String(e)); }
435
449
  });
@@ -445,10 +459,10 @@ server.registerTool("mindos_append_to_file", {
445
459
  }),
446
460
  }, async ({ path, content }) => {
447
461
  try {
448
- await post("/api/file", { op: "append_to_file", path, content });
449
- logOp("mindos_append_to_file", { path }, "ok", `Appended ${content.length} chars`);
462
+ await _post("/api/file", { op: "append_to_file", path, content });
463
+ _logOp("mindos_append_to_file", { path }, "ok", `Appended ${content.length} chars`);
450
464
  return ok(`Appended ${content.length} character(s) to "${path}"`);
451
- } catch (e) { logOp("mindos_append_to_file", { path }, "error", String(e)); return error(String(e)); }
465
+ } catch (e) { _logOp("mindos_append_to_file", { path }, "error", String(e)); return error(String(e)); }
452
466
  });
453
467
 
454
468
  // ── mindos_insert_after_heading ─────────────────────────────────────────────
@@ -463,10 +477,10 @@ server.registerTool("mindos_insert_after_heading", {
463
477
  }),
464
478
  }, async ({ path, heading, content }) => {
465
479
  try {
466
- await post("/api/file", { op: "insert_after_heading", path, heading, content });
467
- logOp("mindos_insert_after_heading", { path, heading }, "ok", `Inserted after "${heading}"`);
480
+ await _post("/api/file", { op: "insert_after_heading", path, heading, content });
481
+ _logOp("mindos_insert_after_heading", { path, heading }, "ok", `Inserted after "${heading}"`);
468
482
  return ok(`Inserted content after heading "${heading}" in "${path}"`);
469
- } catch (e) { logOp("mindos_insert_after_heading", { path, heading }, "error", String(e)); return error(String(e)); }
483
+ } catch (e) { _logOp("mindos_insert_after_heading", { path, heading }, "error", String(e)); return error(String(e)); }
470
484
  });
471
485
 
472
486
  // ── mindos_update_section ───────────────────────────────────────────────────
@@ -481,10 +495,10 @@ server.registerTool("mindos_update_section", {
481
495
  }),
482
496
  }, async ({ path, heading, content }) => {
483
497
  try {
484
- await post("/api/file", { op: "update_section", path, heading, content });
485
- logOp("mindos_update_section", { path, heading }, "ok", `Updated section "${heading}"`);
498
+ await _post("/api/file", { op: "update_section", path, heading, content });
499
+ _logOp("mindos_update_section", { path, heading }, "ok", `Updated section "${heading}"`);
486
500
  return ok(`Updated section "${heading}" in "${path}"`);
487
- } catch (e) { logOp("mindos_update_section", { path, heading }, "error", String(e)); return error(String(e)); }
501
+ } catch (e) { _logOp("mindos_update_section", { path, heading }, "error", String(e)); return error(String(e)); }
488
502
  });
489
503
 
490
504
  // ── mindos_append_csv ───────────────────────────────────────────────────────
@@ -498,7 +512,7 @@ server.registerTool("mindos_append_csv", {
498
512
  }),
499
513
  }, async ({ path, row }) => {
500
514
  try {
501
- const json = await post("/api/file", { op: "append_csv", path, row });
515
+ const json = await _post("/api/file", { op: "append_csv", path, row });
502
516
  return ok(`Appended row to "${path}". File now has ${json.newRowCount} rows.`);
503
517
  } catch (e) { return error(String(e)); }
504
518
  });
@@ -514,7 +528,7 @@ server.registerTool("mindos_get_backlinks", {
514
528
  annotations: { readOnlyHint: true },
515
529
  }, async ({ path }) => {
516
530
  try {
517
- const json = await get("/api/backlinks", { path });
531
+ const json = await _get("/api/backlinks", { path });
518
532
  return ok(JSON.stringify(json, null, 2));
519
533
  } catch (e) { return error(String(e)); }
520
534
  });
@@ -532,7 +546,7 @@ server.registerTool("mindos_bootstrap", {
532
546
  try {
533
547
  const params: Record<string, string> = {};
534
548
  if (target_dir) params.target_dir = target_dir;
535
- const json = await get("/api/bootstrap", params);
549
+ const json = await _get("/api/bootstrap", params);
536
550
  const sections = Object.entries(json)
537
551
  .filter(([, v]) => v !== undefined && v !== null)
538
552
  .map(([key, val]) => `--- ${key} ---\n\n${val}`)
@@ -553,7 +567,7 @@ server.registerTool("mindos_get_history", {
553
567
  annotations: { readOnlyHint: true },
554
568
  }, async ({ path, limit }) => {
555
569
  try {
556
- const json = await get("/api/git", { op: "history", path, limit: String(limit) });
570
+ const json = await _get("/api/git", { op: "history", path, limit: String(limit) });
557
571
  const entries = json.entries as Array<{ hash: string; date: string; message: string; author: string }>;
558
572
  if (entries.length === 0) return ok(`No git history found for "${path}"`);
559
573
  const lines = [`# Git History: ${path}`, "", `${entries.length} commit(s):`, ""];
@@ -576,7 +590,7 @@ server.registerTool("mindos_get_file_at_version", {
576
590
  annotations: { readOnlyHint: true },
577
591
  }, async ({ path, commit }) => {
578
592
  try {
579
- const json = await get("/api/git", { op: "show", path, commit });
593
+ const json = await _get("/api/git", { op: "show", path, commit });
580
594
  const content = json.content as string;
581
595
  return ok(truncate(`# ${path} @ ${commit.slice(0, 8)}\n\n${content}`));
582
596
  } catch (e) { return error(String(e)); }
@@ -648,7 +662,9 @@ async function main() {
648
662
  const sid = transport.sessionId;
649
663
  if (sid) {
650
664
  sessions.set(sid, { transport, server });
651
- console.error(`[MCP] New session ${sid.slice(0, 8)} (${sessions.size} active)`);
665
+ const client = server.server.getClientVersion();
666
+ const clientLabel = client?.name ? ` (${client.name})` : '';
667
+ console.error(`[MCP] New session ${sid.slice(0, 8)}${clientLabel} (${sessions.size} active)`);
652
668
  }
653
669
  });
654
670
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminilight/mindos",
3
- "version": "0.6.38",
3
+ "version": "0.6.40",
4
4
  "description": "MindOS — Human-Agent Collaborative Mind System. Local-first knowledge base that syncs your mind to all AI Agents via MCP.",
5
5
  "keywords": [
6
6
  "mindos",
@@ -0,0 +1,113 @@
1
+ #!/bin/bash
2
+ # Build a minimal MindOS runtime archive for Desktop Core Hot Update.
3
+ # Output: /tmp/mindos-runtime-{VERSION}.tar.gz (pre-built, ~32MB)
4
+ #
5
+ # Directory structure matches what ProcessManager + analyzeMindOsLayout expect:
6
+ # app/.next/standalone/server.js
7
+ # app/.next/standalone/node_modules/
8
+ # app/.next/standalone/.next/server/
9
+ # app/.next/standalone/.next/static/
10
+ # app/.next/standalone/public/
11
+ # app/.next/static/ (isBundledRuntimeIntact checks this)
12
+ # app/public/
13
+ # mcp/dist/index.cjs
14
+ # package.json
15
+ # bin/ templates/ skills/
16
+ set -euo pipefail
17
+
18
+ VERSION=$(node -p "require('./package.json').version")
19
+ WORK="/tmp/mindos-runtime-build-$$"
20
+ ARCHIVE="/tmp/mindos-runtime-${VERSION}.tar.gz"
21
+ rm -rf "$WORK"
22
+
23
+ echo "📦 Building MindOS runtime v${VERSION}..."
24
+
25
+ # ── Web server (standalone Next.js) ──
26
+ echo " Copying standalone..."
27
+ mkdir -p "$WORK/app/.next"
28
+ # Copy the entire standalone tree (server.js + node_modules + .next/server + .next/static + public)
29
+ cp -r app/.next/standalone "$WORK/app/.next/standalone"
30
+ # Remove dev artifacts that sneak into standalone
31
+ rm -rf "$WORK/app/.next/standalone/.next/cache" \
32
+ "$WORK/app/.next/standalone/.next/dev" \
33
+ "$WORK/app/.next/standalone/.next/diagnostics" \
34
+ "$WORK/app/.next/standalone/.next/types" \
35
+ "$WORK/app/.next/standalone/__tests__" \
36
+ "$WORK/app/.next/standalone/.next/lock"
37
+ # Copy static assets at top level (isBundledRuntimeIntact checks app/.next/static/)
38
+ cp -r app/.next/static "$WORK/app/.next/static"
39
+ # Copy public assets
40
+ mkdir -p "$WORK/app"
41
+ cp -r app/public "$WORK/app/public"
42
+
43
+ # ── MCP server ──
44
+ echo " Copying MCP..."
45
+ mkdir -p "$WORK/mcp/dist"
46
+ cp mcp/dist/index.cjs "$WORK/mcp/dist/"
47
+ [ -f mcp/package.json ] && cp mcp/package.json "$WORK/mcp/"
48
+
49
+ # ── Metadata + auxiliary files ──
50
+ echo " Copying metadata..."
51
+ cp package.json "$WORK/"
52
+ [ -d bin ] && cp -r bin "$WORK/"
53
+ [ -d templates ] && cp -r templates "$WORK/"
54
+ [ -d skills ] && cp -r skills "$WORK/"
55
+
56
+ # ── Package (flat, no outer directory) ──
57
+ echo " Creating archive..."
58
+ tar czf "$ARCHIVE" -C "$WORK" .
59
+
60
+ # ── Self-validation ──
61
+ echo " Validating..."
62
+ VERIFY="/tmp/mindos-runtime-verify-$$"
63
+ rm -rf "$VERIFY" && mkdir -p "$VERIFY"
64
+ tar xzf "$ARCHIVE" -C "$VERIFY"
65
+
66
+ ERRORS=0
67
+ for f in \
68
+ "app/.next/standalone/server.js" \
69
+ "app/.next/standalone/node_modules" \
70
+ "app/.next/standalone/.next/server" \
71
+ "app/.next/static" \
72
+ "mcp/dist/index.cjs" \
73
+ "package.json"; do
74
+ if [ ! -e "$VERIFY/$f" ]; then
75
+ echo " ❌ MISSING: $f"
76
+ ERRORS=$((ERRORS + 1))
77
+ fi
78
+ done
79
+
80
+ # Verify version in package.json matches
81
+ PKG_VER=$(node -p "require('$VERIFY/package.json').version" 2>/dev/null || echo "")
82
+ if [ "$PKG_VER" != "$VERSION" ]; then
83
+ echo " ❌ Version mismatch: package.json=$PKG_VER, expected=$VERSION"
84
+ ERRORS=$((ERRORS + 1))
85
+ fi
86
+
87
+ rm -rf "$VERIFY" "$WORK"
88
+
89
+ if [ "$ERRORS" -gt 0 ]; then
90
+ echo "❌ Validation failed with $ERRORS error(s)"
91
+ exit 1
92
+ fi
93
+
94
+ # ── Output info ──
95
+ if command -v sha256sum >/dev/null 2>&1; then
96
+ SHA256=$(sha256sum "$ARCHIVE" | cut -d' ' -f1)
97
+ else
98
+ SHA256=$(shasum -a 256 "$ARCHIVE" | cut -d' ' -f1)
99
+ fi
100
+
101
+ if command -v numfmt >/dev/null 2>&1; then
102
+ SIZE_HUMAN=$(stat -c%s "$ARCHIVE" | numfmt --to=iec)
103
+ SIZE_BYTES=$(stat -c%s "$ARCHIVE")
104
+ elif command -v stat >/dev/null 2>&1; then
105
+ SIZE_BYTES=$(stat -f%z "$ARCHIVE" 2>/dev/null || stat -c%s "$ARCHIVE" 2>/dev/null)
106
+ SIZE_HUMAN="${SIZE_BYTES} bytes"
107
+ fi
108
+
109
+ echo ""
110
+ echo "✅ mindos-runtime-${VERSION}.tar.gz"
111
+ echo " Size: ${SIZE_HUMAN} (${SIZE_BYTES} bytes)"
112
+ echo " SHA256: ${SHA256}"
113
+ echo " Path: ${ARCHIVE}"
package/scripts/setup.js CHANGED
@@ -1228,7 +1228,7 @@ async function main() {
1228
1228
  console.log(`\n${c.green(t('cfgSaved'))}: ${c.dim(CONFIG_PATH)}`);
1229
1229
 
1230
1230
  // ── Skill rules are now built into SKILL.md — no install needed ──────────
1231
- // user-skill-rules.md will be created on first preference capture or via `mindos init-skills`.
1231
+ // .mindos/user-preferences.md will be created on first preference capture or via `mindos init-skills`.
1232
1232
 
1233
1233
  // ── Step 7: MCP Agent Install ──────────────────────────────────────────────
1234
1234
  write('\n');
@@ -7,17 +7,21 @@ description: >
7
7
  Use when the task targets files inside the user's MindOS KB (mindRoot).
8
8
  NOT for editing app source, project docs, or paths outside the KB.
9
9
  Core concepts: Space, Instruction (INSTRUCTION.md), Skill (SKILL.md); notes can embody both.
10
+ Trigger when user asks to: save or record a note, search their knowledge base, update or edit
11
+ a file, organize notes, run a workflow or SOP, capture decisions from a session, append rows
12
+ to a table or CSV, hand off context to another agent — or says "帮我记下来" / "搜一下我的笔记" /
13
+ "更新知识库" / "整理文件" / "执行工作流".
10
14
  ---
11
15
 
12
16
  # MindOS Skill
13
17
 
14
- <!-- version: 1.3.1 -->
18
+ <!-- version: 1.3.2 -->
15
19
 
16
20
  **Before every task, internalize these 5 rules:**
17
21
 
18
22
  1. The **bootstrap directory tree is the primary index** — reason from names and hierarchy before calling search. Most questions can be answered by reading what's already in context.
19
23
  2. **Default to read-only.** Only invoke write tools when the user explicitly asks to save, record, organize, or edit. Lookup / summarize / quote = no writes.
20
- 3. **Rule precedence** (highest wins): user's current-turn instruction → `user-skill-rules.md` → nearest directory `INSTRUCTION.md` → root `INSTRUCTION.md` → this SKILL's defaults.
24
+ 3. **Rule precedence** (highest wins): user's current-turn instruction → `.mindos/user-preferences.md` → nearest directory `INSTRUCTION.md` → root `INSTRUCTION.md` → this SKILL's defaults.
21
25
  4. **Multi-file edits require a plan first.** Present the full change list; execute only after approval.
22
26
  5. After create/delete/move/rename → **sync affected READMEs** automatically.
23
27
 
@@ -83,8 +87,7 @@ User request
83
87
  └─ ASK for clarification. Propose 2-3 specific options based on KB state. Do NOT start editing.
84
88
  ```
85
89
 
86
- **For any write/SOP/structural path above → read [references/write-supplement.md](./references/write-supplement.md) first.**
87
- It covers: startup protocol, write tool selection, and step-by-step execution details for each path.
90
+ **For any write/SOP/structural path above → the write supplement is already loaded in context (see `## Write & Workflow Supplement` section below or in the next context block).**
88
91
 
89
92
  ---
90
93
 
@@ -97,7 +100,7 @@ It covers: startup protocol, write tool selection, and step-by-step execution de
97
100
  | Find files | `mindos_search_notes` (2-4 parallel keyword variants) | Single-keyword search |
98
101
  | Read content | `mindos_read_file` or `mindos_read_lines` (for large files) | Reading entire large file when you need 10 lines |
99
102
 
100
- Write, structural, and history tools → [references/write-supplement.md](./references/write-supplement.md).
103
+ Write, structural, and history tools → see Write & Workflow Supplement (loaded below or in next context block).
101
104
 
102
105
  ### Fallbacks
103
106
 
@@ -112,21 +115,33 @@ Write, structural, and history tools → [references/write-supplement.md](./refe
112
115
  |---------|------|-----------|
113
116
  | **Read-only Q&A** | Lookup / summarize / quote | Tree reasoning → search → read → answer with citations → state gaps |
114
117
 
115
- For write, SOP, structural, and handoff patterns → [references/write-supplement.md](./references/write-supplement.md).
118
+ For write, SOP, structural, and handoff patterns → see Write & Workflow Supplement (loaded below or in next context block).
116
119
 
117
120
  ---
118
121
 
119
- ## Interaction rules
122
+ ## Judgment heuristics
120
123
 
121
- - **Ambiguous request?** Ask first. Propose 2-3 options based on KB state (recent changes, directory structure). Never start reorganizing without understanding scope.
122
- - **Cite sources.** Every fact from the KB gets a file path so the user can verify.
123
- - **Brevity first.** Show the most likely match, not an exhaustive list.
124
+ **Save intent read vs. write boundary**
125
+ - "帮我记下来" / "记录一下" / "保存这个" = write
126
+ - "搜一下有没有关于 X 的笔记" / "总结上周的工作" = read-only
127
+ - Ambiguous boundary ("整理一下这些内容") → ask first: display only, or write back to KB?
128
+
129
+ **File location uncertainty**
130
+ - 扫目录树 5 秒内定不下来 → don't invent a new directory; use the nearest semantically-fit existing one and inform the user
131
+ - User says "just put it somewhere" → place in inbox or top-level general directory, propose classification after (triggers Structure classification hook)
132
+
133
+ **Scope creep signals**
134
+ - Single input routes to >5 files → pause, confirm scope; users rarely intend bulk rewrites
135
+ - "Update all of these" + content spans multiple topics → split into batches, confirm each, don't execute all at once
136
+
137
+ **Citation discipline**
138
+ - KB-cited facts must include the file path so the user can verify
124
139
 
125
140
  ---
126
141
 
127
142
  ## Post-task hooks
128
143
 
129
- After **write tasks** (not simple single-file edits or read-only), scan this table. If a condition matches, make a one-line proposal. At most 1 proposal; pick highest priority. Check `user-skill-rules.md` suppression section first. Skip all if user asked for quiet mode.
144
+ After **write tasks** (not simple single-file edits or read-only), scan this table. If a condition matches, make a one-line proposal. At most 1 proposal; pick highest priority. Check `.mindos/user-preferences.md` suppression section first. Skip all if user asked for quiet mode.
130
145
 
131
146
  | Hook | Priority | Condition |
132
147
  |------|----------|-----------|
@@ -142,7 +157,7 @@ If a hook triggers → read [references/post-task-hooks.md](./references/post-ta
142
157
 
143
158
  ## Preference capture
144
159
 
145
- When the user expresses a standing preference ("don't do X", "always put Y in Z"), read [references/preference-capture.md](./references/preference-capture.md) and follow the confirm-then-write flow to `user-skill-rules.md`.
160
+ When the user expresses a standing preference ("don't do X", "always put Y in Z"), read [references/preference-capture.md](./references/preference-capture.md) and follow the confirm-then-write flow to `.mindos/user-preferences.md`.
146
161
  **Do NOT read** preference-capture unless the user actually expressed a preference to persist.
147
162
 
148
163
  ## SOP authoring