@elizaos/shared 2.0.0-alpha.144
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/LICENSE +21 -0
- package/awareness/index.d.ts +2 -0
- package/awareness/index.d.ts.map +1 -0
- package/awareness/index.js +2 -0
- package/awareness/index.js.map +1 -0
- package/awareness/registry.d.ts +27 -0
- package/awareness/registry.d.ts.map +1 -0
- package/awareness/registry.js +162 -0
- package/awareness/registry.js.map +1 -0
- package/config/types.agent-defaults.d.ts +333 -0
- package/config/types.agent-defaults.d.ts.map +1 -0
- package/config/types.agent-defaults.js +2 -0
- package/config/types.agent-defaults.js.map +1 -0
- package/config/types.agents.d.ts +112 -0
- package/config/types.agents.d.ts.map +1 -0
- package/config/types.agents.js +2 -0
- package/config/types.agents.js.map +1 -0
- package/config/types.d.ts +8 -0
- package/config/types.d.ts.map +1 -0
- package/config/types.eliza.d.ts +648 -0
- package/config/types.eliza.d.ts.map +1 -0
- package/config/types.eliza.js +2 -0
- package/config/types.eliza.js.map +1 -0
- package/config/types.gateway.d.ts +216 -0
- package/config/types.gateway.d.ts.map +1 -0
- package/config/types.gateway.js +2 -0
- package/config/types.gateway.js.map +1 -0
- package/config/types.hooks.d.ts +107 -0
- package/config/types.hooks.d.ts.map +1 -0
- package/config/types.hooks.js +2 -0
- package/config/types.hooks.js.map +1 -0
- package/config/types.js +8 -0
- package/config/types.js.map +1 -0
- package/config/types.messages.d.ts +176 -0
- package/config/types.messages.d.ts.map +1 -0
- package/config/types.messages.js +2 -0
- package/config/types.messages.js.map +1 -0
- package/config/types.tools.d.ts +400 -0
- package/config/types.tools.d.ts.map +1 -0
- package/config/types.tools.js +2 -0
- package/config/types.tools.js.map +1 -0
- package/connectors.d.ts +13 -0
- package/connectors.d.ts.map +1 -0
- package/connectors.js +92 -0
- package/connectors.js.map +1 -0
- package/contracts/apps.d.ts +204 -0
- package/contracts/apps.d.ts.map +1 -0
- package/contracts/apps.js +189 -0
- package/contracts/apps.js.map +1 -0
- package/contracts/awareness.d.ts +38 -0
- package/contracts/awareness.d.ts.map +1 -0
- package/contracts/awareness.js +8 -0
- package/contracts/awareness.js.map +1 -0
- package/contracts/cloud-topology.d.ts +13 -0
- package/contracts/cloud-topology.d.ts.map +1 -0
- package/contracts/cloud-topology.js +74 -0
- package/contracts/cloud-topology.js.map +1 -0
- package/contracts/config.d.ts +146 -0
- package/contracts/config.d.ts.map +1 -0
- package/contracts/config.js +5 -0
- package/contracts/config.js.map +1 -0
- package/contracts/content-pack.d.ts +131 -0
- package/contracts/content-pack.d.ts.map +1 -0
- package/contracts/content-pack.js +103 -0
- package/contracts/content-pack.js.map +1 -0
- package/contracts/drop.d.ts +20 -0
- package/contracts/drop.d.ts.map +1 -0
- package/contracts/drop.js +5 -0
- package/contracts/drop.js.map +1 -0
- package/contracts/index.d.ts +13 -0
- package/contracts/index.d.ts.map +1 -0
- package/contracts/index.js +13 -0
- package/contracts/index.js.map +1 -0
- package/contracts/lifeops.d.ts +1337 -0
- package/contracts/lifeops.d.ts.map +1 -0
- package/contracts/lifeops.js +279 -0
- package/contracts/lifeops.js.map +1 -0
- package/contracts/onboarding.d.ts +443 -0
- package/contracts/onboarding.d.ts.map +1 -0
- package/contracts/onboarding.js +1021 -0
- package/contracts/onboarding.js.map +1 -0
- package/contracts/permissions.d.ts +38 -0
- package/contracts/permissions.d.ts.map +1 -0
- package/contracts/permissions.js +5 -0
- package/contracts/permissions.js.map +1 -0
- package/contracts/service-routing.d.ts +77 -0
- package/contracts/service-routing.d.ts.map +1 -0
- package/contracts/service-routing.js +228 -0
- package/contracts/service-routing.js.map +1 -0
- package/contracts/theme.d.ts +136 -0
- package/contracts/theme.d.ts.map +1 -0
- package/contracts/theme.js +134 -0
- package/contracts/theme.js.map +1 -0
- package/contracts/verification.d.ts +9 -0
- package/contracts/verification.d.ts.map +1 -0
- package/contracts/verification.js +5 -0
- package/contracts/verification.js.map +1 -0
- package/contracts/wallet.d.ts +626 -0
- package/contracts/wallet.d.ts.map +1 -0
- package/contracts/wallet.js +61 -0
- package/contracts/wallet.js.map +1 -0
- package/dev-settings-banner-style.d.ts +14 -0
- package/dev-settings-banner-style.d.ts.map +1 -0
- package/dev-settings-banner-style.js +58 -0
- package/dev-settings-banner-style.js.map +1 -0
- package/dev-settings-figlet-heading.d.ts +22 -0
- package/dev-settings-figlet-heading.d.ts.map +1 -0
- package/dev-settings-figlet-heading.js +56 -0
- package/dev-settings-figlet-heading.js.map +1 -0
- package/dev-settings-table.d.ts +47 -0
- package/dev-settings-table.d.ts.map +1 -0
- package/dev-settings-table.js +189 -0
- package/dev-settings-table.js.map +1 -0
- package/eliza-core-roles.d.ts +70 -0
- package/eliza-core-roles.d.ts.map +1 -0
- package/eliza-core-roles.js +546 -0
- package/eliza-core-roles.js.map +1 -0
- package/env-utils.d.ts +5 -0
- package/env-utils.d.ts.map +1 -0
- package/env-utils.impl.d.ts +2 -0
- package/env-utils.impl.d.ts.map +1 -0
- package/env-utils.impl.js +17 -0
- package/env-utils.impl.js.map +1 -0
- package/env-utils.js +5 -0
- package/env-utils.js.map +1 -0
- package/i18n/generated/validation-keyword-data.d.ts +1030 -0
- package/i18n/generated/validation-keyword-data.d.ts.map +1 -0
- package/i18n/generated/validation-keyword-data.js +1034 -0
- package/i18n/generated/validation-keyword-data.js.map +1 -0
- package/i18n/keyword-matching.d.ts +23 -0
- package/i18n/keyword-matching.d.ts.map +1 -0
- package/i18n/keyword-matching.js +113 -0
- package/i18n/keyword-matching.js.map +1 -0
- package/i18n/validation-keywords.d.ts +13 -0
- package/i18n/validation-keywords.d.ts.map +1 -0
- package/i18n/validation-keywords.js +13 -0
- package/i18n/validation-keywords.js.map +1 -0
- package/index.d.ts +13 -0
- package/index.d.ts.map +1 -0
- package/index.js +13 -0
- package/index.js.map +1 -0
- package/onboarding-presets.characters.d.ts +22 -0
- package/onboarding-presets.characters.d.ts.map +1 -0
- package/onboarding-presets.characters.js +2607 -0
- package/onboarding-presets.characters.js.map +1 -0
- package/onboarding-presets.d.ts +40 -0
- package/onboarding-presets.d.ts.map +1 -0
- package/onboarding-presets.js +177 -0
- package/onboarding-presets.js.map +1 -0
- package/onboarding-presets.shared.d.ts +2 -0
- package/onboarding-presets.shared.d.ts.map +1 -0
- package/onboarding-presets.shared.js +8 -0
- package/onboarding-presets.shared.js.map +1 -0
- package/package.json +173 -0
- package/restart.d.ts +27 -0
- package/restart.d.ts.map +1 -0
- package/restart.js +29 -0
- package/restart.js.map +1 -0
- package/runtime-env.d.ts +82 -0
- package/runtime-env.d.ts.map +1 -0
- package/runtime-env.js +243 -0
- package/runtime-env.js.map +1 -0
- package/settings-debug.d.ts +20 -0
- package/settings-debug.d.ts.map +1 -0
- package/settings-debug.js +117 -0
- package/settings-debug.js.map +1 -0
- package/spoken-text.d.ts +2 -0
- package/spoken-text.d.ts.map +1 -0
- package/spoken-text.js +57 -0
- package/spoken-text.js.map +1 -0
- package/themes/index.d.ts +7 -0
- package/themes/index.d.ts.map +1 -0
- package/themes/index.js +6 -0
- package/themes/index.js.map +1 -0
- package/themes/presets.d.ts +15 -0
- package/themes/presets.d.ts.map +1 -0
- package/themes/presets.js +789 -0
- package/themes/presets.js.map +1 -0
- package/types.d.ts +27 -0
- package/types.d.ts.map +1 -0
- package/types.js +2 -0
- package/types.js.map +1 -0
- package/validation-keywords.d.ts +2 -0
- package/validation-keywords.d.ts.map +1 -0
- package/validation-keywords.js +2 -0
- package/validation-keywords.js.map +1 -0
|
@@ -0,0 +1,1021 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared onboarding contracts.
|
|
3
|
+
*/
|
|
4
|
+
import { isTruthyEnvValue } from "../env-utils.impl.js";
|
|
5
|
+
import { normalizeDeploymentTargetConfig, normalizeLinkedAccountsConfig, normalizeServiceRoutingConfig, } from "./service-routing.js";
|
|
6
|
+
export const CHARACTER_LANGUAGES = [
|
|
7
|
+
"en",
|
|
8
|
+
"zh-CN",
|
|
9
|
+
"ko",
|
|
10
|
+
"es",
|
|
11
|
+
"pt",
|
|
12
|
+
"vi",
|
|
13
|
+
"tl",
|
|
14
|
+
];
|
|
15
|
+
export const SUBSCRIPTION_PROVIDER_SELECTIONS = [
|
|
16
|
+
{
|
|
17
|
+
id: "anthropic-subscription",
|
|
18
|
+
storedProvider: "anthropic-subscription",
|
|
19
|
+
family: "anthropic",
|
|
20
|
+
labelKey: "providerswitcher.claudeSubscription",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "openai-subscription",
|
|
24
|
+
storedProvider: "openai-codex",
|
|
25
|
+
family: "openai",
|
|
26
|
+
labelKey: "providerswitcher.chatgptSubscription",
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
// TODO: These hardcoded provider entries should eventually be populated by
|
|
30
|
+
// plugins at runtime via a registry pattern. Each LLM plugin would call
|
|
31
|
+
// registerProviderOption() during initialization to add itself to the catalog.
|
|
32
|
+
// The hardcoded entries below serve as defaults until all plugins are migrated.
|
|
33
|
+
export const ONBOARDING_PROVIDER_CATALOG = [
|
|
34
|
+
{
|
|
35
|
+
id: "elizacloud",
|
|
36
|
+
name: "Eliza Cloud",
|
|
37
|
+
envKey: null,
|
|
38
|
+
pluginName: "@elizaos/plugin-elizacloud",
|
|
39
|
+
keyPrefix: null,
|
|
40
|
+
description: "Managed hosting for Eliza agents and bundled infrastructure.",
|
|
41
|
+
family: "elizacloud",
|
|
42
|
+
authMode: "cloud",
|
|
43
|
+
group: "cloud",
|
|
44
|
+
order: 10,
|
|
45
|
+
recommended: true,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "anthropic-subscription",
|
|
49
|
+
name: "Claude Subscription",
|
|
50
|
+
envKey: null,
|
|
51
|
+
pluginName: "@elizaos/plugin-anthropic",
|
|
52
|
+
keyPrefix: null,
|
|
53
|
+
description: "Powers task agents via Claude Code CLI. For the main agent, use Eliza Cloud or a direct API key.",
|
|
54
|
+
family: "anthropic",
|
|
55
|
+
authMode: "subscription",
|
|
56
|
+
group: "subscription",
|
|
57
|
+
order: 20,
|
|
58
|
+
recommended: true,
|
|
59
|
+
labelKey: "providerswitcher.claudeSubscription",
|
|
60
|
+
storedProvider: "anthropic-subscription",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "openai-subscription",
|
|
64
|
+
name: "ChatGPT Subscription",
|
|
65
|
+
envKey: null,
|
|
66
|
+
pluginName: "@elizaos/plugin-openai",
|
|
67
|
+
keyPrefix: null,
|
|
68
|
+
description: "Use your ChatGPT Plus or Pro subscription via OAuth.",
|
|
69
|
+
family: "openai",
|
|
70
|
+
authMode: "subscription",
|
|
71
|
+
group: "subscription",
|
|
72
|
+
order: 30,
|
|
73
|
+
recommended: true,
|
|
74
|
+
labelKey: "providerswitcher.chatgptSubscription",
|
|
75
|
+
storedProvider: "openai-codex",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "anthropic",
|
|
79
|
+
name: "Anthropic",
|
|
80
|
+
envKey: "ANTHROPIC_API_KEY",
|
|
81
|
+
pluginName: "@elizaos/plugin-anthropic",
|
|
82
|
+
keyPrefix: "sk-ant-",
|
|
83
|
+
description: "Claude models via API key.",
|
|
84
|
+
family: "anthropic",
|
|
85
|
+
authMode: "api-key",
|
|
86
|
+
group: "local",
|
|
87
|
+
order: 50,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "openai",
|
|
91
|
+
name: "OpenAI",
|
|
92
|
+
envKey: "OPENAI_API_KEY",
|
|
93
|
+
pluginName: "@elizaos/plugin-openai",
|
|
94
|
+
keyPrefix: "sk-",
|
|
95
|
+
description: "GPT models via API key.",
|
|
96
|
+
family: "openai",
|
|
97
|
+
authMode: "api-key",
|
|
98
|
+
group: "local",
|
|
99
|
+
order: 60,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "openrouter",
|
|
103
|
+
name: "OpenRouter",
|
|
104
|
+
envKey: "OPENROUTER_API_KEY",
|
|
105
|
+
pluginName: "@elizaos/plugin-openrouter",
|
|
106
|
+
keyPrefix: "sk-or-",
|
|
107
|
+
description: "Access multiple models via one API key.",
|
|
108
|
+
family: "openrouter",
|
|
109
|
+
authMode: "api-key",
|
|
110
|
+
group: "local",
|
|
111
|
+
order: 70,
|
|
112
|
+
supportsPrimaryModelOverride: true,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: "gemini",
|
|
116
|
+
name: "Gemini",
|
|
117
|
+
envKey: "GOOGLE_GENERATIVE_AI_API_KEY",
|
|
118
|
+
pluginName: "@elizaos/plugin-google-genai",
|
|
119
|
+
keyPrefix: null,
|
|
120
|
+
description: "Google's Gemini models.",
|
|
121
|
+
family: "gemini",
|
|
122
|
+
authMode: "api-key",
|
|
123
|
+
group: "local",
|
|
124
|
+
order: 80,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: "grok",
|
|
128
|
+
name: "xAI (Grok)",
|
|
129
|
+
envKey: "XAI_API_KEY",
|
|
130
|
+
pluginName: "@elizaos/plugin-xai",
|
|
131
|
+
keyPrefix: "xai-",
|
|
132
|
+
description: "xAI's Grok models.",
|
|
133
|
+
family: "grok",
|
|
134
|
+
authMode: "api-key",
|
|
135
|
+
group: "local",
|
|
136
|
+
order: 90,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "groq",
|
|
140
|
+
name: "Groq",
|
|
141
|
+
envKey: "GROQ_API_KEY",
|
|
142
|
+
pluginName: "@elizaos/plugin-groq",
|
|
143
|
+
keyPrefix: "gsk_",
|
|
144
|
+
description: "Fast inference.",
|
|
145
|
+
family: "groq",
|
|
146
|
+
authMode: "api-key",
|
|
147
|
+
group: "local",
|
|
148
|
+
order: 100,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: "deepseek",
|
|
152
|
+
name: "DeepSeek",
|
|
153
|
+
envKey: "DEEPSEEK_API_KEY",
|
|
154
|
+
pluginName: "@elizaos/plugin-deepseek",
|
|
155
|
+
keyPrefix: "sk-",
|
|
156
|
+
description: "DeepSeek models.",
|
|
157
|
+
family: "deepseek",
|
|
158
|
+
authMode: "api-key",
|
|
159
|
+
group: "local",
|
|
160
|
+
order: 110,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: "mistral",
|
|
164
|
+
name: "Mistral",
|
|
165
|
+
envKey: "MISTRAL_API_KEY",
|
|
166
|
+
pluginName: "@elizaos/plugin-mistral",
|
|
167
|
+
keyPrefix: null,
|
|
168
|
+
description: "Mistral AI models.",
|
|
169
|
+
family: "mistral",
|
|
170
|
+
authMode: "api-key",
|
|
171
|
+
group: "local",
|
|
172
|
+
order: 120,
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: "together",
|
|
176
|
+
name: "Together AI",
|
|
177
|
+
envKey: "TOGETHER_API_KEY",
|
|
178
|
+
pluginName: "@elizaos/plugin-together",
|
|
179
|
+
keyPrefix: null,
|
|
180
|
+
description: "Open-source model hosting.",
|
|
181
|
+
family: "together",
|
|
182
|
+
authMode: "api-key",
|
|
183
|
+
group: "local",
|
|
184
|
+
order: 130,
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "ollama",
|
|
188
|
+
name: "Ollama",
|
|
189
|
+
envKey: null,
|
|
190
|
+
pluginName: "@elizaos/plugin-ollama",
|
|
191
|
+
keyPrefix: null,
|
|
192
|
+
description: "Local models, no API key needed.",
|
|
193
|
+
family: "ollama",
|
|
194
|
+
authMode: "local",
|
|
195
|
+
group: "local",
|
|
196
|
+
order: 140,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: "zai",
|
|
200
|
+
name: "z.ai",
|
|
201
|
+
envKey: "ZAI_API_KEY",
|
|
202
|
+
pluginName: "@homunculuslabs/plugin-zai",
|
|
203
|
+
keyPrefix: null,
|
|
204
|
+
description: "GLM models via z.ai Coding Plan.",
|
|
205
|
+
family: "zai",
|
|
206
|
+
authMode: "api-key",
|
|
207
|
+
group: "local",
|
|
208
|
+
order: 150,
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
export const ONBOARDING_CLOUD_PROVIDER_OPTIONS = [
|
|
212
|
+
{
|
|
213
|
+
id: "elizacloud",
|
|
214
|
+
name: "Eliza Cloud",
|
|
215
|
+
description: "Managed cloud infrastructure. Wallets, LLMs, and RPCs included.",
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
function pickOnboardingCloudModelPreferences(value) {
|
|
219
|
+
return {
|
|
220
|
+
...(value.nanoModel ? { nanoModel: value.nanoModel } : {}),
|
|
221
|
+
...(value.smallModel ? { smallModel: value.smallModel } : {}),
|
|
222
|
+
...(value.mediumModel ? { mediumModel: value.mediumModel } : {}),
|
|
223
|
+
...(value.largeModel ? { largeModel: value.largeModel } : {}),
|
|
224
|
+
...(value.megaModel ? { megaModel: value.megaModel } : {}),
|
|
225
|
+
...(value.responseHandlerModel
|
|
226
|
+
? { responseHandlerModel: value.responseHandlerModel }
|
|
227
|
+
: {}),
|
|
228
|
+
...(value.shouldRespondModel
|
|
229
|
+
? { shouldRespondModel: value.shouldRespondModel }
|
|
230
|
+
: {}),
|
|
231
|
+
...(value.actionPlannerModel
|
|
232
|
+
? { actionPlannerModel: value.actionPlannerModel }
|
|
233
|
+
: {}),
|
|
234
|
+
...(value.plannerModel ? { plannerModel: value.plannerModel } : {}),
|
|
235
|
+
...(value.responseModel ? { responseModel: value.responseModel } : {}),
|
|
236
|
+
...(value.mediaDescriptionModel
|
|
237
|
+
? { mediaDescriptionModel: value.mediaDescriptionModel }
|
|
238
|
+
: {}),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function readOnboardingCloudModelPreferences(source) {
|
|
242
|
+
if (!source) {
|
|
243
|
+
return {};
|
|
244
|
+
}
|
|
245
|
+
return pickOnboardingCloudModelPreferences({
|
|
246
|
+
nanoModel: readConfigString(source, "nanoModel"),
|
|
247
|
+
smallModel: readConfigString(source, "smallModel"),
|
|
248
|
+
mediumModel: readConfigString(source, "mediumModel"),
|
|
249
|
+
largeModel: readConfigString(source, "largeModel"),
|
|
250
|
+
megaModel: readConfigString(source, "megaModel"),
|
|
251
|
+
responseHandlerModel: readConfigString(source, "responseHandlerModel"),
|
|
252
|
+
shouldRespondModel: readConfigString(source, "shouldRespondModel"),
|
|
253
|
+
actionPlannerModel: readConfigString(source, "actionPlannerModel"),
|
|
254
|
+
plannerModel: readConfigString(source, "plannerModel"),
|
|
255
|
+
responseModel: readConfigString(source, "responseModel"),
|
|
256
|
+
mediaDescriptionModel: readConfigString(source, "mediaDescriptionModel"),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
const ONBOARDING_PROVIDER_ALIASES = {
|
|
260
|
+
"openai-codex": "openai-subscription",
|
|
261
|
+
"openai-subscription": "openai-subscription",
|
|
262
|
+
"anthropic-subscription": "anthropic-subscription",
|
|
263
|
+
google: "gemini",
|
|
264
|
+
"google-genai": "gemini",
|
|
265
|
+
gemini: "gemini",
|
|
266
|
+
xai: "grok",
|
|
267
|
+
grok: "grok",
|
|
268
|
+
"together-ai": "together",
|
|
269
|
+
together: "together",
|
|
270
|
+
"z.ai": "zai",
|
|
271
|
+
zai: "zai",
|
|
272
|
+
};
|
|
273
|
+
export function isSubscriptionProviderSelectionId(value) {
|
|
274
|
+
return SUBSCRIPTION_PROVIDER_SELECTIONS.some((provider) => provider.id === value);
|
|
275
|
+
}
|
|
276
|
+
export function normalizeSubscriptionProviderSelectionId(value) {
|
|
277
|
+
if (value === "anthropic-subscription")
|
|
278
|
+
return "anthropic-subscription";
|
|
279
|
+
if (value === "openai-subscription" || value === "openai-codex") {
|
|
280
|
+
return "openai-subscription";
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
export function getStoredSubscriptionProvider(selectionId) {
|
|
285
|
+
return selectionId === "anthropic-subscription"
|
|
286
|
+
? "anthropic-subscription"
|
|
287
|
+
: "openai-codex";
|
|
288
|
+
}
|
|
289
|
+
export function getSubscriptionProviderFamily(selectionId) {
|
|
290
|
+
return selectionId === "anthropic-subscription" ? "anthropic" : "openai";
|
|
291
|
+
}
|
|
292
|
+
export function requiresAdditionalRuntimeProvider(providerId) {
|
|
293
|
+
return normalizeOnboardingProviderId(providerId) === "anthropic-subscription";
|
|
294
|
+
}
|
|
295
|
+
export function normalizeOnboardingProviderId(value) {
|
|
296
|
+
if (typeof value !== "string")
|
|
297
|
+
return null;
|
|
298
|
+
const trimmed = value.trim().toLowerCase();
|
|
299
|
+
if (!trimmed)
|
|
300
|
+
return null;
|
|
301
|
+
const candidates = Array.from(new Set([
|
|
302
|
+
trimmed,
|
|
303
|
+
trimmed.replace(/^@[^/]+\//, ""),
|
|
304
|
+
trimmed.replace(/^@[^/]+\//, "").replace(/^plugin-/, ""),
|
|
305
|
+
]));
|
|
306
|
+
for (const candidate of candidates) {
|
|
307
|
+
const directMatch = ONBOARDING_PROVIDER_CATALOG.find((provider) => provider.id === candidate);
|
|
308
|
+
if (directMatch) {
|
|
309
|
+
return directMatch.id;
|
|
310
|
+
}
|
|
311
|
+
const alias = ONBOARDING_PROVIDER_ALIASES[candidate];
|
|
312
|
+
if (alias) {
|
|
313
|
+
return alias;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
for (const candidate of candidates) {
|
|
317
|
+
const pluginMatches = ONBOARDING_PROVIDER_CATALOG.filter((provider) => provider.pluginName.toLowerCase() === candidate);
|
|
318
|
+
if (pluginMatches.length === 0) {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
// Some plugin packages back both subscription and API-key flows.
|
|
322
|
+
// Prefer the concrete API-key provider unless the caller explicitly
|
|
323
|
+
// passed a subscription id/alias above.
|
|
324
|
+
const preferredMatch = pluginMatches.find((provider) => provider.authMode === "api-key") ??
|
|
325
|
+
pluginMatches[0];
|
|
326
|
+
return preferredMatch.id;
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
export function getOnboardingProviderOption(providerId) {
|
|
331
|
+
const normalized = normalizeOnboardingProviderId(providerId);
|
|
332
|
+
if (!normalized)
|
|
333
|
+
return null;
|
|
334
|
+
return (ONBOARDING_PROVIDER_CATALOG.find((provider) => provider.id === normalized) ?? null);
|
|
335
|
+
}
|
|
336
|
+
export function getOnboardingProviderFamily(providerId) {
|
|
337
|
+
return getOnboardingProviderOption(providerId)?.family ?? null;
|
|
338
|
+
}
|
|
339
|
+
export function getStoredOnboardingProviderId(providerId) {
|
|
340
|
+
const provider = getOnboardingProviderOption(providerId);
|
|
341
|
+
if (!provider)
|
|
342
|
+
return null;
|
|
343
|
+
return provider.storedProvider ?? provider.id;
|
|
344
|
+
}
|
|
345
|
+
export function sortOnboardingProviders(providers) {
|
|
346
|
+
return [...providers].sort((left, right) => {
|
|
347
|
+
const recommendedDelta = Number(Boolean(right.recommended)) - Number(Boolean(left.recommended));
|
|
348
|
+
if (recommendedDelta !== 0) {
|
|
349
|
+
return recommendedDelta;
|
|
350
|
+
}
|
|
351
|
+
return left.order - right.order;
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
export function isCloudManagedConnection(connection) {
|
|
355
|
+
return connection?.kind === "cloud-managed";
|
|
356
|
+
}
|
|
357
|
+
export function isRemoteProviderConnection(connection) {
|
|
358
|
+
return connection?.kind === "remote-provider";
|
|
359
|
+
}
|
|
360
|
+
export function isLocalProviderConnection(connection) {
|
|
361
|
+
return connection?.kind === "local-provider";
|
|
362
|
+
}
|
|
363
|
+
export function isOnboardingConnectionComplete(connection) {
|
|
364
|
+
if (isLocalProviderConnection(connection)) {
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
if (isRemoteProviderConnection(connection)) {
|
|
368
|
+
return Boolean(connection.remoteApiBase.trim());
|
|
369
|
+
}
|
|
370
|
+
if (isCloudManagedConnection(connection)) {
|
|
371
|
+
// Cloud OAuth sessions have no apiKey — inference access is provided by
|
|
372
|
+
// the cloud session token. The connection is complete when models are
|
|
373
|
+
// selected, regardless of whether an explicit API key is present.
|
|
374
|
+
return Boolean(connection.smallModel?.trim() && connection.largeModel?.trim());
|
|
375
|
+
}
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
const REDACTED_SECRET = "[REDACTED]";
|
|
379
|
+
function asConfigRecord(value) {
|
|
380
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
381
|
+
? value
|
|
382
|
+
: null;
|
|
383
|
+
}
|
|
384
|
+
function readConfigString(source, key) {
|
|
385
|
+
const value = source?.[key];
|
|
386
|
+
if (typeof value !== "string") {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
const trimmed = value.trim();
|
|
390
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
391
|
+
}
|
|
392
|
+
function normalizeSecretString(value) {
|
|
393
|
+
if (typeof value !== "string") {
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
const trimmed = value.trim();
|
|
397
|
+
if (!trimmed || trimmed.toUpperCase() === REDACTED_SECRET) {
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
return trimmed;
|
|
401
|
+
}
|
|
402
|
+
function readOnboardingEnvContainer(config) {
|
|
403
|
+
const env = asConfigRecord(config?.env);
|
|
404
|
+
return {
|
|
405
|
+
env,
|
|
406
|
+
vars: asConfigRecord(env?.vars),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
export function readOnboardingEnvString(config, key) {
|
|
410
|
+
const { env, vars } = readOnboardingEnvContainer(config);
|
|
411
|
+
return readConfigString(vars, key) ?? readConfigString(env, key);
|
|
412
|
+
}
|
|
413
|
+
export function readOnboardingEnvSecret(config, key) {
|
|
414
|
+
return normalizeSecretString(readOnboardingEnvString(config, key));
|
|
415
|
+
}
|
|
416
|
+
/** Alias to keep call-sites unchanged. */
|
|
417
|
+
const _isTruthyEnvFlag = isTruthyEnvValue;
|
|
418
|
+
export function getOnboardingProviderSignalEnvKeys(providerId) {
|
|
419
|
+
if (providerId === "ollama") {
|
|
420
|
+
return ["OLLAMA_BASE_URL"];
|
|
421
|
+
}
|
|
422
|
+
const provider = getOnboardingProviderOption(providerId);
|
|
423
|
+
return provider?.envKey ? [provider.envKey] : [];
|
|
424
|
+
}
|
|
425
|
+
function readPrimaryModelFromConfig(config) {
|
|
426
|
+
const agents = asConfigRecord(config?.agents);
|
|
427
|
+
const defaults = asConfigRecord(agents?.defaults);
|
|
428
|
+
const model = asConfigRecord(defaults?.model);
|
|
429
|
+
return readConfigString(model, "primary");
|
|
430
|
+
}
|
|
431
|
+
export function hasExplicitCanonicalRuntimeConfig(config) {
|
|
432
|
+
const root = asConfigRecord(config);
|
|
433
|
+
return Boolean(root &&
|
|
434
|
+
(Object.hasOwn(root, "deploymentTarget") ||
|
|
435
|
+
Object.hasOwn(root, "linkedAccounts") ||
|
|
436
|
+
Object.hasOwn(root, "serviceRouting")));
|
|
437
|
+
}
|
|
438
|
+
function buildElizaCloudTextRoute(args) {
|
|
439
|
+
return {
|
|
440
|
+
backend: "elizacloud",
|
|
441
|
+
transport: "cloud-proxy",
|
|
442
|
+
accountId: "elizacloud",
|
|
443
|
+
...pickOnboardingCloudModelPreferences(args),
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const LEGACY_CLOUD_ROUTING_KEYS = [
|
|
447
|
+
"enabled",
|
|
448
|
+
"provider",
|
|
449
|
+
"remoteApiBase",
|
|
450
|
+
"remoteAccessToken",
|
|
451
|
+
"inferenceMode",
|
|
452
|
+
"runtime",
|
|
453
|
+
];
|
|
454
|
+
const LEGACY_CLOUD_SERVICE_KEYS = [
|
|
455
|
+
"inference",
|
|
456
|
+
"tts",
|
|
457
|
+
"media",
|
|
458
|
+
"embeddings",
|
|
459
|
+
"rpc",
|
|
460
|
+
];
|
|
461
|
+
function resolveLegacyDeploymentTargetInConfig(config) {
|
|
462
|
+
const cloud = asConfigRecord(config?.cloud);
|
|
463
|
+
const remoteApiBase = readConfigString(cloud, "remoteApiBase");
|
|
464
|
+
if (remoteApiBase) {
|
|
465
|
+
return {
|
|
466
|
+
runtime: "remote",
|
|
467
|
+
provider: "remote",
|
|
468
|
+
remoteApiBase,
|
|
469
|
+
...(normalizeSecretString(cloud?.remoteAccessToken)
|
|
470
|
+
? {
|
|
471
|
+
remoteAccessToken: normalizeSecretString(cloud?.remoteAccessToken),
|
|
472
|
+
}
|
|
473
|
+
: {}),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
const cloudProvider = normalizeOnboardingProviderId(readConfigString(cloud, "provider"));
|
|
477
|
+
const cloudRuntime = readConfigString(cloud, "runtime");
|
|
478
|
+
const cloudAgentId = readConfigString(cloud, "agentId");
|
|
479
|
+
if (cloudRuntime === "cloud" &&
|
|
480
|
+
cloudProvider === "elizacloud" &&
|
|
481
|
+
cloudAgentId) {
|
|
482
|
+
return { runtime: "cloud", provider: "elizacloud" };
|
|
483
|
+
}
|
|
484
|
+
return { runtime: "local" };
|
|
485
|
+
}
|
|
486
|
+
function resolveLegacyServiceRoutingInConfig(config) {
|
|
487
|
+
const root = asConfigRecord(config);
|
|
488
|
+
const explicit = normalizeServiceRoutingConfig(root?.serviceRouting) ?? {};
|
|
489
|
+
const next = { ...explicit };
|
|
490
|
+
const deploymentTarget = normalizeDeploymentTargetConfig(root?.deploymentTarget) ??
|
|
491
|
+
resolveLegacyDeploymentTargetInConfig(config);
|
|
492
|
+
const cloud = asConfigRecord(config?.cloud);
|
|
493
|
+
const cloudServices = asConfigRecord(cloud?.services);
|
|
494
|
+
const models = asConfigRecord(config?.models);
|
|
495
|
+
if (!next.llmText) {
|
|
496
|
+
if (deploymentTarget.runtime === "remote" && deploymentTarget.remoteApiBase) {
|
|
497
|
+
const remotePrimaryModel = readPrimaryModelFromConfig(config);
|
|
498
|
+
next.llmText = {
|
|
499
|
+
backend: "remote",
|
|
500
|
+
transport: "remote",
|
|
501
|
+
remoteApiBase: deploymentTarget.remoteApiBase,
|
|
502
|
+
...(remotePrimaryModel ? { primaryModel: remotePrimaryModel } : {}),
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
else if (inferLegacyCloudInferenceSelection(config)) {
|
|
506
|
+
next.llmText = buildElizaCloudTextRoute({
|
|
507
|
+
smallModel: readConfigString(models, "small"),
|
|
508
|
+
largeModel: readConfigString(models, "large"),
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
const localProvider = resolveConfiguredLocalProviderFromSignals(config);
|
|
513
|
+
const primaryModel = readPrimaryModelFromConfig(config);
|
|
514
|
+
if (localProvider) {
|
|
515
|
+
next.llmText = {
|
|
516
|
+
backend: localProvider,
|
|
517
|
+
transport: "direct",
|
|
518
|
+
...(primaryModel ? { primaryModel } : {}),
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const legacyCloudServices = [
|
|
524
|
+
[
|
|
525
|
+
"tts",
|
|
526
|
+
typeof cloudServices?.tts === "boolean" ? cloudServices.tts : undefined,
|
|
527
|
+
],
|
|
528
|
+
[
|
|
529
|
+
"media",
|
|
530
|
+
typeof cloudServices?.media === "boolean"
|
|
531
|
+
? cloudServices.media
|
|
532
|
+
: undefined,
|
|
533
|
+
],
|
|
534
|
+
[
|
|
535
|
+
"embeddings",
|
|
536
|
+
typeof cloudServices?.embeddings === "boolean"
|
|
537
|
+
? cloudServices.embeddings
|
|
538
|
+
: undefined,
|
|
539
|
+
],
|
|
540
|
+
[
|
|
541
|
+
"rpc",
|
|
542
|
+
typeof cloudServices?.rpc === "boolean" ? cloudServices.rpc : undefined,
|
|
543
|
+
],
|
|
544
|
+
];
|
|
545
|
+
for (const [capability, legacyValue] of legacyCloudServices) {
|
|
546
|
+
if (next[capability]) {
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
if (legacyValue !== true) {
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
next[capability] = {
|
|
553
|
+
backend: "elizacloud",
|
|
554
|
+
transport: "cloud-proxy",
|
|
555
|
+
accountId: "elizacloud",
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
return Object.keys(next).length > 0 ? next : null;
|
|
559
|
+
}
|
|
560
|
+
function pruneLegacyCloudRoutingFields(config) {
|
|
561
|
+
const root = asConfigRecord(config);
|
|
562
|
+
const cloud = asConfigRecord(root?.cloud);
|
|
563
|
+
if (!root || !cloud) {
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
for (const key of LEGACY_CLOUD_ROUTING_KEYS) {
|
|
567
|
+
delete cloud[key];
|
|
568
|
+
}
|
|
569
|
+
const services = asConfigRecord(cloud.services);
|
|
570
|
+
if (services) {
|
|
571
|
+
for (const key of LEGACY_CLOUD_SERVICE_KEYS) {
|
|
572
|
+
delete services[key];
|
|
573
|
+
}
|
|
574
|
+
if (Object.keys(services).length === 0) {
|
|
575
|
+
delete cloud.services;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
cloud.services = services;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
if (Object.keys(cloud).length === 0) {
|
|
582
|
+
delete root.cloud;
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
root.cloud = cloud;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
export function migrateLegacyRuntimeConfig(config) {
|
|
589
|
+
const root = asConfigRecord(config);
|
|
590
|
+
if (!root) {
|
|
591
|
+
return config;
|
|
592
|
+
}
|
|
593
|
+
const deploymentTarget = normalizeDeploymentTargetConfig(root.deploymentTarget) ??
|
|
594
|
+
resolveLegacyDeploymentTargetInConfig(root);
|
|
595
|
+
if (deploymentTarget.runtime === "local" &&
|
|
596
|
+
!Object.hasOwn(root, "deploymentTarget")) {
|
|
597
|
+
// Keep local default implicit to avoid churn in brand-new configs.
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
root.deploymentTarget = deploymentTarget;
|
|
601
|
+
}
|
|
602
|
+
const linkedAccounts = resolveLinkedAccountsInConfig(root);
|
|
603
|
+
if (linkedAccounts) {
|
|
604
|
+
root.linkedAccounts = linkedAccounts;
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
delete root.linkedAccounts;
|
|
608
|
+
}
|
|
609
|
+
const serviceRouting = normalizeServiceRoutingConfig(root.serviceRouting) ??
|
|
610
|
+
resolveLegacyServiceRoutingInConfig(root);
|
|
611
|
+
if (serviceRouting) {
|
|
612
|
+
root.serviceRouting = serviceRouting;
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
delete root.serviceRouting;
|
|
616
|
+
}
|
|
617
|
+
if (Object.hasOwn(root, "connection")) {
|
|
618
|
+
delete root.connection;
|
|
619
|
+
}
|
|
620
|
+
pruneLegacyCloudRoutingFields(root);
|
|
621
|
+
return config;
|
|
622
|
+
}
|
|
623
|
+
export function resolveLinkedAccountsInConfig(config) {
|
|
624
|
+
const root = asConfigRecord(config);
|
|
625
|
+
const explicit = normalizeLinkedAccountsConfig(root?.linkedAccounts) ?? {};
|
|
626
|
+
const next = { ...explicit };
|
|
627
|
+
const cloud = asConfigRecord(config?.cloud);
|
|
628
|
+
const hasCloudKey = Boolean(normalizeSecretString(cloud?.apiKey));
|
|
629
|
+
const existingCloudAccount = next.elizacloud;
|
|
630
|
+
if (hasCloudKey && (!existingCloudAccount || !existingCloudAccount.status)) {
|
|
631
|
+
next.elizacloud = {
|
|
632
|
+
...existingCloudAccount,
|
|
633
|
+
status: "linked",
|
|
634
|
+
source: existingCloudAccount?.source ?? "api-key",
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
return Object.keys(next).length > 0 ? next : null;
|
|
638
|
+
}
|
|
639
|
+
export function resolveDeploymentTargetInConfig(config) {
|
|
640
|
+
const root = asConfigRecord(config);
|
|
641
|
+
const explicit = normalizeDeploymentTargetConfig(root?.deploymentTarget);
|
|
642
|
+
if (explicit) {
|
|
643
|
+
return explicit;
|
|
644
|
+
}
|
|
645
|
+
return { runtime: "local" };
|
|
646
|
+
}
|
|
647
|
+
export function resolveServiceRoutingInConfig(config) {
|
|
648
|
+
const root = asConfigRecord(config);
|
|
649
|
+
const explicit = normalizeServiceRoutingConfig(root?.serviceRouting) ?? {};
|
|
650
|
+
const next = { ...explicit };
|
|
651
|
+
const deploymentTarget = resolveDeploymentTargetInConfig(config);
|
|
652
|
+
if (!next.llmText) {
|
|
653
|
+
if (deploymentTarget.runtime === "remote" && deploymentTarget.remoteApiBase) {
|
|
654
|
+
const remotePrimaryModel = readPrimaryModelFromConfig(config);
|
|
655
|
+
next.llmText = {
|
|
656
|
+
backend: "remote",
|
|
657
|
+
transport: "remote",
|
|
658
|
+
remoteApiBase: deploymentTarget.remoteApiBase,
|
|
659
|
+
...(remotePrimaryModel ? { primaryModel: remotePrimaryModel } : {}),
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
const localProvider = resolveConfiguredLocalProviderFromSignals(config);
|
|
664
|
+
const primaryModel = readPrimaryModelFromConfig(config);
|
|
665
|
+
if (localProvider) {
|
|
666
|
+
next.llmText = {
|
|
667
|
+
backend: localProvider,
|
|
668
|
+
transport: "direct",
|
|
669
|
+
...(primaryModel ? { primaryModel } : {}),
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return Object.keys(next).length > 0 ? next : null;
|
|
675
|
+
}
|
|
676
|
+
function deriveOnboardingConnectionFromRuntimeConfig(config) {
|
|
677
|
+
const routing = resolveServiceRoutingInConfig(config);
|
|
678
|
+
const deploymentTarget = resolveDeploymentTargetInConfig(config);
|
|
679
|
+
const llmText = routing?.llmText;
|
|
680
|
+
const backend = normalizeOnboardingProviderId(llmText?.backend);
|
|
681
|
+
const localProviderOption = backend
|
|
682
|
+
? getOnboardingProviderOption(backend)
|
|
683
|
+
: null;
|
|
684
|
+
const routeApiKey = localProviderOption?.envKey != null
|
|
685
|
+
? readOnboardingEnvSecret(config, localProviderOption.envKey)
|
|
686
|
+
: undefined;
|
|
687
|
+
if (llmText?.transport === "cloud-proxy" && backend === "elizacloud") {
|
|
688
|
+
return {
|
|
689
|
+
kind: "cloud-managed",
|
|
690
|
+
cloudProvider: "elizacloud",
|
|
691
|
+
...pickOnboardingCloudModelPreferences(llmText),
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
if (llmText?.transport === "remote") {
|
|
695
|
+
const remoteApiBase = llmText.remoteApiBase ?? deploymentTarget.remoteApiBase;
|
|
696
|
+
if (!remoteApiBase) {
|
|
697
|
+
return null;
|
|
698
|
+
}
|
|
699
|
+
return {
|
|
700
|
+
kind: "remote-provider",
|
|
701
|
+
remoteApiBase,
|
|
702
|
+
...(deploymentTarget.remoteAccessToken
|
|
703
|
+
? { remoteAccessToken: deploymentTarget.remoteAccessToken }
|
|
704
|
+
: {}),
|
|
705
|
+
...(backend && backend !== "elizacloud" ? { provider: backend } : {}),
|
|
706
|
+
...(routeApiKey ? { apiKey: routeApiKey } : {}),
|
|
707
|
+
...(llmText.primaryModel ? { primaryModel: llmText.primaryModel } : {}),
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
if (backend && backend !== "elizacloud") {
|
|
711
|
+
return {
|
|
712
|
+
kind: "local-provider",
|
|
713
|
+
provider: backend,
|
|
714
|
+
...(routeApiKey ? { apiKey: routeApiKey } : {}),
|
|
715
|
+
...(llmText?.primaryModel ? { primaryModel: llmText.primaryModel } : {}),
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
if (deploymentTarget.runtime === "remote" &&
|
|
719
|
+
deploymentTarget.remoteApiBase?.trim()) {
|
|
720
|
+
return {
|
|
721
|
+
kind: "remote-provider",
|
|
722
|
+
remoteApiBase: deploymentTarget.remoteApiBase,
|
|
723
|
+
...(deploymentTarget.remoteAccessToken
|
|
724
|
+
? { remoteAccessToken: deploymentTarget.remoteAccessToken }
|
|
725
|
+
: {}),
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
return null;
|
|
729
|
+
}
|
|
730
|
+
function resolveConfiguredLocalProviderFromSignals(config) {
|
|
731
|
+
const agents = asConfigRecord(config?.agents);
|
|
732
|
+
const defaults = asConfigRecord(agents?.defaults);
|
|
733
|
+
const storedSubscriptionProvider = normalizeOnboardingProviderId(readConfigString(defaults, "subscriptionProvider"));
|
|
734
|
+
if (storedSubscriptionProvider &&
|
|
735
|
+
storedSubscriptionProvider !== "elizacloud" &&
|
|
736
|
+
!requiresAdditionalRuntimeProvider(storedSubscriptionProvider)) {
|
|
737
|
+
return storedSubscriptionProvider;
|
|
738
|
+
}
|
|
739
|
+
for (const provider of ONBOARDING_PROVIDER_CATALOG) {
|
|
740
|
+
if (provider.id === "elizacloud") {
|
|
741
|
+
continue;
|
|
742
|
+
}
|
|
743
|
+
const providerId = provider.id;
|
|
744
|
+
const detected = getOnboardingProviderSignalEnvKeys(providerId).some((key) => Boolean(readOnboardingEnvString(config, key)));
|
|
745
|
+
if (detected) {
|
|
746
|
+
return providerId;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
export function normalizePersistedOnboardingConnection(value) {
|
|
752
|
+
const connection = asConfigRecord(value);
|
|
753
|
+
if (!connection) {
|
|
754
|
+
return null;
|
|
755
|
+
}
|
|
756
|
+
if (connection.kind === "cloud-managed") {
|
|
757
|
+
return {
|
|
758
|
+
kind: "cloud-managed",
|
|
759
|
+
cloudProvider: "elizacloud",
|
|
760
|
+
apiKey: normalizeSecretString(connection.apiKey),
|
|
761
|
+
...readOnboardingCloudModelPreferences(connection),
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
if (connection.kind === "local-provider") {
|
|
765
|
+
const provider = normalizeOnboardingProviderId(connection.provider);
|
|
766
|
+
if (!provider || provider === "elizacloud") {
|
|
767
|
+
return null;
|
|
768
|
+
}
|
|
769
|
+
return {
|
|
770
|
+
kind: "local-provider",
|
|
771
|
+
provider,
|
|
772
|
+
apiKey: normalizeSecretString(connection.apiKey),
|
|
773
|
+
primaryModel: readConfigString(connection, "primaryModel"),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
if (connection.kind === "remote-provider") {
|
|
777
|
+
const remoteApiBase = readConfigString(connection, "remoteApiBase");
|
|
778
|
+
const provider = normalizeOnboardingProviderId(connection.provider);
|
|
779
|
+
if (!remoteApiBase) {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
return {
|
|
783
|
+
kind: "remote-provider",
|
|
784
|
+
remoteApiBase,
|
|
785
|
+
remoteAccessToken: normalizeSecretString(connection.remoteAccessToken),
|
|
786
|
+
provider: provider && provider !== "elizacloud" ? provider : undefined,
|
|
787
|
+
apiKey: normalizeSecretString(connection.apiKey),
|
|
788
|
+
primaryModel: readConfigString(connection, "primaryModel"),
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
return null;
|
|
792
|
+
}
|
|
793
|
+
export function normalizeOnboardingCredentialInputs(value) {
|
|
794
|
+
const inputs = asConfigRecord(value);
|
|
795
|
+
if (!inputs) {
|
|
796
|
+
return null;
|
|
797
|
+
}
|
|
798
|
+
const llmApiKey = normalizeSecretString(inputs.llmApiKey);
|
|
799
|
+
const cloudApiKey = normalizeSecretString(inputs.cloudApiKey);
|
|
800
|
+
if (!llmApiKey && !cloudApiKey) {
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
return {
|
|
804
|
+
...(llmApiKey ? { llmApiKey } : {}),
|
|
805
|
+
...(cloudApiKey ? { cloudApiKey } : {}),
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
export function deriveOnboardingCredentialPersistencePlan(args) {
|
|
809
|
+
const credentialInputs = normalizeOnboardingCredentialInputs(args.credentialInputs);
|
|
810
|
+
const deploymentTarget = normalizeDeploymentTargetConfig(args.deploymentTarget);
|
|
811
|
+
const serviceRouting = normalizeServiceRoutingConfig(args.serviceRouting);
|
|
812
|
+
const llmRoute = serviceRouting?.llmText;
|
|
813
|
+
const cloudApiKey = credentialInputs?.cloudApiKey;
|
|
814
|
+
const llmApiKey = credentialInputs?.llmApiKey;
|
|
815
|
+
if (llmRoute?.transport === "cloud-proxy" &&
|
|
816
|
+
normalizeOnboardingProviderId(llmRoute.backend) === "elizacloud" &&
|
|
817
|
+
cloudApiKey) {
|
|
818
|
+
return {
|
|
819
|
+
llmSelection: {
|
|
820
|
+
backend: "elizacloud",
|
|
821
|
+
transport: "cloud-proxy",
|
|
822
|
+
apiKey: cloudApiKey,
|
|
823
|
+
...pickOnboardingCloudModelPreferences(llmRoute),
|
|
824
|
+
},
|
|
825
|
+
cloudApiKey,
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
if (llmRoute?.transport === "direct" && llmApiKey) {
|
|
829
|
+
const provider = normalizeOnboardingProviderId(llmRoute.backend);
|
|
830
|
+
if (provider && provider !== "elizacloud") {
|
|
831
|
+
return {
|
|
832
|
+
llmSelection: {
|
|
833
|
+
backend: provider,
|
|
834
|
+
transport: "direct",
|
|
835
|
+
apiKey: llmApiKey,
|
|
836
|
+
...(llmRoute.primaryModel
|
|
837
|
+
? { primaryModel: llmRoute.primaryModel }
|
|
838
|
+
: {}),
|
|
839
|
+
},
|
|
840
|
+
...(cloudApiKey ? { cloudApiKey } : {}),
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
if (llmRoute?.transport === "remote" && llmApiKey) {
|
|
845
|
+
const provider = normalizeOnboardingProviderId(llmRoute.backend);
|
|
846
|
+
const remoteApiBase = llmRoute.remoteApiBase ?? deploymentTarget?.remoteApiBase;
|
|
847
|
+
if (provider && provider !== "elizacloud" && remoteApiBase) {
|
|
848
|
+
return {
|
|
849
|
+
llmSelection: {
|
|
850
|
+
backend: provider,
|
|
851
|
+
transport: "remote",
|
|
852
|
+
remoteApiBase,
|
|
853
|
+
...(deploymentTarget?.remoteAccessToken
|
|
854
|
+
? { remoteAccessToken: deploymentTarget.remoteAccessToken }
|
|
855
|
+
: {}),
|
|
856
|
+
apiKey: llmApiKey,
|
|
857
|
+
...(llmRoute.primaryModel
|
|
858
|
+
? { primaryModel: llmRoute.primaryModel }
|
|
859
|
+
: {}),
|
|
860
|
+
},
|
|
861
|
+
...(cloudApiKey ? { cloudApiKey } : {}),
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
return {
|
|
866
|
+
llmSelection: null,
|
|
867
|
+
...(cloudApiKey ? { cloudApiKey } : {}),
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
export function stripOnboardingConnectionSecrets(connection) {
|
|
871
|
+
if (connection.kind === "cloud-managed") {
|
|
872
|
+
return {
|
|
873
|
+
kind: "cloud-managed",
|
|
874
|
+
cloudProvider: "elizacloud",
|
|
875
|
+
...pickOnboardingCloudModelPreferences(connection),
|
|
876
|
+
};
|
|
877
|
+
}
|
|
878
|
+
if (connection.kind === "local-provider") {
|
|
879
|
+
return {
|
|
880
|
+
kind: "local-provider",
|
|
881
|
+
provider: connection.provider,
|
|
882
|
+
primaryModel: connection.primaryModel,
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
return {
|
|
886
|
+
kind: "remote-provider",
|
|
887
|
+
remoteApiBase: connection.remoteApiBase,
|
|
888
|
+
provider: connection.provider,
|
|
889
|
+
primaryModel: connection.primaryModel,
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
export function inferCompatibilityOnboardingConnection(config) {
|
|
893
|
+
const cloud = asConfigRecord(config?.cloud);
|
|
894
|
+
const models = asConfigRecord(config?.models);
|
|
895
|
+
const remoteApiBase = readConfigString(cloud, "remoteApiBase");
|
|
896
|
+
const remoteAccessToken = normalizeSecretString(cloud?.remoteAccessToken);
|
|
897
|
+
const localProvider = resolveConfiguredLocalProviderFromSignals(config);
|
|
898
|
+
const primaryModel = readPrimaryModelFromConfig(config);
|
|
899
|
+
const localProviderOption = getOnboardingProviderOption(localProvider);
|
|
900
|
+
const localApiKey = localProviderOption?.envKey != null
|
|
901
|
+
? readOnboardingEnvSecret(config, localProviderOption.envKey)
|
|
902
|
+
: undefined;
|
|
903
|
+
if (remoteApiBase) {
|
|
904
|
+
return {
|
|
905
|
+
kind: "remote-provider",
|
|
906
|
+
remoteApiBase,
|
|
907
|
+
remoteAccessToken,
|
|
908
|
+
provider: localProvider ?? undefined,
|
|
909
|
+
apiKey: localApiKey,
|
|
910
|
+
primaryModel,
|
|
911
|
+
};
|
|
912
|
+
}
|
|
913
|
+
const cloudProvider = normalizeOnboardingProviderId(readConfigString(cloud, "provider"));
|
|
914
|
+
const cloudApiKey = normalizeSecretString(cloud?.apiKey);
|
|
915
|
+
const nanoModel = readConfigString(models, "nano");
|
|
916
|
+
const smallModel = readConfigString(models, "small");
|
|
917
|
+
const mediumModel = readConfigString(models, "medium");
|
|
918
|
+
const largeModel = readConfigString(models, "large");
|
|
919
|
+
const megaModel = readConfigString(models, "mega");
|
|
920
|
+
const cloudExplicitlyDisabled = cloud?.enabled === false;
|
|
921
|
+
if (!cloudExplicitlyDisabled &&
|
|
922
|
+
(cloud?.enabled === true ||
|
|
923
|
+
cloudProvider === "elizacloud" ||
|
|
924
|
+
readConfigString(cloud, "inferenceMode") === "cloud" ||
|
|
925
|
+
nanoModel ||
|
|
926
|
+
smallModel ||
|
|
927
|
+
mediumModel ||
|
|
928
|
+
largeModel ||
|
|
929
|
+
megaModel)) {
|
|
930
|
+
return {
|
|
931
|
+
kind: "cloud-managed",
|
|
932
|
+
cloudProvider: "elizacloud",
|
|
933
|
+
apiKey: cloudApiKey,
|
|
934
|
+
nanoModel,
|
|
935
|
+
smallModel,
|
|
936
|
+
mediumModel,
|
|
937
|
+
largeModel,
|
|
938
|
+
megaModel,
|
|
939
|
+
};
|
|
940
|
+
}
|
|
941
|
+
if (!localProvider) {
|
|
942
|
+
return null;
|
|
943
|
+
}
|
|
944
|
+
return {
|
|
945
|
+
kind: "local-provider",
|
|
946
|
+
provider: localProvider,
|
|
947
|
+
apiKey: localApiKey,
|
|
948
|
+
primaryModel,
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
export function inferOnboardingConnectionFromConfig(config) {
|
|
952
|
+
return deriveOnboardingConnectionFromRuntimeConfig(config);
|
|
953
|
+
}
|
|
954
|
+
function inferLegacyCloudInferenceSelection(config) {
|
|
955
|
+
const cloud = asConfigRecord(config?.cloud);
|
|
956
|
+
if (cloud?.enabled === false) {
|
|
957
|
+
return false;
|
|
958
|
+
}
|
|
959
|
+
const services = asConfigRecord(cloud?.services);
|
|
960
|
+
const inferenceMode = readConfigString(cloud, "inferenceMode");
|
|
961
|
+
if (inferenceMode === "byok" ||
|
|
962
|
+
inferenceMode === "local" ||
|
|
963
|
+
services?.inference === false) {
|
|
964
|
+
return false;
|
|
965
|
+
}
|
|
966
|
+
const cloudProvider = normalizeOnboardingProviderId(readConfigString(cloud, "provider"));
|
|
967
|
+
const models = asConfigRecord(config?.models);
|
|
968
|
+
const nanoModel = readConfigString(models, "nano");
|
|
969
|
+
const smallModel = readConfigString(models, "small");
|
|
970
|
+
const mediumModel = readConfigString(models, "medium");
|
|
971
|
+
const largeModel = readConfigString(models, "large");
|
|
972
|
+
const megaModel = readConfigString(models, "mega");
|
|
973
|
+
return Boolean(cloud?.enabled === true ||
|
|
974
|
+
cloudProvider === "elizacloud" ||
|
|
975
|
+
inferenceMode === "cloud" ||
|
|
976
|
+
nanoModel ||
|
|
977
|
+
smallModel ||
|
|
978
|
+
mediumModel ||
|
|
979
|
+
largeModel ||
|
|
980
|
+
megaModel);
|
|
981
|
+
}
|
|
982
|
+
export function isCloudInferenceSelectedInConfig(config) {
|
|
983
|
+
const routing = resolveServiceRoutingInConfig(config);
|
|
984
|
+
const llmText = routing?.llmText;
|
|
985
|
+
return Boolean(llmText?.transport === "cloud-proxy" &&
|
|
986
|
+
normalizeOnboardingProviderId(llmText.backend) === "elizacloud");
|
|
987
|
+
}
|
|
988
|
+
// ---------------------------------------------------------------------------
|
|
989
|
+
// Provider option registry — allows plugins to register additional providers
|
|
990
|
+
// at runtime without modifying the hardcoded ONBOARDING_PROVIDER_CATALOG.
|
|
991
|
+
// ---------------------------------------------------------------------------
|
|
992
|
+
const _registeredProviderOptions = [];
|
|
993
|
+
/**
|
|
994
|
+
* Register an additional provider option at runtime.
|
|
995
|
+
* Plugins should call this during initialization to add themselves to the
|
|
996
|
+
* onboarding provider catalog.
|
|
997
|
+
*/
|
|
998
|
+
export function registerProviderOption(option) {
|
|
999
|
+
const existing = _registeredProviderOptions.findIndex((o) => o.id === option.id);
|
|
1000
|
+
if (existing >= 0) {
|
|
1001
|
+
_registeredProviderOptions[existing] = option;
|
|
1002
|
+
}
|
|
1003
|
+
else {
|
|
1004
|
+
_registeredProviderOptions.push(option);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
/**
|
|
1008
|
+
* Get all provider options: hardcoded catalog merged with runtime-registered
|
|
1009
|
+
* providers. Runtime registrations override hardcoded entries with the same id.
|
|
1010
|
+
*/
|
|
1011
|
+
export function getProviderOptions() {
|
|
1012
|
+
const merged = new Map();
|
|
1013
|
+
for (const option of ONBOARDING_PROVIDER_CATALOG) {
|
|
1014
|
+
merged.set(option.id, option);
|
|
1015
|
+
}
|
|
1016
|
+
for (const option of _registeredProviderOptions) {
|
|
1017
|
+
merged.set(option.id, option);
|
|
1018
|
+
}
|
|
1019
|
+
return Array.from(merged.values());
|
|
1020
|
+
}
|
|
1021
|
+
//# sourceMappingURL=onboarding.js.map
|