@aexol/spectral 0.9.192 → 0.9.194
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/dist/agent/agents.js
CHANGED
|
@@ -8,7 +8,7 @@ export const SYSTEM_AGENTS = [
|
|
|
8
8
|
name: "ghost",
|
|
9
9
|
description: "Built-in orchestrator primary agent that delegates work to researcher, executor, and reviewer subagents.",
|
|
10
10
|
mode: "primary",
|
|
11
|
-
systemPrompt: "You are ghost, the built-in system orchestrator. Plan the work, delegate
|
|
11
|
+
systemPrompt: "You are ghost, the built-in system orchestrator. Plan the work, then delegate by calling the `subagent` tool with one of your subagents, then integrate the results into a coherent outcome.\n\nYour subagents (call them via the `subagent` tool, e.g. subagent(agent=\"researcher\", task=\"...\")):\n- `researcher` — investigate the codebase, read code and documentation, and report precise, cited findings without making changes.\n- `executor` — implement the requested changes minimally and safely, run verification, and report exactly what changed with evidence.\n- `reviewer` — review proposed or implemented changes for correctness, edge cases, security, and consistency with the codebase.\n\nDelegate the actual work to the appropriate subagent instead of doing it yourself; use `researcher` for research/investigation, `executor` for implementation, and `reviewer` for review.",
|
|
12
12
|
source: "system",
|
|
13
13
|
filePath: "system:ghost",
|
|
14
14
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/desktop-screenshot/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAEX,YAAY,EAEZ,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/desktop-screenshot/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAEX,YAAY,EAEZ,MAAM,iCAAiC,CAAC;AA6ezC,wBAA8B,0BAA0B,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFzF"}
|
|
@@ -18,11 +18,23 @@ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
18
18
|
import { tmpdir } from "node:os";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { randomUUID } from "node:crypto";
|
|
21
|
+
const SCREENSHOTS_DIR = ".screenshots";
|
|
21
22
|
function tmpDir() {
|
|
22
23
|
const d = join(tmpdir(), "spectral-screenshots");
|
|
23
24
|
mkdirSync(d, { recursive: true });
|
|
24
25
|
return d;
|
|
25
26
|
}
|
|
27
|
+
function saveScreenshot(buf, format, cwd) {
|
|
28
|
+
const dir = join(cwd, SCREENSHOTS_DIR);
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
const now = new Date();
|
|
31
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
32
|
+
const timestamp = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
|
|
33
|
+
const filename = `screenshot-${timestamp}.${format}`;
|
|
34
|
+
const filepath = join(dir, filename);
|
|
35
|
+
writeFileSync(filepath, buf);
|
|
36
|
+
return filepath;
|
|
37
|
+
}
|
|
26
38
|
// ===========================================================================
|
|
27
39
|
// macOS (darwin)
|
|
28
40
|
// ===========================================================================
|
|
@@ -449,6 +461,7 @@ export default async function desktopScreenshotExtension(ext) {
|
|
|
449
461
|
name: "desktop_screenshot",
|
|
450
462
|
label: "Desktop Screenshot",
|
|
451
463
|
description: "Take a screenshot of the entire desktop or a specific application window. " +
|
|
464
|
+
"Saves the capture to .screenshots/ in the project and returns the saved file path. " +
|
|
452
465
|
"Returns the image for AI vision analysis. " +
|
|
453
466
|
"Use 'list_windows' first to see window titles, then pass a matching " +
|
|
454
467
|
"'windowTitle' to capture only that window.",
|
|
@@ -460,18 +473,19 @@ export default async function desktopScreenshotExtension(ext) {
|
|
|
460
473
|
windowTitle: { type: "string", description: "Capture a specific window by title (case-insensitive substring match from list_windows). Omit to capture the entire desktop." },
|
|
461
474
|
},
|
|
462
475
|
},
|
|
463
|
-
async execute(_toolCallId, params) {
|
|
476
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
464
477
|
const p = params;
|
|
465
478
|
const format = p.format ?? "png";
|
|
466
479
|
const mimeType = (format === "jpg" || format === "jpeg") ? "image/jpeg" : "image/png";
|
|
467
480
|
const makeImageResult = (buf, label) => {
|
|
468
481
|
const base64 = buf.toString("base64");
|
|
482
|
+
const savedPath = saveScreenshot(buf, format, ctx.cwd);
|
|
469
483
|
return {
|
|
470
484
|
content: [
|
|
471
|
-
{ type: "text", text: `✓ ${label} (${format.toUpperCase()}, ${(buf.length / 1024).toFixed(1)} KB).\nThe image is attached and will be analyzed by the vision model.` },
|
|
485
|
+
{ type: "text", text: `✓ ${label} (${format.toUpperCase()}, ${(buf.length / 1024).toFixed(1)} KB).\nSaved: ${savedPath}\nThe image is attached and will be analyzed by the vision model.` },
|
|
472
486
|
{ type: "image", data: base64, mimeType },
|
|
473
487
|
],
|
|
474
|
-
details: { format, sizeBytes: buf.length, platform: process.platform },
|
|
488
|
+
details: { format, sizeBytes: buf.length, platform: process.platform, savedPath },
|
|
475
489
|
};
|
|
476
490
|
};
|
|
477
491
|
const makeError = (msg) => ({
|