@geminilight/mindos 0.6.63 → 0.6.65

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 (268) 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 +21 -21
  4. package/_standalone/.next/build-manifest.json +2 -2
  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/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  10. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error.html +2 -2
  12. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  25. package/_standalone/.next/server/app/agents/page.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  27. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  28. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
  39. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask/route.js +48 -42
  43. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  44. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  48. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  50. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  52. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/file/import/route.js +1 -1
  57. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  62. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  64. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  66. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  68. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  71. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  76. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  83. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  85. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  88. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
  90. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/settings/route.js +1 -1
  93. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  94. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
  96. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/setup/route.js +1 -1
  102. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/api/skills/route.js +1 -1
  104. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  105. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  107. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  108. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  111. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  113. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  114. package/_standalone/.next/server/app/changes/page.js +1 -1
  115. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  116. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  117. package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
  118. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  119. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  120. package/_standalone/.next/server/app/echo/page.js +1 -1
  121. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  122. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  123. package/_standalone/.next/server/app/explore/page.js +1 -1
  124. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  125. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  126. package/_standalone/.next/server/app/help/page.js +1 -1
  127. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  128. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  129. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  130. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  131. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/login/page.js +1 -1
  133. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  134. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app/page.js +1 -1
  136. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  137. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  138. package/_standalone/.next/server/app/setup/page.js +2 -2
  139. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  140. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  141. package/_standalone/.next/server/app/trash/page.js +3 -3
  142. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  143. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  144. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  145. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  146. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  147. package/_standalone/.next/server/app/wiki/page.js +1 -1
  148. package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
  149. package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
  150. package/_standalone/.next/server/app-paths-manifest.json +21 -21
  151. package/_standalone/.next/server/chunks/122.js +222 -0
  152. package/_standalone/.next/server/chunks/3113.js +52 -0
  153. package/_standalone/.next/server/chunks/6539.js +1 -1
  154. package/_standalone/.next/server/chunks/8388.js +2 -2
  155. package/_standalone/.next/server/chunks/953.js +3 -3
  156. package/_standalone/.next/server/chunks/9787.js +2 -0
  157. package/_standalone/.next/server/pages/500.html +2 -2
  158. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  159. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  160. package/_standalone/.next/static/chunks/1001-99da82ec8d8c136f.js +1 -0
  161. package/_standalone/.next/static/chunks/5149-4d828886dda479fa.js +1 -0
  162. package/_standalone/.next/static/chunks/{5581-82e5db227f8e9393.js → 5581-c671163a2fe1b312.js} +2 -2
  163. package/_standalone/.next/static/chunks/6636-53238eff89503f03.js +6 -0
  164. package/_standalone/.next/static/chunks/6757-1c1a89720fdda8f0.js +1 -0
  165. package/_standalone/.next/static/chunks/7129-20e9d2463a9da646.js +1 -0
  166. package/_standalone/.next/static/chunks/{3674-be69a8b858ceacdd.js → 7294-cac25d97869afadc.js} +1 -1
  167. package/_standalone/.next/static/chunks/8225-21e5cebc3731ddf0.js +1 -0
  168. package/_standalone/.next/static/chunks/8520-b51810e66293ceb8.js +22 -0
  169. package/_standalone/.next/static/chunks/9207-dc9c31b351a2ed78.js +1 -0
  170. package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-b0dabe793500383d.js → page-2f5cf97e03dc1cc9.js} +1 -1
  171. package/_standalone/.next/static/chunks/app/agents/{page-1f1ac330c8177cf6.js → page-50eac58d511dcc6e.js} +1 -1
  172. package/_standalone/.next/static/chunks/app/echo/[segment]/page-2a00f4686adf3885.js +11 -0
  173. package/_standalone/.next/static/chunks/app/{layout-50a6b1164ee98ab9.js → layout-2cb7a6602d2e5d5f.js} +62 -58
  174. package/_standalone/.next/static/chunks/app/{page-73802bd31d7f6c9f.js → page-5ab911b2226f6ff7.js} +1 -1
  175. package/_standalone/.next/static/chunks/app/setup/page-907b7c57fad2292b.js +1 -0
  176. package/_standalone/.next/static/chunks/app/trash/page-11a511b065ea84c2.js +1 -0
  177. package/_standalone/.next/static/chunks/app/view/[...path]/{page-808f39963bf04715.js → page-26e47dd4c533a58c.js} +2 -2
  178. package/_standalone/.next/static/css/67e7918f5ed7d147.css +1 -0
  179. package/_standalone/.next/trace +65 -65
  180. package/_standalone/__tests__/api/ask-attachments.test.ts +194 -0
  181. package/_standalone/__tests__/api/settings.test.ts +16 -12
  182. package/_standalone/__tests__/api/setup.test.ts +11 -9
  183. package/_standalone/__tests__/api/test-key.test.ts +0 -10
  184. package/_standalone/__tests__/components/UpdateToast.test.ts +344 -0
  185. package/_standalone/__tests__/core/context.test.ts +48 -426
  186. package/_standalone/__tests__/lib/pi-skills.test.ts +4 -4
  187. package/_standalone/__tests__/lib/settings-ai-client.test.ts +32 -12
  188. package/_standalone/__tests__/setup.ts +5 -5
  189. package/_standalone/components/ask/AskContent.tsx +70 -40
  190. package/_standalone/components/ask/AskHeader.tsx +8 -1
  191. package/_standalone/components/ask/MessageList.tsx +37 -3
  192. package/_standalone/components/ask/ProviderModelCapsule.tsx +51 -129
  193. package/_standalone/components/settings/AiTab.tsx +270 -347
  194. package/_standalone/components/settings/CustomProviderFields.tsx +121 -0
  195. package/_standalone/components/settings/CustomProvidersCard.tsx +2 -2
  196. package/_standalone/components/settings/KnowledgeTab.tsx +6 -20
  197. package/_standalone/components/settings/McpAgentInstall.tsx +7 -2
  198. package/_standalone/components/settings/Primitives.tsx +48 -104
  199. package/_standalone/components/settings/ProviderModal.tsx +38 -221
  200. package/_standalone/components/settings/SettingsContent.tsx +5 -12
  201. package/_standalone/components/settings/TestButton.tsx +64 -0
  202. package/_standalone/components/settings/types.ts +3 -12
  203. package/_standalone/components/settings/useCustomProviderForm.ts +132 -0
  204. package/_standalone/components/setup/StepAI.tsx +3 -3
  205. package/_standalone/components/shared/ModelInput.tsx +18 -4
  206. package/_standalone/components/shared/ProviderSelect.tsx +126 -134
  207. package/_standalone/hooks/useAskChat.ts +97 -13
  208. package/_standalone/hooks/useAskPanel.ts +17 -1
  209. package/_standalone/lib/settings-ai-client.ts +17 -8
  210. package/_standalone/tsconfig.tsbuildinfo +1 -1
  211. package/app/app/api/ask/route.ts +124 -44
  212. package/app/app/api/mcp/agents/route.ts +3 -3
  213. package/app/app/api/settings/list-models/route.ts +15 -26
  214. package/app/app/api/settings/route.ts +14 -59
  215. package/app/app/api/settings/test-key/route.ts +47 -12
  216. package/app/app/api/setup/route.ts +36 -18
  217. package/app/app/api/skills/route.ts +1 -1
  218. package/app/app/layout.tsx +5 -3
  219. package/app/components/HomeContent.tsx +11 -0
  220. package/app/components/UpdateToast.tsx +255 -0
  221. package/app/components/ask/AskContent.tsx +70 -40
  222. package/app/components/ask/AskHeader.tsx +8 -1
  223. package/app/components/ask/MessageList.tsx +37 -3
  224. package/app/components/ask/ProviderModelCapsule.tsx +51 -129
  225. package/app/components/settings/AiTab.tsx +270 -347
  226. package/app/components/settings/CustomProviderFields.tsx +121 -0
  227. package/app/components/settings/CustomProvidersCard.tsx +2 -2
  228. package/app/components/settings/KnowledgeTab.tsx +6 -20
  229. package/app/components/settings/McpAgentInstall.tsx +7 -2
  230. package/app/components/settings/Primitives.tsx +48 -104
  231. package/app/components/settings/ProviderModal.tsx +38 -221
  232. package/app/components/settings/SettingsContent.tsx +5 -12
  233. package/app/components/settings/TestButton.tsx +64 -0
  234. package/app/components/settings/types.ts +3 -12
  235. package/app/components/settings/useCustomProviderForm.ts +132 -0
  236. package/app/components/setup/StepAI.tsx +3 -3
  237. package/app/components/shared/ModelInput.tsx +18 -4
  238. package/app/components/shared/ProviderSelect.tsx +126 -134
  239. package/app/hooks/useAskChat.ts +97 -13
  240. package/app/hooks/useAskPanel.ts +17 -1
  241. package/app/lib/agent/context.ts +65 -0
  242. package/app/lib/agent/providers.ts +25 -0
  243. package/app/lib/agent/tools.ts +1 -1
  244. package/app/lib/custom-endpoints.ts +129 -29
  245. package/app/lib/i18n/modules/settings.ts +20 -0
  246. package/app/lib/pi-integration/skills.ts +16 -4
  247. package/app/lib/settings-ai-client.ts +17 -8
  248. package/app/lib/settings.ts +64 -90
  249. package/app/lib/types.ts +4 -0
  250. package/package.json +1 -1
  251. package/_standalone/.next/server/chunks/530.js +0 -218
  252. package/_standalone/.next/server/chunks/9007.js +0 -2
  253. package/_standalone/.next/server/chunks/9137.js +0 -52
  254. package/_standalone/.next/static/chunks/1309-373ade1b40aea186.js +0 -1
  255. package/_standalone/.next/static/chunks/3165-9189a38fd9ebf6f2.js +0 -1
  256. package/_standalone/.next/static/chunks/4587-5d06728133fff222.js +0 -1
  257. package/_standalone/.next/static/chunks/6261-5ce86db54b19ae46.js +0 -1
  258. package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +0 -6
  259. package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +0 -1
  260. package/_standalone/.next/static/chunks/8520-84e607f33c409f91.js +0 -22
  261. package/_standalone/.next/static/chunks/9207-9a4a1a1ede4f8e6e.js +0 -1
  262. package/_standalone/.next/static/chunks/app/echo/[segment]/page-bc5e104eb7ae6327.js +0 -11
  263. package/_standalone/.next/static/chunks/app/setup/page-79acb0baf38184c6.js +0 -1
  264. package/_standalone/.next/static/chunks/app/trash/page-d040db56863da504.js +0 -1
  265. package/_standalone/.next/static/css/1287672978833d07.css +0 -1
  266. package/_standalone/lib/agent/context.ts +0 -403
  267. /package/_standalone/.next/static/{X86rF8dKEO0InosOw4a2_ → eIlwbGas1iRGonlPyEwj7}/_buildManifest.js +0 -0
  268. /package/_standalone/.next/static/{X86rF8dKEO0InosOw4a2_ → eIlwbGas1iRGonlPyEwj7}/_ssgManifest.js +0 -0
@@ -3,10 +3,13 @@ import path from 'path';
3
3
  import os from 'os';
4
4
  import { parseAcpAgentOverrides } from './acp/agent-descriptors';
5
5
  import { type ProviderId, PROVIDER_PRESETS, isProviderId, getApiKeyFromEnv } from './agent/providers';
6
- import { type CustomProvider, parseCustomProviders, isCustomProviderId, findCustomProvider } from './custom-endpoints';
6
+ import { type Provider, parseProviders, findProvider, migrateProviders } from './custom-endpoints';
7
+ // Backward compat re-exports for files still importing from settings
8
+ export type { Provider };
7
9
 
8
10
  const SETTINGS_PATH = path.join(os.homedir(), '.mindos', 'config.json');
9
11
 
12
+ /** @deprecated Use Provider from custom-endpoints.ts */
10
13
  export interface ProviderConfig {
11
14
  apiKey: string;
12
15
  model: string;
@@ -14,8 +17,8 @@ export interface ProviderConfig {
14
17
  }
15
18
 
16
19
  export interface AiConfig {
17
- provider: ProviderId;
18
- providers: Partial<Record<ProviderId, ProviderConfig>>;
20
+ activeProvider: string; // provider entry ID (p_*)
21
+ providers: Provider[]; // unified provider list
19
22
  }
20
23
 
21
24
  export interface AgentConfig {
@@ -61,17 +64,13 @@ export interface ServerSettings {
61
64
  };
62
65
  /** User-defined agents not built into MindOS. */
63
66
  customAgents?: import('./custom-agents').CustomAgentDef[];
64
- /** User-defined provider configurations (multiple keys/endpoints per provider type). */
65
- customProviders?: CustomProvider[];
67
+ // customProviders is now merged into ai.providers kept for migration only
66
68
  }
67
69
 
68
70
  const DEFAULTS: ServerSettings = {
69
71
  ai: {
70
- provider: 'anthropic' as ProviderId,
71
- providers: {
72
- anthropic: { apiKey: '', model: 'claude-sonnet-4-6' },
73
- openai: { apiKey: '', model: 'gpt-5.4', baseUrl: '' },
74
- },
72
+ activeProvider: '',
73
+ providers: [],
75
74
  },
76
75
  mindRoot: '',
77
76
  };
@@ -85,56 +84,27 @@ function str(obj: unknown, key: string, fallback: string): string {
85
84
  return fallback;
86
85
  }
87
86
 
88
- /** Parse a provider config from unknown input, filling missing/invalid fields with defaults */
89
- function parseProvider(raw: unknown, defaults: ProviderConfig): ProviderConfig {
90
- return {
91
- apiKey: str(raw, 'apiKey', defaults.apiKey),
92
- model: str(raw, 'model', defaults.model),
93
- ...(defaults.baseUrl !== undefined
94
- ? { baseUrl: str(raw, 'baseUrl', defaults.baseUrl) }
95
- : {}),
96
- };
97
- }
98
-
99
87
  /** Migrate old flat ai structure to new providers dict, if needed */
100
88
  function migrateAi(parsed: Record<string, unknown>): AiConfig {
101
89
  const ai = parsed.ai as Record<string, unknown> | undefined;
102
90
  if (!ai) return { ...DEFAULTS.ai };
103
91
 
104
- const providerField = typeof ai.provider === 'string' ? ai.provider : 'anthropic';
105
- const provider: ProviderId = isProviderId(providerField) ? providerField : 'anthropic';
106
-
107
- // Already new format parse all known providers from disk
108
- if (ai.providers && typeof ai.providers === 'object') {
109
- const p = ai.providers as Record<string, unknown>;
110
- const providers: Partial<Record<ProviderId, ProviderConfig>> = {};
111
- for (const id of Object.keys(p)) {
112
- if (!isProviderId(id)) continue;
113
- const preset = PROVIDER_PRESETS[id];
114
- const defaultCfg = DEFAULTS.ai.providers[id] ?? { apiKey: '', model: preset.defaultModel };
115
- providers[id] = parseProvider(p[id], defaultCfg);
116
- }
117
- // Ensure at least anthropic and openai exist (backward compat)
118
- if (!providers.anthropic) providers.anthropic = DEFAULTS.ai.providers.anthropic;
119
- if (!providers.openai) providers.openai = DEFAULTS.ai.providers.openai;
120
- return { provider, providers };
92
+ // ── New format: ai.providers is an array ──
93
+ if (Array.isArray(ai.providers)) {
94
+ const providers = parseProviders(ai.providers);
95
+ const activeProvider = typeof ai.activeProvider === 'string' ? ai.activeProvider : '';
96
+ return { activeProvider, providers };
121
97
  }
122
98
 
123
- // Old flat format migrate
124
- return {
125
- provider,
126
- providers: {
127
- anthropic: {
128
- apiKey: str(ai, 'anthropicApiKey', ''),
129
- model: str(ai, 'anthropicModel', 'claude-sonnet-4-6'),
130
- },
131
- openai: {
132
- apiKey: str(ai, 'openaiApiKey', ''),
133
- model: str(ai, 'openaiModel', 'gpt-5.4'),
134
- baseUrl: str(ai, 'openaiBaseUrl', ''),
135
- },
136
- },
137
- };
99
+ // ── Old format: ai.providers is a dict (or missing) → auto-migrate ──
100
+ const migrated = migrateProviders(parsed);
101
+ if (migrated) {
102
+ return { activeProvider: migrated.activeProvider, providers: migrated.providers };
103
+ }
104
+
105
+ // Very old flat format (anthropicApiKey etc.) — also handled by migrateProviders
106
+ // but if it returns null, fall through to defaults
107
+ return { ...DEFAULTS.ai };
138
108
  }
139
109
 
140
110
  /** Parse agent config from unknown input */
@@ -198,7 +168,12 @@ export function readSettings(): ServerSettings {
198
168
  try {
199
169
  const raw = fs.readFileSync(SETTINGS_PATH, 'utf-8');
200
170
  const parsed = JSON.parse(raw) as Record<string, unknown>;
201
- return {
171
+
172
+ // Detect old format and check if migration is needed
173
+ const ai = parsed.ai as Record<string, unknown> | undefined;
174
+ const needsMigration = ai && !Array.isArray(ai.providers);
175
+
176
+ const settings: ServerSettings = {
202
177
  ai: migrateAi(parsed),
203
178
  agent: parseAgent(parsed.agent),
204
179
  acpAgents: parseAcpAgentsField(parsed.acpAgents),
@@ -222,13 +197,19 @@ export function readSettings(): ServerSettings {
222
197
  })(),
223
198
  connectionMode: inferConnectionMode(parsed),
224
199
  customAgents: Array.isArray(parsed.customAgents) ? parsed.customAgents as import('./custom-agents').CustomAgentDef[] : undefined,
225
- customProviders: parseCustomProviders(parsed.customProviders),
226
200
  };
201
+
202
+ // Auto-persist migrated config so migration only runs once
203
+ if (needsMigration) {
204
+ try { writeSettings(settings); } catch { /* best-effort */ }
205
+ }
206
+
207
+ return settings;
227
208
  } catch {
228
209
  // Config file missing or corrupt → force setup wizard
229
210
  return {
230
211
  ...DEFAULTS,
231
- ai: { ...DEFAULTS.ai, providers: { ...DEFAULTS.ai.providers } },
212
+ ai: { ...DEFAULTS.ai, providers: [] },
232
213
  setupPending: true,
233
214
  connectionMode: { cli: true, mcp: false },
234
215
  };
@@ -254,7 +235,8 @@ export function writeSettings(settings: ServerSettings): void {
254
235
  if (settings.baseUrlCompat !== undefined) merged.baseUrlCompat = settings.baseUrlCompat;
255
236
  if (settings.connectionMode !== undefined) merged.connectionMode = settings.connectionMode;
256
237
  if (settings.customAgents !== undefined) merged.customAgents = settings.customAgents;
257
- if (settings.customProviders !== undefined) merged.customProviders = settings.customProviders;
238
+ // Remove legacy customProviders (now merged into ai.providers array)
239
+ delete merged.customProviders;
258
240
  // setupPending: false/undefined → remove the field (cleanup); true → set it
259
241
  if ('setupPending' in settings) {
260
242
  if (settings.setupPending) merged.setupPending = true;
@@ -302,8 +284,7 @@ export function recordSkillInstall(agentKey: string, skillName: string, installP
302
284
 
303
285
  /** Effective AI config — unified interface for all providers.
304
286
  * Resolves: saved config → env var → preset default, in that priority order.
305
- * When `providerOverride` is given, resolves that provider's config instead.
306
- * Supports custom provider IDs (cp_*) — looks up from customProviders list. */
287
+ * When `providerOverride` is given (a provider entry ID), resolves that provider's config. */
307
288
  export function effectiveAiConfig(providerOverride?: string): {
308
289
  provider: ProviderId;
309
290
  apiKey: string;
@@ -312,40 +293,33 @@ export function effectiveAiConfig(providerOverride?: string): {
312
293
  } {
313
294
  const s = readSettings();
314
295
 
315
- // Custom provider override (cp_* ID)
316
- if (providerOverride && isCustomProviderId(providerOverride)) {
317
- const cp = findCustomProvider(s.customProviders ?? [], providerOverride);
318
- if (cp) {
319
- return {
320
- provider: cp.baseProviderId,
321
- apiKey: cp.apiKey,
322
- model: cp.model,
323
- baseUrl: cp.baseUrl,
324
- };
325
- }
326
- // Custom provider not found fall through to default
296
+ // Find the provider entry
297
+ const targetId = providerOverride || s.ai.activeProvider;
298
+ const entry = targetId ? findProvider(s.ai.providers, targetId) : undefined;
299
+
300
+ if (entry) {
301
+ // Resolve from the unified provider entry
302
+ const preset = PROVIDER_PRESETS[entry.protocol];
303
+ const apiKey = entry.apiKey
304
+ || getApiKeyFromEnv(entry.protocol)
305
+ || preset?.apiKeyFallback
306
+ || '';
307
+ const model = entry.model || preset?.defaultModel || '';
308
+ const baseUrl = entry.baseUrl || preset?.fixedBaseUrl || '';
309
+ return { provider: entry.protocol, apiKey, model, baseUrl };
327
310
  }
328
311
 
312
+ // Fallback: no matching entry — try env var or default
329
313
  const envProvider = process.env.AI_PROVIDER;
330
- const providerRaw = providerOverride ?? s.ai.provider;
331
- const provider: ProviderId = (typeof providerRaw === 'string' && isProviderId(providerRaw))
332
- ? providerRaw
333
- : (envProvider && isProviderId(envProvider) ? envProvider : 'anthropic');
334
-
335
- const preset = PROVIDER_PRESETS[provider] ?? PROVIDER_PRESETS.anthropic;
336
- const provCfg = s.ai.providers[provider] ?? { apiKey: '', model: '' };
337
-
338
- const apiKey = provCfg.apiKey
339
- || getApiKeyFromEnv(provider)
340
- || preset.apiKeyFallback
341
- || '';
342
- const model = provCfg.model
343
- || preset.defaultModel;
344
- const baseUrl = provCfg.baseUrl
345
- || preset.fixedBaseUrl
346
- || '';
347
-
348
- return { provider, apiKey, model, baseUrl };
314
+ const protocol: ProviderId = (envProvider && isProviderId(envProvider)) ? envProvider : 'anthropic';
315
+ const preset = PROVIDER_PRESETS[protocol] ?? PROVIDER_PRESETS.anthropic;
316
+
317
+ return {
318
+ provider: protocol,
319
+ apiKey: getApiKeyFromEnv(protocol) || preset.apiKeyFallback || '',
320
+ model: preset.defaultModel,
321
+ baseUrl: preset.fixedBaseUrl || '',
322
+ };
349
323
  }
350
324
 
351
325
  /** Effective MIND_ROOT — settings file can override, env var is fallback */
package/app/lib/types.ts CHANGED
@@ -69,6 +69,10 @@ export interface Message {
69
69
  images?: ImagePart[];
70
70
  /** Skill name used for this user message (rendered as a capsule in the UI) */
71
71
  skillName?: string;
72
+ /** KB file paths (@mentions) sent with this message */
73
+ attachedFiles?: string[];
74
+ /** Names of uploaded files (PDFs etc.) sent with this message */
75
+ uploadedFileNames?: string[];
72
76
  }
73
77
 
74
78
  export interface LocalAttachment {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminilight/mindos",
3
- "version": "0.6.63",
3
+ "version": "0.6.65",
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",