@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 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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"}