@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.
- package/_standalone/.mindos-build-version +1 -1
- package/_standalone/.next/BUILD_ID +1 -1
- package/_standalone/.next/app-path-routes-manifest.json +21 -21
- package/_standalone/.next/build-manifest.json +2 -2
- package/_standalone/.next/cache/.previewinfo +1 -1
- package/_standalone/.next/cache/.rscinfo +1 -1
- package/_standalone/.next/cache/config.json +3 -3
- package/_standalone/.next/prerender-manifest.json +3 -3
- package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/_global-error.html +2 -2
- package/_standalone/.next/server/app/_global-error.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/_standalone/.next/server/app/_not-found/page.js +1 -1
- package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/agents/page.js +1 -1
- package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask/route.js +48 -42
- package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js +1 -1
- package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/raw/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route.js +1 -1
- package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/setup/route.js +1 -1
- package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/skills/route.js +1 -1
- package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/changes/page.js +1 -1
- package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page.js +2 -2
- package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/echo/page.js +1 -1
- package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/explore/page.js +1 -1
- package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/help/page.js +1 -1
- package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js +1 -1
- package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/login/page.js +1 -1
- package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/page.js +1 -1
- package/_standalone/.next/server/app/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/setup/page.js +2 -2
- package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/trash/page.js +3 -3
- package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
- package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js +1 -1
- package/_standalone/.next/server/app/wiki/page.js.nft.json +1 -1
- package/_standalone/.next/server/app/wiki/page_client-reference-manifest.js +1 -1
- package/_standalone/.next/server/app-paths-manifest.json +21 -21
- package/_standalone/.next/server/chunks/122.js +222 -0
- package/_standalone/.next/server/chunks/3113.js +52 -0
- package/_standalone/.next/server/chunks/6539.js +1 -1
- package/_standalone/.next/server/chunks/8388.js +2 -2
- package/_standalone/.next/server/chunks/953.js +3 -3
- package/_standalone/.next/server/chunks/9787.js +2 -0
- package/_standalone/.next/server/pages/500.html +2 -2
- package/_standalone/.next/server/server-reference-manifest.js +1 -1
- package/_standalone/.next/server/server-reference-manifest.json +1 -1
- package/_standalone/.next/static/chunks/1001-99da82ec8d8c136f.js +1 -0
- package/_standalone/.next/static/chunks/5149-4d828886dda479fa.js +1 -0
- package/_standalone/.next/static/chunks/{5581-82e5db227f8e9393.js → 5581-c671163a2fe1b312.js} +2 -2
- package/_standalone/.next/static/chunks/6636-53238eff89503f03.js +6 -0
- package/_standalone/.next/static/chunks/6757-1c1a89720fdda8f0.js +1 -0
- package/_standalone/.next/static/chunks/7129-20e9d2463a9da646.js +1 -0
- package/_standalone/.next/static/chunks/{3674-be69a8b858ceacdd.js → 7294-cac25d97869afadc.js} +1 -1
- package/_standalone/.next/static/chunks/8225-21e5cebc3731ddf0.js +1 -0
- package/_standalone/.next/static/chunks/8520-b51810e66293ceb8.js +22 -0
- package/_standalone/.next/static/chunks/9207-dc9c31b351a2ed78.js +1 -0
- package/_standalone/.next/static/chunks/app/agents/[agentKey]/{page-b0dabe793500383d.js → page-2f5cf97e03dc1cc9.js} +1 -1
- package/_standalone/.next/static/chunks/app/agents/{page-1f1ac330c8177cf6.js → page-50eac58d511dcc6e.js} +1 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-2a00f4686adf3885.js +11 -0
- package/_standalone/.next/static/chunks/app/{layout-50a6b1164ee98ab9.js → layout-2cb7a6602d2e5d5f.js} +62 -58
- package/_standalone/.next/static/chunks/app/{page-73802bd31d7f6c9f.js → page-5ab911b2226f6ff7.js} +1 -1
- package/_standalone/.next/static/chunks/app/setup/page-907b7c57fad2292b.js +1 -0
- package/_standalone/.next/static/chunks/app/trash/page-11a511b065ea84c2.js +1 -0
- package/_standalone/.next/static/chunks/app/view/[...path]/{page-808f39963bf04715.js → page-26e47dd4c533a58c.js} +2 -2
- package/_standalone/.next/static/css/67e7918f5ed7d147.css +1 -0
- package/_standalone/.next/trace +65 -65
- package/_standalone/__tests__/api/ask-attachments.test.ts +194 -0
- package/_standalone/__tests__/api/settings.test.ts +16 -12
- package/_standalone/__tests__/api/setup.test.ts +11 -9
- package/_standalone/__tests__/api/test-key.test.ts +0 -10
- package/_standalone/__tests__/components/UpdateToast.test.ts +344 -0
- package/_standalone/__tests__/core/context.test.ts +48 -426
- package/_standalone/__tests__/lib/pi-skills.test.ts +4 -4
- package/_standalone/__tests__/lib/settings-ai-client.test.ts +32 -12
- package/_standalone/__tests__/setup.ts +5 -5
- package/_standalone/components/ask/AskContent.tsx +70 -40
- package/_standalone/components/ask/AskHeader.tsx +8 -1
- package/_standalone/components/ask/MessageList.tsx +37 -3
- package/_standalone/components/ask/ProviderModelCapsule.tsx +51 -129
- package/_standalone/components/settings/AiTab.tsx +270 -347
- package/_standalone/components/settings/CustomProviderFields.tsx +121 -0
- package/_standalone/components/settings/CustomProvidersCard.tsx +2 -2
- package/_standalone/components/settings/KnowledgeTab.tsx +6 -20
- package/_standalone/components/settings/McpAgentInstall.tsx +7 -2
- package/_standalone/components/settings/Primitives.tsx +48 -104
- package/_standalone/components/settings/ProviderModal.tsx +38 -221
- package/_standalone/components/settings/SettingsContent.tsx +5 -12
- package/_standalone/components/settings/TestButton.tsx +64 -0
- package/_standalone/components/settings/types.ts +3 -12
- package/_standalone/components/settings/useCustomProviderForm.ts +132 -0
- package/_standalone/components/setup/StepAI.tsx +3 -3
- package/_standalone/components/shared/ModelInput.tsx +18 -4
- package/_standalone/components/shared/ProviderSelect.tsx +126 -134
- package/_standalone/hooks/useAskChat.ts +97 -13
- package/_standalone/hooks/useAskPanel.ts +17 -1
- package/_standalone/lib/settings-ai-client.ts +17 -8
- package/_standalone/tsconfig.tsbuildinfo +1 -1
- package/app/app/api/ask/route.ts +124 -44
- package/app/app/api/mcp/agents/route.ts +3 -3
- package/app/app/api/settings/list-models/route.ts +15 -26
- package/app/app/api/settings/route.ts +14 -59
- package/app/app/api/settings/test-key/route.ts +47 -12
- package/app/app/api/setup/route.ts +36 -18
- package/app/app/api/skills/route.ts +1 -1
- package/app/app/layout.tsx +5 -3
- package/app/components/HomeContent.tsx +11 -0
- package/app/components/UpdateToast.tsx +255 -0
- package/app/components/ask/AskContent.tsx +70 -40
- package/app/components/ask/AskHeader.tsx +8 -1
- package/app/components/ask/MessageList.tsx +37 -3
- package/app/components/ask/ProviderModelCapsule.tsx +51 -129
- package/app/components/settings/AiTab.tsx +270 -347
- package/app/components/settings/CustomProviderFields.tsx +121 -0
- package/app/components/settings/CustomProvidersCard.tsx +2 -2
- package/app/components/settings/KnowledgeTab.tsx +6 -20
- package/app/components/settings/McpAgentInstall.tsx +7 -2
- package/app/components/settings/Primitives.tsx +48 -104
- package/app/components/settings/ProviderModal.tsx +38 -221
- package/app/components/settings/SettingsContent.tsx +5 -12
- package/app/components/settings/TestButton.tsx +64 -0
- package/app/components/settings/types.ts +3 -12
- package/app/components/settings/useCustomProviderForm.ts +132 -0
- package/app/components/setup/StepAI.tsx +3 -3
- package/app/components/shared/ModelInput.tsx +18 -4
- package/app/components/shared/ProviderSelect.tsx +126 -134
- package/app/hooks/useAskChat.ts +97 -13
- package/app/hooks/useAskPanel.ts +17 -1
- package/app/lib/agent/context.ts +65 -0
- package/app/lib/agent/providers.ts +25 -0
- package/app/lib/agent/tools.ts +1 -1
- package/app/lib/custom-endpoints.ts +129 -29
- package/app/lib/i18n/modules/settings.ts +20 -0
- package/app/lib/pi-integration/skills.ts +16 -4
- package/app/lib/settings-ai-client.ts +17 -8
- package/app/lib/settings.ts +64 -90
- package/app/lib/types.ts +4 -0
- package/package.json +1 -1
- package/_standalone/.next/server/chunks/530.js +0 -218
- package/_standalone/.next/server/chunks/9007.js +0 -2
- package/_standalone/.next/server/chunks/9137.js +0 -52
- package/_standalone/.next/static/chunks/1309-373ade1b40aea186.js +0 -1
- package/_standalone/.next/static/chunks/3165-9189a38fd9ebf6f2.js +0 -1
- package/_standalone/.next/static/chunks/4587-5d06728133fff222.js +0 -1
- package/_standalone/.next/static/chunks/6261-5ce86db54b19ae46.js +0 -1
- package/_standalone/.next/static/chunks/6636-9bbc90fb3b8731fe.js +0 -6
- package/_standalone/.next/static/chunks/7637-904b0a381dc3ec02.js +0 -1
- package/_standalone/.next/static/chunks/8520-84e607f33c409f91.js +0 -22
- package/_standalone/.next/static/chunks/9207-9a4a1a1ede4f8e6e.js +0 -1
- package/_standalone/.next/static/chunks/app/echo/[segment]/page-bc5e104eb7ae6327.js +0 -11
- package/_standalone/.next/static/chunks/app/setup/page-79acb0baf38184c6.js +0 -1
- package/_standalone/.next/static/chunks/app/trash/page-d040db56863da504.js +0 -1
- package/_standalone/.next/static/css/1287672978833d07.css +0 -1
- package/_standalone/lib/agent/context.ts +0 -403
- /package/_standalone/.next/static/{X86rF8dKEO0InosOw4a2_ → eIlwbGas1iRGonlPyEwj7}/_buildManifest.js +0 -0
- /package/_standalone/.next/static/{X86rF8dKEO0InosOw4a2_ → eIlwbGas1iRGonlPyEwj7}/_ssgManifest.js +0 -0
package/app/lib/settings.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
18
|
-
providers:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
providers:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
331
|
-
const
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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