@robota-sdk/agent-cli 3.0.0-beta.60 → 3.0.0-beta.62

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.
@@ -1,9 +1,6 @@
1
- // src/utils/provider-factory.ts
2
- import { readFileSync, existsSync } from "fs";
3
- import { join } from "path";
4
-
5
1
  // src/utils/provider-default-definitions.ts
6
2
  import { createAnthropicProviderDefinition } from "@robota-sdk/agent-provider-anthropic";
3
+ import { createDeepSeekProviderDefinition } from "@robota-sdk/agent-provider-deepseek";
7
4
  import { createGemmaProviderDefinition } from "@robota-sdk/agent-provider-gemma";
8
5
  import { createGeminiProviderDefinition } from "@robota-sdk/agent-provider-gemini";
9
6
  import { createOpenAIProviderDefinition } from "@robota-sdk/agent-provider-openai";
@@ -13,11 +10,20 @@ var DEFAULT_PROVIDER_DEFINITIONS = [
13
10
  createOpenAIProviderDefinition(),
14
11
  createGeminiProviderDefinition(),
15
12
  createGemmaProviderDefinition(),
16
- createQwenProviderDefinition()
13
+ createQwenProviderDefinition(),
14
+ createDeepSeekProviderDefinition()
17
15
  ];
18
16
 
17
+ // src/utils/provider-factory.ts
18
+ import { readFileSync, existsSync } from "fs";
19
+ import { join } from "path";
20
+
19
21
  // src/utils/provider-definition.ts
20
- import { findProviderDefinition, formatSupportedProviderTypes } from "@robota-sdk/agent-core";
22
+ import {
23
+ findProviderDefinition,
24
+ formatSupportedProviderTypes,
25
+ getProviderCredentialRequirement
26
+ } from "@robota-sdk/agent-core";
21
27
 
22
28
  // src/utils/env-ref.ts
23
29
  import {
@@ -163,8 +169,11 @@ function createProviderFromConfig(settings, providerDefinitions) {
163
169
  `Unknown provider: ${settings.name}. Currently supported: ${formatSupportedProviderTypes(providerDefinitions)}`
164
170
  );
165
171
  }
166
- if (definition.requiresApiKey === true && !settings.apiKey) {
167
- throw new Error(`Provider ${settings.name} requires apiKey`);
172
+ const credentialRequirement = getProviderCredentialRequirement(definition);
173
+ if (credentialRequirement !== void 0 && !hasRequiredProviderCredential(settings, credentialRequirement)) {
174
+ throw new Error(
175
+ `Provider ${settings.name} requires ${formatCredentialRequirement(credentialRequirement)}`
176
+ );
168
177
  }
169
178
  return definition.createProvider(settings);
170
179
  }
@@ -190,6 +199,16 @@ function createProviderFromProfile(profile, modelOverride, providerDefinitions =
190
199
  providerDefinitions
191
200
  );
192
201
  }
202
+ function hasRequiredProviderCredential(settings, requirement) {
203
+ return requirement.anyOf.some((field) => hasProviderCredentialValue(settings, field));
204
+ }
205
+ function hasProviderCredentialValue(settings, field) {
206
+ const value = settings[field];
207
+ return value !== void 0 && value.length > 0;
208
+ }
209
+ function formatCredentialRequirement(requirement) {
210
+ return requirement.anyOf.join(" or ");
211
+ }
193
212
  function getProviderDefinitions(options) {
194
213
  return options.providerDefinitions ?? DEFAULT_PROVIDER_DEFINITIONS;
195
214
  }
@@ -255,6 +274,7 @@ export {
255
274
  DEFAULT_PROVIDER_DEFINITIONS,
256
275
  findProviderDefinition,
257
276
  formatSupportedProviderTypes,
277
+ getProviderCredentialRequirement,
258
278
  hasUsableSecretReference,
259
279
  readProviderSettings,
260
280
  readMergedProviderSettings,
@@ -0,0 +1,287 @@
1
+ // src/utils/provider-factory.ts
2
+ import { readFileSync, existsSync } from "fs";
3
+ import { join } from "path";
4
+
5
+ // src/utils/provider-default-definitions.ts
6
+ import { createAnthropicProviderDefinition } from "@robota-sdk/agent-provider-anthropic";
7
+ import { createDeepSeekProviderDefinition } from "@robota-sdk/agent-provider-deepseek";
8
+ import { createGemmaProviderDefinition } from "@robota-sdk/agent-provider-gemma";
9
+ import { createGeminiProviderDefinition } from "@robota-sdk/agent-provider-gemini";
10
+ import { createOpenAIProviderDefinition } from "@robota-sdk/agent-provider-openai";
11
+ import { createQwenProviderDefinition } from "@robota-sdk/agent-provider-qwen";
12
+ var DEFAULT_PROVIDER_DEFINITIONS = [
13
+ createAnthropicProviderDefinition(),
14
+ createOpenAIProviderDefinition(),
15
+ createGeminiProviderDefinition(),
16
+ createGemmaProviderDefinition(),
17
+ createQwenProviderDefinition(),
18
+ createDeepSeekProviderDefinition()
19
+ ];
20
+
21
+ // src/utils/provider-definition.ts
22
+ import {
23
+ findProviderDefinition,
24
+ formatSupportedProviderTypes,
25
+ getProviderCredentialRequirement
26
+ } from "@robota-sdk/agent-core";
27
+
28
+ // src/utils/env-ref.ts
29
+ import {
30
+ formatEnvReference,
31
+ hasUsableSecretReference,
32
+ isEnvReference,
33
+ resolveEnvReference
34
+ } from "@robota-sdk/agent-sdk";
35
+
36
+ // src/utils/provider-factory.ts
37
+ function readProviderSettings(cwd, options = {}) {
38
+ const merged = readMergedProviderSettings(cwd);
39
+ const providerConfig = resolveActiveProvider(
40
+ merged,
41
+ options.providerOverride,
42
+ getProviderDefinitions(options)
43
+ );
44
+ if (providerConfig !== void 0) {
45
+ return providerConfig;
46
+ }
47
+ throw new Error("No provider configuration found. Run `robota` to set up.");
48
+ }
49
+ function readMergedProviderSettings(cwd) {
50
+ return readMergedProviderSettingsFromPaths(getProviderSettingsPaths(cwd));
51
+ }
52
+ function getProviderSettingsPaths(cwd) {
53
+ const userHome = getUserHome();
54
+ return [
55
+ join(userHome, ".robota", "settings.json"),
56
+ join(userHome, ".claude", "settings.json"),
57
+ join(cwd, ".robota", "settings.json"),
58
+ join(cwd, ".robota", "settings.local.json"),
59
+ join(cwd, ".claude", "settings.json"),
60
+ join(cwd, ".claude", "settings.local.json")
61
+ ];
62
+ }
63
+ function getUserHome() {
64
+ return process.env.HOME ?? process.env.USERPROFILE ?? "/";
65
+ }
66
+ function readMergedProviderSettingsFromPaths(paths) {
67
+ return paths.reduce((settings, filePath) => {
68
+ const parsed = readSettingsFile(filePath);
69
+ if (parsed === void 0) {
70
+ return settings;
71
+ }
72
+ return mergeSettings(settings, parsed);
73
+ }, {});
74
+ }
75
+ function readSettingsFile(filePath) {
76
+ if (!existsSync(filePath)) {
77
+ return void 0;
78
+ }
79
+ try {
80
+ const raw = readFileSync(filePath, "utf8");
81
+ return JSON.parse(raw);
82
+ } catch {
83
+ return void 0;
84
+ }
85
+ }
86
+ function mergeSettings(base, override) {
87
+ return {
88
+ ...base,
89
+ ...override,
90
+ provider: base.provider !== void 0 || override.provider !== void 0 ? { ...base.provider, ...override.provider } : void 0,
91
+ providers: base.providers !== void 0 || override.providers !== void 0 ? mergeProviders(base.providers, override.providers) : void 0
92
+ };
93
+ }
94
+ function mergeProviders(base, override) {
95
+ const result = { ...base ?? {} };
96
+ for (const [name, profile] of Object.entries(override ?? {})) {
97
+ result[name] = { ...result[name], ...profile };
98
+ }
99
+ return result;
100
+ }
101
+ function resolveActiveProvider(settings, providerOverride, providerDefinitions = DEFAULT_PROVIDER_DEFINITIONS) {
102
+ const activeProvider = providerOverride ?? settings.currentProvider;
103
+ if (activeProvider !== void 0) {
104
+ const profile = settings.providers?.[activeProvider];
105
+ if (profile === void 0) {
106
+ throw new Error(`Provider profile "${activeProvider}" was not found in providers`);
107
+ }
108
+ if (!profile.type) {
109
+ throw new Error(`Provider profile "${activeProvider}" is missing type`);
110
+ }
111
+ return normalizeProviderConfig(
112
+ {
113
+ name: profile.type,
114
+ model: profile.model,
115
+ apiKey: profile.apiKey,
116
+ baseURL: profile.baseURL,
117
+ timeout: profile.timeout,
118
+ options: profile.options
119
+ },
120
+ providerDefinitions
121
+ );
122
+ }
123
+ const provider = settings.provider;
124
+ if (provider?.name) {
125
+ return normalizeProviderConfig(
126
+ {
127
+ name: provider.name,
128
+ model: provider.model,
129
+ apiKey: provider.apiKey,
130
+ baseURL: provider.baseURL,
131
+ timeout: provider.timeout,
132
+ options: provider.options
133
+ },
134
+ providerDefinitions
135
+ );
136
+ }
137
+ return void 0;
138
+ }
139
+ function normalizeProviderConfig(settings, providerDefinitions) {
140
+ const defaults = findProviderDefinition(providerDefinitions, settings.name)?.defaults ?? {};
141
+ const model = settings.model ?? defaults.model;
142
+ if (!model) {
143
+ throw new Error(`Provider ${settings.name} requires model`);
144
+ }
145
+ const apiKeyReference = settings.apiKey ?? defaults.apiKey;
146
+ const options = settings.options ?? defaults.options;
147
+ return {
148
+ name: settings.name,
149
+ model,
150
+ apiKey: apiKeyReference !== void 0 ? resolveEnvReference(apiKeyReference) : void 0,
151
+ baseURL: settings.baseURL ?? defaults.baseURL,
152
+ timeout: settings.timeout,
153
+ ...options !== void 0 && { options }
154
+ };
155
+ }
156
+ function resolveProfileApiKey(profile) {
157
+ if (profile.apiKey !== void 0) {
158
+ return resolveEnvReference(profile.apiKey);
159
+ }
160
+ if (profile.apiKeyEnv !== void 0) {
161
+ return process.env[profile.apiKeyEnv];
162
+ }
163
+ return void 0;
164
+ }
165
+ function createProviderFromConfig(settings, providerDefinitions) {
166
+ const definition = findProviderDefinition(providerDefinitions, settings.name);
167
+ if (definition === void 0) {
168
+ throw new Error(
169
+ `Unknown provider: ${settings.name}. Currently supported: ${formatSupportedProviderTypes(providerDefinitions)}`
170
+ );
171
+ }
172
+ const credentialRequirement = getProviderCredentialRequirement(definition);
173
+ if (credentialRequirement !== void 0 && !hasRequiredProviderCredential(settings, credentialRequirement)) {
174
+ throw new Error(
175
+ `Provider ${settings.name} requires ${formatCredentialRequirement(credentialRequirement)}`
176
+ );
177
+ }
178
+ return definition.createProvider(settings);
179
+ }
180
+ function createProviderFromSettings(cwd, modelOverride, options = {}) {
181
+ const providerDefinitions = getProviderDefinitions(options);
182
+ const settings = readProviderSettings(cwd, { ...options, providerDefinitions });
183
+ const model = modelOverride ?? settings.model;
184
+ return createProviderFromConfig({ ...settings, model }, providerDefinitions);
185
+ }
186
+ function createProviderFromProfile(profile, modelOverride, providerDefinitions = DEFAULT_PROVIDER_DEFINITIONS) {
187
+ return createProviderFromConfig(
188
+ normalizeProviderConfig(
189
+ {
190
+ name: profile.type,
191
+ model: modelOverride ?? profile.model,
192
+ apiKey: resolveProfileApiKey(profile),
193
+ baseURL: profile.baseURL,
194
+ timeout: profile.timeout,
195
+ options: profile.options
196
+ },
197
+ providerDefinitions
198
+ ),
199
+ providerDefinitions
200
+ );
201
+ }
202
+ function hasRequiredProviderCredential(settings, requirement) {
203
+ return requirement.anyOf.some((field) => hasProviderCredentialValue(settings, field));
204
+ }
205
+ function hasProviderCredentialValue(settings, field) {
206
+ const value = settings[field];
207
+ return value !== void 0 && value.length > 0;
208
+ }
209
+ function formatCredentialRequirement(requirement) {
210
+ return requirement.anyOf.join(" or ");
211
+ }
212
+ function getProviderDefinitions(options) {
213
+ return options.providerDefinitions ?? DEFAULT_PROVIDER_DEFINITIONS;
214
+ }
215
+
216
+ // src/subagents/child-process-subagent-ipc.ts
217
+ function isRecord(value) {
218
+ return typeof value === "object" && value !== null;
219
+ }
220
+ function hasString(value, key) {
221
+ return typeof value[key] === "string";
222
+ }
223
+ function isStartPayload(value) {
224
+ if (!isRecord(value)) return false;
225
+ if (!hasString(value, "jobId")) return false;
226
+ if (!isRecord(value.request)) return false;
227
+ if (!hasString(value.request, "type")) return false;
228
+ if (!hasString(value.request, "prompt")) return false;
229
+ if (!isRecord(value.agentDefinition)) return false;
230
+ if (!hasString(value.agentDefinition, "name")) return false;
231
+ if (!hasString(value.agentDefinition, "systemPrompt")) return false;
232
+ if (!isRecord(value.parentConfig)) return false;
233
+ if (!isRecord(value.parentContext)) return false;
234
+ if (!isRecord(value.providerProfile)) return false;
235
+ if (!hasString(value.providerProfile, "type")) return false;
236
+ return hasString(value.providerProfile, "model");
237
+ }
238
+ function isSubagentWorkerParentMessage(value) {
239
+ if (!isRecord(value) || !hasString(value, "type")) return false;
240
+ switch (value.type) {
241
+ case "start":
242
+ return isStartPayload(value.payload);
243
+ case "send":
244
+ return hasString(value, "prompt");
245
+ case "cancel":
246
+ return value.reason === void 0 || typeof value.reason === "string";
247
+ default:
248
+ return false;
249
+ }
250
+ }
251
+ function isSubagentWorkerChildMessage(value) {
252
+ if (!isRecord(value) || !hasString(value, "type")) return false;
253
+ switch (value.type) {
254
+ case "ready":
255
+ return true;
256
+ case "text_delta":
257
+ return hasString(value, "delta");
258
+ case "tool_start":
259
+ return hasString(value, "toolName");
260
+ case "tool_end":
261
+ return hasString(value, "toolName") && typeof value.success === "boolean";
262
+ case "result":
263
+ return hasString(value, "output");
264
+ case "error":
265
+ return hasString(value, "message");
266
+ case "cancelled":
267
+ return value.reason === void 0 || typeof value.reason === "string";
268
+ default:
269
+ return false;
270
+ }
271
+ }
272
+
273
+ export {
274
+ DEFAULT_PROVIDER_DEFINITIONS,
275
+ findProviderDefinition,
276
+ formatSupportedProviderTypes,
277
+ getProviderCredentialRequirement,
278
+ hasUsableSecretReference,
279
+ readProviderSettings,
280
+ readMergedProviderSettings,
281
+ getProviderSettingsPaths,
282
+ readMergedProviderSettingsFromPaths,
283
+ createProviderFromSettings,
284
+ createProviderFromProfile,
285
+ isSubagentWorkerParentMessage,
286
+ isSubagentWorkerChildMessage
287
+ };
@@ -0,0 +1,9 @@
1
+ import {
2
+ createDefaultCliCommandModules,
3
+ startCli
4
+ } from "./chunk-6US65UBD.js";
5
+ import "./chunk-7D75HL37.js";
6
+ export {
7
+ createDefaultCliCommandModules,
8
+ startCli
9
+ };