@genspark/cli 1.0.8 → 1.0.10
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 +30 -4
- package/dist/acp-serve.d.ts +14 -0
- package/dist/acp-serve.d.ts.map +1 -0
- package/dist/acp-serve.js +568 -0
- package/dist/acp-serve.js.map +1 -0
- package/dist/client.d.ts +25 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +66 -6
- package/dist/client.js.map +1 -1
- package/dist/index.js +142 -51
- package/dist/index.js.map +1 -1
- package/docs/skills.md +1 -1
- package/package.json +1 -1
- package/skills/gsk-acp-agents/SKILL.md +124 -0
- package/skills/gsk-aidrive/SKILL.md +1 -1
- package/skills/gsk-analyze-media/SKILL.md +1 -1
- package/skills/gsk-audio-generation/SKILL.md +1 -1
- package/skills/gsk-audio-transcribe/SKILL.md +1 -1
- package/skills/gsk-crawler/SKILL.md +1 -1
- package/skills/gsk-create-task/SKILL.md +1 -1
- package/skills/gsk-get-service-url/SKILL.md +1 -1
- package/skills/gsk-image-generation/SKILL.md +1 -1
- package/skills/gsk-image-search/SKILL.md +1 -1
- package/skills/gsk-phone-call/SKILL.md +6 -4
- package/skills/gsk-shared/SKILL.md +18 -0
- package/skills/gsk-stock-price/SKILL.md +1 -1
- package/skills/gsk-summarize-large-document/SKILL.md +1 -1
- package/skills/gsk-understand-images/SKILL.md +1 -1
- package/skills/gsk-video-generation/SKILL.md +1 -1
- package/skills/gsk-web-search/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -463,9 +463,35 @@ gsk task cross_check --task_name "Earth shape" --query "The Earth is flat" --ins
|
|
|
463
463
|
| `--task_name <name>` | — | Name for the task (**required**) |
|
|
464
464
|
| `--query <text>` | — | Query describing what to create (**required**) |
|
|
465
465
|
| `--instructions <text>` | — | Detailed instructions (**required**) |
|
|
466
|
+
| `--acp` | `false` | Start as ACP (Agent Client Protocol) stdio agent for multi-turn use with Genspark Claw |
|
|
466
467
|
|
|
467
468
|
**Supported task types:** `super_agent`, `podcasts`, `docs`, `slides`, `sheets`, `deep_research`, `website`, `video_generation`, `audio_generation`, `meeting_notes`, `cross_check`
|
|
468
469
|
|
|
470
|
+
#### ACP Mode
|
|
471
|
+
|
|
472
|
+
Use `--acp` to start a task agent as an [Agent Client Protocol](https://agentclientprotocol.com/) stdio server. This enables AI agent platforms like [Genspark Claw](https://openclaw.ai) to natively discover and interact with GSK agents, with multi-turn conversation support.
|
|
473
|
+
|
|
474
|
+
```bash
|
|
475
|
+
# Start an ACP agent for slides (used by acpx, not typically run manually)
|
|
476
|
+
gsk task slides --acp
|
|
477
|
+
|
|
478
|
+
# Start an ACP agent for documents
|
|
479
|
+
gsk task docs --acp
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
**acpx configuration** (`~/.acpx/config.json`):
|
|
483
|
+
```json
|
|
484
|
+
{
|
|
485
|
+
"agents": {
|
|
486
|
+
"gsk-slides": { "command": "gsk task slides --acp" },
|
|
487
|
+
"gsk-docs": { "command": "gsk task docs --acp" },
|
|
488
|
+
"gsk-sheets": { "command": "gsk task sheets --acp" }
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
Then in Genspark Claw: `/acp spawn gsk-slides` to create and iterate on presentations via natural language.
|
|
494
|
+
|
|
469
495
|
### Stock Prices
|
|
470
496
|
|
|
471
497
|
### stock_price (alias: `stock`)
|
|
@@ -662,19 +688,19 @@ gsk calendar create --summary "Personal Event" --start_time "..." --end_time "..
|
|
|
662
688
|
|
|
663
689
|
### AI Phone Calls
|
|
664
690
|
|
|
665
|
-
### call
|
|
691
|
+
### phone-call (alias: `call-for-me`)
|
|
666
692
|
|
|
667
693
|
Make an AI phone call on your behalf. The AI validates prerequisites, resolves contact info, and initiates the call.
|
|
668
694
|
|
|
669
695
|
```bash
|
|
670
696
|
# Call a business by phone number
|
|
671
|
-
gsk call "Pizza Hut" -c "+1-555-123-4567" -p "Check if they deliver to my area"
|
|
697
|
+
gsk phone-call "Pizza Hut" -c "+1-555-123-4567" -p "Check if they deliver to my area"
|
|
672
698
|
|
|
673
699
|
# Call a business by Google Maps place_id
|
|
674
|
-
gsk call "Joe's Pizza" -c "ChIJxxxxxxxx" --is_place_id -p "Reserve a table for 4"
|
|
700
|
+
gsk phone-call "Joe's Pizza" -c "ChIJxxxxxxxx" --is_place_id -p "Reserve a table for 4"
|
|
675
701
|
|
|
676
702
|
# Dry run: validate and resolve contact info without initiating the call
|
|
677
|
-
gsk call "Pizza Hut" -c "+1-555-123-4567" -p "Check hours" --dry-run
|
|
703
|
+
gsk phone-call "Pizza Hut" -c "+1-555-123-4567" -p "Check hours" --dry-run
|
|
678
704
|
```
|
|
679
705
|
|
|
680
706
|
| Option | Default | Description |
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP (Agent Client Protocol) stdio bridge for GSK task agents.
|
|
3
|
+
*
|
|
4
|
+
* Speaks ACP JSON-RPC over stdin/stdout, internally calls GSK backend APIs.
|
|
5
|
+
* Usage: gsk task <type> --acp
|
|
6
|
+
*
|
|
7
|
+
* Protocol: NDJSON (one JSON-RPC 2.0 message per line on stdin/stdout)
|
|
8
|
+
*/
|
|
9
|
+
import type { GlobalOptions } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Start the ACP stdio bridge for a given task type.
|
|
12
|
+
*/
|
|
13
|
+
export declare function startAcpBridge(taskType: string, globalOpts: GlobalOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=acp-serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-serve.d.ts","sourceRoot":"","sources":["../src/acp-serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,YAAY,CAAA;AA2G5D;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC,IAAI,CAAC,CA8ef"}
|
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP (Agent Client Protocol) stdio bridge for GSK task agents.
|
|
3
|
+
*
|
|
4
|
+
* Speaks ACP JSON-RPC over stdin/stdout, internally calls GSK backend APIs.
|
|
5
|
+
* Usage: gsk task <type> --acp
|
|
6
|
+
*
|
|
7
|
+
* Protocol: NDJSON (one JSON-RPC 2.0 message per line on stdin/stdout)
|
|
8
|
+
*/
|
|
9
|
+
import { ApiClient } from './client.js';
|
|
10
|
+
import { debug } from './logger.js';
|
|
11
|
+
import * as readline from 'readline';
|
|
12
|
+
import * as crypto from 'crypto';
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as pathModule from 'path';
|
|
15
|
+
function isRequest(msg) {
|
|
16
|
+
return 'id' in msg;
|
|
17
|
+
}
|
|
18
|
+
function getSessionStorePath() {
|
|
19
|
+
const dir = pathModule.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.genspark-tool-cli', 'acp-sessions');
|
|
20
|
+
if (!fs.existsSync(dir)) {
|
|
21
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
// Sanitize session ID to prevent path traversal
|
|
26
|
+
function sanitizeId(id) {
|
|
27
|
+
return id.replace(/[^a-zA-Z0-9_-]/g, '');
|
|
28
|
+
}
|
|
29
|
+
function persistSession(session) {
|
|
30
|
+
if (!session.projectId)
|
|
31
|
+
return;
|
|
32
|
+
const data = {
|
|
33
|
+
sessionId: session.sessionId,
|
|
34
|
+
taskType: session.taskType,
|
|
35
|
+
projectId: session.projectId,
|
|
36
|
+
createdAt: new Date().toISOString(),
|
|
37
|
+
};
|
|
38
|
+
const filePath = pathModule.join(getSessionStorePath(), `${sanitizeId(session.sessionId)}.json`);
|
|
39
|
+
fs.writeFileSync(filePath, JSON.stringify(data));
|
|
40
|
+
}
|
|
41
|
+
function loadPersistedSession(sessionId) {
|
|
42
|
+
const safe = sanitizeId(sessionId);
|
|
43
|
+
if (!safe)
|
|
44
|
+
return null;
|
|
45
|
+
const filePath = pathModule.join(getSessionStorePath(), `${safe}.json`);
|
|
46
|
+
if (!fs.existsSync(filePath))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function listPersistedSessions(taskType) {
|
|
56
|
+
const dir = getSessionStorePath();
|
|
57
|
+
const sessions = [];
|
|
58
|
+
if (!fs.existsSync(dir))
|
|
59
|
+
return sessions;
|
|
60
|
+
for (const file of fs.readdirSync(dir)) {
|
|
61
|
+
if (!file.endsWith('.json'))
|
|
62
|
+
continue;
|
|
63
|
+
try {
|
|
64
|
+
const data = JSON.parse(fs.readFileSync(pathModule.join(dir, file), 'utf-8'));
|
|
65
|
+
if (!taskType || data.taskType === taskType) {
|
|
66
|
+
sessions.push(data);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// skip corrupted files
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Start the ACP stdio bridge for a given task type.
|
|
77
|
+
*/
|
|
78
|
+
export async function startAcpBridge(taskType, globalOpts) {
|
|
79
|
+
const client = new ApiClient(globalOpts);
|
|
80
|
+
const session = {
|
|
81
|
+
sessionId: crypto.randomUUID(),
|
|
82
|
+
taskType,
|
|
83
|
+
projectId: null,
|
|
84
|
+
};
|
|
85
|
+
let promptInFlight = false;
|
|
86
|
+
let stdinClosed = false;
|
|
87
|
+
let currentAbortController = null;
|
|
88
|
+
const rl = readline.createInterface({
|
|
89
|
+
input: process.stdin,
|
|
90
|
+
terminal: false,
|
|
91
|
+
});
|
|
92
|
+
function send(obj) {
|
|
93
|
+
const line = JSON.stringify({ jsonrpc: '2.0', ...obj });
|
|
94
|
+
process.stdout.write(line + '\n');
|
|
95
|
+
}
|
|
96
|
+
function sendResponse(id, result) {
|
|
97
|
+
send({ id, result });
|
|
98
|
+
}
|
|
99
|
+
function sendError(id, code, message) {
|
|
100
|
+
send({ id, error: { code, message } });
|
|
101
|
+
}
|
|
102
|
+
function sendNotification(method, params) {
|
|
103
|
+
send({ method, params });
|
|
104
|
+
}
|
|
105
|
+
function sendAgentMessage(sessionId, text) {
|
|
106
|
+
sendNotification('session/update', {
|
|
107
|
+
sessionId,
|
|
108
|
+
update: {
|
|
109
|
+
sessionUpdate: 'agent_message_chunk',
|
|
110
|
+
content: { type: 'text', text },
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function sendToolCall(sessionId, toolCallId, title, status) {
|
|
115
|
+
sendNotification('session/update', {
|
|
116
|
+
sessionId,
|
|
117
|
+
update: {
|
|
118
|
+
sessionUpdate: 'tool_call',
|
|
119
|
+
toolCallId,
|
|
120
|
+
title,
|
|
121
|
+
kind: 'other',
|
|
122
|
+
status,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function sendToolCallUpdate(sessionId, toolCallId, status, content) {
|
|
127
|
+
const update = {
|
|
128
|
+
sessionUpdate: 'tool_call_update',
|
|
129
|
+
toolCallId,
|
|
130
|
+
status,
|
|
131
|
+
};
|
|
132
|
+
if (content) {
|
|
133
|
+
update.content = [
|
|
134
|
+
{ type: 'content', content: { type: 'text', text: content } },
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
sendNotification('session/update', { sessionId, update });
|
|
138
|
+
}
|
|
139
|
+
// --- Handler: initialize ---
|
|
140
|
+
async function handleInitialize(msg) {
|
|
141
|
+
sendResponse(msg.id, {
|
|
142
|
+
protocolVersion: 1,
|
|
143
|
+
agentCapabilities: {
|
|
144
|
+
loadSession: true,
|
|
145
|
+
sessionCapabilities: { list: true },
|
|
146
|
+
promptCapabilities: {},
|
|
147
|
+
},
|
|
148
|
+
agentInfo: {
|
|
149
|
+
name: `gsk-${taskType}`,
|
|
150
|
+
title: `Genspark ${taskType.charAt(0).toUpperCase() + taskType.slice(1)} Agent`,
|
|
151
|
+
version: '1.0.0',
|
|
152
|
+
},
|
|
153
|
+
authMethods: [],
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// --- Handler: session/new ---
|
|
157
|
+
async function handleSessionNew(msg) {
|
|
158
|
+
if (promptInFlight) {
|
|
159
|
+
sendError(msg.id, -32603, 'Cannot create new session while a prompt is in progress');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
session.sessionId = crypto.randomUUID();
|
|
163
|
+
session.projectId = null;
|
|
164
|
+
sendResponse(msg.id, {
|
|
165
|
+
sessionId: session.sessionId,
|
|
166
|
+
configOptions: [],
|
|
167
|
+
modes: {
|
|
168
|
+
currentModeId: 'default',
|
|
169
|
+
availableModes: [
|
|
170
|
+
{
|
|
171
|
+
id: 'default',
|
|
172
|
+
name: 'Default',
|
|
173
|
+
description: `Create and iterate on ${taskType}`,
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// --- Handler: session/load ---
|
|
180
|
+
async function handleSessionLoad(msg) {
|
|
181
|
+
if (promptInFlight) {
|
|
182
|
+
sendError(msg.id, -32603, 'Cannot load session while a prompt is in progress');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const params = msg.params || {};
|
|
186
|
+
const targetSessionId = params.sessionId;
|
|
187
|
+
if (!targetSessionId) {
|
|
188
|
+
sendError(msg.id, -32602, 'sessionId is required');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const persisted = loadPersistedSession(targetSessionId);
|
|
192
|
+
if (!persisted) {
|
|
193
|
+
sendError(msg.id, -32002, `Session not found: ${targetSessionId}`);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Validate task type matches this bridge's type
|
|
197
|
+
if (persisted.taskType !== taskType) {
|
|
198
|
+
sendError(msg.id, -32602, `Task type mismatch: session is ${persisted.taskType}, but this bridge is ${taskType}`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Restore session state
|
|
202
|
+
session.sessionId = persisted.sessionId;
|
|
203
|
+
session.projectId = persisted.projectId;
|
|
204
|
+
// Check if there's an in-progress agent and reconnect to its event stream.
|
|
205
|
+
// This must complete BEFORE sending the session/load response, otherwise
|
|
206
|
+
// the caller may send session/prompt while promptInFlight is still true,
|
|
207
|
+
// causing a "A prompt is already in progress" race condition.
|
|
208
|
+
if (session.projectId) {
|
|
209
|
+
promptInFlight = true;
|
|
210
|
+
currentAbortController = new AbortController();
|
|
211
|
+
try {
|
|
212
|
+
const eventsResult = await client.agentAskEvents(session.projectId, session.taskType, undefined, currentAbortController.signal);
|
|
213
|
+
if (eventsResult.status === 'ok') {
|
|
214
|
+
const data = eventsResult.data;
|
|
215
|
+
const text = extractResponseText(data);
|
|
216
|
+
if (text && text !== '{}') {
|
|
217
|
+
// Intentional: this notification is sent before the session/load
|
|
218
|
+
// response below. JSON-RPC allows notifications at any time and
|
|
219
|
+
// they carry sessionId for correlation. The response must come
|
|
220
|
+
// after the probe so the caller doesn't race with session/prompt.
|
|
221
|
+
sendAgentMessage(session.sessionId, text);
|
|
222
|
+
}
|
|
223
|
+
if (eventsResult.message === 'no_running_agent') {
|
|
224
|
+
debug('[ACP] Agent finished, replayed last result');
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
debug('[ACP] Reconnected to in-progress agent and got result');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
debug('[ACP] No in-progress agent, session ready for new prompts');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
debug('[ACP] Failed to check for in-progress agent, continuing');
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
promptInFlight = false;
|
|
239
|
+
currentAbortController = null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Send response AFTER reconnect probe completes, so the caller knows
|
|
243
|
+
// it's safe to send session/prompt without hitting promptInFlight guard.
|
|
244
|
+
sendResponse(msg.id, {
|
|
245
|
+
sessionId: session.sessionId,
|
|
246
|
+
configOptions: [],
|
|
247
|
+
modes: {
|
|
248
|
+
currentModeId: 'default',
|
|
249
|
+
availableModes: [
|
|
250
|
+
{
|
|
251
|
+
id: 'default',
|
|
252
|
+
name: 'Default',
|
|
253
|
+
description: `Create and iterate on ${taskType}`,
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
if (stdinClosed)
|
|
259
|
+
process.exit(0);
|
|
260
|
+
}
|
|
261
|
+
// --- Handler: session/list ---
|
|
262
|
+
async function handleSessionList(msg) {
|
|
263
|
+
const sessions = listPersistedSessions(taskType);
|
|
264
|
+
sendResponse(msg.id, sessions.map(s => ({
|
|
265
|
+
sessionId: s.sessionId,
|
|
266
|
+
taskType: s.taskType,
|
|
267
|
+
projectId: s.projectId,
|
|
268
|
+
createdAt: s.createdAt,
|
|
269
|
+
})));
|
|
270
|
+
}
|
|
271
|
+
// --- Handler: session/prompt ---
|
|
272
|
+
async function handleSessionPrompt(msg) {
|
|
273
|
+
const params = msg.params || {};
|
|
274
|
+
const promptParts = params.prompt;
|
|
275
|
+
const text = promptParts
|
|
276
|
+
?.filter(p => p.type === 'text' && p.text)
|
|
277
|
+
.map(p => p.text)
|
|
278
|
+
.join('\n') || '';
|
|
279
|
+
// Reject concurrent prompts — ACP processes one prompt at a time
|
|
280
|
+
if (promptInFlight) {
|
|
281
|
+
sendError(msg.id, -32603, 'A prompt is already in progress');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (!text) {
|
|
285
|
+
sendError(msg.id, -32602, 'Empty prompt');
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
promptInFlight = true;
|
|
289
|
+
currentAbortController = new AbortController();
|
|
290
|
+
const toolCallId = `task-${Date.now()}`;
|
|
291
|
+
const activeAgentToolCalls = [];
|
|
292
|
+
try {
|
|
293
|
+
// Announce tool call for progress visibility
|
|
294
|
+
sendToolCall(session.sessionId, toolCallId, `Processing ${taskType} request`, 'pending');
|
|
295
|
+
let streamedContent = '';
|
|
296
|
+
const responseText = await askAgent(client, session, text, currentAbortController.signal, progressMsg => {
|
|
297
|
+
sendToolCallUpdate(session.sessionId, toolCallId, 'in_progress', progressMsg);
|
|
298
|
+
},
|
|
299
|
+
// Stream deltas as agent_message_chunk in real-time
|
|
300
|
+
delta => {
|
|
301
|
+
sendAgentMessage(session.sessionId, delta);
|
|
302
|
+
streamedContent += delta;
|
|
303
|
+
},
|
|
304
|
+
// Show agent's internal tool calls as ACP tool_call notifications
|
|
305
|
+
(tcId, tcName) => {
|
|
306
|
+
// Mark previous agent tool calls as completed
|
|
307
|
+
for (const prevId of activeAgentToolCalls) {
|
|
308
|
+
sendToolCallUpdate(session.sessionId, prevId, 'completed');
|
|
309
|
+
}
|
|
310
|
+
activeAgentToolCalls.length = 0;
|
|
311
|
+
// Start new tool call
|
|
312
|
+
sendToolCall(session.sessionId, tcId, tcName, 'in_progress');
|
|
313
|
+
activeAgentToolCalls.push(tcId);
|
|
314
|
+
});
|
|
315
|
+
// Mark remaining agent tool calls as completed
|
|
316
|
+
for (const prevId of activeAgentToolCalls) {
|
|
317
|
+
sendToolCallUpdate(session.sessionId, prevId, 'completed');
|
|
318
|
+
}
|
|
319
|
+
// Mark top-level tool call completed
|
|
320
|
+
sendToolCallUpdate(session.sessionId, toolCallId, 'completed');
|
|
321
|
+
// Persist session for future session/load
|
|
322
|
+
persistSession(session);
|
|
323
|
+
// Send final response only if it differs from what was streamed
|
|
324
|
+
// (e.g., content was replaced by message_result after deltas),
|
|
325
|
+
// or if nothing was streamed at all.
|
|
326
|
+
if (responseText && responseText !== streamedContent) {
|
|
327
|
+
sendAgentMessage(session.sessionId, responseText);
|
|
328
|
+
}
|
|
329
|
+
// Complete the prompt
|
|
330
|
+
sendResponse(msg.id, { stopReason: 'end_turn' });
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
// Clean up any in-progress agent tool calls
|
|
334
|
+
for (const prevId of activeAgentToolCalls) {
|
|
335
|
+
sendToolCallUpdate(session.sessionId, prevId, 'completed');
|
|
336
|
+
}
|
|
337
|
+
if (err.name === 'AbortError') {
|
|
338
|
+
sendToolCallUpdate(session.sessionId, toolCallId, 'completed', 'Cancelled');
|
|
339
|
+
sendResponse(msg.id, { stopReason: 'cancelled' });
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
sendToolCallUpdate(session.sessionId, toolCallId, 'completed', 'Error');
|
|
343
|
+
sendAgentMessage(session.sessionId, `Error: ${err.message}`);
|
|
344
|
+
sendResponse(msg.id, { stopReason: 'end_turn' });
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
promptInFlight = false;
|
|
349
|
+
currentAbortController = null;
|
|
350
|
+
if (stdinClosed)
|
|
351
|
+
process.exit(0);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// --- Handler: session/cancel ---
|
|
355
|
+
function handleSessionCancel() {
|
|
356
|
+
if (currentAbortController) {
|
|
357
|
+
currentAbortController.abort();
|
|
358
|
+
debug('[ACP] session/cancel: aborting in-flight request');
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// --- Handler: session/export ---
|
|
362
|
+
async function handleSessionExport(msg) {
|
|
363
|
+
if (!session.projectId) {
|
|
364
|
+
sendError(msg.id, -32603, 'No active project to export. Send a prompt first.');
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const params = msg.params || {};
|
|
368
|
+
const format = params.format || 'auto';
|
|
369
|
+
const outputPath = params.outputPath;
|
|
370
|
+
debug(`[ACP] session/export: format=${format}, outputPath=${outputPath || '(none)'}`);
|
|
371
|
+
try {
|
|
372
|
+
const result = await client.exportArtifact(session.projectId, session.taskType, format);
|
|
373
|
+
if (result.status !== 'ok' || !result.data) {
|
|
374
|
+
sendError(msg.id, -32603, `Export failed: ${result.message || 'unknown error'}`);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const data = result.data;
|
|
378
|
+
const downloadUrl = data.download_url;
|
|
379
|
+
const fileName = data.file_name;
|
|
380
|
+
const exportFormat = data.format;
|
|
381
|
+
const responseData = {
|
|
382
|
+
download_url: downloadUrl,
|
|
383
|
+
file_name: fileName,
|
|
384
|
+
format: exportFormat,
|
|
385
|
+
};
|
|
386
|
+
// If outputPath specified, download to local file
|
|
387
|
+
if (outputPath && downloadUrl) {
|
|
388
|
+
try {
|
|
389
|
+
const resp = await fetch(downloadUrl);
|
|
390
|
+
if (resp.ok) {
|
|
391
|
+
const buffer = Buffer.from(await resp.arrayBuffer());
|
|
392
|
+
fs.writeFileSync(outputPath, buffer);
|
|
393
|
+
responseData.local_path = pathModule.resolve(outputPath);
|
|
394
|
+
responseData.size_bytes = buffer.length;
|
|
395
|
+
debug(`[ACP] Exported ${buffer.length} bytes → ${outputPath}`);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
responseData.download_error = `HTTP ${resp.status}`;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
catch (dlErr) {
|
|
402
|
+
responseData.download_error = dlErr.message;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
sendResponse(msg.id, responseData);
|
|
406
|
+
}
|
|
407
|
+
catch (err) {
|
|
408
|
+
sendError(msg.id, -32603, `Export error: ${err.message}`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// --- Message router ---
|
|
412
|
+
rl.on('line', async (line) => {
|
|
413
|
+
if (!line.trim())
|
|
414
|
+
return;
|
|
415
|
+
let msg;
|
|
416
|
+
try {
|
|
417
|
+
msg = JSON.parse(line);
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
if (msg.jsonrpc !== '2.0')
|
|
423
|
+
return;
|
|
424
|
+
const method = msg.method;
|
|
425
|
+
debug(`[ACP] Received: ${method}`);
|
|
426
|
+
try {
|
|
427
|
+
switch (method) {
|
|
428
|
+
case 'initialize':
|
|
429
|
+
if (isRequest(msg))
|
|
430
|
+
await handleInitialize(msg);
|
|
431
|
+
break;
|
|
432
|
+
case 'session/new':
|
|
433
|
+
if (isRequest(msg))
|
|
434
|
+
await handleSessionNew(msg);
|
|
435
|
+
break;
|
|
436
|
+
case 'session/load':
|
|
437
|
+
if (isRequest(msg))
|
|
438
|
+
await handleSessionLoad(msg);
|
|
439
|
+
break;
|
|
440
|
+
case 'session/list':
|
|
441
|
+
if (isRequest(msg))
|
|
442
|
+
await handleSessionList(msg);
|
|
443
|
+
break;
|
|
444
|
+
case 'session/prompt':
|
|
445
|
+
if (isRequest(msg))
|
|
446
|
+
await handleSessionPrompt(msg);
|
|
447
|
+
break;
|
|
448
|
+
case 'session/export':
|
|
449
|
+
if (isRequest(msg))
|
|
450
|
+
await handleSessionExport(msg);
|
|
451
|
+
break;
|
|
452
|
+
case 'session/cancel':
|
|
453
|
+
handleSessionCancel();
|
|
454
|
+
break;
|
|
455
|
+
default:
|
|
456
|
+
if (isRequest(msg)) {
|
|
457
|
+
sendError(msg.id, -32601, `Method not found: ${method}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (err) {
|
|
462
|
+
if (isRequest(msg)) {
|
|
463
|
+
sendError(msg.id, -32603, err.message);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
rl.on('close', () => {
|
|
468
|
+
stdinClosed = true;
|
|
469
|
+
if (!promptInFlight)
|
|
470
|
+
process.exit(0);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Send a message to the agent via agent_ask endpoint (streaming).
|
|
475
|
+
* First call (no projectId) creates the project; subsequent calls continue it.
|
|
476
|
+
*/
|
|
477
|
+
async function askAgent(client, session, message, signal, onProgress, onDelta, onToolCall) {
|
|
478
|
+
const result = await client.agentAsk(session.projectId, message, session.taskType, msg => {
|
|
479
|
+
if (msg.delta && onDelta) {
|
|
480
|
+
onDelta(msg.delta);
|
|
481
|
+
}
|
|
482
|
+
else if (msg.tool_call_name && onToolCall) {
|
|
483
|
+
onToolCall(msg.tool_call_id || `agent-tool-${Date.now()}`, msg.tool_call_name);
|
|
484
|
+
}
|
|
485
|
+
else if (msg.heartbeat) {
|
|
486
|
+
onProgress(`Processing... (${msg.elapsed_seconds}s)`);
|
|
487
|
+
}
|
|
488
|
+
}, signal);
|
|
489
|
+
if (result.status !== 'ok' || !result.data) {
|
|
490
|
+
throw new Error(result.message || 'agent_ask failed');
|
|
491
|
+
}
|
|
492
|
+
const data = result.data;
|
|
493
|
+
// Extract project_id from response (set on first call when project is created)
|
|
494
|
+
const projectId = data.project_id;
|
|
495
|
+
if (projectId && !session.projectId) {
|
|
496
|
+
session.projectId = projectId;
|
|
497
|
+
debug(`[ACP] Project created: ${session.projectId}`);
|
|
498
|
+
}
|
|
499
|
+
return extractResponseText(data);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Extract human-readable response text from task result.
|
|
503
|
+
* Handles artifact URLs for various task types:
|
|
504
|
+
* - docs/slides/sheets: file_url + optional file_name
|
|
505
|
+
* - podcasts: file_url (audio) + video_file_url
|
|
506
|
+
* - image/video/audio generation: results[] array with URLs
|
|
507
|
+
*/
|
|
508
|
+
function extractResponseText(data) {
|
|
509
|
+
const resultContent = data.result_content;
|
|
510
|
+
if (resultContent) {
|
|
511
|
+
const lastMessage = resultContent.last_message;
|
|
512
|
+
const parts = lastMessage && lastMessage.length > 0 ? [...lastMessage] : [];
|
|
513
|
+
// Artifacts are nested under result_content.artifacts
|
|
514
|
+
const artifacts = resultContent.artifacts;
|
|
515
|
+
if (artifacts) {
|
|
516
|
+
// Single file artifact (docs, slides, sheets, podcasts audio)
|
|
517
|
+
const fileUrl = artifacts.file_url;
|
|
518
|
+
if (fileUrl) {
|
|
519
|
+
const fileName = artifacts.file_name;
|
|
520
|
+
parts.push(fileName ? `\nFile: ${fileUrl} (${fileName})` : `\nFile: ${fileUrl}`);
|
|
521
|
+
}
|
|
522
|
+
// Podcasts video
|
|
523
|
+
const videoFileUrl = artifacts.video_file_url;
|
|
524
|
+
if (videoFileUrl) {
|
|
525
|
+
parts.push(`Video: ${videoFileUrl}`);
|
|
526
|
+
}
|
|
527
|
+
// Media generation results (image/video/audio arrays)
|
|
528
|
+
const results = artifacts.results;
|
|
529
|
+
if (results && results.length > 0) {
|
|
530
|
+
parts.push(''); // blank line separator
|
|
531
|
+
for (const item of results) {
|
|
532
|
+
const url = (item.image_url ||
|
|
533
|
+
item.video_url ||
|
|
534
|
+
item.audio_url ||
|
|
535
|
+
item.url);
|
|
536
|
+
const prompt = item.prompt;
|
|
537
|
+
if (url) {
|
|
538
|
+
parts.push(prompt ? `- ${url} (${prompt})` : `- ${url}`);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// Append any remaining artifact fields as JSON
|
|
543
|
+
const knownKeys = new Set(['file_url', 'file_name', 'video_file_url', 'results']);
|
|
544
|
+
const extra = {};
|
|
545
|
+
for (const [k, v] of Object.entries(artifacts)) {
|
|
546
|
+
if (!knownKeys.has(k) && v)
|
|
547
|
+
extra[k] = v;
|
|
548
|
+
}
|
|
549
|
+
if (Object.keys(extra).length > 0) {
|
|
550
|
+
parts.push(`\n${JSON.stringify(extra)}`);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
// Artifacts note (project URL etc.)
|
|
554
|
+
const artifactsNote = resultContent.artifacts_note;
|
|
555
|
+
if (artifactsNote) {
|
|
556
|
+
parts.push(`\n${artifactsNote}`);
|
|
557
|
+
}
|
|
558
|
+
if (parts.length > 0) {
|
|
559
|
+
return parts.join('\n');
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
const msg = data.message;
|
|
563
|
+
if (msg)
|
|
564
|
+
return msg;
|
|
565
|
+
// Don't expose raw JSON to the user
|
|
566
|
+
return '';
|
|
567
|
+
}
|
|
568
|
+
//# sourceMappingURL=acp-serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-serve.js","sourceRoot":"","sources":["../src/acp-serve.ts"],"names":[],"mappings":"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"}
|