@robota-sdk/agent-cli 3.0.0-beta.62 → 3.0.0-beta.64
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.md +3 -3
- package/dist/node/bin.d.ts +1 -1
- package/dist/node/bin.js +46 -6037
- package/dist/node/bin.js.map +1 -0
- package/dist/node/child-process-subagent-ipc--Vp2dk1v.js +2 -0
- package/dist/node/child-process-subagent-ipc--Vp2dk1v.js.map +1 -0
- package/dist/node/child-process-subagent-ipc-Aitv2i6E.cjs +1 -0
- package/dist/node/child-process-subagent-ipc-CEy8bLN6.cjs +1 -0
- package/dist/node/child-process-subagent-ipc-DVpVp43R.js +2 -0
- package/dist/node/child-process-subagent-ipc-DVpVp43R.js.map +1 -0
- package/dist/node/index.cjs +44 -6011
- package/dist/node/index.d.ts +31 -82
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +45 -5822
- package/dist/node/index.js.map +1 -0
- package/dist/node/subagents/child-process-subagent-worker.cjs +1 -249
- package/dist/node/subagents/child-process-subagent-worker.d.ts +1 -2
- package/dist/node/subagents/child-process-subagent-worker.js +2 -123
- package/dist/node/subagents/child-process-subagent-worker.js.map +1 -0
- package/package.json +12 -40
- package/README.ko.md +0 -297
- package/dist/node/chunk-6US65UBD.js +0 -5740
- package/dist/node/chunk-7D75HL37.js +0 -287
- package/dist/node/chunk-BENOH47A.js +0 -287
- package/dist/node/cli-N6TYREZG.js +0 -9
- package/dist/node/index.d.cts +0 -93
- package/dist/node/subagents/child-process-subagent-worker.d.cts +0 -2
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
// src/utils/provider-default-definitions.ts
|
|
2
|
-
import { createAnthropicProviderDefinition } from "@robota-sdk/agent-provider-anthropic";
|
|
3
|
-
import { createDeepSeekProviderDefinition } from "@robota-sdk/agent-provider-deepseek";
|
|
4
|
-
import { createGemmaProviderDefinition } from "@robota-sdk/agent-provider-gemma";
|
|
5
|
-
import { createGeminiProviderDefinition } from "@robota-sdk/agent-provider-gemini";
|
|
6
|
-
import { createOpenAIProviderDefinition } from "@robota-sdk/agent-provider-openai";
|
|
7
|
-
import { createQwenProviderDefinition } from "@robota-sdk/agent-provider-qwen";
|
|
8
|
-
var DEFAULT_PROVIDER_DEFINITIONS = [
|
|
9
|
-
createAnthropicProviderDefinition(),
|
|
10
|
-
createOpenAIProviderDefinition(),
|
|
11
|
-
createGeminiProviderDefinition(),
|
|
12
|
-
createGemmaProviderDefinition(),
|
|
13
|
-
createQwenProviderDefinition(),
|
|
14
|
-
createDeepSeekProviderDefinition()
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
// src/utils/provider-factory.ts
|
|
18
|
-
import { readFileSync, existsSync } from "fs";
|
|
19
|
-
import { join } from "path";
|
|
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
|
-
};
|
|
@@ -1,287 +0,0 @@
|
|
|
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
|
-
};
|
package/dist/node/index.d.cts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { IProviderDefinition, IProviderConfig } from '@robota-sdk/agent-core';
|
|
2
|
-
import { ICommandModule, IBackgroundTaskRunner, ISubagentRunner, IInProcessSubagentRunnerDeps, ISubagentWorktreeAdapter, ISubagentJobStart, ISubagentJobHandle, TSubagentRunnerFactory, ISubagentWorktreePrepareRequest, IPreparedSubagentWorktree } from '@robota-sdk/agent-sdk';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* CLI entry point — parses arguments, creates provider, and starts the Ink TUI.
|
|
6
|
-
*
|
|
7
|
-
* CLI composes provider definitions. SDK owns everything else
|
|
8
|
-
* (config, context, session, tools).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Main CLI orchestration function.
|
|
13
|
-
*/
|
|
14
|
-
interface IStartCliOptions {
|
|
15
|
-
commandModules?: readonly ICommandModule[];
|
|
16
|
-
providerDefinitions?: readonly IProviderDefinition[];
|
|
17
|
-
}
|
|
18
|
-
declare function startCli(options?: IStartCliOptions): Promise<void>;
|
|
19
|
-
|
|
20
|
-
interface IManagedShellProcessRunnerOptions {
|
|
21
|
-
killGraceMs?: number;
|
|
22
|
-
}
|
|
23
|
-
declare function createManagedShellProcessRunner(options?: IManagedShellProcessRunnerOptions): IBackgroundTaskRunner;
|
|
24
|
-
|
|
25
|
-
interface IChildProcessSubagentRunnerOptions {
|
|
26
|
-
providerConfig?: IProviderConfig;
|
|
27
|
-
workerPath?: string;
|
|
28
|
-
execArgv?: string[];
|
|
29
|
-
killGraceMs?: number;
|
|
30
|
-
env?: NodeJS.ProcessEnv;
|
|
31
|
-
worktreeIsolation?: boolean;
|
|
32
|
-
worktreeAdapter?: ISubagentWorktreeAdapter;
|
|
33
|
-
logsDir?: string;
|
|
34
|
-
}
|
|
35
|
-
declare function createChildProcessSubagentRunnerFactory(options?: IChildProcessSubagentRunnerOptions): TSubagentRunnerFactory;
|
|
36
|
-
declare class ChildProcessSubagentRunner implements ISubagentRunner {
|
|
37
|
-
private readonly deps;
|
|
38
|
-
private readonly workerPath;
|
|
39
|
-
private readonly execArgv?;
|
|
40
|
-
private readonly killGraceMs;
|
|
41
|
-
private readonly providerConfig?;
|
|
42
|
-
private readonly env?;
|
|
43
|
-
private readonly logsDir?;
|
|
44
|
-
constructor(deps: IInProcessSubagentRunnerDeps, options?: IChildProcessSubagentRunnerOptions);
|
|
45
|
-
start(job: ISubagentJobStart): ISubagentJobHandle;
|
|
46
|
-
private createStartPayload;
|
|
47
|
-
private resolveTranscriptPath;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
interface IGitWorktreeIsolationAdapterOptions {
|
|
51
|
-
worktreeDir?: string;
|
|
52
|
-
branchPrefix?: string;
|
|
53
|
-
idFactory?: () => string;
|
|
54
|
-
maxCreateAttempts?: number;
|
|
55
|
-
}
|
|
56
|
-
declare function createGitWorktreeIsolationAdapter(options?: IGitWorktreeIsolationAdapterOptions): ISubagentWorktreeAdapter;
|
|
57
|
-
declare class GitWorktreeIsolationAdapter implements ISubagentWorktreeAdapter {
|
|
58
|
-
private readonly worktreeDir;
|
|
59
|
-
private readonly branchPrefix;
|
|
60
|
-
private readonly idFactory;
|
|
61
|
-
private readonly maxCreateAttempts;
|
|
62
|
-
constructor(options?: IGitWorktreeIsolationAdapterOptions);
|
|
63
|
-
prepare(request: ISubagentWorktreePrepareRequest): IPreparedSubagentWorktree;
|
|
64
|
-
isClean(worktree: IPreparedSubagentWorktree): boolean;
|
|
65
|
-
getStatus(worktree: IPreparedSubagentWorktree): string;
|
|
66
|
-
remove(worktree: IPreparedSubagentWorktree): void;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* CLI-specific types for terminal I/O abstraction.
|
|
71
|
-
*/
|
|
72
|
-
/**
|
|
73
|
-
* Spinner handle returned by ITerminalOutput.spinner()
|
|
74
|
-
*/
|
|
75
|
-
interface ISpinner {
|
|
76
|
-
stop(): void;
|
|
77
|
-
update(message: string): void;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Terminal output abstraction — injected into all components that need I/O
|
|
81
|
-
*/
|
|
82
|
-
interface ITerminalOutput {
|
|
83
|
-
write(text: string): void;
|
|
84
|
-
writeLine(text: string): void;
|
|
85
|
-
writeMarkdown(md: string): void;
|
|
86
|
-
writeError(text: string): void;
|
|
87
|
-
prompt(question: string): Promise<string>;
|
|
88
|
-
/** Arrow-key selector. Returns the index of the chosen option. */
|
|
89
|
-
select(options: string[], initialIndex?: number): Promise<number>;
|
|
90
|
-
spinner(message: string): ISpinner;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export { ChildProcessSubagentRunner, GitWorktreeIsolationAdapter, type IChildProcessSubagentRunnerOptions, type IGitWorktreeIsolationAdapterOptions, type IManagedShellProcessRunnerOptions, type ISpinner, type ITerminalOutput, createChildProcessSubagentRunnerFactory, createGitWorktreeIsolationAdapter, createManagedShellProcessRunner, startCli };
|