@geminilight/mindos 0.6.69 → 0.6.70

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 (496) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +22 -21
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +7 -7
  10. package/_standalone/.next/routes-manifest.json +6 -0
  11. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  13. package/_standalone/.next/server/app/_global-error.html +2 -2
  14. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  22. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  26. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js +1 -1
  28. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  29. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/registry/route.js +1 -1
  38. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/acp/session/route.js +1 -1
  40. package/_standalone/.next/server/app/api/acp/session/route.js.nft.json +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/agents/copy-skill/route.js.nft.json +1 -1
  44. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/ask/route.js +13 -13
  48. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  53. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  55. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  57. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/channels/verify/route.js +1 -0
  59. package/_standalone/.next/server/app/api/channels/verify/route.js.nft.json +1 -0
  60. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -0
  61. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  63. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/extract-pdf/route.js +2 -2
  65. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  67. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  70. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  72. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  74. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/inbox/clip/route.js.nft.json +1 -1
  84. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  86. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/lint/route.js.nft.json +1 -1
  90. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.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/direct-tools/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  101. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  108. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  111. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  114. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/api/space-overview/route.js +2 -2
  122. package/_standalone/.next/server/app/api/space-overview/route.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  132. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  133. package/_standalone/.next/server/app/changelog/page.js +1 -1
  134. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  135. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  136. package/_standalone/.next/server/app/changes/page.js +1 -1
  137. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  138. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  139. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  140. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  141. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  142. package/_standalone/.next/server/app/echo/page.js +1 -1
  143. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  144. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  145. package/_standalone/.next/server/app/explore/page.js +1 -1
  146. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  147. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/app/help/page.js +1 -1
  149. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  150. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  151. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  152. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  153. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  154. package/_standalone/.next/server/app/login/page.js +1 -1
  155. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  156. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  157. package/_standalone/.next/server/app/page.js +1 -1
  158. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  159. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  160. package/_standalone/.next/server/app/setup/page.js +1 -1
  161. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  162. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  163. package/_standalone/.next/server/app/trash/page.js +3 -3
  164. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  165. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  166. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  167. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  168. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  169. package/_standalone/.next/server/app/wiki/page.js +1 -1
  170. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  171. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  172. package/_standalone/.next/server/app-paths-manifest.json +22 -21
  173. package/_standalone/.next/server/chunks/3437.js +2 -2
  174. package/_standalone/.next/server/chunks/5299.js +1 -0
  175. package/_standalone/.next/server/chunks/6022.js +42 -42
  176. package/_standalone/.next/server/chunks/6133.js +54 -0
  177. package/_standalone/.next/server/chunks/6539.js +1 -1
  178. package/_standalone/.next/server/chunks/8326.js +1 -0
  179. package/_standalone/.next/server/chunks/8388.js +5 -3
  180. package/_standalone/.next/server/chunks/953.js +6 -4
  181. package/_standalone/.next/server/chunks/9938.js +24 -0
  182. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  183. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  184. package/_standalone/.next/server/pages/500.html +2 -2
  185. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  186. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  187. package/_standalone/.next/static/chunks/1814.8a1fef15856dce84.js +1 -0
  188. package/_standalone/.next/static/chunks/2654-e07c692d6c99f25b.js +1 -0
  189. package/_standalone/.next/static/chunks/{2935.7d75923daaf448d3.js → 2935.9b08eeade3644806.js} +1 -1
  190. package/_standalone/.next/static/chunks/3269.a7343771e3f0ff58.js +48 -0
  191. package/_standalone/.next/static/chunks/3637.2b2697198968d83f.js +1 -0
  192. package/_standalone/.next/static/chunks/{5550-b7c97fc13628db15.js → 4327-d70a8d457e2d03fe.js} +1 -1
  193. package/_standalone/.next/static/chunks/48-c88ea6a2a45f15b4.js +28 -0
  194. package/_standalone/.next/static/chunks/5581-6d403608b5dfb20b.js +29 -0
  195. package/_standalone/.next/static/chunks/6902-edc5c487c696bd0b.js +3 -0
  196. package/_standalone/.next/static/chunks/808.72eb7bdd399e9a24.js +1 -0
  197. package/_standalone/.next/static/chunks/app/.well-known/agent-card.json/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  198. package/_standalone/.next/static/chunks/app/_global-error/{page-e0c1e2c67572781c.js → page-930dfa67e2789df5.js} +1 -1
  199. package/_standalone/.next/static/chunks/app/agents/page-3dc2bf2f6bc7334c.js +1 -0
  200. package/_standalone/.next/static/chunks/app/api/a2a/agents/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  201. package/_standalone/.next/static/chunks/app/api/a2a/delegations/{route-e0c1e2c67572781c.js → route-930dfa67e2789df5.js} +1 -1
  202. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-930dfa67e2789df5.js +1 -0
  203. package/_standalone/.next/static/chunks/app/api/a2a/route-930dfa67e2789df5.js +1 -0
  204. package/_standalone/.next/static/chunks/app/api/acp/config/route-930dfa67e2789df5.js +1 -0
  205. package/_standalone/.next/static/chunks/app/api/acp/detect/route-930dfa67e2789df5.js +1 -0
  206. package/_standalone/.next/static/chunks/app/api/acp/install/route-930dfa67e2789df5.js +1 -0
  207. package/_standalone/.next/static/chunks/app/api/acp/registry/route-930dfa67e2789df5.js +1 -0
  208. package/_standalone/.next/static/chunks/app/api/acp/session/route-930dfa67e2789df5.js +1 -0
  209. package/_standalone/.next/static/chunks/app/api/agent-activity/route-930dfa67e2789df5.js +1 -0
  210. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-930dfa67e2789df5.js +1 -0
  211. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-930dfa67e2789df5.js +1 -0
  212. package/_standalone/.next/static/chunks/app/api/agents/custom/route-930dfa67e2789df5.js +1 -0
  213. package/_standalone/.next/static/chunks/app/api/ask/route-930dfa67e2789df5.js +1 -0
  214. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-930dfa67e2789df5.js +1 -0
  215. package/_standalone/.next/static/chunks/app/api/auth/route-930dfa67e2789df5.js +1 -0
  216. package/_standalone/.next/static/chunks/app/api/backlinks/route-930dfa67e2789df5.js +1 -0
  217. package/_standalone/.next/static/chunks/app/api/bootstrap/route-930dfa67e2789df5.js +1 -0
  218. package/_standalone/.next/static/chunks/app/api/changes/route-930dfa67e2789df5.js +1 -0
  219. package/_standalone/.next/static/chunks/app/api/channels/verify/route-930dfa67e2789df5.js +1 -0
  220. package/_standalone/.next/static/chunks/app/api/connect/route-930dfa67e2789df5.js +1 -0
  221. package/_standalone/.next/static/chunks/app/api/export/route-930dfa67e2789df5.js +1 -0
  222. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-930dfa67e2789df5.js +1 -0
  223. package/_standalone/.next/static/chunks/app/api/file/import/route-930dfa67e2789df5.js +1 -0
  224. package/_standalone/.next/static/chunks/app/api/file/raw/route-930dfa67e2789df5.js +1 -0
  225. package/_standalone/.next/static/chunks/app/api/file/route-930dfa67e2789df5.js +1 -0
  226. package/_standalone/.next/static/chunks/app/api/files/route-930dfa67e2789df5.js +1 -0
  227. package/_standalone/.next/static/chunks/app/api/git/route-930dfa67e2789df5.js +1 -0
  228. package/_standalone/.next/static/chunks/app/api/graph/route-930dfa67e2789df5.js +1 -0
  229. package/_standalone/.next/static/chunks/app/api/health/route-930dfa67e2789df5.js +1 -0
  230. package/_standalone/.next/static/chunks/app/api/im/config/route-930dfa67e2789df5.js +1 -0
  231. package/_standalone/.next/static/chunks/app/api/im/status/route-930dfa67e2789df5.js +1 -0
  232. package/_standalone/.next/static/chunks/app/api/im/test/route-930dfa67e2789df5.js +1 -0
  233. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-930dfa67e2789df5.js +1 -0
  234. package/_standalone/.next/static/chunks/app/api/inbox/route-930dfa67e2789df5.js +1 -0
  235. package/_standalone/.next/static/chunks/app/api/init/route-930dfa67e2789df5.js +1 -0
  236. package/_standalone/.next/static/chunks/app/api/lint/route-930dfa67e2789df5.js +1 -0
  237. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-930dfa67e2789df5.js +1 -0
  238. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-930dfa67e2789df5.js +1 -0
  239. package/_standalone/.next/static/chunks/app/api/mcp/install/route-930dfa67e2789df5.js +1 -0
  240. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-930dfa67e2789df5.js +1 -0
  241. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-930dfa67e2789df5.js +1 -0
  242. package/_standalone/.next/static/chunks/app/api/mcp/status/route-930dfa67e2789df5.js +1 -0
  243. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-930dfa67e2789df5.js +1 -0
  244. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-930dfa67e2789df5.js +1 -0
  245. package/_standalone/.next/static/chunks/app/api/monitoring/route-930dfa67e2789df5.js +1 -0
  246. package/_standalone/.next/static/chunks/app/api/recent-files/route-930dfa67e2789df5.js +1 -0
  247. package/_standalone/.next/static/chunks/app/api/restart/route-930dfa67e2789df5.js +1 -0
  248. package/_standalone/.next/static/chunks/app/api/search/route-930dfa67e2789df5.js +1 -0
  249. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-930dfa67e2789df5.js +1 -0
  250. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-930dfa67e2789df5.js +1 -0
  251. package/_standalone/.next/static/chunks/app/api/settings/route-930dfa67e2789df5.js +1 -0
  252. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-930dfa67e2789df5.js +1 -0
  253. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-930dfa67e2789df5.js +1 -0
  254. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-930dfa67e2789df5.js +1 -0
  255. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-930dfa67e2789df5.js +1 -0
  256. package/_standalone/.next/static/chunks/app/api/setup/ls/route-930dfa67e2789df5.js +1 -0
  257. package/_standalone/.next/static/chunks/app/api/setup/route-930dfa67e2789df5.js +1 -0
  258. package/_standalone/.next/static/chunks/app/api/skills/route-930dfa67e2789df5.js +1 -0
  259. package/_standalone/.next/static/chunks/app/api/space-overview/route-930dfa67e2789df5.js +1 -0
  260. package/_standalone/.next/static/chunks/app/api/sync/route-930dfa67e2789df5.js +1 -0
  261. package/_standalone/.next/static/chunks/app/api/tree-version/route-930dfa67e2789df5.js +1 -0
  262. package/_standalone/.next/static/chunks/app/api/uninstall/route-930dfa67e2789df5.js +1 -0
  263. package/_standalone/.next/static/chunks/app/api/update/route-930dfa67e2789df5.js +1 -0
  264. package/_standalone/.next/static/chunks/app/api/update-check/route-930dfa67e2789df5.js +1 -0
  265. package/_standalone/.next/static/chunks/app/api/update-status/route-930dfa67e2789df5.js +1 -0
  266. package/_standalone/.next/static/chunks/app/api/workflows/route-930dfa67e2789df5.js +1 -0
  267. package/_standalone/.next/static/chunks/app/changes/page-930dfa67e2789df5.js +1 -0
  268. package/_standalone/.next/static/chunks/app/echo/[segment]/page-75a6330292613587.js +157 -0
  269. package/_standalone/.next/static/chunks/app/echo/page-930dfa67e2789df5.js +1 -0
  270. package/_standalone/.next/static/chunks/app/layout-8aa53b34ef34a246.js +133 -0
  271. package/_standalone/.next/static/chunks/app/loading-930dfa67e2789df5.js +1 -0
  272. package/_standalone/.next/static/chunks/app/{page-c3be6477dbcf182d.js → page-318332501426ef5b.js} +1 -1
  273. package/_standalone/.next/static/chunks/app/trash/page-17bd5aedcfea9b65.js +1 -0
  274. package/_standalone/.next/static/chunks/app/view/[...path]/loading-930dfa67e2789df5.js +1 -0
  275. package/_standalone/.next/static/chunks/app/view/[...path]/page-d5c37c41c556013d.js +12 -0
  276. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-930dfa67e2789df5.js +1 -0
  277. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-930dfa67e2789df5.js +1 -0
  278. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-930dfa67e2789df5.js +1 -0
  279. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-930dfa67e2789df5.js +1 -0
  280. package/_standalone/.next/static/chunks/webpack-1c2d44f6d86f3986.js +1 -0
  281. package/_standalone/.next/static/css/a8cadde78aea8585.css +1 -0
  282. package/_standalone/.next/static/ixCTELNH6V05Z00pC6ZMO/_buildManifest.js +1 -0
  283. package/_standalone/.next/trace +72 -71
  284. package/_standalone/.next/types/routes.d.ts +2 -1
  285. package/_standalone/.next/types/validator.ts +9 -0
  286. package/_standalone/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  287. package/_standalone/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  288. package/_standalone/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  289. package/_standalone/__tests__/acp/agent-descriptors.test.ts +36 -0
  290. package/_standalone/__tests__/acp/session.test.ts +346 -167
  291. package/_standalone/__tests__/agent/provider-endpoints.test.ts +70 -0
  292. package/_standalone/__tests__/api/channels-verify.test.ts +75 -0
  293. package/_standalone/__tests__/api/extract-pdf.test.ts +265 -0
  294. package/_standalone/__tests__/api/test-key.test.ts +15 -3
  295. package/_standalone/__tests__/channel-mgmt.test.js +11 -0
  296. package/_standalone/__tests__/components/breadcrumb-header-ux.test.ts +14 -0
  297. package/_standalone/__tests__/components/header-toc-vertical-alignment.test.ts +23 -0
  298. package/_standalone/__tests__/components/table-of-contents-header-layout.test.ts +15 -0
  299. package/_standalone/__tests__/components/view-page-header-layout.test.ts +13 -0
  300. package/_standalone/__tests__/components/view-page-header-scroll-stability.test.ts +34 -0
  301. package/_standalone/__tests__/core/hybrid-search.test.ts +109 -0
  302. package/_standalone/components/Breadcrumb.tsx +11 -11
  303. package/_standalone/components/FindInPage.tsx +1 -1
  304. package/_standalone/components/MarkdownView.tsx +4 -0
  305. package/_standalone/components/Panel.tsx +17 -10
  306. package/_standalone/components/TableOfContents.tsx +9 -9
  307. package/_standalone/components/agents/AgentsContentChannelDetail.tsx +168 -54
  308. package/_standalone/components/agents/AgentsContentChannels.tsx +22 -22
  309. package/_standalone/components/ask/AskContent.tsx +68 -28
  310. package/_standalone/components/ask/AskHeader.tsx +6 -2
  311. package/_standalone/components/ask/ProviderModelCapsule.tsx +11 -9
  312. package/_standalone/components/ask/SessionHistoryPanel.tsx +398 -0
  313. package/_standalone/components/settings/AiTab.tsx +5 -1
  314. package/_standalone/components/settings/KnowledgeTab.tsx +92 -1
  315. package/_standalone/components/settings/McpConnectGuides.tsx +4 -0
  316. package/_standalone/components/settings/McpPortSection.tsx +207 -0
  317. package/_standalone/components/settings/McpTab.tsx +1 -5
  318. package/_standalone/components/settings/TestButton.tsx +1 -0
  319. package/_standalone/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  320. package/_standalone/components/settings/types.ts +12 -0
  321. package/_standalone/components/settings/useCustomProviderForm.ts +2 -2
  322. package/_standalone/data/skills/mindos/SKILL.md +45 -1
  323. package/_standalone/hooks/useAcpDetection.ts +1 -1
  324. package/_standalone/hooks/useAcpRegistry.ts +1 -1
  325. package/_standalone/hooks/useFileImport.ts +7 -2
  326. package/_standalone/hooks/useFileUpload.ts +17 -10
  327. package/_standalone/lib/acp/index.ts +3 -7
  328. package/_standalone/lib/acp/types.ts +0 -29
  329. package/_standalone/lib/im/platforms.ts +6 -2
  330. package/_standalone/lib/pdf-extract.ts +6 -2
  331. package/_standalone/package-lock.json +12 -2
  332. package/_standalone/package.json +2 -1
  333. package/_standalone/tsconfig.tsbuildinfo +1 -1
  334. package/app/MINDOS_ARCHITECTURE_DIAGRAM.md +488 -0
  335. package/app/MINDOS_EXPLORATION_SUMMARY.md +229 -0
  336. package/app/MINDOS_INFRASTRUCTURE_ANALYSIS.md +732 -0
  337. package/app/app/api/channels/verify/route.ts +54 -0
  338. package/app/app/api/extract-pdf/route.ts +17 -3
  339. package/app/app/api/settings/list-models/route.ts +40 -44
  340. package/app/app/api/settings/route.ts +16 -0
  341. package/app/app/api/settings/test-key/route.ts +5 -2
  342. package/app/app/view/[...path]/ViewPageClient.tsx +1 -1
  343. package/app/components/Breadcrumb.tsx +11 -11
  344. package/app/components/DirView.tsx +1 -1
  345. package/app/components/FindInPage.tsx +1 -1
  346. package/app/components/InboxView.tsx +2 -2
  347. package/app/components/MarkdownView.tsx +4 -0
  348. package/app/components/Panel.tsx +17 -10
  349. package/app/components/TableOfContents.tsx +9 -9
  350. package/app/components/agents/AgentsContentChannelDetail.tsx +168 -54
  351. package/app/components/agents/AgentsContentChannels.tsx +22 -22
  352. package/app/components/ask/AskContent.tsx +68 -28
  353. package/app/components/ask/AskHeader.tsx +6 -2
  354. package/app/components/ask/ProviderModelCapsule.tsx +11 -9
  355. package/app/components/ask/SessionHistoryPanel.tsx +398 -0
  356. package/app/components/settings/AiTab.tsx +5 -1
  357. package/app/components/settings/KnowledgeTab.tsx +92 -1
  358. package/app/components/settings/McpConnectGuides.tsx +4 -0
  359. package/app/components/settings/McpPortSection.tsx +207 -0
  360. package/app/components/settings/McpTab.tsx +1 -5
  361. package/app/components/settings/TestButton.tsx +1 -0
  362. package/app/components/settings/{ServerPortsCard.tsx → WebPortSection.tsx} +66 -151
  363. package/app/components/settings/types.ts +12 -0
  364. package/app/components/settings/useCustomProviderForm.ts +2 -2
  365. package/app/data/skills/mindos/SKILL.md +45 -1
  366. package/app/hooks/useAcpDetection.ts +1 -1
  367. package/app/hooks/useAcpRegistry.ts +1 -1
  368. package/app/hooks/useFileImport.ts +7 -2
  369. package/app/hooks/useFileUpload.ts +17 -10
  370. package/app/lib/acp/agent-descriptors.ts +18 -0
  371. package/app/lib/acp/index.ts +3 -7
  372. package/app/lib/acp/registry.ts +1 -1
  373. package/app/lib/acp/session.ts +237 -530
  374. package/app/lib/acp/subprocess.ts +224 -427
  375. package/app/lib/acp/types.ts +0 -29
  376. package/app/lib/agent/model.ts +20 -4
  377. package/app/lib/agent/non-streaming.ts +37 -20
  378. package/app/lib/agent/providers.ts +31 -0
  379. package/app/lib/agent/tools.ts +2 -1
  380. package/app/lib/core/embedding-index.ts +285 -0
  381. package/app/lib/core/embedding-provider.ts +164 -0
  382. package/app/lib/core/hybrid-search.ts +160 -0
  383. package/app/lib/core/search.ts +11 -21
  384. package/app/lib/i18n/modules/ai-chat.ts +26 -0
  385. package/app/lib/i18n/modules/panels.ts +14 -0
  386. package/app/lib/i18n/modules/settings.ts +2 -0
  387. package/app/lib/im/platforms.ts +6 -2
  388. package/app/lib/im/verify.ts +94 -0
  389. package/app/lib/pdf-extract.ts +6 -2
  390. package/app/lib/settings.ts +23 -0
  391. package/app/package.json +2 -1
  392. package/bin/cli.js +3 -1
  393. package/bin/commands/channel.js +342 -0
  394. package/bin/commands/update.js +11 -4
  395. package/bin/lib/build.js +34 -16
  396. package/bin/lib/channel-config.js +168 -0
  397. package/bin/lib/channel-constants.js +88 -0
  398. package/bin/lib/channel-mgmt.js +244 -0
  399. package/bin/lib/channel-prompts.js +72 -0
  400. package/bin/lib/channel-validate.js +57 -0
  401. package/bin/lib/safe-rm.js +165 -0
  402. package/package.json +1 -1
  403. package/skills/mindos/SKILL.md +45 -1
  404. package/_standalone/.next/server/chunks/1750.js +0 -1
  405. package/_standalone/.next/server/chunks/7200.js +0 -52
  406. package/_standalone/.next/static/HL8b6d3NCfyoAXNuY2kcn/_buildManifest.js +0 -1
  407. package/_standalone/.next/static/chunks/1814.a79b84d37df75c43.js +0 -1
  408. package/_standalone/.next/static/chunks/3466.bc6ab3172ad66091.js +0 -1
  409. package/_standalone/.next/static/chunks/3637.38c4f28d8f698e0e.js +0 -1
  410. package/_standalone/.next/static/chunks/4351-9ab695985bb808ad.js +0 -1
  411. package/_standalone/.next/static/chunks/5133-3779d65f4fdfb041.js +0 -30
  412. package/_standalone/.next/static/chunks/5581-4dd3d32f6e8606ec.js +0 -29
  413. package/_standalone/.next/static/chunks/8735.66a049abcf0971fb.js +0 -48
  414. package/_standalone/.next/static/chunks/app/agents/page-4c0637183e46c8d3.js +0 -1
  415. package/_standalone/.next/static/chunks/app/api/a2a/discover/route-e0c1e2c67572781c.js +0 -1
  416. package/_standalone/.next/static/chunks/app/api/a2a/route-e0c1e2c67572781c.js +0 -1
  417. package/_standalone/.next/static/chunks/app/api/acp/config/route-e0c1e2c67572781c.js +0 -1
  418. package/_standalone/.next/static/chunks/app/api/acp/detect/route-e0c1e2c67572781c.js +0 -1
  419. package/_standalone/.next/static/chunks/app/api/acp/install/route-e0c1e2c67572781c.js +0 -1
  420. package/_standalone/.next/static/chunks/app/api/acp/registry/route-e0c1e2c67572781c.js +0 -1
  421. package/_standalone/.next/static/chunks/app/api/acp/session/route-e0c1e2c67572781c.js +0 -1
  422. package/_standalone/.next/static/chunks/app/api/agent-activity/route-e0c1e2c67572781c.js +0 -1
  423. package/_standalone/.next/static/chunks/app/api/agents/copy-skill/route-e0c1e2c67572781c.js +0 -1
  424. package/_standalone/.next/static/chunks/app/api/agents/custom/detect/route-e0c1e2c67572781c.js +0 -1
  425. package/_standalone/.next/static/chunks/app/api/agents/custom/route-e0c1e2c67572781c.js +0 -1
  426. package/_standalone/.next/static/chunks/app/api/ask/route-e0c1e2c67572781c.js +0 -1
  427. package/_standalone/.next/static/chunks/app/api/ask-sessions/route-e0c1e2c67572781c.js +0 -1
  428. package/_standalone/.next/static/chunks/app/api/auth/route-e0c1e2c67572781c.js +0 -1
  429. package/_standalone/.next/static/chunks/app/api/backlinks/route-e0c1e2c67572781c.js +0 -1
  430. package/_standalone/.next/static/chunks/app/api/bootstrap/route-e0c1e2c67572781c.js +0 -1
  431. package/_standalone/.next/static/chunks/app/api/changes/route-e0c1e2c67572781c.js +0 -1
  432. package/_standalone/.next/static/chunks/app/api/connect/route-e0c1e2c67572781c.js +0 -1
  433. package/_standalone/.next/static/chunks/app/api/export/route-e0c1e2c67572781c.js +0 -1
  434. package/_standalone/.next/static/chunks/app/api/extract-pdf/route-e0c1e2c67572781c.js +0 -1
  435. package/_standalone/.next/static/chunks/app/api/file/import/route-e0c1e2c67572781c.js +0 -1
  436. package/_standalone/.next/static/chunks/app/api/file/raw/route-e0c1e2c67572781c.js +0 -1
  437. package/_standalone/.next/static/chunks/app/api/file/route-e0c1e2c67572781c.js +0 -1
  438. package/_standalone/.next/static/chunks/app/api/files/route-e0c1e2c67572781c.js +0 -1
  439. package/_standalone/.next/static/chunks/app/api/git/route-e0c1e2c67572781c.js +0 -1
  440. package/_standalone/.next/static/chunks/app/api/graph/route-e0c1e2c67572781c.js +0 -1
  441. package/_standalone/.next/static/chunks/app/api/health/route-e0c1e2c67572781c.js +0 -1
  442. package/_standalone/.next/static/chunks/app/api/im/config/route-e0c1e2c67572781c.js +0 -1
  443. package/_standalone/.next/static/chunks/app/api/im/status/route-e0c1e2c67572781c.js +0 -1
  444. package/_standalone/.next/static/chunks/app/api/im/test/route-e0c1e2c67572781c.js +0 -1
  445. package/_standalone/.next/static/chunks/app/api/inbox/clip/route-e0c1e2c67572781c.js +0 -1
  446. package/_standalone/.next/static/chunks/app/api/inbox/route-e0c1e2c67572781c.js +0 -1
  447. package/_standalone/.next/static/chunks/app/api/init/route-e0c1e2c67572781c.js +0 -1
  448. package/_standalone/.next/static/chunks/app/api/lint/route-e0c1e2c67572781c.js +0 -1
  449. package/_standalone/.next/static/chunks/app/api/mcp/agents/route-e0c1e2c67572781c.js +0 -1
  450. package/_standalone/.next/static/chunks/app/api/mcp/direct-tools/route-e0c1e2c67572781c.js +0 -1
  451. package/_standalone/.next/static/chunks/app/api/mcp/install/route-e0c1e2c67572781c.js +0 -1
  452. package/_standalone/.next/static/chunks/app/api/mcp/install-skill/route-e0c1e2c67572781c.js +0 -1
  453. package/_standalone/.next/static/chunks/app/api/mcp/restart/route-e0c1e2c67572781c.js +0 -1
  454. package/_standalone/.next/static/chunks/app/api/mcp/status/route-e0c1e2c67572781c.js +0 -1
  455. package/_standalone/.next/static/chunks/app/api/mcp/tools/route-e0c1e2c67572781c.js +0 -1
  456. package/_standalone/.next/static/chunks/app/api/mcp/uninstall/route-e0c1e2c67572781c.js +0 -1
  457. package/_standalone/.next/static/chunks/app/api/monitoring/route-e0c1e2c67572781c.js +0 -1
  458. package/_standalone/.next/static/chunks/app/api/recent-files/route-e0c1e2c67572781c.js +0 -1
  459. package/_standalone/.next/static/chunks/app/api/restart/route-e0c1e2c67572781c.js +0 -1
  460. package/_standalone/.next/static/chunks/app/api/search/route-e0c1e2c67572781c.js +0 -1
  461. package/_standalone/.next/static/chunks/app/api/settings/list-models/route-e0c1e2c67572781c.js +0 -1
  462. package/_standalone/.next/static/chunks/app/api/settings/reset-token/route-e0c1e2c67572781c.js +0 -1
  463. package/_standalone/.next/static/chunks/app/api/settings/route-e0c1e2c67572781c.js +0 -1
  464. package/_standalone/.next/static/chunks/app/api/settings/test-key/route-e0c1e2c67572781c.js +0 -1
  465. package/_standalone/.next/static/chunks/app/api/setup/check-path/route-e0c1e2c67572781c.js +0 -1
  466. package/_standalone/.next/static/chunks/app/api/setup/check-port/route-e0c1e2c67572781c.js +0 -1
  467. package/_standalone/.next/static/chunks/app/api/setup/generate-token/route-e0c1e2c67572781c.js +0 -1
  468. package/_standalone/.next/static/chunks/app/api/setup/ls/route-e0c1e2c67572781c.js +0 -1
  469. package/_standalone/.next/static/chunks/app/api/setup/route-e0c1e2c67572781c.js +0 -1
  470. package/_standalone/.next/static/chunks/app/api/skills/route-e0c1e2c67572781c.js +0 -1
  471. package/_standalone/.next/static/chunks/app/api/space-overview/route-e0c1e2c67572781c.js +0 -1
  472. package/_standalone/.next/static/chunks/app/api/sync/route-e0c1e2c67572781c.js +0 -1
  473. package/_standalone/.next/static/chunks/app/api/tree-version/route-e0c1e2c67572781c.js +0 -1
  474. package/_standalone/.next/static/chunks/app/api/uninstall/route-e0c1e2c67572781c.js +0 -1
  475. package/_standalone/.next/static/chunks/app/api/update/route-e0c1e2c67572781c.js +0 -1
  476. package/_standalone/.next/static/chunks/app/api/update-check/route-e0c1e2c67572781c.js +0 -1
  477. package/_standalone/.next/static/chunks/app/api/update-status/route-e0c1e2c67572781c.js +0 -1
  478. package/_standalone/.next/static/chunks/app/api/workflows/route-e0c1e2c67572781c.js +0 -1
  479. package/_standalone/.next/static/chunks/app/changes/page-e0c1e2c67572781c.js +0 -1
  480. package/_standalone/.next/static/chunks/app/echo/[segment]/page-5333ab47257fab7f.js +0 -159
  481. package/_standalone/.next/static/chunks/app/echo/page-e0c1e2c67572781c.js +0 -1
  482. package/_standalone/.next/static/chunks/app/layout-bd0652768781e726.js +0 -133
  483. package/_standalone/.next/static/chunks/app/loading-e0c1e2c67572781c.js +0 -1
  484. package/_standalone/.next/static/chunks/app/trash/page-8280ba2f5c20861e.js +0 -1
  485. package/_standalone/.next/static/chunks/app/view/[...path]/loading-e0c1e2c67572781c.js +0 -1
  486. package/_standalone/.next/static/chunks/app/view/[...path]/page-b942374e2f88c53e.js +0 -12
  487. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-e0c1e2c67572781c.js +0 -1
  488. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-e0c1e2c67572781c.js +0 -1
  489. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-e0c1e2c67572781c.js +0 -1
  490. package/_standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e0c1e2c67572781c.js +0 -1
  491. package/_standalone/.next/static/chunks/webpack-9e42857d6c44fe70.js +0 -1
  492. package/_standalone/.next/static/css/8b1f248d6540e52f.css +0 -1
  493. package/_standalone/lib/core/__tests__/synonym-dict.test.ts +0 -82
  494. package/app/lib/core/__tests__/synonym-dict.test.ts +0 -82
  495. package/app/lib/core/synonym-dict.ts +0 -139
  496. /package/_standalone/.next/static/{HL8b6d3NCfyoAXNuY2kcn → ixCTELNH6V05Z00pC6ZMO}/_ssgManifest.js +0 -0
@@ -0,0 +1,732 @@
1
+ # MindOS Infrastructure Analysis: Settings, LLM API Management, and Search
2
+
3
+ ## Executive Summary
4
+
5
+ MindOS uses a unified, extensible architecture for managing user settings (including API keys), LLM provider configurations, and search infrastructure. The system is designed to support optional features through modular plugin patterns and configuration-driven behavior. Below is a detailed analysis of the three pillars required for adding embedding-based RAG search.
6
+
7
+ ---
8
+
9
+ ## 1. SETTINGS SYSTEM
10
+
11
+ ### 1.1 Settings Storage Location & Format
12
+
13
+ **Path:** `~/.mindos/config.json` (platform-independent)
14
+ - Stored in user's home directory under `.mindos/` directory
15
+ - Single JSON file, atomic writes via rename (prevents corruption on crash)
16
+ - Synced from multiple sources (CLI, API, UI)
17
+
18
+ **Example structure:**
19
+ ```json
20
+ {
21
+ "mindRoot": "/path/to/mind",
22
+ "port": 3003,
23
+ "mcpPort": 8700,
24
+ "authToken": "token-here",
25
+ "webPassword": "password",
26
+ "ai": {
27
+ "activeProvider": "p_esc9eiuh",
28
+ "providers": [...]
29
+ },
30
+ "agent": {
31
+ "maxSteps": 20,
32
+ "enableThinking": true
33
+ },
34
+ "baseUrlCompat": {},
35
+ "connectionMode": {"cli": true, "mcp": true},
36
+ "guideState": {...},
37
+ "disabledSkills": [],
38
+ "installedSkillAgents": []
39
+ }
40
+ ```
41
+
42
+ ### 1.2 Settings API Surface
43
+
44
+ **File:** `lib/settings.ts` (core interface)
45
+
46
+ **Key Functions:**
47
+ ```typescript
48
+ readSettings(): ServerSettings
49
+ // Reads from ~/.mindos/config.json, auto-migrates old formats
50
+ // Returns typed ServerSettings interface
51
+ // Handles corruption gracefully (returns defaults + setupPending=true)
52
+
53
+ writeSettings(settings: ServerSettings): void
54
+ // Atomic JSON write via temp file + rename
55
+ // Merges with existing config to preserve unknown fields
56
+ // Non-critical failures silently caught
57
+ ```
58
+
59
+ **Key Types:**
60
+ ```typescript
61
+ interface ServerSettings {
62
+ ai: AiConfig;
63
+ agent?: AgentConfig;
64
+ mindRoot: string;
65
+ port?: number;
66
+ mcpPort?: number;
67
+ authToken?: string;
68
+ webPassword?: string;
69
+ startMode?: 'dev' | 'start' | 'daemon';
70
+ setupPending?: boolean;
71
+ disabledSkills?: string[];
72
+ guideState?: GuideState;
73
+ acpAgents?: Record<string, AcpAgentOverride>;
74
+ baseUrlCompat?: Record<string, 'streaming' | 'non-streaming'>;
75
+ connectionMode?: { cli: boolean; mcp: boolean };
76
+ customAgents?: CustomAgentDef[];
77
+ }
78
+
79
+ interface AiConfig {
80
+ activeProvider: string; // e.g., "p_esc9eiuh" (provider entry ID)
81
+ providers: Provider[]; // Unified array of all configured providers
82
+ }
83
+
84
+ interface AgentConfig {
85
+ maxSteps?: number; // 1-30, default 20
86
+ enableThinking?: boolean; // Anthropic only, default false
87
+ thinkingBudget?: number; // default 5000
88
+ contextStrategy?: 'auto' | 'off';
89
+ reconnectRetries?: number;
90
+ }
91
+ ```
92
+
93
+ ### 1.3 Settings I/O Patterns
94
+
95
+ **File:** `lib/sync-config.ts` (companion functions)
96
+ ```typescript
97
+ atomicWriteJSON(filePath, data) // Temp file + rename pattern
98
+ loadConfig(): Record<string, any> // Load config.json
99
+ saveConfig(config) // Save config.json
100
+ loadSyncState(): Record<string, any> // Load sync-state.json
101
+ ```
102
+
103
+ **Constants:**
104
+ ```typescript
105
+ SETTINGS_PATH = ~/.mindos/config.json
106
+ SYNC_STATE_PATH = ~/.mindos/sync-state.json
107
+ ```
108
+
109
+ ### 1.4 Settings UI Flow
110
+
111
+ **File:** `components/settings/AiTab.tsx` (example)
112
+ - Settings UI component (React)
113
+ - Fetches settings via `GET /api/settings`
114
+ - Updates settings via `POST /api/settings`
115
+ - Auto-saves individual field changes
116
+
117
+ **API Routes:**
118
+ ```
119
+ GET /api/settings → Returns all settings + env overrides
120
+ POST /api/settings → Writes full settings object
121
+ POST /api/settings/test-key → Tests LLM provider connectivity
122
+ GET /api/settings/list-models → Lists available models for a provider
123
+ POST /api/settings/reset-token → Regenerates auth token
124
+ ```
125
+
126
+ **File:** `app/api/settings/route.ts`
127
+ ```typescript
128
+ GET() // Returns settings + masking for tokens, env var detection
129
+ POST() // Validates, merges, writes to settings file
130
+ ```
131
+
132
+ ### 1.5 Extension Point: Adding New Settings Fields
133
+
134
+ **Pattern:**
135
+ 1. Add new field to `ServerSettings` interface in `lib/settings.ts`
136
+ 2. Add read/write logic in `readSettings()` / `writeSettings()`
137
+ 3. Add parsing function (e.g., `parseNewField()`) with safe type coercion
138
+ 4. Add default value to `DEFAULTS` object
139
+ 5. Add UI component in `components/settings/` (e.g., `NewFeatureTab.tsx`)
140
+ 6. Wire up API route `/api/settings` to pass field through
141
+
142
+ **Example for RAG embeddings:**
143
+ ```typescript
144
+ interface RagConfig {
145
+ enabled: boolean;
146
+ embeddingModel: string; // e.g., "text-embedding-3-small"
147
+ embeddingProvider: ProviderId; // e.g., "openai"
148
+ embeddingApiKey: string;
149
+ indexType: 'bm25' | 'hybrid' | 'semantic'; // BM25 vs embeddings
150
+ chunkSize: number;
151
+ chunkOverlap: number;
152
+ }
153
+
154
+ interface ServerSettings {
155
+ // ... existing fields
156
+ rag?: RagConfig;
157
+ }
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 2. LLM API KEY MANAGEMENT
163
+
164
+ ### 2.1 Provider Configuration Architecture
165
+
166
+ **File:** `lib/agent/providers.ts`
167
+
168
+ **Provider Types:**
169
+ - `ProviderId`: Union type of all supported providers
170
+ - Primary: `'anthropic'`, `'openai'`, `'google'`, `'groq'`
171
+ - Extended: `'xai'`, `'openrouter'`, `'mistral'`, `'deepseek'`, `'zai'`, `'kimi-coding'`, `'cerebras'`, `'ollama'`, etc.
172
+
173
+ **Unified Provider Entry:**
174
+ ```typescript
175
+ interface Provider {
176
+ id: string; // "p_" + 8 random chars (e.g., "p_esc9eiuh")
177
+ name: string; // User-visible name (e.g., "My OpenAI")
178
+ protocol: ProviderId; // Which API protocol to use
179
+ apiKey: string; // Actual API key
180
+ model: string; // Model ID (e.g., "gpt-5.4")
181
+ baseUrl: string; // Custom endpoint URL (for self-hosted, proxies)
182
+ }
183
+ ```
184
+
185
+ **Provider Presets (Metadata):**
186
+ ```typescript
187
+ interface ProviderPreset {
188
+ id: ProviderId;
189
+ name: string; // e.g., "Anthropic"
190
+ nameZh: string; // Chinese name
191
+ shortLabel: string; // Capsule label (3-8 chars)
192
+ defaultModel: string;
193
+ fixedBaseUrl?: string; // For Ollama, DeepSeek (can't override)
194
+ apiKeyFallback?: string; // For Ollama (no auth needed)
195
+ supportsBaseUrl: boolean;
196
+ supportsThinking: boolean;
197
+ supportsListModels: boolean;
198
+ signupUrl?: string;
199
+ category: 'primary' | 'more';
200
+ }
201
+ ```
202
+
203
+ **Constants:**
204
+ ```typescript
205
+ PROVIDER_PRESETS[ProviderId] // Registry of all provider metadata
206
+ ALL_PROVIDER_IDS: ProviderId[] // All supported IDs
207
+ ```
208
+
209
+ ### 2.2 API Key Resolution Priority Chain
210
+
211
+ **Function:** `effectiveAiConfig(providerOverride?: string)` in `lib/settings.ts`
212
+
213
+ **Resolution order (highest to lowest priority):**
214
+ 1. Saved config file (`config.json` → `ai.providers[]`)
215
+ 2. Environment variable (e.g., `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`)
216
+ 3. Preset default/fallback (e.g., Ollama has `apiKeyFallback`)
217
+
218
+ ```typescript
219
+ effectiveAiConfig(providerOverride?: string): {
220
+ provider: ProviderId;
221
+ apiKey: string;
222
+ model: string;
223
+ baseUrl: string;
224
+ }
225
+ ```
226
+
227
+ ### 2.3 Environment Variable Mapping
228
+
229
+ **Function:** `getApiKeyEnvVar(providerId: ProviderId)` in `lib/agent/providers.ts`
230
+
231
+ **Examples:**
232
+ - `anthropic` → `ANTHROPIC_API_KEY`
233
+ - `openai` → `OPENAI_API_KEY`
234
+ - `google` → `GOOGLE_API_KEY`
235
+ - `groq` → `GROQ_API_KEY`
236
+ - etc.
237
+
238
+ **Detection:** `GET /api/settings` response includes:
239
+ ```typescript
240
+ envOverrides: Record<string, boolean> // Which env vars are set
241
+ envValues: Record<string, string> // Values (masked if set)
242
+ ```
243
+
244
+ ### 2.4 Provider Validation & Parsing
245
+
246
+ **Function:** `parseProviders(raw: unknown): Provider[]` in `lib/custom-endpoints.ts`
247
+
248
+ **Validation:**
249
+ - ID must start with `"p_"`
250
+ - name must be non-empty string
251
+ - protocol must be valid `ProviderId`
252
+ - Filters invalid entries (silent skip)
253
+
254
+ **Usage in API:**
255
+ ```typescript
256
+ // POST /api/settings calls parseProviders on incoming data
257
+ const resolvedAi = body.ai ? {
258
+ activeProvider: body.ai.activeProvider,
259
+ providers: parseProviders(body.ai.providers)
260
+ } : current.ai;
261
+ ```
262
+
263
+ ### 2.5 Migration from Old Format
264
+
265
+ **Function:** `migrateProviders(parsed)` in `lib/custom-endpoints.ts`
266
+
267
+ **Old format:**
268
+ ```json
269
+ { "ai": {
270
+ "provider": "openai",
271
+ "providers": { "openai": {...}, "anthropic": {...} }
272
+ }}
273
+ ```
274
+
275
+ **New format:**
276
+ ```json
277
+ { "ai": {
278
+ "activeProvider": "p_abc12345",
279
+ "providers": [
280
+ {"id": "p_abc12345", "protocol": "openai", ...},
281
+ {"id": "p_xyz98765", "protocol": "anthropic", ...}
282
+ ]
283
+ }}
284
+ ```
285
+
286
+ **Auto-migration:** `readSettings()` detects old format and auto-migrates on first read, then persists new format back to disk.
287
+
288
+ ### 2.6 Extension Point: Adding a New Embedding Provider
289
+
290
+ **Steps:**
291
+ 1. Add to `ProviderId` type in `lib/agent/providers.ts`
292
+ 2. Add entry to `PROVIDER_PRESETS` with metadata
293
+ 3. Add env var mapping in `getApiKeyEnvVar()`
294
+ 4. If OpenAI-compatible, use `deepseek` pattern (override via `baseUrl`)
295
+ 5. If new protocol, add support to pi-ai (upstream dependency)
296
+
297
+ **Example for local Ollama embedding service:**
298
+ ```typescript
299
+ // lib/agent/providers.ts
300
+ export type ProviderId = ... | 'ollama-embed';
301
+
302
+ PROVIDER_PRESETS.ollama-embed = {
303
+ id: 'ollama-embed',
304
+ name: 'Ollama (Local)',
305
+ nameZh: 'Ollama (本地)',
306
+ shortLabel: 'Ollama',
307
+ defaultModel: 'nomic-embed-text',
308
+ fixedBaseUrl: 'http://localhost:11434/api/embed',
309
+ apiKeyFallback: 'dummy', // No auth
310
+ supportsBaseUrl: false,
311
+ supportsThinking: false,
312
+ supportsListModels: false,
313
+ category: 'more',
314
+ };
315
+ ```
316
+
317
+ ---
318
+
319
+ ## 3. SEARCH INFRASTRUCTURE
320
+
321
+ ### 3.1 Current Search Architecture
322
+
323
+ **Two parallel systems:**
324
+
325
+ 1. **Core Search (BM25)** - Backend, MCP/API focused
326
+ - File: `lib/core/search.ts`
327
+ - Scoring: BM25 (Best Matching 25) algorithm
328
+ - Used by: MCP tools, agent search, REST API
329
+
330
+ 2. **App Search (Fuse.js)** - Frontend, UI-focused
331
+ - File: `lib/fs.ts` → `searchFiles(query: string)`
332
+ - Scoring: Fuzzy matching
333
+ - Used by: ⌘K search overlay in UI
334
+
335
+ ### 3.2 Core Search (BM25)
336
+
337
+ **File:** `lib/core/search.ts`
338
+
339
+ **API:**
340
+ ```typescript
341
+ searchFiles(
342
+ mindRoot: string,
343
+ query: string,
344
+ opts?: SearchOptions
345
+ ): SearchResult[]
346
+
347
+ interface SearchOptions {
348
+ limit?: number; // default 20
349
+ scope?: string; // directory prefix filter
350
+ file_type?: 'md' | 'csv' | 'all';
351
+ modified_after?: string; // ISO date filter
352
+ }
353
+
354
+ interface SearchResult {
355
+ path: string;
356
+ snippet: string;
357
+ score: number;
358
+ occurrences: number;
359
+ }
360
+ ```
361
+
362
+ **BM25 Parameters:**
363
+ ```typescript
364
+ const BM25_K1 = 1.2; // Term frequency saturation
365
+ const BM25_B = 0.75; // Document length normalization
366
+
367
+ function bm25Score(
368
+ tf: number, // term frequency in doc
369
+ df: number, // document frequency
370
+ docLength: number,
371
+ avgDocLength: number,
372
+ totalDocs: number
373
+ ): number
374
+ ```
375
+
376
+ **Features:**
377
+ - Multi-term queries (terms scored independently, summed)
378
+ - CJK support (word boundaries vs. substring matching)
379
+ - Latin term word boundaries (prevents partial matches)
380
+ - Snippet extraction around first match
381
+
382
+ ### 3.3 Search Index (Inverted Index)
383
+
384
+ **File:** `lib/core/search-index.ts`
385
+
386
+ **Class:** `SearchIndex`
387
+
388
+ ```typescript
389
+ class SearchIndex {
390
+ rebuild(mindRoot: string): void
391
+ // Full rebuild: read all files, tokenize, invert
392
+
393
+ load(mindosDir, mindRoot): boolean
394
+ // Load from disk (~/.mindos/search-index.json)
395
+ // Returns false if stale/corrupt
396
+
397
+ persist(mindosDir: string): void
398
+ // Serialize to JSON for next cold start
399
+
400
+ // Incremental updates (O(tokens) instead of O(all-files))
401
+ addFile(mindRoot, filePath): void
402
+ updateFile(mindRoot, filePath): void
403
+ removeFile(filePath): void
404
+
405
+ // Query interface
406
+ getCandidatesUnion(query): string[] | null
407
+ // UNION semantics: any file matching any token
408
+
409
+ getCandidates(query): string[] | null
410
+ // INTERSECTION semantics: files matching all tokens
411
+
412
+ getFileCount(): number
413
+ getAvgDocLength(): number
414
+ getDocLength(filePath): number
415
+ getDocFrequency(token): number
416
+ }
417
+ ```
418
+
419
+ **Persistence:**
420
+ - Stored at: `~/.mindos/search-index.json`
421
+ - Format: Serialized inverted index + BM25 stats
422
+ - Staleness detection: file count, mtime sampling
423
+ - Auto-rebuild on staleness
424
+
425
+ **Tokenization:**
426
+ ```typescript
427
+ function tokenize(text: string): Set<string>
428
+ // Latin: split on non-alphanumeric, min 2 chars
429
+ // CJK: Intl.Segmenter word boundaries (or bigrams if unavailable)
430
+ // Combined: both strategies applied
431
+ ```
432
+
433
+ ### 3.4 Search Index Lifecycle & Caching
434
+
435
+ **File:** `lib/fs.ts` (app layer)
436
+
437
+ **Module-level singleton:**
438
+ ```typescript
439
+ // Private module state
440
+ let _cache: FileTreeCache | null = null;
441
+ let _searchIndex: SearchIndexState | null = null;
442
+ let _treeVersion = 0;
443
+
444
+ // Called after file mutations
445
+ invalidateCache(): void // Full invalidate
446
+ invalidateCacheForFile(filePath): void // Incremental
447
+ invalidateCacheForNewFile(filePath): void
448
+ invalidateCacheForDeletedFile(filePath): void
449
+ ```
450
+
451
+ **Invalidation triggers:**
452
+ - Write/edit file → `updateSearchIndexFile()`
453
+ - Create file → `addSearchIndexFile()`
454
+ - Delete file → `removeSearchIndexFile()`
455
+ - Rename/move/delete dir → Full invalidate
456
+
457
+ **Persistence:**
458
+ - Debounced persist: 5s after last write operation
459
+ - Process exit hooks: flush immediately (SIGTERM, SIGINT, beforeExit)
460
+
461
+ ### 3.5 App-Level Search (Fuse.js)
462
+
463
+ **File:** `lib/fs.ts`
464
+
465
+ ```typescript
466
+ export function searchFiles(query: string): AppSearchResult[]
467
+ // Fuzzy search via Fuse.js, limit 20
468
+
469
+ interface AppSearchResult {
470
+ path: string;
471
+ snippet: string;
472
+ score: number; // 1 - fuse.score
473
+ matches?: Array<{
474
+ indices: [number, number][];
475
+ value: string;
476
+ key: string;
477
+ }>;
478
+ }
479
+ ```
480
+
481
+ **Index building:**
482
+ - Lazy: built on first search
483
+ - TTL: 30s expiration
484
+ - Watches mindRoot for changes (immediate invalidation)
485
+
486
+ **Search queries:**
487
+ - Fuse.js fuzzy matching (no BM25)
488
+ - CJK support via same tokenization
489
+
490
+ ### 3.6 API Search Route
491
+
492
+ **File:** `app/api/search/route.ts`
493
+
494
+ ```typescript
495
+ GET /api/search?q=query_string
496
+
497
+ // Response: SearchResult[]
498
+ [
499
+ {
500
+ path: "Space/file.md",
501
+ snippet: "...context around match...",
502
+ score: 42.3,
503
+ occurrences: 5
504
+ }
505
+ ]
506
+ ```
507
+
508
+ **Implementation:**
509
+ ```typescript
510
+ export async function GET(request: NextRequest) {
511
+ const q = request.nextUrl.searchParams.get('q') || '';
512
+ if (!q.trim()) return [];
513
+
514
+ const results = searchFiles(q);
515
+ return NextResponse.json(results);
516
+ }
517
+ ```
518
+
519
+ ### 3.7 Search Result Types
520
+
521
+ **File:** `lib/core/types.ts`
522
+
523
+ ```typescript
524
+ export interface SearchResult {
525
+ path: string;
526
+ snippet: string;
527
+ score: number;
528
+ occurrences: number;
529
+ }
530
+ ```
531
+
532
+ ### 3.8 PDF Support
533
+
534
+ **Current:**
535
+ - `searchFiles()` reads PDF text via `extractPdfText()`
536
+ - Uses pdfjs-dist for text extraction
537
+ - Included in BM25 search automatically
538
+
539
+ **Limits:**
540
+ - MAX_CONTENT_LENGTH = 50,000 chars per file
541
+ - Larger documents truncated for index
542
+
543
+ ### 3.9 Extension Point: Adding Embedding-Based RAG
544
+
545
+ **Integration patterns:**
546
+
547
+ 1. **Dual-search model:**
548
+ - Keep BM25 for full-text (fast, no AI needed)
549
+ - Add semantic search via embeddings (slower, uses LLM)
550
+ - Optionally combine results (hybrid search)
551
+
552
+ 2. **New module structure:**
553
+ ```
554
+ lib/core/
555
+ ├── search.ts (existing BM25)
556
+ ├── search-index.ts (existing inverted index)
557
+ ├── embedding-index.ts (NEW: vector store)
558
+ ├── embedding-client.ts (NEW: embedding API calls)
559
+ └── rag-search.ts (NEW: unified search interface)
560
+ ```
561
+
562
+ 3. **Configuration flow:**
563
+ ```
564
+ ~/.mindos/config.json
565
+ └── rag?: {
566
+ enabled: boolean,
567
+ embeddingModel: string,
568
+ embeddingProvider: ProviderId,
569
+ embeddingApiKey: string,
570
+ indexType: 'bm25' | 'hybrid' | 'semantic'
571
+ }
572
+ ```
573
+
574
+ 4. **Index persistence:**
575
+ - Store embeddings at `~/.mindos/embedding-index.json`
576
+ - Include version, model name, file metadata
577
+ - Invalidate on:
578
+ - File changes
579
+ - Model/provider change
580
+ - Config modification
581
+
582
+ 5. **API extension:**
583
+ ```
584
+ POST /api/search (existing, BM25 only)
585
+ POST /api/search/semantic
586
+ GET /api/search?type=hybrid (combined BM25 + semantic)
587
+ POST /api/settings/embedding-models (list available)
588
+ ```
589
+
590
+ ---
591
+
592
+ ## 4. PACKAGE ECOSYSTEM
593
+
594
+ **File:** `package.json`
595
+
596
+ **Relevant dependencies:**
597
+ - `fuse.js@^7.1.0` - Fuzzy search (frontend)
598
+ - `pdfjs-dist@^4.10.38` - PDF text extraction
599
+ - `@mariozechner/pi-ai@^0.60.0` - LLM provider abstraction
600
+ - `zod@^3.23.8` - Schema validation
601
+ - `zustand@^5.0.12` - State management
602
+
603
+ **NO existing embedding/ML dependencies:**
604
+ - No `openai` SDK (would be needed for embeddings)
605
+ - No `transformers`, `onnx`, or `llm.js`
606
+ - No vector database (Pinecone, Qdrant, Weaviate, etc.)
607
+
608
+ **For embedding RAG, consider adding:**
609
+ - `@openai/embeddings` (OpenAI embeddings)
610
+ - `vectorstore-lite` or `sqlite-vss` (lightweight local vector store)
611
+ - Or: keep in-memory during session, JSON persistence
612
+
613
+ ---
614
+
615
+ ## 5. FEATURE ORGANIZATION PATTERNS
616
+
617
+ ### 5.1 Optional Feature Example: Web Search
618
+
619
+ **Location:** `lib/agent/web-search.ts`
620
+
621
+ **Pattern:**
622
+ - Standalone module (not integrated by default)
623
+ - Called explicitly by agent when needed
624
+ - No settings UI (always available if agent uses it)
625
+ - No API key management (free, no auth)
626
+
627
+ **Structure:**
628
+ ```
629
+ lib/agent/
630
+ ├── web-search.ts (implementation)
631
+ ├── providers.ts (provider metadata)
632
+ └── index.ts (exports)
633
+ ```
634
+
635
+ ### 5.2 Optional Settings Feature
636
+
637
+ **Pattern:**
638
+ 1. Add `NewConfig` interface to `ServerSettings` (optional field)
639
+ 2. Add parsing function (safe type coercion)
640
+ 3. Add defaults to `DEFAULTS` object
641
+ 4. Add UI tab in `components/settings/NewTab.tsx`
642
+ 5. Wire up API route POST handler
643
+ 6. Add validation tests
644
+
645
+ **Example: Knowledge Tab** (existing)
646
+ - File: `components/settings/KnowledgeTab.tsx`
647
+ - Settings: Git sync config, auto-pull interval, etc.
648
+ - API: Handles in `POST /api/settings`
649
+
650
+ ### 5.3 Recommended RAG Feature Structure
651
+
652
+ ```
653
+ lib/
654
+ ├── core/
655
+ │ ├── search.ts (existing BM25)
656
+ │ ├── search-index.ts (existing inverted index)
657
+ │ ├── embedding-index.ts (NEW)
658
+ │ └── embedding-client.ts (NEW)
659
+ ├── rag/
660
+ │ ├── config.ts (RAG config helpers)
661
+ │ ├── index-manager.ts (rebuild, persist, load)
662
+ │ └── search.ts (unified search API)
663
+ └── agent/
664
+ └── embedding-provider.ts (NEW provider abstraction)
665
+
666
+ components/settings/
667
+ ├── RagTab.tsx (NEW)
668
+ ├── RagEmbeddingSelect.tsx (NEW component)
669
+ └── RagIndexStatus.tsx (NEW component)
670
+
671
+ app/api/
672
+ ├── rag/
673
+ │ ├── rebuild/route.ts (POST to rebuild index)
674
+ │ ├── status/route.ts (GET index stats)
675
+ │ └── search/route.ts (POST semantic search)
676
+ └── search/
677
+ └── route.ts (existing, add ?type=hybrid param)
678
+ ```
679
+
680
+ ---
681
+
682
+ ## 6. KEY FILES SUMMARY
683
+
684
+ | File | Purpose | Key Exports |
685
+ |------|---------|-------------|
686
+ | `lib/settings.ts` | Core settings I/O | `readSettings()`, `writeSettings()`, `ServerSettings` interface |
687
+ | `lib/custom-endpoints.ts` | Provider unified interface | `Provider`, `parseProviders()`, `migrateProviders()` |
688
+ | `lib/agent/providers.ts` | Provider metadata & env vars | `PROVIDER_PRESETS`, `getApiKeyEnvVar()`, `ProviderId` type |
689
+ | `lib/core/search.ts` | BM25 search | `searchFiles()`, `bm25Score()` |
690
+ | `lib/core/search-index.ts` | Inverted index | `SearchIndex` class, persistence |
691
+ | `lib/fs.ts` | App-level search & caching | `searchFiles()`, cache invalidation |
692
+ | `app/api/settings/route.ts` | Settings REST API | GET/POST handlers |
693
+ | `app/api/search/route.ts` | Search REST API | GET handler, BM25 results |
694
+ | `components/settings/AiTab.tsx` | Provider UI | Provider selection, key input, test button |
695
+
696
+ ---
697
+
698
+ ## 7. IMPORTANT DESIGN DECISIONS
699
+
700
+ 1. **Unified Provider Model**: All LLM providers use same `Provider` interface, making it easy to add new ones.
701
+
702
+ 2. **Atomic File Writes**: Settings use temp file + rename to prevent corruption on crash.
703
+
704
+ 3. **Lazy Index Building**: Search index built on first search, not at startup.
705
+
706
+ 4. **Incremental Updates**: File mutations update search index O(tokens) instead of full rebuild.
707
+
708
+ 5. **Multi-Engine Web Search**: No API keys needed (free HTML scraping with fallback chain).
709
+
710
+ 6. **CJK Support**: Proper word segmentation with fallback to bigrams.
711
+
712
+ 7. **Auto-Migration**: Old config formats auto-detected and migrated transparently.
713
+
714
+ 8. **Environment Variable Priority**: Settings can be overridden by env vars for CI/deployment.
715
+
716
+ ---
717
+
718
+ ## 8. EXTENSION CHECKLIST FOR EMBEDDING RAG
719
+
720
+ - [ ] Add `rag?: RagConfig` to `ServerSettings` interface
721
+ - [ ] Add RAG parsing function in `lib/settings.ts`
722
+ - [ ] Add `RagTab.tsx` UI component in `components/settings/`
723
+ - [ ] Add `EmbeddingClient` abstraction in `lib/rag/`
724
+ - [ ] Create `EmbeddingIndex` class for vector storage
725
+ - [ ] Add API routes for RAG operations
726
+ - [ ] Implement hybrid search combining BM25 + semantic
727
+ - [ ] Add index persistence at `~/.mindos/embedding-index.json`
728
+ - [ ] Add staleness detection (model name, provider, file changes)
729
+ - [ ] Add env var support: `RAG_EMBEDDING_PROVIDER`, `RAG_EMBEDDING_API_KEY`
730
+ - [ ] Wire up settings validation tests
731
+ - [ ] Add migration logic for future config format changes
732
+