@robota-sdk/agent-cli 3.0.0-beta.61 → 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 +17 -2
- package/bin/robota.cjs +43 -0
- package/dist/node/bin.js +6019 -3
- package/dist/node/{chunk-J654S773.js → chunk-6US65UBD.js} +4609 -4410
- package/dist/node/chunk-7D75HL37.js +287 -0
- package/dist/node/cli-N6TYREZG.js +9 -0
- package/dist/node/index.cjs +540 -258
- 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/package.json +38 -32
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/subagents/child-process-subagent-worker.ts
|
|
4
|
+
var import_agent_sdk2 = require("@robota-sdk/agent-sdk");
|
|
5
|
+
|
|
6
|
+
// src/utils/provider-factory.ts
|
|
7
|
+
var import_node_fs = require("fs");
|
|
8
|
+
var import_node_path = require("path");
|
|
9
|
+
|
|
10
|
+
// src/utils/provider-default-definitions.ts
|
|
11
|
+
var import_agent_provider_anthropic = require("@robota-sdk/agent-provider-anthropic");
|
|
12
|
+
var import_agent_provider_deepseek = require("@robota-sdk/agent-provider-deepseek");
|
|
13
|
+
var import_agent_provider_gemma = require("@robota-sdk/agent-provider-gemma");
|
|
14
|
+
var import_agent_provider_gemini = require("@robota-sdk/agent-provider-gemini");
|
|
15
|
+
var import_agent_provider_openai = require("@robota-sdk/agent-provider-openai");
|
|
16
|
+
var import_agent_provider_qwen = require("@robota-sdk/agent-provider-qwen");
|
|
17
|
+
var DEFAULT_PROVIDER_DEFINITIONS = [
|
|
18
|
+
(0, import_agent_provider_anthropic.createAnthropicProviderDefinition)(),
|
|
19
|
+
(0, import_agent_provider_openai.createOpenAIProviderDefinition)(),
|
|
20
|
+
(0, import_agent_provider_gemini.createGeminiProviderDefinition)(),
|
|
21
|
+
(0, import_agent_provider_gemma.createGemmaProviderDefinition)(),
|
|
22
|
+
(0, import_agent_provider_qwen.createQwenProviderDefinition)(),
|
|
23
|
+
(0, import_agent_provider_deepseek.createDeepSeekProviderDefinition)()
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
// src/utils/provider-definition.ts
|
|
27
|
+
var import_agent_core = require("@robota-sdk/agent-core");
|
|
28
|
+
|
|
29
|
+
// src/utils/env-ref.ts
|
|
30
|
+
var import_agent_sdk = require("@robota-sdk/agent-sdk");
|
|
31
|
+
|
|
32
|
+
// src/utils/provider-factory.ts
|
|
33
|
+
function normalizeProviderConfig(settings, providerDefinitions) {
|
|
34
|
+
const defaults = (0, import_agent_core.findProviderDefinition)(providerDefinitions, settings.name)?.defaults ?? {};
|
|
35
|
+
const model = settings.model ?? defaults.model;
|
|
36
|
+
if (!model) {
|
|
37
|
+
throw new Error(`Provider ${settings.name} requires model`);
|
|
38
|
+
}
|
|
39
|
+
const apiKeyReference = settings.apiKey ?? defaults.apiKey;
|
|
40
|
+
const options = settings.options ?? defaults.options;
|
|
41
|
+
return {
|
|
42
|
+
name: settings.name,
|
|
43
|
+
model,
|
|
44
|
+
apiKey: apiKeyReference !== void 0 ? (0, import_agent_sdk.resolveEnvReference)(apiKeyReference) : void 0,
|
|
45
|
+
baseURL: settings.baseURL ?? defaults.baseURL,
|
|
46
|
+
timeout: settings.timeout,
|
|
47
|
+
...options !== void 0 && { options }
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function resolveProfileApiKey(profile) {
|
|
51
|
+
if (profile.apiKey !== void 0) {
|
|
52
|
+
return (0, import_agent_sdk.resolveEnvReference)(profile.apiKey);
|
|
53
|
+
}
|
|
54
|
+
if (profile.apiKeyEnv !== void 0) {
|
|
55
|
+
return process.env[profile.apiKeyEnv];
|
|
56
|
+
}
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
function createProviderFromConfig(settings, providerDefinitions) {
|
|
60
|
+
const definition = (0, import_agent_core.findProviderDefinition)(providerDefinitions, settings.name);
|
|
61
|
+
if (definition === void 0) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`Unknown provider: ${settings.name}. Currently supported: ${(0, import_agent_core.formatSupportedProviderTypes)(providerDefinitions)}`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
const credentialRequirement = (0, import_agent_core.getProviderCredentialRequirement)(definition);
|
|
67
|
+
if (credentialRequirement !== void 0 && !hasRequiredProviderCredential(settings, credentialRequirement)) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`Provider ${settings.name} requires ${formatCredentialRequirement(credentialRequirement)}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return definition.createProvider(settings);
|
|
73
|
+
}
|
|
74
|
+
function createProviderFromProfile(profile, modelOverride, providerDefinitions = DEFAULT_PROVIDER_DEFINITIONS) {
|
|
75
|
+
return createProviderFromConfig(
|
|
76
|
+
normalizeProviderConfig(
|
|
77
|
+
{
|
|
78
|
+
name: profile.type,
|
|
79
|
+
model: modelOverride ?? profile.model,
|
|
80
|
+
apiKey: resolveProfileApiKey(profile),
|
|
81
|
+
baseURL: profile.baseURL,
|
|
82
|
+
timeout: profile.timeout,
|
|
83
|
+
options: profile.options
|
|
84
|
+
},
|
|
85
|
+
providerDefinitions
|
|
86
|
+
),
|
|
87
|
+
providerDefinitions
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function hasRequiredProviderCredential(settings, requirement) {
|
|
91
|
+
return requirement.anyOf.some((field) => hasProviderCredentialValue(settings, field));
|
|
92
|
+
}
|
|
93
|
+
function hasProviderCredentialValue(settings, field) {
|
|
94
|
+
const value = settings[field];
|
|
95
|
+
return value !== void 0 && value.length > 0;
|
|
96
|
+
}
|
|
97
|
+
function formatCredentialRequirement(requirement) {
|
|
98
|
+
return requirement.anyOf.join(" or ");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// src/subagents/child-process-subagent-ipc.ts
|
|
102
|
+
function isRecord(value) {
|
|
103
|
+
return typeof value === "object" && value !== null;
|
|
104
|
+
}
|
|
105
|
+
function hasString(value, key) {
|
|
106
|
+
return typeof value[key] === "string";
|
|
107
|
+
}
|
|
108
|
+
function isStartPayload(value) {
|
|
109
|
+
if (!isRecord(value)) return false;
|
|
110
|
+
if (!hasString(value, "jobId")) return false;
|
|
111
|
+
if (!isRecord(value.request)) return false;
|
|
112
|
+
if (!hasString(value.request, "type")) return false;
|
|
113
|
+
if (!hasString(value.request, "prompt")) return false;
|
|
114
|
+
if (!isRecord(value.agentDefinition)) return false;
|
|
115
|
+
if (!hasString(value.agentDefinition, "name")) return false;
|
|
116
|
+
if (!hasString(value.agentDefinition, "systemPrompt")) return false;
|
|
117
|
+
if (!isRecord(value.parentConfig)) return false;
|
|
118
|
+
if (!isRecord(value.parentContext)) return false;
|
|
119
|
+
if (!isRecord(value.providerProfile)) return false;
|
|
120
|
+
if (!hasString(value.providerProfile, "type")) return false;
|
|
121
|
+
return hasString(value.providerProfile, "model");
|
|
122
|
+
}
|
|
123
|
+
function isSubagentWorkerParentMessage(value) {
|
|
124
|
+
if (!isRecord(value) || !hasString(value, "type")) return false;
|
|
125
|
+
switch (value.type) {
|
|
126
|
+
case "start":
|
|
127
|
+
return isStartPayload(value.payload);
|
|
128
|
+
case "send":
|
|
129
|
+
return hasString(value, "prompt");
|
|
130
|
+
case "cancel":
|
|
131
|
+
return value.reason === void 0 || typeof value.reason === "string";
|
|
132
|
+
default:
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// src/subagents/child-process-subagent-worker.ts
|
|
138
|
+
var CANCEL_EXIT_CODE = 130;
|
|
139
|
+
var NOOP_TERMINAL = {
|
|
140
|
+
write: () => {
|
|
141
|
+
},
|
|
142
|
+
writeLine: () => {
|
|
143
|
+
},
|
|
144
|
+
writeMarkdown: () => {
|
|
145
|
+
},
|
|
146
|
+
writeError: () => {
|
|
147
|
+
},
|
|
148
|
+
prompt: () => Promise.resolve(""),
|
|
149
|
+
select: () => Promise.resolve(0),
|
|
150
|
+
spinner: () => ({ stop: () => {
|
|
151
|
+
}, update: () => {
|
|
152
|
+
} })
|
|
153
|
+
};
|
|
154
|
+
var session = null;
|
|
155
|
+
var cancelled = false;
|
|
156
|
+
var running = Promise.resolve();
|
|
157
|
+
function sendChildMessage(message) {
|
|
158
|
+
if (process.send) {
|
|
159
|
+
process.send(message);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function runInitialPrompt(payload) {
|
|
163
|
+
try {
|
|
164
|
+
const provider = createProviderFromProfile(payload.providerProfile, payload.request.model);
|
|
165
|
+
const sessionLogger = payload.logsDir ? (0, import_agent_sdk2.createSubagentLogger)(payload.request.parentSessionId, payload.jobId, payload.logsDir) : void 0;
|
|
166
|
+
session = (0, import_agent_sdk2.createSubagentSession)({
|
|
167
|
+
agentDefinition: payload.agentDefinition,
|
|
168
|
+
parentConfig: payload.parentConfig,
|
|
169
|
+
parentContext: payload.parentContext,
|
|
170
|
+
parentTools: (0, import_agent_sdk2.createDefaultTools)(),
|
|
171
|
+
provider,
|
|
172
|
+
terminal: NOOP_TERMINAL,
|
|
173
|
+
sessionId: payload.jobId,
|
|
174
|
+
...sessionLogger ? { sessionLogger } : {},
|
|
175
|
+
permissionMode: payload.permissionMode,
|
|
176
|
+
hooks: payload.parentConfig.hooks,
|
|
177
|
+
onTextDelta: (delta) => sendChildMessage({ type: "text_delta", delta }),
|
|
178
|
+
onToolExecution: forwardToolExecution
|
|
179
|
+
});
|
|
180
|
+
const output = await session.run(payload.request.prompt);
|
|
181
|
+
if (cancelled) {
|
|
182
|
+
sendChildMessage({ type: "cancelled", reason: "Subagent worker cancelled" });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
sendChildMessage({ type: "result", output });
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (cancelled) {
|
|
188
|
+
sendChildMessage({ type: "cancelled", reason: "Subagent worker cancelled" });
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
192
|
+
sendChildMessage({ type: "error", message });
|
|
193
|
+
} finally {
|
|
194
|
+
setImmediate(() => process.exit(cancelled ? CANCEL_EXIT_CODE : 0));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function forwardToolExecution(event) {
|
|
198
|
+
if (event.type === "start") {
|
|
199
|
+
sendChildMessage({ type: "tool_start", toolName: event.toolName, toolArgs: event.toolArgs });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
sendChildMessage({ type: "tool_end", toolName: event.toolName, success: event.success ?? true });
|
|
203
|
+
}
|
|
204
|
+
function runFollowUp(prompt) {
|
|
205
|
+
if (session === null) {
|
|
206
|
+
sendChildMessage({ type: "error", message: "Subagent worker has not started" });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
running = running.then(async () => {
|
|
210
|
+
try {
|
|
211
|
+
await session?.run(prompt);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
214
|
+
sendChildMessage({ type: "error", message });
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
async function cancelWorker(reason) {
|
|
219
|
+
cancelled = true;
|
|
220
|
+
session?.abort();
|
|
221
|
+
sendChildMessage({ type: "cancelled", reason });
|
|
222
|
+
await session?.shutdown({ reason: "other" }).catch(() => void 0);
|
|
223
|
+
setTimeout(() => process.exit(CANCEL_EXIT_CODE), 0);
|
|
224
|
+
}
|
|
225
|
+
process.on("message", (message) => {
|
|
226
|
+
if (!isSubagentWorkerParentMessage(message)) {
|
|
227
|
+
sendChildMessage({ type: "error", message: "Malformed subagent worker parent message" });
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
switch (message.type) {
|
|
231
|
+
case "start":
|
|
232
|
+
running = running.then(() => runInitialPrompt(message.payload));
|
|
233
|
+
break;
|
|
234
|
+
case "send":
|
|
235
|
+
runFollowUp(message.prompt);
|
|
236
|
+
break;
|
|
237
|
+
case "cancel":
|
|
238
|
+
void cancelWorker(message.reason);
|
|
239
|
+
break;
|
|
240
|
+
default:
|
|
241
|
+
sendChildMessage({ type: "error", message: "Unhandled subagent worker parent message" });
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
process.on("disconnect", () => {
|
|
245
|
+
cancelled = true;
|
|
246
|
+
session?.abort();
|
|
247
|
+
void session?.shutdown({ reason: "other" }).catch(() => void 0);
|
|
248
|
+
});
|
|
249
|
+
sendChildMessage({ type: "ready" });
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robota-sdk/agent-cli",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.62",
|
|
4
4
|
"description": "AI coding assistant CLI built on Robota SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"robota": "./
|
|
7
|
+
"robota": "./bin/robota.cjs"
|
|
8
8
|
},
|
|
9
9
|
"main": "dist/node/index.js",
|
|
10
10
|
"types": "dist/node/index.d.ts",
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"node": ">=22.0.0"
|
|
35
35
|
},
|
|
36
36
|
"files": [
|
|
37
|
-
"dist"
|
|
37
|
+
"dist",
|
|
38
|
+
"bin"
|
|
38
39
|
],
|
|
39
40
|
"dependencies": {
|
|
40
41
|
"chalk": "^5.3.0",
|
|
@@ -45,39 +46,44 @@
|
|
|
45
46
|
"ink-text-input": "^6.0.0",
|
|
46
47
|
"marked": "^9.1.5",
|
|
47
48
|
"marked-terminal": "^7.3.0",
|
|
49
|
+
"open": "^11.0.0",
|
|
48
50
|
"react": "19.2.4",
|
|
49
51
|
"string-width": "^8.2.0",
|
|
50
|
-
"
|
|
51
|
-
"@robota-sdk/agent-command-
|
|
52
|
-
"@robota-sdk/agent-command-
|
|
53
|
-
"@robota-sdk/agent-command-
|
|
54
|
-
"@robota-sdk/agent-command-
|
|
55
|
-
"@robota-sdk/agent-command-
|
|
56
|
-
"@robota-sdk/agent-command-
|
|
57
|
-
"@robota-sdk/agent-command-
|
|
58
|
-
"@robota-sdk/agent-command-
|
|
59
|
-
"@robota-sdk/agent-command-
|
|
60
|
-
"@robota-sdk/agent-command-
|
|
61
|
-
"@robota-sdk/agent-command-
|
|
62
|
-
"@robota-sdk/agent-command-
|
|
63
|
-
"@robota-sdk/agent-command-
|
|
64
|
-
"@robota-sdk/agent-command-
|
|
65
|
-
"@robota-sdk/agent-command-
|
|
66
|
-
"@robota-sdk/agent-
|
|
67
|
-
"@robota-sdk/agent-
|
|
68
|
-
"@robota-sdk/agent-
|
|
69
|
-
"@robota-sdk/agent-
|
|
70
|
-
"@robota-sdk/agent-provider-
|
|
71
|
-
"@robota-sdk/agent-provider-
|
|
72
|
-
"@robota-sdk/agent-provider-
|
|
73
|
-
"@robota-sdk/agent-
|
|
74
|
-
"@robota-sdk/agent-
|
|
75
|
-
"@robota-sdk/agent-
|
|
52
|
+
"ws": "^8.18.3",
|
|
53
|
+
"@robota-sdk/agent-command-agent": "3.0.0-beta.62",
|
|
54
|
+
"@robota-sdk/agent-command-background": "3.0.0-beta.62",
|
|
55
|
+
"@robota-sdk/agent-command-help": "3.0.0-beta.62",
|
|
56
|
+
"@robota-sdk/agent-command-exit": "3.0.0-beta.62",
|
|
57
|
+
"@robota-sdk/agent-command-language": "3.0.0-beta.62",
|
|
58
|
+
"@robota-sdk/agent-command-model": "3.0.0-beta.62",
|
|
59
|
+
"@robota-sdk/agent-command-memory": "3.0.0-beta.62",
|
|
60
|
+
"@robota-sdk/agent-command-context": "3.0.0-beta.62",
|
|
61
|
+
"@robota-sdk/agent-command-compact": "3.0.0-beta.62",
|
|
62
|
+
"@robota-sdk/agent-command-permissions": "3.0.0-beta.62",
|
|
63
|
+
"@robota-sdk/agent-command-provider": "3.0.0-beta.62",
|
|
64
|
+
"@robota-sdk/agent-command-plugin": "3.0.0-beta.62",
|
|
65
|
+
"@robota-sdk/agent-command-rewind": "3.0.0-beta.62",
|
|
66
|
+
"@robota-sdk/agent-command-reset": "3.0.0-beta.62",
|
|
67
|
+
"@robota-sdk/agent-command-session": "3.0.0-beta.62",
|
|
68
|
+
"@robota-sdk/agent-command-skills": "3.0.0-beta.62",
|
|
69
|
+
"@robota-sdk/agent-core": "3.0.0-beta.62",
|
|
70
|
+
"@robota-sdk/agent-command-statusline": "3.0.0-beta.62",
|
|
71
|
+
"@robota-sdk/agent-command-user-local": "3.0.0-beta.62",
|
|
72
|
+
"@robota-sdk/agent-provider-anthropic": "3.0.0-beta.62",
|
|
73
|
+
"@robota-sdk/agent-provider-deepseek": "3.0.0-beta.62",
|
|
74
|
+
"@robota-sdk/agent-provider-openai": "3.0.0-beta.62",
|
|
75
|
+
"@robota-sdk/agent-provider-gemini": "3.0.0-beta.62",
|
|
76
|
+
"@robota-sdk/agent-provider-qwen": "3.0.0-beta.62",
|
|
77
|
+
"@robota-sdk/agent-provider-gemma": "3.0.0-beta.62",
|
|
78
|
+
"@robota-sdk/agent-transport-headless": "3.0.0-beta.62",
|
|
79
|
+
"@robota-sdk/agent-sdk": "3.0.0-beta.62",
|
|
80
|
+
"@robota-sdk/agent-transport-ws": "3.0.0-beta.62"
|
|
76
81
|
},
|
|
77
82
|
"devDependencies": {
|
|
78
83
|
"@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
|
|
79
84
|
"@types/marked": "^6.0.0",
|
|
80
85
|
"@types/react": "^19.2.14",
|
|
86
|
+
"@types/ws": "^8.5.10",
|
|
81
87
|
"ink-testing-library": "^4.0.0",
|
|
82
88
|
"rimraf": "^5.0.5",
|
|
83
89
|
"tsup": "^8.0.1",
|
|
@@ -90,9 +96,9 @@
|
|
|
90
96
|
"access": "public"
|
|
91
97
|
},
|
|
92
98
|
"scripts": {
|
|
93
|
-
"build": "tsup
|
|
94
|
-
"build:js": "tsup
|
|
95
|
-
"build:types": "tsup
|
|
99
|
+
"build": "tsup",
|
|
100
|
+
"build:js": "tsup --no-dts",
|
|
101
|
+
"build:types": "tsup --dts-only",
|
|
96
102
|
"dev": "tsx src/bin.ts",
|
|
97
103
|
"start": "node dist/node/bin.js",
|
|
98
104
|
"test": "vitest run --passWithNoTests",
|