@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.
Files changed (36) hide show
  1. package/dist/agent/index.cjs +13 -3
  2. package/dist/agent/index.js +12 -2
  3. package/dist/bridge/cli.cjs +3 -3
  4. package/dist/bridge/cli.js +2 -2
  5. package/dist/bridge/index.cjs +3 -3
  6. package/dist/bridge/index.js +2 -2
  7. package/dist/{chunk-I5MRJW7B.js → chunk-67JAEU53.js} +1 -1
  8. package/dist/{chunk-U4QN36YT.cjs → chunk-BDT2IYXK.cjs} +128 -16
  9. package/dist/{chunk-S4EIAIEW.cjs → chunk-OJTZKDLJ.cjs} +7 -7
  10. package/dist/{chunk-XZB3TJ6K.js → chunk-SAN4SBBS.js} +25 -7
  11. package/dist/{chunk-GI3AVES4.js → chunk-SVHXD2VH.js} +117 -5
  12. package/dist/{chunk-AMX23CSN.cjs → chunk-Z7BVK32C.cjs} +25 -7
  13. package/dist/image-editor/index.cjs +12 -11
  14. package/dist/image-editor/index.js +12 -11
  15. package/dist/image-editor/layers/panel.d.cts +6 -2
  16. package/dist/image-editor/layers/panel.d.ts +6 -2
  17. package/dist/tools/index.cjs +13 -3
  18. package/dist/tools/index.d.cts +1 -0
  19. package/dist/tools/index.d.ts +1 -0
  20. package/dist/tools/index.js +12 -2
  21. package/dist/tools/skill-evals.d.cts +107 -0
  22. package/dist/tools/skill-evals.d.ts +107 -0
  23. package/dist/tools/skills.d.cts +12 -1
  24. package/dist/tools/skills.d.ts +12 -1
  25. package/package.json +1 -1
  26. package/skills/README.md +7 -2
  27. package/skills/pixerate-agent-tools/SKILL.md +5 -3
  28. package/skills/pixerate-chart/SKILL.md +8 -0
  29. package/skills/pixerate-chart-annotate/SKILL.md +96 -0
  30. package/skills/pixerate-chart-annotate/evals/highlight-the-point.json +78 -0
  31. package/skills/pixerate-chart-annotate/evals/source-and-units.json +76 -0
  32. package/skills/pixerate-chart-annotate/evals/target-line.json +85 -0
  33. package/skills/pixerate-chart-choose-and-build/SKILL.md +100 -0
  34. package/skills/pixerate-chart-choose-and-build/evals/colour-blind-safe.json +113 -0
  35. package/skills/pixerate-chart-choose-and-build/evals/honest-baseline.json +81 -0
  36. package/skills/pixerate-chart-choose-and-build/evals/trend-over-time.json +175 -0
@@ -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
- var _chunkAMX23CSNcjs = require('../chunk-AMX23CSN.cjs');
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
- 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 = _chunkAMX23CSNcjs.JSON_RPC_ERRORS; exports.MCP_PROTOCOL_VERSIONS = _chunkAMX23CSNcjs.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 = _chunkAMX23CSNcjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkAMX23CSNcjs.TOOL_BRIDGE_PROTOCOL; exports.TOOL_DISCOVERY_TOOLS = _chunkAMX23CSNcjs.TOOL_DISCOVERY_TOOLS; exports.TOOL_NAMESPACE_SEPARATOR = _chunkAMX23CSNcjs.TOOL_NAMESPACE_SEPARATOR; exports.ToolRegistry = _chunkAMX23CSNcjs.ToolRegistry; exports.ToolRegistryError = _chunkAMX23CSNcjs.ToolRegistryError; exports.ToolRegistryView = _chunkAMX23CSNcjs.ToolRegistryView; exports.UNSAFE_JSON_KEYS = _chunk2BSBFBOAcjs.UNSAFE_JSON_KEYS; exports.baseToolName = _chunkAMX23CSNcjs.baseToolName; exports.captureInputSchema = _chunkN2FGYZ4Qcjs.captureInputSchema; exports.captureOutputSize = _chunkN2FGYZ4Qcjs.captureOutputSize; exports.cloneElementWithStyles = _chunkSVFEVKLFcjs.cloneElementWithStyles; exports.connectToolBridge = _chunkAMX23CSNcjs.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 = _chunkAMX23CSNcjs.createMcpServer; exports.createPlaybackToolProvider = _chunk3SLBXKAWcjs.createPlaybackToolProvider; exports.createRichTextToolProvider = createRichTextToolProvider; exports.createSpreadsheetToolProvider = createSpreadsheetToolProvider; exports.createStyleResolver = _chunkU4QN36YTcjs.createStyleResolver; exports.createStyleToolProvider = _chunkU4QN36YTcjs.createStyleToolProvider; exports.createToolRegistry = _chunkAMX23CSNcjs.createToolRegistry; exports.derivePlaybackSteps = _chunk3SLBXKAWcjs.derivePlaybackSteps; exports.elementToSvg = _chunkSVFEVKLFcjs.elementToSvg; exports.errorResult = _chunkAMX23CSNcjs.errorResult; exports.isUnsafeJsonKey = _chunk2BSBFBOAcjs.isUnsafeJsonKey; exports.listSkills = _chunkAMX23CSNcjs.listSkills; exports.locatePlaybackChrome = _chunk3SLBXKAWcjs.locatePlaybackChrome; exports.memoryStyleStore = _chunkU4QN36YTcjs.memoryStyleStore; exports.normalizeSide = normalizeSide; exports.parseSkillFrontmatter = _chunkAMX23CSNcjs.parseSkillFrontmatter; exports.parseStyleDomains = _chunkU4QN36YTcjs.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 = _chunkAMX23CSNcjs.readSkillFile; exports.readingTime = _chunk3SLBXKAWcjs.readingTime; exports.realPresenceClock = _chunkK7ENM55Pcjs.realPresenceClock; exports.renderStyle = _chunkU4QN36YTcjs.renderStyle; exports.resolveCaptureRequest = _chunkN2FGYZ4Qcjs.resolveCaptureRequest; exports.runStyleChecks = _chunkU4QN36YTcjs.runStyleChecks; exports.runToolScript = _chunkU4QN36YTcjs.runToolScript; exports.searchTokens = _chunkAMX23CSNcjs.searchTokens; exports.searchTools = _chunkAMX23CSNcjs.searchTools; exports.stripPrototypeKeys = _chunk2BSBFBOAcjs.stripPrototypeKeys; exports.summarize = _chunkAMX23CSNcjs.summarize; exports.toCapturedImageData = _chunkN2FGYZ4Qcjs.toCapturedImageData; exports.toToolResult = _chunkAMX23CSNcjs.toToolResult; exports.toolCallToAgentCommand = toolCallToAgentCommand; exports.toolResultError = _chunkU4QN36YTcjs.toolResultError; exports.toolResultValue = _chunkU4QN36YTcjs.toolResultValue; exports.toolsetInstructions = _chunkAMX23CSNcjs.toolsetInstructions; exports.toolsetName = _chunkAMX23CSNcjs.toolsetName; exports.trackPresenceDrag = _chunkK7ENM55Pcjs.trackPresenceDrag; exports.tweenPresenceCursor = _chunkK7ENM55Pcjs.tweenPresenceCursor; exports.unionCaptureRects = _chunkN2FGYZ4Qcjs.unionCaptureRects; exports.unionRects = _chunk3SLBXKAWcjs.unionRects; exports.unknownToolMessage = _chunkAMX23CSNcjs.unknownToolMessage; exports.validateAgentCommand = validateAgentCommand; exports.validateJsonSchema = _chunkWOFXZ3XUcjs.validateJsonSchema;
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;
@@ -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-GI3AVES4.js";
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-XZB3TJ6K.js";
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,
@@ -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 _chunkS4EIAIEWcjs = require('../chunk-S4EIAIEW.cjs');
5
- require('../chunk-AMX23CSN.cjs');
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 _chunkS4EIAIEWcjs.createToolBridge.call(void 0, {
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)),
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createToolBridge
4
- } from "../chunk-I5MRJW7B.js";
5
- import "../chunk-XZB3TJ6K.js";
4
+ } from "../chunk-67JAEU53.js";
5
+ import "../chunk-SAN4SBBS.js";
6
6
  import "../chunk-V2ZCJRDM.js";
7
7
  import "../chunk-HF5QZS7Z.js";
8
8
 
@@ -3,11 +3,11 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkS4EIAIEWcjs = require('../chunk-S4EIAIEW.cjs');
6
+ var _chunkOJTZKDLJcjs = require('../chunk-OJTZKDLJ.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunkAMX23CSNcjs = require('../chunk-AMX23CSN.cjs');
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 = _chunkAMX23CSNcjs.TOOL_BRIDGE_DEFAULT_PORT; exports.TOOL_BRIDGE_PROTOCOL = _chunkAMX23CSNcjs.TOOL_BRIDGE_PROTOCOL; exports.createToolBridge = _chunkS4EIAIEWcjs.createToolBridge; exports.defaultSkillsDir = _chunkS4EIAIEWcjs.defaultSkillsDir; exports.isLocalOrigin = _chunkS4EIAIEWcjs.isLocalOrigin; exports.loadSkillFiles = _chunkS4EIAIEWcjs.loadSkillFiles;
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;
@@ -3,11 +3,11 @@ import {
3
3
  defaultSkillsDir,
4
4
  isLocalOrigin,
5
5
  loadSkillFiles
6
- } from "../chunk-I5MRJW7B.js";
6
+ } from "../chunk-67JAEU53.js";
7
7
  import {
8
8
  TOOL_BRIDGE_DEFAULT_PORT,
9
9
  TOOL_BRIDGE_PROTOCOL
10
- } from "../chunk-XZB3TJ6K.js";
10
+ } from "../chunk-SAN4SBBS.js";
11
11
  import "../chunk-V2ZCJRDM.js";
12
12
  import "../chunk-HF5QZS7Z.js";
13
13
  export {
@@ -3,7 +3,7 @@ import {
3
3
  TOOL_BRIDGE_PROTOCOL,
4
4
  ToolRegistry,
5
5
  createMcpServer
6
- } from "./chunk-XZB3TJ6K.js";
6
+ } from "./chunk-SAN4SBBS.js";
7
7
 
8
8
  // src/bridge/index.ts
9
9
  import { createServer } from "http";
@@ -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 _chunkAMX23CSNcjs = require('./chunk-AMX23CSN.cjs');
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', _ => _.text])) return void 0;
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', _2 => _2.text]), () => ( "The tool failed."));
135
+ return _nullishCoalesce(_optionalChain([text, 'optionalAccess', _5 => _5.text]), () => ( "The tool failed."));
29
136
  }
30
- var realWait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
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', _3 => _3.playback, 'optionalAccess', _4 => _4.stop, 'call', _5 => _5()]);
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', _6 => _6.playback, 'optionalAccess', _7 => _7.say, 'call', _8 => _8(step.say, options.actor ? { actor: options.actor } : {})]);
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', _9 => _9[1], 'access', _10 => _10.split, 'call', _11 => _11(/\r?\n/), 'access', _12 => _12.find, 'call', _13 => _13((l) => /^domains:/.test(l))]);
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', _14 => _14.get, 'call', _15 => _15(name), 'optionalAccess', _16 => _16.get, 'call', _17 => _17(file)]),
98
- files: (name) => [..._nullishCoalesce(_optionalChain([files, 'access', _18 => _18.get, 'call', _19 => _19(name), 'optionalAccess', _20 => _20.keys, 'call', _21 => _21()]), () => ( []))].sort(),
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 } = _chunkAMX23CSNcjs.parseSkillFrontmatter.call(void 0, winner.text);
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 resolve(domainId) {
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 resolve(domainId);
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', _22 => _22.store, 'access', _23 => _23.subscribe, 'optionalCall', _24 => _24(listener)])), _optionalChain([options, 'access', _25 => _25.tokens, 'optionalAccess', _26 => _26.subscribe, 'optionalCall', _27 => _27(listener)])];
342
- return () => offs.forEach((off) => _optionalChain([off, 'optionalCall', _28 => _28()]));
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
- 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;
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 _chunkAMX23CSNcjs = require('./chunk-AMX23CSN.cjs');
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, () => ( _chunkAMX23CSNcjs.TOOL_BRIDGE_DEFAULT_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, _chunkAMX23CSNcjs.ToolRegistry)();
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 !== _chunkAMX23CSNcjs.TOOL_BRIDGE_PROTOCOL) {
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${_chunkAMX23CSNcjs.TOOL_BRIDGE_PROTOCOL}; update @pixerate/editor.`);
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: _chunkAMX23CSNcjs.TOOL_BRIDGE_PROTOCOL, id: editor.id }));
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 = _chunkAMX23CSNcjs.createMcpServer.call(void 0, registry, {
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) fields[kv[1]] = kv[2].trim().replace(/^(['"])([\s\S]*)\1$/, "$2");
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
- skills.set(dir, { name: dir, description: description ?? "", references: [] });
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",