@pixerate/editor 0.222.3 → 0.223.1
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/index.cjs +13 -3
- package/dist/agent/index.js +12 -2
- package/dist/bridge/cli.cjs +3 -3
- package/dist/bridge/cli.js +2 -2
- package/dist/bridge/index.cjs +3 -3
- package/dist/bridge/index.js +2 -2
- package/dist/{chunk-I5MRJW7B.js → chunk-67JAEU53.js} +1 -1
- package/dist/{chunk-U4QN36YT.cjs → chunk-BDT2IYXK.cjs} +128 -16
- package/dist/{chunk-S4EIAIEW.cjs → chunk-OJTZKDLJ.cjs} +7 -7
- package/dist/{chunk-XZB3TJ6K.js → chunk-SAN4SBBS.js} +25 -7
- package/dist/{chunk-GI3AVES4.js → chunk-SVHXD2VH.js} +117 -5
- package/dist/{chunk-AMX23CSN.cjs → chunk-Z7BVK32C.cjs} +25 -7
- package/dist/image-editor/index.cjs +12 -11
- package/dist/image-editor/index.js +12 -11
- package/dist/image-editor/layers/panel.d.cts +6 -2
- package/dist/image-editor/layers/panel.d.ts +6 -2
- package/dist/tools/index.cjs +13 -3
- package/dist/tools/index.d.cts +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +12 -2
- package/dist/tools/skill-evals.d.cts +107 -0
- package/dist/tools/skill-evals.d.ts +107 -0
- package/dist/tools/skills.d.cts +12 -1
- package/dist/tools/skills.d.ts +12 -1
- package/package.json +1 -1
- package/skills/README.md +7 -2
- package/skills/pixerate-agent-tools/SKILL.md +5 -3
- package/skills/pixerate-chart/SKILL.md +8 -0
- package/skills/pixerate-chart-annotate/SKILL.md +96 -0
- package/skills/pixerate-chart-annotate/evals/highlight-the-point.json +78 -0
- package/skills/pixerate-chart-annotate/evals/source-and-units.json +76 -0
- package/skills/pixerate-chart-annotate/evals/target-line.json +85 -0
- package/skills/pixerate-chart-choose-and-build/SKILL.md +100 -0
- package/skills/pixerate-chart-choose-and-build/evals/colour-blind-safe.json +113 -0
- package/skills/pixerate-chart-choose-and-build/evals/honest-baseline.json +81 -0
- package/skills/pixerate-chart-choose-and-build/evals/trend-over-time.json +175 -0
package/dist/agent/index.cjs
CHANGED
|
@@ -25,12 +25,12 @@ require('../chunk-4EFNS2HV.cjs');
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
var _chunkU4QN36YTcjs = require('../chunk-U4QN36YT.cjs');
|
|
29
28
|
|
|
30
29
|
|
|
31
30
|
|
|
32
31
|
|
|
33
32
|
|
|
33
|
+
var _chunkBDT2IYXKcjs = require('../chunk-BDT2IYXK.cjs');
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
@@ -51,7 +51,12 @@ var _chunkU4QN36YTcjs = require('../chunk-U4QN36YT.cjs');
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
var _chunkZ7BVK32Ccjs = require('../chunk-Z7BVK32C.cjs');
|
|
55
60
|
|
|
56
61
|
|
|
57
62
|
|
|
@@ -2271,4 +2276,9 @@ function createCanvasComponentToolProvider(controller, options = { id: "canvas-c
|
|
|
2271
2276
|
|
|
2272
2277
|
|
|
2273
2278
|
|
|
2274
|
-
|
|
2279
|
+
|
|
2280
|
+
|
|
2281
|
+
|
|
2282
|
+
|
|
2283
|
+
|
|
2284
|
+
exports.AgentPlayback = _chunk3SLBXKAWcjs.AgentPlayback; exports.CAPTURE_EXCLUDE_SELECTOR = _chunkSVFEVKLFcjs.CAPTURE_EXCLUDE_SELECTOR; exports.CAPTURE_OVERLAY_SELECTORS = _chunkSVFEVKLFcjs.CAPTURE_OVERLAY_SELECTORS; exports.EDITOR_CANVAS_TOOLS = _chunkSVFEVKLFcjs.EDITOR_CANVAS_TOOLS; exports.EDITOR_MCP_TOOLS = _chunkSVFEVKLFcjs.EDITOR_MCP_TOOLS; exports.EDITOR_PROMPT_TOOLS = _chunkSVFEVKLFcjs.EDITOR_PROMPT_TOOLS; exports.EDIT_OPERATION_REQUIRED_ARGUMENTS = _chunkSVFEVKLFcjs.EDIT_OPERATION_REQUIRED_ARGUMENTS; exports.EXPORT_EXCLUDED_SELECTORS = _chunkSVFEVKLFcjs.EXPORT_EXCLUDED_SELECTORS; exports.JSON_RPC_ERRORS = _chunkZ7BVK32Ccjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkZ7BVK32Ccjs.MCP_PROTOCOL_VERSIONS; exports.MCP_TOOL_CANVAS_ADD_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_ADD_NODE; exports.MCP_TOOL_CANVAS_CONNECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_CONNECT; exports.MCP_TOOL_CANVAS_HIGHLIGHT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_HIGHLIGHT; exports.MCP_TOOL_CANVAS_LAYOUT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_LAYOUT; exports.MCP_TOOL_CANVAS_REMOVE_NODES = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_REMOVE_NODES; exports.MCP_TOOL_CANVAS_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_SELECT; exports.MCP_TOOL_CANVAS_UPDATE_NODE = _chunkSVFEVKLFcjs.MCP_TOOL_CANVAS_UPDATE_NODE; exports.MCP_TOOL_EDIT_CANVAS = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_CANVAS; exports.MCP_TOOL_EDIT_PROMPT = _chunkSVFEVKLFcjs.MCP_TOOL_EDIT_PROMPT; exports.MCP_TOOL_GET_EDITOR_STATE = _chunkSVFEVKLFcjs.MCP_TOOL_GET_EDITOR_STATE; exports.MCP_TOOL_PROMPT_INSERT_TEXT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_INSERT_TEXT; exports.MCP_TOOL_PROMPT_REPLACE_RANGE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_REPLACE_RANGE; exports.MCP_TOOL_PROMPT_SELECT = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SELECT; exports.MCP_TOOL_PROMPT_SET_VARIABLE = _chunkSVFEVKLFcjs.MCP_TOOL_PROMPT_SET_VARIABLE; exports.MCP_TOOL_VIEW_EDITOR = _chunkSVFEVKLFcjs.MCP_TOOL_VIEW_EDITOR; exports.PRESENCE_COLORS = _chunkK7ENM55Pcjs.PRESENCE_COLORS; exports.PerformanceQueue = _chunkK7ENM55Pcjs.PerformanceQueue; exports.PresenceStore = _chunkK7ENM55Pcjs.PresenceStore; exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkZ7BVK32Ccjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkZ7BVK32Ccjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkZ7BVK32Ccjs.ToolRegistry; exports.ToolRegistryError = _chunkZ7BVK32Ccjs.ToolRegistryError; exports.ToolRegistryView = _chunkZ7BVK32Ccjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkZ7BVK32Ccjs.baseToolName; exports.callEvalTool = _chunkBDT2IYXKcjs.callEvalTool; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkZ7BVK32Ccjs.connectToolBridge; exports.createAgentPlayback = _chunk3SLBXKAWcjs.createAgentPlayback; exports.createCanvasComponentToolProvider = createCanvasComponentToolProvider; exports.createCaptureTool = _chunkN2FGYZ4Qcjs.createCaptureTool; exports.createCaptureToolProvider = _chunkN2FGYZ4Qcjs.createCaptureToolProvider; exports.createDocumentChartTools = createDocumentChartTools; exports.createEditorMcpToolProvider = createEditorMcpToolProvider; exports.createElementCaptureSurface = _chunkSVFEVKLFcjs.createElementCaptureSurface; exports.createInstantPresenceClock = _chunkK7ENM55Pcjs.createInstantPresenceClock; exports.createMcpServer = _chunkZ7BVK32Ccjs.createMcpServer; exports.createPlaybackToolProvider = _chunk3SLBXKAWcjs.createPlaybackToolProvider; exports.createRichTextToolProvider = createRichTextToolProvider; exports.createSpreadsheetToolProvider = createSpreadsheetToolProvider; exports.createStyleResolver = _chunkBDT2IYXKcjs.createStyleResolver; exports.createStyleToolProvider = _chunkBDT2IYXKcjs.createStyleToolProvider; exports.createToolRegistry = _chunkZ7BVK32Ccjs.createToolRegistry; exports.derivePlaybackSteps = _chunk3SLBXKAWcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkZ7BVK32Ccjs.errorResult; exports.failedEvalChecks = _chunkBDT2IYXKcjs.failedEvalChecks; exports.imageEvalFixturePixels = _chunkBDT2IYXKcjs.imageEvalFixturePixels; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkillEvals = _chunkBDT2IYXKcjs.listSkillEvals; exports.listSkills = _chunkZ7BVK32Ccjs.listSkills; exports.locatePlaybackChrome = _chunk3SLBXKAWcjs.locatePlaybackChrome; exports.matchesEvalExpectation = _chunkBDT2IYXKcjs.matchesEvalExpectation; exports.memoryStyleStore = _chunkBDT2IYXKcjs.memoryStyleStore; exports.normalizeSide = normalizeSide; exports.parseSkillFrontmatter = _chunkZ7BVK32Ccjs.parseSkillFrontmatter; exports.parseStyleDomains = _chunkBDT2IYXKcjs.parseStyleDomains; exports.planAgentCommand = planAgentCommand; exports.planCanvasPlaybackSteps = planCanvasPlaybackSteps; exports.planCanvasToolPlayback = planCanvasToolPlayback; exports.planToolCall = planToolCall; exports.playbackRectFromClient = _chunk3SLBXKAWcjs.playbackRectFromClient; exports.playbackRefsFromArgs = _chunk3SLBXKAWcjs.playbackRefsFromArgs; exports.playbackRefsFromResult = _chunk3SLBXKAWcjs.playbackRefsFromResult; exports.rasterizeElement = _chunkSVFEVKLFcjs.rasterizeElement; exports.readSkillFile = _chunkZ7BVK32Ccjs.readSkillFile; exports.readingTime = _chunk3SLBXKAWcjs.readingTime; exports.realPresenceClock = _chunkK7ENM55Pcjs.realPresenceClock; exports.renderStyle = _chunkBDT2IYXKcjs.renderStyle; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runStyleChecks = _chunkBDT2IYXKcjs.runStyleChecks; exports.runToolScript = _chunkBDT2IYXKcjs.runToolScript; exports.searchTokens = _chunkZ7BVK32Ccjs.searchTokens; exports.searchTools = _chunkZ7BVK32Ccjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkZ7BVK32Ccjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkZ7BVK32Ccjs.toToolResult; exports.toolCallToAgentCommand = toolCallToAgentCommand; exports.toolResultError = _chunkBDT2IYXKcjs.toolResultError; exports.toolResultValue = _chunkBDT2IYXKcjs.toolResultValue; exports.toolsetInstructions = _chunkZ7BVK32Ccjs.toolsetInstructions; exports.toolsetName = _chunkZ7BVK32Ccjs.toolsetName; exports.trackPresenceDrag = _chunkK7ENM55Pcjs.trackPresenceDrag; exports.tweenPresenceCursor = _chunkK7ENM55Pcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunk3SLBXKAWcjs.unionRects; exports.unknownToolMessage = _chunkZ7BVK32Ccjs.unknownToolMessage; exports.validateAgentCommand = validateAgentCommand; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
|
package/dist/agent/index.js
CHANGED
|
@@ -16,8 +16,13 @@ import {
|
|
|
16
16
|
} from "../chunk-U4VE4UI2.js";
|
|
17
17
|
import "../chunk-7KZ2HKKC.js";
|
|
18
18
|
import {
|
|
19
|
+
callEvalTool,
|
|
19
20
|
createStyleResolver,
|
|
20
21
|
createStyleToolProvider,
|
|
22
|
+
failedEvalChecks,
|
|
23
|
+
imageEvalFixturePixels,
|
|
24
|
+
listSkillEvals,
|
|
25
|
+
matchesEvalExpectation,
|
|
21
26
|
memoryStyleStore,
|
|
22
27
|
parseStyleDomains,
|
|
23
28
|
renderStyle,
|
|
@@ -25,7 +30,7 @@ import {
|
|
|
25
30
|
runToolScript,
|
|
26
31
|
toolResultError,
|
|
27
32
|
toolResultValue
|
|
28
|
-
} from "../chunk-
|
|
33
|
+
} from "../chunk-SVHXD2VH.js";
|
|
29
34
|
import {
|
|
30
35
|
JSON_RPC_ERRORS,
|
|
31
36
|
MCP_PROTOCOL_VERSIONS,
|
|
@@ -51,7 +56,7 @@ import {
|
|
|
51
56
|
toolsetInstructions,
|
|
52
57
|
toolsetName,
|
|
53
58
|
unknownToolMessage
|
|
54
|
-
} from "../chunk-
|
|
59
|
+
} from "../chunk-SAN4SBBS.js";
|
|
55
60
|
import {
|
|
56
61
|
AgentPlayback,
|
|
57
62
|
createAgentPlayback,
|
|
@@ -2209,6 +2214,7 @@ export {
|
|
|
2209
2214
|
ToolRegistryView,
|
|
2210
2215
|
UNSAFE_JSON_KEYS,
|
|
2211
2216
|
baseToolName,
|
|
2217
|
+
callEvalTool,
|
|
2212
2218
|
captureInputSchema,
|
|
2213
2219
|
captureOutputSize,
|
|
2214
2220
|
cloneElementWithStyles,
|
|
@@ -2231,9 +2237,13 @@ export {
|
|
|
2231
2237
|
derivePlaybackSteps,
|
|
2232
2238
|
elementToSvg,
|
|
2233
2239
|
errorResult,
|
|
2240
|
+
failedEvalChecks,
|
|
2241
|
+
imageEvalFixturePixels,
|
|
2234
2242
|
isUnsafeJsonKey,
|
|
2243
|
+
listSkillEvals,
|
|
2235
2244
|
listSkills,
|
|
2236
2245
|
locatePlaybackChrome,
|
|
2246
|
+
matchesEvalExpectation,
|
|
2237
2247
|
memoryStyleStore,
|
|
2238
2248
|
normalizeSide,
|
|
2239
2249
|
parseSkillFrontmatter,
|
package/dist/bridge/cli.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict"; function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../chunk-
|
|
4
|
+
var _chunkOJTZKDLJcjs = require('../chunk-OJTZKDLJ.cjs');
|
|
5
|
+
require('../chunk-Z7BVK32C.cjs');
|
|
6
6
|
require('../chunk-WOFXZ3XU.cjs');
|
|
7
7
|
require('../chunk-2BSBFBOA.cjs');
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ args.forEach((arg, i) => {
|
|
|
23
23
|
if (arg === "--origin" && args[i + 1]) origins.push(args[i + 1]);
|
|
24
24
|
});
|
|
25
25
|
var port = value("--port");
|
|
26
|
-
void
|
|
26
|
+
void _chunkOJTZKDLJcjs.createToolBridge.call(void 0, {
|
|
27
27
|
name: _nullishCoalesce(value("--name"), () => ( "pixerate")),
|
|
28
28
|
port: port !== void 0 ? Number(port) : void 0,
|
|
29
29
|
token: _nullishCoalesce(value("--token"), () => ( process.env.PIXERATE_BRIDGE_TOKEN)),
|
package/dist/bridge/cli.js
CHANGED
package/dist/bridge/index.cjs
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkOJTZKDLJcjs = require('../chunk-OJTZKDLJ.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkZ7BVK32Ccjs = require('../chunk-Z7BVK32C.cjs');
|
|
11
11
|
require('../chunk-WOFXZ3XU.cjs');
|
|
12
12
|
require('../chunk-2BSBFBOA.cjs');
|
|
13
13
|
|
|
@@ -17,4 +17,4 @@ require('../chunk-2BSBFBOA.cjs');
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
exports.TOOL_BRIDGE_DEFAULT_PORT =
|
|
20
|
+
exports.TOOL_BRIDGE_DEFAULT_PORT = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL; exports.createToolBridge = _chunkOJTZKDLJcjs.createToolBridge; exports.defaultSkillsDir = _chunkOJTZKDLJcjs.defaultSkillsDir; exports.isLocalOrigin = _chunkOJTZKDLJcjs.isLocalOrigin; exports.loadSkillFiles = _chunkOJTZKDLJcjs.loadSkillFiles;
|
package/dist/bridge/index.js
CHANGED
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
defaultSkillsDir,
|
|
4
4
|
isLocalOrigin,
|
|
5
5
|
loadSkillFiles
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-67JAEU53.js";
|
|
7
7
|
import {
|
|
8
8
|
TOOL_BRIDGE_DEFAULT_PORT,
|
|
9
9
|
TOOL_BRIDGE_PROTOCOL
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-SAN4SBBS.js";
|
|
11
11
|
import "../chunk-V2ZCJRDM.js";
|
|
12
12
|
import "../chunk-HF5QZS7Z.js";
|
|
13
13
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkZ7BVK32Ccjs = require('./chunk-Z7BVK32C.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
var _chunk3SLBXKAWcjs = require('./chunk-3SLBXKAW.cjs');
|
|
@@ -12,11 +12,118 @@ var _chunkWOFXZ3XUcjs = require('./chunk-WOFXZ3XU.cjs');
|
|
|
12
12
|
|
|
13
13
|
var _chunk2BSBFBOAcjs = require('./chunk-2BSBFBOA.cjs');
|
|
14
14
|
|
|
15
|
+
// src/tools/skill-evals.ts
|
|
16
|
+
function listSkillEvals(files) {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const [raw, text] of Object.entries(files)) {
|
|
19
|
+
const path = raw.replace(/\\/g, "/").replace(/^\.?\//, "");
|
|
20
|
+
const match = /^([^/]+)\/evals\/[^/]+\.json$/.exec(path);
|
|
21
|
+
if (match) out.push({ skill: match[1], path, eval: JSON.parse(text) });
|
|
22
|
+
}
|
|
23
|
+
return out.sort((a, b) => a.path.localeCompare(b.path));
|
|
24
|
+
}
|
|
25
|
+
function imageEvalFixturePixels(f) {
|
|
26
|
+
const { width: W, height: H } = f;
|
|
27
|
+
const data = new Uint8ClampedArray(W * H * 4);
|
|
28
|
+
for (let y = 0; y < H; y++) {
|
|
29
|
+
for (let x = 0; x < W; x++) {
|
|
30
|
+
let rgb = f.background;
|
|
31
|
+
for (const s of f.shapes) {
|
|
32
|
+
const inside = s.shape === "rect" ? x >= s.x && x < s.x + s.width && y >= s.y && y < s.y + s.height : ((x + 0.5 - s.x - s.width / 2) / (s.width / 2)) ** 2 + ((y + 0.5 - s.y - s.height / 2) / (s.height / 2)) ** 2 <= 1;
|
|
33
|
+
if (inside) rgb = s.color;
|
|
34
|
+
}
|
|
35
|
+
data.set([...rgb, 255], (y * W + x) * 4);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { width: W, height: H, data };
|
|
39
|
+
}
|
|
40
|
+
async function callEvalTool(callTool, { tool, args = {} }) {
|
|
41
|
+
const res = await callTool(tool, await resolve(callTool, args));
|
|
42
|
+
if (res.isError) throw new Error(`${tool}: ${_nullishCoalesce(_optionalChain([res, 'access', _ => _.content, 'optionalAccess', _2 => _2[0], 'optionalAccess', _3 => _3.text]), () => ( "tool error"))}`);
|
|
43
|
+
return res.structuredContent;
|
|
44
|
+
}
|
|
45
|
+
async function resolve(callTool, v) {
|
|
46
|
+
if (Array.isArray(v)) return Promise.all(v.map((x) => resolve(callTool, x)));
|
|
47
|
+
if (!v || typeof v !== "object") return v;
|
|
48
|
+
if ("$read" in v) {
|
|
49
|
+
const { $read, args, path } = v;
|
|
50
|
+
return at(await callEvalTool(callTool, { tool: $read, args }), path);
|
|
51
|
+
}
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const [k, x] of Object.entries(v)) out[k] = await resolve(callTool, x);
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
function at(value, path) {
|
|
57
|
+
const [key, ...rest] = path.split(".");
|
|
58
|
+
if (value == null || key === void 0) return value;
|
|
59
|
+
if (key === "*") return Array.isArray(value) ? rest.length ? value.map((x) => at(x, rest.join("."))) : value : void 0;
|
|
60
|
+
const next = Array.isArray(value) && /^-\d+$/.test(key) ? value[value.length + Number(key)] : value[key];
|
|
61
|
+
return rest.length ? at(next, rest.join(".")) : next;
|
|
62
|
+
}
|
|
63
|
+
var isEmpty = (v) => v === null || v === void 0 || v === "" || Array.isArray(v) && v.every(isEmpty);
|
|
64
|
+
function matchesEvalExpectation(actual, expected) {
|
|
65
|
+
const matches = matchesEvalExpectation;
|
|
66
|
+
if (expected === null || typeof expected !== "object") return Object.is(actual, expected);
|
|
67
|
+
if (Array.isArray(expected)) return Array.isArray(actual) && actual.length === expected.length && expected.every((e, i) => matches(actual[i], e));
|
|
68
|
+
const ops = Object.entries(expected);
|
|
69
|
+
return ops.every(([key, want]) => {
|
|
70
|
+
const list = Array.isArray(actual) ? actual : null;
|
|
71
|
+
switch (key) {
|
|
72
|
+
case "$min":
|
|
73
|
+
return typeof actual === "number" && actual >= want;
|
|
74
|
+
case "$max":
|
|
75
|
+
return typeof actual === "number" && actual <= want;
|
|
76
|
+
case "$type":
|
|
77
|
+
return (actual === null ? "null" : Array.isArray(actual) ? "array" : typeof actual) === want;
|
|
78
|
+
case "$match": {
|
|
79
|
+
const [pattern, flags] = Array.isArray(want) ? want : [want, ""];
|
|
80
|
+
return typeof actual === "string" && new RegExp(pattern, flags).test(actual);
|
|
81
|
+
}
|
|
82
|
+
case "$in":
|
|
83
|
+
return want.some((w) => matches(actual, w));
|
|
84
|
+
case "$not":
|
|
85
|
+
return !matches(actual, want);
|
|
86
|
+
case "$every":
|
|
87
|
+
return !!list && list.every((a) => matches(a, want));
|
|
88
|
+
case "$some":
|
|
89
|
+
return !!list && list.some((a) => matches(a, want));
|
|
90
|
+
case "$length":
|
|
91
|
+
return !!list && matches(list.length, want);
|
|
92
|
+
case "$unique":
|
|
93
|
+
return !!list && new Set(list.map((a) => JSON.stringify(a))).size === list.length;
|
|
94
|
+
case "$distinct":
|
|
95
|
+
return !!list && matches([...new Set(list.map((a) => JSON.stringify(a)))].map((a) => JSON.parse(a)), want);
|
|
96
|
+
case "$sum":
|
|
97
|
+
return !!list && list.every((a) => typeof a === "number") && Math.abs(list.reduce((s, a) => s + a, 0) - want) < 1e-6;
|
|
98
|
+
case "$column": {
|
|
99
|
+
const [index, m] = want;
|
|
100
|
+
return !!list && matches(list.map((row) => Array.isArray(row) ? row[index] : void 0), m);
|
|
101
|
+
}
|
|
102
|
+
case "$expr":
|
|
103
|
+
return !!new Function("v", `return (${want});`)(actual);
|
|
104
|
+
case "$nonEmpty":
|
|
105
|
+
return !!list && matches(list.filter((a) => !isEmpty(a)), want);
|
|
106
|
+
default:
|
|
107
|
+
if (key.startsWith("$")) throw new Error(`Unknown eval operator ${key}.`);
|
|
108
|
+
return actual !== null && typeof actual === "object" && matches(actual[key], want);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async function failedEvalChecks(callTool, checks) {
|
|
113
|
+
const failed = [];
|
|
114
|
+
for (const check of checks) {
|
|
115
|
+
const result = await callEvalTool(callTool, check).catch((e) => e);
|
|
116
|
+
if (result instanceof Error) failed.push(`${check.why} (${result.message})`);
|
|
117
|
+
else if (!matchesEvalExpectation(result, check.expect)) failed.push(`${check.why} (${check.tool} \u2192 ${JSON.stringify(result).slice(0, 400)})`);
|
|
118
|
+
}
|
|
119
|
+
return failed;
|
|
120
|
+
}
|
|
121
|
+
|
|
15
122
|
// src/tools/script.ts
|
|
16
123
|
function toolResultValue(result) {
|
|
17
124
|
if (result.structuredContent) return result.structuredContent;
|
|
18
125
|
const text = result.content.find((b) => b.type === "text");
|
|
19
|
-
if (!_optionalChain([text, 'optionalAccess',
|
|
126
|
+
if (!_optionalChain([text, 'optionalAccess', _4 => _4.text])) return void 0;
|
|
20
127
|
try {
|
|
21
128
|
return JSON.parse(text.text);
|
|
22
129
|
} catch (e2) {
|
|
@@ -25,9 +132,9 @@ function toolResultValue(result) {
|
|
|
25
132
|
}
|
|
26
133
|
function toolResultError(result) {
|
|
27
134
|
const text = result.content.find((b) => b.type === "text");
|
|
28
|
-
return _nullishCoalesce(_optionalChain([text, 'optionalAccess',
|
|
135
|
+
return _nullishCoalesce(_optionalChain([text, 'optionalAccess', _5 => _5.text]), () => ( "The tool failed."));
|
|
29
136
|
}
|
|
30
|
-
var realWait = (ms) => new Promise((
|
|
137
|
+
var realWait = (ms) => new Promise((resolve2) => setTimeout(resolve2, ms));
|
|
31
138
|
async function runToolScript(source, script, options = {}) {
|
|
32
139
|
const control = _nullishCoalesce(options.control, () => ( { speed: 1, stopped: false }));
|
|
33
140
|
const wait = _nullishCoalesce(options.wait, () => ( realWait));
|
|
@@ -36,7 +143,7 @@ async function runToolScript(source, script, options = {}) {
|
|
|
36
143
|
})));
|
|
37
144
|
const ctx = { results: {}, last: void 0 };
|
|
38
145
|
const finish = (ok) => {
|
|
39
|
-
if (control.stopped) _optionalChain([options, 'access',
|
|
146
|
+
if (control.stopped) _optionalChain([options, 'access', _6 => _6.playback, 'optionalAccess', _7 => _7.stop, 'call', _8 => _8()]);
|
|
40
147
|
emit({ type: "done", ok, stopped: control.stopped });
|
|
41
148
|
return { ok, ctx };
|
|
42
149
|
};
|
|
@@ -45,7 +152,7 @@ async function runToolScript(source, script, options = {}) {
|
|
|
45
152
|
const step = script.steps[i];
|
|
46
153
|
if (step.say) {
|
|
47
154
|
emit({ type: "say", step: i, text: step.say });
|
|
48
|
-
_optionalChain([options, 'access',
|
|
155
|
+
_optionalChain([options, 'access', _9 => _9.playback, 'optionalAccess', _10 => _10.say, 'call', _11 => _11(step.say, options.actor ? { actor: options.actor } : {})]);
|
|
49
156
|
await pause(_chunk3SLBXKAWcjs.readingTime.call(void 0, step.say));
|
|
50
157
|
}
|
|
51
158
|
if (!step.tool) continue;
|
|
@@ -76,7 +183,7 @@ var STYLE_SKILL_NAME = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
|
76
183
|
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
77
184
|
function parseStyleDomains(markdown) {
|
|
78
185
|
const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(markdown);
|
|
79
|
-
const line = _optionalChain([match, 'optionalAccess',
|
|
186
|
+
const line = _optionalChain([match, 'optionalAccess', _12 => _12[1], 'access', _13 => _13.split, 'call', _14 => _14(/\r?\n/), 'access', _15 => _15.find, 'call', _16 => _16((l) => /^domains:/.test(l))]);
|
|
80
187
|
if (!line) return void 0;
|
|
81
188
|
const raw = line.slice("domains:".length).trim().replace(/^\[|\]$/g, "");
|
|
82
189
|
return raw.split(",").map((d) => d.trim().replace(/^(['"])(.*)\1$/, "$2")).filter(Boolean);
|
|
@@ -94,8 +201,8 @@ function memoryStyleStore(initial = {}, state = {}) {
|
|
|
94
201
|
}
|
|
95
202
|
return {
|
|
96
203
|
list: () => [.../* @__PURE__ */ new Set([...files.keys(), ...states.keys()])].sort().map((name) => ({ name, ...states.get(name) })),
|
|
97
|
-
read: (name, file) => _optionalChain([files, 'access',
|
|
98
|
-
files: (name) => [..._nullishCoalesce(_optionalChain([files, 'access',
|
|
204
|
+
read: (name, file) => _optionalChain([files, 'access', _17 => _17.get, 'call', _18 => _18(name), 'optionalAccess', _19 => _19.get, 'call', _20 => _20(file)]),
|
|
205
|
+
files: (name) => [..._nullishCoalesce(_optionalChain([files, 'access', _21 => _21.get, 'call', _22 => _22(name), 'optionalAccess', _23 => _23.keys, 'call', _24 => _24()]), () => ( []))].sort(),
|
|
99
206
|
subscribe(listener) {
|
|
100
207
|
listeners.add(listener);
|
|
101
208
|
return () => listeners.delete(listener);
|
|
@@ -233,7 +340,7 @@ function createStyleResolver(options) {
|
|
|
233
340
|
}
|
|
234
341
|
enabled = entry.enabled;
|
|
235
342
|
}
|
|
236
|
-
const { description = "", body } =
|
|
343
|
+
const { description = "", body } = _chunkZ7BVK32Ccjs.parseSkillFrontmatter.call(void 0, winner.text);
|
|
237
344
|
const named = parseStyleDomains(winner.text);
|
|
238
345
|
const applies = /* @__PURE__ */ new Set();
|
|
239
346
|
for (const d of _nullishCoalesce(named, () => ( domainIds))) {
|
|
@@ -291,7 +398,7 @@ function createStyleResolver(options) {
|
|
|
291
398
|
skills.sort((a, b) => a.layerIndex - b.layerIndex || a.info.order - b.info.order || a.info.name.localeCompare(b.info.name));
|
|
292
399
|
return { skills, issues };
|
|
293
400
|
}
|
|
294
|
-
async function
|
|
401
|
+
async function resolve2(domainId) {
|
|
295
402
|
requireDomain(domainId);
|
|
296
403
|
const { skills, issues: loadIssues } = await load();
|
|
297
404
|
const issues = [...loadIssues];
|
|
@@ -323,7 +430,7 @@ function createStyleResolver(options) {
|
|
|
323
430
|
const { skills } = await load();
|
|
324
431
|
return skills.filter((s) => opts.domain === void 0 || s.applies.has(opts.domain)).map((s) => s.info);
|
|
325
432
|
},
|
|
326
|
-
resolve,
|
|
433
|
+
resolve: resolve2,
|
|
327
434
|
async readFile(name, file) {
|
|
328
435
|
const layer = await winnerLayer(name);
|
|
329
436
|
return layer ? layer.store.read(name, file) : void 0;
|
|
@@ -334,12 +441,12 @@ function createStyleResolver(options) {
|
|
|
334
441
|
},
|
|
335
442
|
async check(domainId, state) {
|
|
336
443
|
const domain = requireDomain(domainId);
|
|
337
|
-
const style = await
|
|
444
|
+
const style = await resolve2(domainId);
|
|
338
445
|
return { ...runStyleChecks(domain, state, style), style };
|
|
339
446
|
},
|
|
340
447
|
subscribe(listener) {
|
|
341
|
-
const offs = [...layers.map((l) => _optionalChain([l, 'access',
|
|
342
|
-
return () => offs.forEach((off) => _optionalChain([off, 'optionalCall',
|
|
448
|
+
const offs = [...layers.map((l) => _optionalChain([l, 'access', _25 => _25.store, 'access', _26 => _26.subscribe, 'optionalCall', _27 => _27(listener)])), _optionalChain([options, 'access', _28 => _28.tokens, 'optionalAccess', _29 => _29.subscribe, 'optionalCall', _30 => _30(listener)])];
|
|
449
|
+
return () => offs.forEach((off) => _optionalChain([off, 'optionalCall', _31 => _31()]));
|
|
343
450
|
}
|
|
344
451
|
};
|
|
345
452
|
}
|
|
@@ -481,4 +588,9 @@ function createStyleToolProvider(styles, options = {}) {
|
|
|
481
588
|
|
|
482
589
|
|
|
483
590
|
|
|
484
|
-
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
exports.listSkillEvals = listSkillEvals; exports.imageEvalFixturePixels = imageEvalFixturePixels; exports.callEvalTool = callEvalTool; exports.matchesEvalExpectation = matchesEvalExpectation; exports.failedEvalChecks = failedEvalChecks; exports.toolResultValue = toolResultValue; exports.toolResultError = toolResultError; exports.runToolScript = runToolScript; exports.parseStyleDomains = parseStyleDomains; exports.memoryStyleStore = memoryStyleStore; exports.createStyleResolver = createStyleResolver; exports.runStyleChecks = runStyleChecks; exports.renderStyle = renderStyle; exports.createStyleToolProvider = createStyleToolProvider;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkZ7BVK32Ccjs = require('./chunk-Z7BVK32C.cjs');
|
|
7
7
|
|
|
8
8
|
// src/bridge/index.ts
|
|
9
9
|
var _http = require('http');
|
|
@@ -197,7 +197,7 @@ var SKILL_INSTRUCTIONS = "Each editor's tools are documented by an agent skill (
|
|
|
197
197
|
async function createToolBridge(options) {
|
|
198
198
|
const log = _nullishCoalesce(options.log, () => ( ((message) => process.stderr.write(`[${options.name}] ${message}
|
|
199
199
|
`))));
|
|
200
|
-
const port = _nullishCoalesce(options.port, () => (
|
|
200
|
+
const port = _nullishCoalesce(options.port, () => ( _chunkZ7BVK32Ccjs.TOOL_BRIDGE_DEFAULT_PORT));
|
|
201
201
|
const retryMs = _nullishCoalesce(options.retryMs, () => ( 2e3));
|
|
202
202
|
const timeoutMs = _nullishCoalesce(options.timeoutMs, () => ( 6e4));
|
|
203
203
|
const extraOrigins = new Set(_nullishCoalesce(options.origins, () => ( [])));
|
|
@@ -211,7 +211,7 @@ async function createToolBridge(options) {
|
|
|
211
211
|
let closed = false;
|
|
212
212
|
let retry;
|
|
213
213
|
const send = (editor, message) => editor.socket.send(JSON.stringify(message));
|
|
214
|
-
const registry = new (0,
|
|
214
|
+
const registry = new (0, _chunkZ7BVK32Ccjs.ToolRegistry)();
|
|
215
215
|
const listeners = /* @__PURE__ */ new Set();
|
|
216
216
|
const toolsChanged = () => listeners.forEach((l) => l());
|
|
217
217
|
const describeEditors = () => [...editors.values()].map((e) => `${e.id} (${e.name})`).join(", ");
|
|
@@ -319,13 +319,13 @@ async function createToolBridge(options) {
|
|
|
319
319
|
return;
|
|
320
320
|
}
|
|
321
321
|
if (message.t === "hello") {
|
|
322
|
-
if (message.v !==
|
|
322
|
+
if (message.v !== _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL) {
|
|
323
323
|
log(`refused an editor speaking protocol v${String(message.v)}`);
|
|
324
|
-
return ws.close(1008, `This bridge speaks protocol v${
|
|
324
|
+
return ws.close(1008, `This bridge speaks protocol v${_chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL}; update @pixerate/editor.`);
|
|
325
325
|
}
|
|
326
326
|
editor = { id: `e${++editorCounter}`, name: String(message.name || "Editor"), ...message.kind ? { kind: message.kind } : {}, socket: ws, tools: Array.isArray(message.tools) ? message.tools : [], activeAt: Date.now(), activeSeq: ++activity };
|
|
327
327
|
editors.set(editor.id, editor);
|
|
328
|
-
ws.send(JSON.stringify({ t: "welcome", v:
|
|
328
|
+
ws.send(JSON.stringify({ t: "welcome", v: _chunkZ7BVK32Ccjs.TOOL_BRIDGE_PROTOCOL, id: editor.id }));
|
|
329
329
|
log(`editor ${editor.id} connected: ${editor.name} (${editor.tools.length} tools)`);
|
|
330
330
|
toolsChanged();
|
|
331
331
|
} else if (message.t === "tools" && editor) {
|
|
@@ -381,7 +381,7 @@ async function createToolBridge(options) {
|
|
|
381
381
|
`)]);
|
|
382
382
|
const skills = options.skills === false ? {} : _nullishCoalesce(options.skills, () => ( loadSkillFiles()));
|
|
383
383
|
const hasSkills = Object.keys(skills).length > 0;
|
|
384
|
-
const mcp =
|
|
384
|
+
const mcp = _chunkZ7BVK32Ccjs.createMcpServer.call(void 0, registry, {
|
|
385
385
|
name: options.name,
|
|
386
386
|
version: _nullishCoalesce(options.version, () => ( "0.1.0")),
|
|
387
387
|
instructions: [options.instructions, BRIDGE_INSTRUCTIONS, hasSkills ? SKILL_INSTRUCTIONS : ""].filter(Boolean).join("\n\n"),
|
|
@@ -8,13 +8,22 @@ import {
|
|
|
8
8
|
// src/tools/skills.ts
|
|
9
9
|
function parseSkillFrontmatter(markdown) {
|
|
10
10
|
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(markdown);
|
|
11
|
-
if (!match) return { body: markdown };
|
|
11
|
+
if (!match) return { metadata: {}, body: markdown };
|
|
12
12
|
const fields = {};
|
|
13
|
+
const metadata = {};
|
|
14
|
+
const unquote = (value) => value.trim().replace(/^(['"])([\s\S]*)\1$/, "$2");
|
|
15
|
+
let inMetadata = false;
|
|
13
16
|
for (const line of match[1].split(/\r?\n/)) {
|
|
14
17
|
const kv = /^([A-Za-z_-]+):\s*(.*)$/.exec(line);
|
|
15
|
-
if (kv)
|
|
18
|
+
if (kv) {
|
|
19
|
+
fields[kv[1]] = unquote(kv[2]);
|
|
20
|
+
inMetadata = kv[1] === "metadata" && kv[2].trim() === "";
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const nested = inMetadata ? /^\s+([A-Za-z_-]+):\s*(.*)$/.exec(line) : null;
|
|
24
|
+
if (nested) metadata[nested[1]] = unquote(nested[2]);
|
|
16
25
|
}
|
|
17
|
-
return { name: fields.name, description: fields.description, body: markdown.slice(match[0].length) };
|
|
26
|
+
return { name: fields.name, description: fields.description, metadata, body: markdown.slice(match[0].length) };
|
|
18
27
|
}
|
|
19
28
|
var normalize = (path) => path.replace(/\\/g, "/").replace(/^\.?\//, "");
|
|
20
29
|
function listSkills(files) {
|
|
@@ -23,8 +32,15 @@ function listSkills(files) {
|
|
|
23
32
|
for (const path of paths) {
|
|
24
33
|
const [dir, ...rest] = path.split("/");
|
|
25
34
|
if (rest.join("/") !== "SKILL.md") continue;
|
|
26
|
-
const { description } = parseSkillFrontmatter(files[path] ?? files[`./${path}`] ?? "");
|
|
27
|
-
|
|
35
|
+
const { description, metadata } = parseSkillFrontmatter(files[path] ?? files[`./${path}`] ?? "");
|
|
36
|
+
const workflow = metadata.kind === "workflow";
|
|
37
|
+
skills.set(dir, {
|
|
38
|
+
name: dir,
|
|
39
|
+
description: description ?? "",
|
|
40
|
+
references: [],
|
|
41
|
+
kind: workflow ? "workflow" : "reference",
|
|
42
|
+
...workflow && metadata.reference ? { reference: metadata.reference } : {}
|
|
43
|
+
});
|
|
28
44
|
}
|
|
29
45
|
for (const path of paths) {
|
|
30
46
|
const [dir, ...rest] = path.split("/");
|
|
@@ -259,11 +275,12 @@ var ToolRegistryView = class {
|
|
|
259
275
|
const style = await discovery.styles.resolve(domain);
|
|
260
276
|
return style.skills.length ? { domain, skills: style.skills.length, layers: [...new Set(style.skills.map((s) => s.layer))] } : void 0;
|
|
261
277
|
};
|
|
278
|
+
const workflowsOf = (set) => set.skill ? skills.filter((s) => s.kind === "workflow" && s.reference === set.skill).map((s) => s.name) : [];
|
|
262
279
|
const tools = [
|
|
263
280
|
{
|
|
264
281
|
name: "list_toolsets",
|
|
265
282
|
title: "List toolsets",
|
|
266
|
-
description: "Lists the groups of editor tools available here (one per open editor or feature): name, title, what it covers, its agent skill, how many tools it has and whether they are in your tool list (`enabled`: all, some or none). Start here, then call search_tools or enable_tools.",
|
|
283
|
+
description: "Lists the groups of editor tools available here (one per open editor or feature): name, title, what it covers, its agent skill, its workflow skills (`workflows`: skills for whole jobs done with its tools, such as a cutout or a photo correction), how many tools it has and whether they are in your tool list (`enabled`: all, some or none). Start here, then call search_tools or enable_tools.",
|
|
267
284
|
annotations: READ_ONLY,
|
|
268
285
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
269
286
|
handler: async () => {
|
|
@@ -275,6 +292,7 @@ var ToolRegistryView = class {
|
|
|
275
292
|
...set.title ? { title: set.title } : {},
|
|
276
293
|
...set.description ? { description: set.description } : {},
|
|
277
294
|
...set.skill ? { skill: set.skill } : {},
|
|
295
|
+
...workflowsOf(set).length ? { workflows: workflowsOf(set) } : {},
|
|
278
296
|
tools: set.tools.length,
|
|
279
297
|
enabled: enabledState(set),
|
|
280
298
|
...styles[i] ? { style: styles[i] } : {}
|
|
@@ -344,7 +362,7 @@ var ToolRegistryView = class {
|
|
|
344
362
|
tools.push({
|
|
345
363
|
name: "get_skill",
|
|
346
364
|
title: "Get skill",
|
|
347
|
-
description: "Reads an agent skill: the guide to a toolset's tools (when to use each, the working method, pitfalls). Read the skill a toolset names in list_toolsets before working with it. Returns markdown; pass `file` for one of its reference files.",
|
|
365
|
+
description: "Reads an agent skill: the guide to a toolset's tools (when to use each, the working method, pitfalls). Read the skill a toolset names in list_toolsets before working with it. When the task is one of the jobs in its `workflows` (or in the skill's own Workflow skills section), read that workflow skill too: it has the steps in order and the checks between them. Returns markdown; pass `file` for one of its reference files.",
|
|
348
366
|
annotations: READ_ONLY,
|
|
349
367
|
inputSchema: {
|
|
350
368
|
type: "object",
|