@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.
- package/README.ko.md +297 -0
- package/README.md +76 -37
- package/bin/robota.cjs +43 -0
- package/dist/node/bin.js +6019 -3
- package/dist/node/{chunk-GHQHUBHC.js → chunk-6US65UBD.js} +2314 -2043
- package/dist/node/{chunk-6XQKLNRF.js → chunk-7D75HL37.js} +28 -8
- package/dist/node/chunk-BENOH47A.js +287 -0
- package/dist/node/cli-N6TYREZG.js +9 -0
- package/dist/node/index.cjs +917 -556
- package/dist/node/index.js +5813 -8
- package/dist/node/subagents/child-process-subagent-worker.cjs +249 -0
- package/dist/node/subagents/child-process-subagent-worker.d.cts +2 -0
- package/dist/node/subagents/child-process-subagent-worker.js +1 -1
- package/package.json +39 -32
|
@@ -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 {
|
|
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
|
-
|
|
167
|
-
|
|
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
|
+
};
|