{
  "$schema": "./schema.json",
  "name": "Markdown Widgetlets",
  "description": "A collection of visualization and utility components for data presentation and interaction.",
  "version": "1.0.0",
  "publisher": "Microservicios",
  "icon": "https://microservicios.co/favicon.ico",
  "remoteEntry": {
    "url": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
    "scope": "remoteApp"
  },
  "components": [
    {
      "id": "architecture-visualizer-v1",
      "name": "Architecture Visualizer",
      "description": "An interactive architecture diagram and code explorer with node-based visualization, search, zoom controls, and project overview.",
      "goal": "Visualize system architectures, code structures, and project dependencies in an interactive, explorable format.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "projectName": {
            "type": "string",
            "description": "The name of the project being visualized.",
            "default": "My Project"
          },
          "projectDescription": {
            "type": "string",
            "description": "A brief description of the project.",
            "default": ""
          },
          "nodes": {
            "type": "array",
            "description": "Architecture nodes/components to display.",
            "default": [
              {
                "id": "frontend",
                "label": "Frontend App",
                "type": "frontend"
              },
              {
                "id": "api",
                "label": "REST API",
                "type": "api"
              },
              {
                "id": "db",
                "label": "PostgreSQL",
                "type": "database"
              }
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Unique identifier for the node."
                },
                "label": {
                  "type": "string",
                  "description": "Display label for the node."
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "service",
                    "database",
                    "api",
                    "frontend",
                    "external",
                    "queue",
                    "storage",
                    "custom"
                  ],
                  "description": "Type of node for styling."
                },
                "icon": {
                  "type": "string",
                  "description": "Optional icon name (lucide-react icons)."
                },
                "description": {
                  "type": "string",
                  "description": "Optional description for tooltip."
                },
                "group": {
                  "type": "string",
                  "description": "Optional group/category for the node."
                },
                "position": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    }
                  },
                  "description": "Optional fixed position. Auto-layout if not provided."
                }
              },
              "required": [
                "id",
                "label",
                "type"
              ]
            }
          },
          "edges": {
            "type": "array",
            "description": "Connections between nodes.",
            "default": [
              {
                "source": "frontend",
                "target": "api",
                "type": "animated"
              },
              {
                "source": "api",
                "target": "db",
                "type": "default"
              }
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Optional unique identifier for the edge."
                },
                "source": {
                  "type": "string",
                  "description": "Source node ID."
                },
                "target": {
                  "type": "string",
                  "description": "Target node ID."
                },
                "label": {
                  "type": "string",
                  "description": "Optional edge label."
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "default",
                    "animated",
                    "dashed"
                  ],
                  "description": "Edge display style.",
                  "default": "default"
                }
              },
              "required": [
                "source",
                "target"
              ]
            }
          },
          "files": {
            "type": "array",
            "description": "File tree for code explorer.",
            "default": [
              {
                "id": "src",
                "name": "src",
                "path": "/src",
                "type": "directory",
                "children": [
                  {
                    "id": "src-main",
                    "name": "main.tsx",
                    "path": "/src/main.tsx",
                    "type": "file",
                    "language": "typescript"
                  },
                  {
                    "id": "src-app",
                    "name": "App.tsx",
                    "path": "/src/App.tsx",
                    "type": "file",
                    "language": "typescript"
                  },
                  {
                    "id": "src-components",
                    "name": "components",
                    "path": "/src/components",
                    "type": "directory",
                    "children": [
                      {
                        "id": "cmp-architecture",
                        "name": "ArchitectureVisualizer.tsx",
                        "path": "/src/components/ArchitectureVisualizer.tsx",
                        "type": "file",
                        "language": "typescript"
                      },
                      {
                        "id": "cmp-node",
                        "name": "NodeCard.tsx",
                        "path": "/src/components/NodeCard.tsx",
                        "type": "file",
                        "language": "typescript"
                      }
                    ]
                  },
                  {
                    "id": "src-hooks",
                    "name": "hooks",
                    "path": "/src/hooks",
                    "type": "directory",
                    "children": [
                      {
                        "id": "hook-graph",
                        "name": "useGraphLayout.ts",
                        "path": "/src/hooks/useGraphLayout.ts",
                        "type": "file",
                        "language": "typescript"
                      }
                    ]
                  }
                ]
              },
              {
                "id": "public",
                "name": "public",
                "path": "/public",
                "type": "directory",
                "children": [
                  {
                    "id": "public-index",
                    "name": "index.html",
                    "path": "/public/index.html",
                    "type": "file",
                    "language": "html"
                  }
                ]
              },
              {
                "id": "pkg",
                "name": "package.json",
                "path": "/package.json",
                "type": "file",
                "language": "json"
              },
              {
                "id": "vite-config",
                "name": "vite.config.ts",
                "path": "/vite.config.ts",
                "type": "file",
                "language": "typescript"
              },
              {
                "id": "readme",
                "name": "README.md",
                "path": "/README.md",
                "type": "file",
                "language": "markdown"
              }
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "file",
                    "directory"
                  ]
                },
                "language": {
                  "type": "string",
                  "description": "Programming language for files."
                },
                "children": {
                  "type": "array",
                  "description": "Nested items for directories."
                }
              },
              "required": [
                "id",
                "name",
                "type"
              ]
            }
          },
          "languages": {
            "type": "array",
            "description": "Language statistics for the project.",
            "default": [],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "percentage": {
                  "type": "number"
                },
                "color": {
                  "type": "string",
                  "description": "CSS color for the language bar."
                }
              },
              "required": [
                "name",
                "percentage"
              ]
            }
          },
          "collaborators": {
            "type": "array",
            "description": "List of collaborators/contributors.",
            "default": [],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "avatar": {
                  "type": "string",
                  "description": "Avatar image URL."
                }
              },
              "required": [
                "name"
              ]
            }
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark",
              "auto"
            ],
            "description": "Color theme for the visualizer.",
            "default": "dark"
          },
          "showFileTree": {
            "type": "boolean",
            "description": "Whether to show the file explorer panel.",
            "default": true
          },
          "showAboutPanel": {
            "type": "boolean",
            "description": "Whether to show the project info sidebar.",
            "default": true
          }
        },
        "required": [
          "nodes"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "node_clicked",
              "node_hovered",
              "edge_clicked",
              "file_selected",
              "zoom_changed",
              "search_performed",
              "layout_changed"
            ],
            "description": "Event type emitted by the visualizer."
          },
          "data": {
            "type": "object",
            "description": "Event-specific data payload."
          }
        },
        "required": [
          "type"
        ]
      },
      "controlSchema": null,
      "defaultPayload": {
        "projectName": "My Project",
        "projectDescription": "",
        "nodes": [
          {
            "id": "frontend",
            "label": "Frontend App",
            "type": "frontend"
          },
          {
            "id": "api",
            "label": "REST API",
            "type": "api"
          },
          {
            "id": "db",
            "label": "PostgreSQL",
            "type": "database"
          }
        ],
        "edges": [
          {
            "source": "frontend",
            "target": "api",
            "type": "animated"
          },
          {
            "source": "api",
            "target": "db",
            "type": "default"
          }
        ],
        "files": [
          {
            "id": "src",
            "name": "src",
            "path": "/src",
            "type": "directory",
            "children": [
              {
                "id": "src-main",
                "name": "main.tsx",
                "path": "/src/main.tsx",
                "type": "file",
                "language": "typescript"
              },
              {
                "id": "src-app",
                "name": "App.tsx",
                "path": "/src/App.tsx",
                "type": "file",
                "language": "typescript"
              },
              {
                "id": "src-components",
                "name": "components",
                "path": "/src/components",
                "type": "directory",
                "children": [
                  {
                    "id": "cmp-architecture",
                    "name": "ArchitectureVisualizer.tsx",
                    "path": "/src/components/ArchitectureVisualizer.tsx",
                    "type": "file",
                    "language": "typescript"
                  },
                  {
                    "id": "cmp-node",
                    "name": "NodeCard.tsx",
                    "path": "/src/components/NodeCard.tsx",
                    "type": "file",
                    "language": "typescript"
                  }
                ]
              },
              {
                "id": "src-hooks",
                "name": "hooks",
                "path": "/src/hooks",
                "type": "directory",
                "children": [
                  {
                    "id": "hook-graph",
                    "name": "useGraphLayout.ts",
                    "path": "/src/hooks/useGraphLayout.ts",
                    "type": "file",
                    "language": "typescript"
                  }
                ]
              }
            ]
          },
          {
            "id": "public",
            "name": "public",
            "path": "/public",
            "type": "directory",
            "children": [
              {
                "id": "public-index",
                "name": "index.html",
                "path": "/public/index.html",
                "type": "file",
                "language": "html"
              }
            ]
          },
          {
            "id": "pkg",
            "name": "package.json",
            "path": "/package.json",
            "type": "file",
            "language": "json"
          },
          {
            "id": "vite-config",
            "name": "vite.config.ts",
            "path": "/vite.config.ts",
            "type": "file",
            "language": "typescript"
          },
          {
            "id": "readme",
            "name": "README.md",
            "path": "/README.md",
            "type": "file",
            "language": "markdown"
          }
        ],
        "languages": [],
        "collaborators": [],
        "theme": "dark",
        "showFileTree": true,
        "showAboutPanel": true
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Architecture Visualizer",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./ArchitectureVisualizer"
        }
      }
    },
    {
      "id": "bubble-chart-v1",
      "name": "Bubble Chart",
      "description": "Interactive bubble chart visualization for displaying multi-dimensional data with size and color encoding.",
      "goal": "Visualize hierarchical or categorical data using bubbles sized by value with interactive hover and click behaviors.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "description": "Array of data points for the bubble chart.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Label for the bubble."
                },
                "value": {
                  "type": "number",
                  "description": "Size value for the bubble."
                },
                "category": {
                  "type": "string",
                  "description": "Optional category for color grouping."
                }
              },
              "required": [
                "name",
                "value"
              ]
            },
            "default": [
              {
                "name": "Item A",
                "value": 100,
                "category": "Group 1"
              },
              {
                "name": "Item B",
                "value": 80,
                "category": "Group 1"
              },
              {
                "name": "Item C",
                "value": 60,
                "category": "Group 2"
              }
            ]
          },
          "colorScheme": {
            "type": "string",
            "enum": [
              "default",
              "warm",
              "cool",
              "rainbow",
              "monochrome"
            ],
            "description": "Color scheme for the bubbles.",
            "default": "default"
          },
          "showLabels": {
            "type": "boolean",
            "description": "Whether to show labels inside bubbles.",
            "default": true
          },
          "animated": {
            "type": "boolean",
            "description": "Enable entrance and hover animations.",
            "default": true
          }
        },
        "required": [
          "data"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "bubble_clicked",
              "bubble_hovered",
              "chart_rendered"
            ],
            "description": "Event type."
          },
          "item": {
            "type": "object",
            "description": "The bubble data that was interacted with."
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "data": [
          {
            "name": "Item A",
            "value": 100,
            "category": "Group 1"
          },
          {
            "name": "Item B",
            "value": 80,
            "category": "Group 1"
          },
          {
            "name": "Item C",
            "value": 60,
            "category": "Group 2"
          }
        ],
        "colorScheme": "default",
        "showLabels": true,
        "animated": true
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Bubble Chart",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./BubbleChart"
        }
      }
    },
    {
      "id": "chess-v1",
      "name": "Chess",
      "description": "A fully interactive chess board that plays against a built-in minimax AI (alpha-beta pruning, configurable depth 1–5, default 3). The player controls their colour via click. The agent can inspect board state, issue moves in coordinate notation, start new games, and undo moves.",
      "goal": "Provide a playable, agent-controllable chess experience inside the chat interface. The agent can teach openings, demonstrate tactics, suggest moves, replay positions, and analyse games.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "description": "Widget window title",
            "default": "Ajedrez"
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "default": "dark",
            "description": "Board colour theme"
          },
          "humanColor": {
            "type": "string",
            "enum": [
              "w",
              "b"
            ],
            "default": "w",
            "description": "Which colour the human player controls (w = White, b = Black)"
          },
          "aiDepth": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 3,
            "description": "Minimax search depth (1 = easy, 3 = balanced, 5 = strong but slower ~2 s/move)"
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "description": "Events emitted by the widget via onOutput.",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "move",
              "game_over",
              "state",
              "error"
            ],
            "description": "Event type"
          },
          "san": {
            "type": "string",
            "description": "Standard Algebraic Notation of the move (move events)"
          },
          "fen": {
            "type": "string",
            "description": "FEN string of the resulting position"
          },
          "by": {
            "type": "string",
            "enum": [
              "human",
              "ai"
            ],
            "description": "Who made the move (move events)"
          },
          "result": {
            "type": "string",
            "enum": [
              "white_wins",
              "black_wins",
              "draw"
            ],
            "description": "Game result (game_over events)"
          },
          "turn": {
            "type": "string",
            "enum": [
              "w",
              "b"
            ],
            "description": "Whose turn it is after the event"
          },
          "in_check": {
            "type": "boolean",
            "description": "Whether the side to move is in check (state events)"
          },
          "game_over": {
            "type": "boolean",
            "description": "Whether the game is over (state events)"
          },
          "pgn": {
            "type": "string",
            "description": "Full PGN of the game so far (state events)"
          },
          "move_history": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of SAN moves played so far (state events)"
          },
          "capturedByWhite": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Piece types captured by White (state events)"
          },
          "capturedByBlack": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Piece types captured by Black (state events)"
          },
          "pieces": {
            "type": "array",
            "description": "All pieces on the board: [{type,color,square}]. type: p=pawn,n=knight,b=bishop,r=rook,q=queen,k=king. color: w/b."
          },
          "legal_moves": {
            "type": "array",
            "description": "All legal moves for the side to move: [{from,to,san,piece,flags}]. Use this to translate natural language to exact squares."
          },
          "message": {
            "type": "string",
            "description": "Error description (error events)"
          }
        }
      },
      "controlSchema": {
        "type": "string",
        "description": "Command string to control the chess widget. Moves use coordinate notation (source square + destination square).",
        "commands": [
          {
            "command": "move <from><to>[promo]",
            "description": "Make a move in coordinate notation. Accepted formats: \"move e2e4\" (joined) or \"move e2 e4\" (spaced). Promotion: append the piece letter, e.g. \"move d7d8q\" (queen). The move must be legal for the current turn — the widget will emit an error event if it is not.",
            "examples": [
              "move e2e4",
              "move d2 d4",
              "move d7d8q"
            ]
          },
          {
            "command": "new_game",
            "description": "Reset the board to the starting position and clear move history.",
            "example": "new_game"
          },
          {
            "command": "undo",
            "description": "Undo the last two half-moves (human move + AI response). If fewer than two half-moves exist, only the available ones are undone.",
            "example": "undo"
          },
          {
            "command": "get_state",
            "description": "Emits a \"state\" output event with: FEN, PGN, whose turn (w/b), in_check, game_over, and the full move_history array in SAN notation.",
            "example": "get_state"
          }
        ]
      },
      "defaultPayload": {
        "title": "Ajedrez",
        "theme": "dark",
        "humanColor": "w",
        "aiDepth": 3
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Chess",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./Chess"
        }
      }
    },
    {
      "id": "triada-color-v1",
      "name": "Color Harmony Picker",
      "description": "An interactive color wheel with gradient picker, harmony modes, and palette generation. Features draggable color points and real-time palette updates.",
      "goal": "Help users select harmonious color palettes using color theory principles like analogous, complementary, and triadic relationships.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "baseColor": {
            "type": "string",
            "format": "hex-color",
            "description": "Initial base color in hex format to set the picker position.",
            "default": "#0B82DB"
          },
          "harmony": {
            "type": "string",
            "enum": [
              "analogous",
              "complementary",
              "triadic",
              "split-complementary",
              "tetradic",
              "monochromatic"
            ],
            "description": "Color harmony type to generate the palette.",
            "default": "analogous"
          }
        },
        "required": []
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "palette_generated",
              "color_copied"
            ],
            "description": "Event type - either palette update or color copy action."
          },
          "harmony": {
            "type": "string",
            "description": "The harmony type used for palette generation."
          },
          "colors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Array of hex color codes in the generated palette."
          },
          "baseColor": {
            "type": "string",
            "description": "The primary/base color of the palette."
          },
          "color": {
            "type": "string",
            "description": "The hex color that was copied (only for color_copied events)."
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "baseColor": "#0B82DB",
        "harmony": "analogous"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Color Harmony Picker",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./TriadaColorComponent"
        }
      }
    },
    {
      "id": "design-studio-v1",
      "name": "DesignStudio",
      "description": "A modern, professional Canva-like creative platform designed for non-designers. Enables users and AI agents to create marketing graphics, SaaS announcements, social media posts, pitch decks, quote cards, and presentation slides turn by turn with harmonized palettes, starter templates, touch controls, and high-res export.",
      "goal": "Empower non-designers and AI agents to rapidly produce polished, publication-ready graphic designs directly within conversational workflows with instant visual feedback and live state inspection.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "aspectRatio": {
            "type": "string",
            "enum": [
              "1:1",
              "16:9",
              "9:16",
              "4:3",
              "3:4"
            ],
            "default": "1:1",
            "description": "Artboard aspect ratio (1:1 square post, 16:9 presentation slide, 9:16 vertical story, 4:3 pitch deck, 3:4 portrait flyer)."
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "default": "dark",
            "description": "Studio interface theme."
          },
          "palette": {
            "type": "string",
            "enum": [
              "saas",
              "minimal",
              "sunset",
              "luxury",
              "ocean",
              "creative"
            ],
            "default": "saas",
            "description": "Harmonized color palette."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "state_update"
            ],
            "description": "Always \"state_update\"."
          },
          "data": {
            "type": "object",
            "description": "Current studio state: slideCount, currentSlide, aspectRatio, theme, palette, background, itemsCount, and items."
          }
        },
        "required": [
          "type",
          "data"
        ]
      },
      "controlSchema": {
        "type": "string",
        "description": "Commands for creating and manipulating professional design slides, templates, text, cards, and styling.\n- Available starter templates: saas_launch, flash_sale, quote_minimal, metric_growth, hiring_card.\n- Available palettes: saas, minimal, sunset, luxury, ocean, creative.\n- Available backgrounds: solid, mesh, dots, spotlight, cards.\n- Available text types: heading, body, text.\n- Batch commands can be combined with semicolons \";\" or newlines \"\\n\".",
        "commands": [
          {
            "command": "add_template <templateId>",
            "description": "Applies a complete professional designer template in 1 turn (saas_launch, flash_sale, quote_minimal, metric_growth, hiring_card). Example: \"add_template saas_launch\""
          },
          {
            "command": "add_text <heading|body|text> <content> [x] [y] [fontSize] [color]",
            "description": "Adds a typography block with optional coordinates and styling. Example: \"add_text heading \"Nueva Colección\" 400 250 44 #ffffff\""
          },
          {
            "command": "add_badge <label> [x] [y] [color]",
            "description": "Adds a pill badge tag. Example: \"add_badge \"OFERTA -50%\" 400 160 #f43f5e\""
          },
          {
            "command": "add_card <text> [x] [y] [w] [h] [color]",
            "description": "Adds a modern card container. Example: \"add_card \"Plan Pro\" 400 300 320 200 #1e293b\""
          },
          {
            "command": "set_palette <paletteId>",
            "description": "Harmonizes all slide colors to a curated palette (saas, minimal, sunset, luxury, ocean, creative). Example: \"set_palette luxury\""
          },
          {
            "command": "set_bg <bgType>",
            "description": "Changes background style (solid, mesh, dots, spotlight, cards). Example: \"set_bg mesh\""
          },
          {
            "command": "set_aspect <1:1|16:9|9:16|4:3|3:4>",
            "description": "Changes artboard canvas aspect ratio. Example: \"set_aspect 16:9\""
          },
          {
            "command": "set_theme <light|dark>",
            "description": "Switches UI chrome between light and dark mode. Example: \"set_theme light\""
          },
          {
            "command": "new_slide",
            "description": "Creates a new slide and switches to it."
          },
          {
            "command": "delete_slide",
            "description": "Deletes the current slide."
          },
          {
            "command": "goto_slide <number>",
            "description": "Navigates to the specified 1-indexed slide. Example: \"goto_slide 2\""
          },
          {
            "command": "next_slide",
            "description": "Navigates to the next slide."
          },
          {
            "command": "prev_slide",
            "description": "Navigates to the previous slide."
          },
          {
            "command": "clear",
            "description": "Clears all items from the current slide."
          },
          {
            "command": "undo",
            "description": "Reverts the last modification."
          },
          {
            "command": "export_png",
            "description": "Renders and downloads the current slide as a high-resolution 2x PNG."
          },
          {
            "command": "get_state",
            "description": "Returns live state snapshot of the active slide and studio elements."
          }
        ]
      },
      "defaultPayload": {
        "aspectRatio": "1:1",
        "theme": "dark",
        "palette": "saas"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "DesignStudio",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./DesignStudio"
        }
      }
    },
    {
      "id": "diagram-sketch-v1",
      "name": "Diagram Sketch",
      "description": "An Excalidraw-style interactive sketch board rendered live in the chat with full mobile support. Supports rectangles, squares, circles, diamonds, sticky notes, databases, clouds, lines, arrows, freehand drawings, and connected shapes. The agent and user can interactively create, move, resize, relabel, restyle, connect, zoom, pan, and delete shapes turn by turn.",
      "goal": "Help software architects, developers, and users sketch system designs, flowcharts, cloud architectures, and idea boards directly in the conversation with fluid touch and mouse controls, maximizing screen space without leaving the chat.",
      "version": "1.2.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "width": {
            "type": "integer",
            "description": "Initial canvas width in pixels.",
            "default": 1000
          },
          "height": {
            "type": "integer",
            "description": "Initial canvas height in pixels.",
            "default": 600
          },
          "grid": {
            "type": "boolean",
            "description": "Whether to show the background dot grid.",
            "default": true
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "state_update"
            ],
            "description": "Always \"state_update\" — snapshot of current board state."
          },
          "data": {
            "type": "object",
            "description": "The CURRENT board snapshot: shapes, connections, viewport settings, and selection."
          }
        },
        "required": [
          "type",
          "data"
        ]
      },
      "controlSchema": {
        "type": "string",
        "commands": [
          {
            "command": "rect <id> <x> <y> <w> <h> <text>",
            "description": "Adds a rectangle. <x>/<y> is top-left corner, <w>/<h> size, <text> optional label."
          },
          {
            "command": "square <id> <x> <y> <size> <text>",
            "description": "Adds a square (equal sides) with size <size> and optional label."
          },
          {
            "command": "circle <id> <x> <y> <r> <text>",
            "description": "Adds a circle centered at <x>,<y> with radius <r> and optional label."
          },
          {
            "command": "diamond <id> <x> <y> <w> <h> <text>",
            "description": "Adds a flowchart decision rhombus/diamond centered at <x>,<y> with width <w>, height <h>, and optional label."
          },
          {
            "command": "note <id> <x> <y> <w> <h> <text>",
            "description": "Adds a sticky note / note card at <x>,<y> with width <w>, height <h>, and label."
          },
          {
            "command": "database <id> <x> <y> <w> <h> <text>",
            "description": "Adds a database cylinder node at <x>,<y> with width <w>, height <h>, and label."
          },
          {
            "command": "cloud <id> <x> <y> <w> <h> <text>",
            "description": "Adds a cloud infrastructure node at <x>,<y> with width <w>, height <h>, and label."
          },
          {
            "command": "line <id> <x1> <y1> <x2> <y2>",
            "description": "Adds a plain straight divider line between two points."
          },
          {
            "command": "arrow <id> <x1> <y1> <x2> <y2> <text>",
            "description": "Adds a free-floating arrow between two fixed points with an optional label."
          },
          {
            "command": "text <id> <x> <y> <text>",
            "description": "Adds a standalone text label at <x>,<y>."
          },
          {
            "command": "draw <id> <x1,y1 x2,y2 ...>",
            "description": "Adds a freehand sketch path with space-separated x,y coordinate pairs."
          },
          {
            "command": "pen <id> <x1,y1 x2,y2 ...>",
            "description": "Alias for draw: adds a freehand path."
          },
          {
            "command": "connect <fromId> <toId> <text>",
            "description": "Draws an auto-anchoring connector arrow between two existing shapes. The connection follows automatically if either shape moves."
          },
          {
            "command": "move <id> <x> <y>",
            "description": "Moves a shape to new coordinates."
          },
          {
            "command": "resize <id> <w> <h>",
            "description": "Resizes an existing shape."
          },
          {
            "command": "edit <id> <text>",
            "description": "Updates label text of an existing shape or connection."
          },
          {
            "command": "color <id> <color>",
            "description": "Sets fill color of a shape (or text color of a connection/text)."
          },
          {
            "command": "stroke <id> <color>",
            "description": "Sets border/stroke color of a shape or line."
          },
          {
            "command": "strokewidth <id> <width>",
            "description": "Sets stroke border width (e.g. 1, 2, 4)."
          },
          {
            "command": "strokestyle <id> <solid|dashed|dotted>",
            "description": "Sets stroke style pattern."
          },
          {
            "command": "duplicate <id>",
            "description": "Clones an existing shape offset slightly."
          },
          {
            "command": "bring_front <id>",
            "description": "Brings shape to the topmost layer."
          },
          {
            "command": "send_back <id>",
            "description": "Sends shape to the bottommost layer."
          },
          {
            "command": "select <id>",
            "description": "Selects a shape on the board (or unselects if \"select none\")."
          },
          {
            "command": "delete <id>",
            "description": "Removes a shape or connection by id."
          },
          {
            "command": "clear",
            "description": "Clears all shapes and connections from the board."
          },
          {
            "command": "zoom <level>",
            "description": "Sets zoom magnification (e.g. \"zoom 1.5\" or \"zoom 100\")."
          },
          {
            "command": "pan <x> <y>",
            "description": "Pans the canvas viewport to offset <x>,<y>."
          },
          {
            "command": "reset_view",
            "description": "Resets canvas pan and zoom back to default centered view."
          },
          {
            "command": "grid <true|false>",
            "description": "Toggles canvas background dot grid visibility."
          },
          {
            "command": "undo",
            "description": "Undoes the last board modification."
          },
          {
            "command": "redo",
            "description": "Redoes the previously undone modification."
          },
          {
            "command": "export <png|svg>",
            "description": "Triggers client-side export and download of the diagram as PNG or SVG."
          }
        ]
      },
      "defaultPayload": {
        "width": 1000,
        "height": 600,
        "grid": true
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Diagram Sketch",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./DiagramSketch"
        }
      }
    },
    {
      "id": "forge-preview-v1",
      "name": "Forge Preview",
      "description": "A collaborative code editor and previewer for React projects with file management.",
      "goal": "Provide a workspace for editing and previewing React applications with support for multiple files.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "path": {
                      "type": "string"
                    },
                    "content": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "file",
                        "directory"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "path",
                    "content",
                    "type"
                  ]
                }
              }
            },
            "required": [
              "id",
              "files"
            ],
            "default": {
              "id": "default-project",
              "name": "Hello Forge",
              "description": "A starter React project",
              "files": [
                {
                  "id": "index-html",
                  "name": "index.html",
                  "path": "index.html",
                  "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <script src=\"https://cdn.tailwindcss.com\"></script>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n  </body>\n</html>",
                  "type": "file"
                },
                {
                  "id": "app-tsx",
                  "name": "App.tsx",
                  "path": "src/App.tsx",
                  "content": "import React from 'react';\n\nexport default function App() {\n  return (\n    <div className=\"min-h-screen bg-slate-900 flex items-center justify-center p-4 text-white\">\n      <div className=\"max-w-md w-full bg-slate-800 p-8 rounded-2xl shadow-2xl border border-slate-700 text-center\">\n        <h1 className=\"text-4xl font-black bg-gradient-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent mb-4\">\n          Forge Preview\n        </h1>\n        <p className=\"text-slate-400 mb-6\">\n          Your professional code workspace is ready. Start editing files in the sidebar to see changes in real-time.\n        </p>\n        <div className=\"inline-flex px-4 py-2 bg-blue-600 hover:bg-blue-500 rounded-lg font-medium transition-colors cursor-pointer\">\n          Get Started\n        </div>\n      </div>\n    </div>\n  );\n}",
                  "type": "file"
                },
                {
                  "id": "theme-css",
                  "name": "index.css",
                  "path": "src/index.css",
                  "content": "body { margin: 0; font-family: 'Inter', sans-serif; }",
                  "type": "file"
                }
              ]
            }
          },
          "activeFileId": {
            "type": "string",
            "description": "The ID of the file to open initially.",
            "default": "app-tsx"
          }
        },
        "required": [
          "project"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "file_saved",
              "project_updated",
              "error"
            ],
            "description": "Event type emitted by the previewer."
          },
          "data": {
            "type": "object",
            "description": "Event-specific data payload."
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "project": {
          "id": "default-project",
          "name": "Hello Forge",
          "description": "A starter React project",
          "files": [
            {
              "id": "index-html",
              "name": "index.html",
              "path": "index.html",
              "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <script src=\"https://cdn.tailwindcss.com\"></script>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n  </body>\n</html>",
              "type": "file"
            },
            {
              "id": "app-tsx",
              "name": "App.tsx",
              "path": "src/App.tsx",
              "content": "import React from 'react';\n\nexport default function App() {\n  return (\n    <div className=\"min-h-screen bg-slate-900 flex items-center justify-center p-4 text-white\">\n      <div className=\"max-w-md w-full bg-slate-800 p-8 rounded-2xl shadow-2xl border border-slate-700 text-center\">\n        <h1 className=\"text-4xl font-black bg-gradient-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent mb-4\">\n          Forge Preview\n        </h1>\n        <p className=\"text-slate-400 mb-6\">\n          Your professional code workspace is ready. Start editing files in the sidebar to see changes in real-time.\n        </p>\n        <div className=\"inline-flex px-4 py-2 bg-blue-600 hover:bg-blue-500 rounded-lg font-medium transition-colors cursor-pointer\">\n          Get Started\n        </div>\n      </div>\n    </div>\n  );\n}",
              "type": "file"
            },
            {
              "id": "theme-css",
              "name": "index.css",
              "path": "src/index.css",
              "content": "body { margin: 0; font-family: 'Inter', sans-serif; }",
              "type": "file"
            }
          ]
        },
        "activeFileId": "app-tsx"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Forge Preview",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./ForgePreview"
        }
      }
    },
    {
      "id": "markdown-viewer-v1",
      "name": "Markdown Viewer",
      "description": "A feature-rich Markdown renderer with support for GFM, syntax highlighting, Mermaid diagrams, and PDF export.",
      "goal": "Render and display Markdown content with enhanced features like code highlighting and diagram support.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "The Markdown content to render.",
            "default": "# Hello World\n\nThis is **Markdown** content."
          },
          "showPdfExport": {
            "type": "boolean",
            "description": "Whether to show the PDF export button.",
            "default": true
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark",
              "auto"
            ],
            "description": "Color theme for the viewer.",
            "default": "auto"
          }
        },
        "required": [
          "content"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "content_rendered",
              "pdf_exported",
              "link_clicked"
            ],
            "description": "Event type emitted by the viewer."
          },
          "data": {
            "type": "object",
            "description": "Event-specific data payload."
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "content": "# Hello World\n\nThis is **Markdown** content.",
        "showPdfExport": true,
        "theme": "auto"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Markdown Viewer",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./MarkdownViewer"
        }
      }
    },
    {
      "id": "pdf-form-v1",
      "name": "PdfForm",
      "description": "An interactive PDF Form Filler and Template Designer widget. Detects native AcroForm fields, supports custom manual field placement (text, multiline, checkbox, date, signature, dropdown, radio), and provides bidirectional control for LLM agents to inspect fields, set values turn-by-turn, manage templates, and export filled documents.",
      "goal": "Empower users and AI agents to fill, inspect, design, and export interactive PDF forms directly in the conversation interface.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "description": "Document or template title",
            "default": "Plantilla sin título"
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "UI Theme (default light)",
            "default": "light"
          },
          "pdfUrl": {
            "type": "string",
            "description": "Optional URL to preload a PDF file into the editor"
          },
          "fields": {
            "type": "object",
            "description": "Initial key-value mapping of field values, e.g. { \"nombre\": \"Ana Pérez\", \"aprobado\": true }"
          }
        }
      },
      "outputSchema": null,
      "controlSchema": {
        "type": "string",
        "description": "Control command for live PDF form manipulation and inspection",
        "commands": [
          {
            "command": "get_state",
            "description": "Returns current PDF editor state including document title, page count, active page, zoom, completion stats, and all fields with their current values and coordinates."
          },
          {
            "command": "set_field <id_or_name> <value>",
            "description": "Sets the value of a single field identified by its ID or name. For checkboxes, value can be \"true\" or \"false\"."
          },
          {
            "command": "set_fields <json_object>",
            "description": "Sets multiple field values in bulk using a JSON mapping, e.g. set_fields {\"nombre\":\"Carlos\",\"email\":\"carlos@ejemplo.com\",\"acepto\":true}."
          },
          {
            "command": "select_field <id_or_name>",
            "description": "Highlights and focuses a specific field in the viewer."
          },
          {
            "command": "delete_field <id_or_name>",
            "description": "Deletes a field from the document."
          },
          {
            "command": "clear_values",
            "description": "Clears all field values without removing the field definitions."
          },
          {
            "command": "goto_page <page_number>",
            "description": "Navigates to a 1-based page number."
          },
          {
            "command": "next_page",
            "description": "Moves to the next page in the document."
          },
          {
            "command": "prev_page",
            "description": "Moves to the previous page in the document."
          },
          {
            "command": "zoom <percent>",
            "description": "Sets document zoom level (e.g. zoom 100, zoom 125, zoom 75)."
          },
          {
            "command": "undo",
            "description": "Reverts the last modification to fields or values."
          },
          {
            "command": "redo",
            "description": "Reapplies the last undone modification."
          },
          {
            "command": "export_pdf",
            "description": "Generates and downloads the filled PDF document."
          },
          {
            "command": "export_csv",
            "description": "Exports the list of fields and values as a CSV file."
          },
          {
            "command": "new_blank [title]",
            "description": "Creates a new blank single-page A4 document to start designing a template."
          },
          {
            "command": "redetect",
            "description": "Re-analyzes the underlying PDF to detect native AcroForm fields."
          }
        ]
      },
      "defaultPayload": {
        "title": "Plantilla sin título",
        "theme": "light",
        "pdfUrl": "",
        "fields": {}
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "PdfForm",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./PdfForm"
        }
      }
    },
    {
      "id": "sentence-constructor-v1",
      "name": "Sentence Constructor",
      "description": "An interactive language learning exercise widget that allows users to construct sentences by arranging word blocks.",
      "goal": "Help language learners practice sentence structure by providing an engaging drag-and-drop word ordering exercise with immediate feedback.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sourceLanguage": {
            "type": "string",
            "enum": [
              "English",
              "Spanish",
              "French"
            ],
            "description": "The language of the prompt sentence to translate from.",
            "default": "English"
          },
          "targetLanguage": {
            "type": "string",
            "enum": [
              "English",
              "Spanish",
              "French"
            ],
            "description": "The language the user should translate the sentence into.",
            "default": "Spanish"
          },
          "prompt": {
            "type": "string",
            "description": "The sentence to translate, displayed to the user.",
            "default": "The cat is on the table"
          },
          "audioUrl": {
            "type": "string",
            "format": "uri",
            "description": "URL to audio file for pronunciation of the prompt.",
            "default": ""
          },
          "wordBank": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Array of words (including distractors) that the user can select from.",
            "default": [
              "El",
              "gato",
              "está",
              "en",
              "la",
              "mesa",
              "perro",
              "silla"
            ]
          },
          "correctAnswer": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The correct ordering of words that forms the valid translation.",
            "default": [
              "El",
              "gato",
              "está",
              "en",
              "la",
              "mesa"
            ]
          },
          "weakWord": {
            "type": "string",
            "description": "A word to highlight as the 'weak word' the user should focus on learning.",
            "default": "mesa"
          }
        },
        "required": [
          "prompt",
          "wordBank",
          "correctAnswer",
          "weakWord"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "exercise_completed"
            ],
            "description": "Event type indicating the exercise was completed."
          },
          "meta": {
            "type": "object",
            "properties": {
              "timeTakenSeconds": {
                "type": "string",
                "description": "Time taken to complete the exercise in seconds."
              },
              "success": {
                "type": "boolean",
                "description": "Whether the user's answer was correct."
              },
              "mistakesMade": {
                "type": "integer",
                "description": "Number of incorrect attempts made."
              }
            }
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "sourceLanguage": "English",
        "targetLanguage": "Spanish",
        "prompt": "The cat is on the table",
        "audioUrl": "",
        "wordBank": [
          "El",
          "gato",
          "está",
          "en",
          "la",
          "mesa",
          "perro",
          "silla"
        ],
        "correctAnswer": [
          "El",
          "gato",
          "está",
          "en",
          "la",
          "mesa"
        ],
        "weakWord": "mesa"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Sentence Constructor",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./SentenceConstructor"
        }
      }
    },
    {
      "id": "sheet-grid-v1",
      "name": "SheetGrid",
      "description": "A lightweight Excel-style spreadsheet editor with dynamic formula evaluation (SUM, AVG, MIN, MAX, COUNT, IF, ROUND, arithmetic), rich cell formatting, row/column insertion & deletion, range selection, and embedded reactive SVG charting (bar, line, pie). The agent can inspect state, manipulate cells, rows, columns, styles, formulas, and generate linked charts turn-by-turn.",
      "goal": "Help users organize tabular data, perform automated calculations, format sheets, manage rows/columns, and visualize trends through charts directly in the chat interface.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "description": "Sheet title",
            "default": "Hoja de Cálculo"
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "UI Theme (default light)",
            "default": "light"
          },
          "cols": {
            "type": "integer",
            "description": "Number of columns to initialize (default 10).",
            "default": 10
          },
          "rows": {
            "type": "integer",
            "description": "Number of rows to initialize (default 25).",
            "default": 25
          },
          "data": {
            "type": "object",
            "description": "Initial cell mapping, e.g. { \"A1\": \"Ventas\", \"B1\": 1500, \"B2\": \"=B1*1.1\" }"
          },
          "chart": {
            "type": "object",
            "description": "Initial chart configuration, e.g. { type: \"bar\", range: \"A1:B5\", title: \"Resumen\" }"
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "state_update",
              "cell_change",
              "chart_update"
            ],
            "description": "Event type emitted by the spreadsheet."
          },
          "data": {
            "type": "object",
            "description": "Current snapshot of cells, computed values, active range, styles, and chart."
          }
        },
        "required": [
          "type",
          "data"
        ]
      },
      "controlSchema": {
        "type": "string",
        "description": "Control command for live spreadsheet and chart manipulation",
        "commands": [
          {
            "command": "get_state",
            "description": "Returns current sheet state including title, grid dimensions, non-empty cells with raw & calculated values, active selection, cell formats, active sheet, and chart configuration."
          },
          {
            "command": "undo",
            "description": "Reverts the last change made to cells, formats, or sheet dimensions."
          },
          {
            "command": "redo",
            "description": "Reapplies the last reverted change."
          },
          {
            "command": "zoom <percent>",
            "description": "Changes display zoom level in percent (e.g. zoom 100, zoom 125, zoom 75)."
          },
          {
            "command": "export_csv",
            "description": "Exports the current sheet as CSV and emits export_csv event with content."
          },
          {
            "command": "export_json",
            "description": "Exports the spreadsheet state as JSON and emits export_json event with content."
          },
          {
            "command": "select <cell_or_range>",
            "description": "Selects a cell or range in the UI (e.g. select B4 or select A1:D6)."
          },
          {
            "command": "set <cell> <value>",
            "description": "Sets a single cell value or formula. <cell> is column letter + row number (e.g. A1, B4). <value> can be text, number, or formula starting with = (e.g. =SUM(B2:B5), =AVERAGE(C1:C10), =IF(D2>0, \"Ganancia\", \"Pérdida\"), =ROUND(B2*1.19, 2), =A1*1.15)."
          },
          {
            "command": "set_range <start:end> <json_2d_array>",
            "description": "Populates a rectangle of cells in bulk with a 2D JSON array. Example: set_range A1:B3 [[\"Mes\",\"Ventas\"],[\"Ene\",100],[\"Feb\",150]]."
          },
          {
            "command": "sort <range_or_col> [asc|desc]",
            "description": "Sorts rows by column values. Examples: sort B2:D10 B desc (sorts range by column B descending), or sort B desc (sorts entire grid by column B)."
          },
          {
            "command": "filter <range> <col> <operator> <value>",
            "description": "Filters table rows based on comparison criteria. Operator can be =, !=, >, >=, <, <=, or contains. Example: filter A1:D10 B > 15000."
          },
          {
            "command": "filter_clear",
            "description": "Clears any active row filters restoring full table visibility."
          },
          {
            "command": "copy <from_range> <to_cell>",
            "description": "Copies cell or range data to destination top-left cell (e.g. copy A1:B5 D1)."
          },
          {
            "command": "autofill <from_range> <to_range>",
            "description": "Replicates formulas or values downwards or across a target range (like dragging the Google Sheets blue fill handle). Example: autofill D2 D3:D10."
          },
          {
            "command": "find_replace <search> <replace> [range]",
            "description": "Finds and replaces matching values across the whole sheet or specific range. Example: find_replace \"Antiguo\" \"Nuevo\" A1:D20."
          },
          {
            "command": "clear_cell <cell>",
            "description": "Clears the content and formatting of a specific cell (e.g. clear_cell B4)."
          },
          {
            "command": "clear_range <range>",
            "description": "Clears all cells in a range without shifting (e.g. clear_range B2:D10)."
          },
          {
            "command": "insert_row <row_number>",
            "description": "Inserts a new blank row at row_number (1-indexed), shifting following rows downward and updating formulas (e.g. insert_row 3)."
          },
          {
            "command": "insert_row_above <row_number>",
            "description": "Inserts a new blank row above row_number (e.g. insert_row_above 3)."
          },
          {
            "command": "insert_row_below <row_number>",
            "description": "Inserts a new blank row below row_number (e.g. insert_row_below 3)."
          },
          {
            "command": "delete_row <row_number>",
            "description": "Deletes row_number (1-indexed), removing its cells and shifting following rows upward (e.g. delete_row 3)."
          },
          {
            "command": "clear_row <row_number>",
            "description": "Clears all contents in row_number without shifting rows (e.g. clear_row 5)."
          },
          {
            "command": "insert_col <col_letter>",
            "description": "Inserts a new blank column at col_letter, shifting following columns to the right and updating formulas (e.g. insert_col C)."
          },
          {
            "command": "insert_col_left <col_letter>",
            "description": "Inserts a new blank column to the left of col_letter (e.g. insert_col_left C)."
          },
          {
            "command": "insert_col_right <col_letter>",
            "description": "Inserts a new blank column to the right of col_letter (e.g. insert_col_right C)."
          },
          {
            "command": "delete_col <col_letter>",
            "description": "Deletes col_letter, removing its cells and shifting following columns to the left (e.g. delete_col C)."
          },
          {
            "command": "clear_col <col_letter>",
            "description": "Clears all contents in col_letter without shifting columns (e.g. clear_col B)."
          },
          {
            "command": "freeze_rows <count>",
            "description": "Freezes the top N rows so they stay pinned during vertical scrolling (e.g. freeze_rows 1)."
          },
          {
            "command": "freeze_cols <count>",
            "description": "Freezes the left N columns so they stay pinned during horizontal scrolling (e.g. freeze_cols 1)."
          },
          {
            "command": "font_family <cell_or_range> <font>",
            "description": "Sets the font family for cells (e.g. font_family A1:D1 \"Inter\" or font_family A1:B8 \"Roboto\")."
          },
          {
            "command": "font_size <cell_or_range> <size>",
            "description": "Sets font size in pixels (e.g. font_size A1:D1 14)."
          },
          {
            "command": "format <cell_or_range> <style_or_type>",
            "description": "Applies formatting to a cell or range. Options: bold, italic, underline, strikethrough, align_left, align_center, align_right, color <hex>, bg <hex>, type currency, type percent, type number, type text (e.g. format A1:D1 bold, format A1:D1 bg #e8f0fe, format B2:B10 type currency, format C2:C10 type percent)."
          },
          {
            "command": "align <cell_or_range> <left|center|right>",
            "description": "Sets horizontal alignment for a cell or range (e.g. align A1:D1 center)."
          },
          {
            "command": "borders <cell_or_range> <all|outer|none|bottom|top> [color]",
            "description": "Configures borders for cells. Example: borders A1:D1 bottom #1a73e8 or borders A1:D10 all #dadce0."
          },
          {
            "command": "decimals <cell_or_range> <increase|decrease|number>",
            "description": "Sets the number of decimal places shown for numeric cells (e.g. decimals B2:B10 2 or decimals C2:C5 increase)."
          },
          {
            "command": "sheet_add <name>",
            "description": "Adds a new sheet tab with the given name (e.g. sheet_add \"Ventas Q3\")."
          },
          {
            "command": "sheet_switch <name>",
            "description": "Switches the active spreadsheet tab (e.g. sheet_switch \"Ventas Q3\")."
          },
          {
            "command": "sheet_rename <old_name> <new_name>",
            "description": "Renames an existing sheet tab (e.g. sheet_rename \"Hoja 1\" \"Presupuesto\")."
          },
          {
            "command": "sheet_delete <name>",
            "description": "Deletes a sheet tab by name (e.g. sheet_delete \"Hoja 2\")."
          },
          {
            "command": "theme <light|dark>",
            "description": "Changes the spreadsheet appearance theme (e.g. theme light for Google Sheets classic white or theme dark)."
          },
          {
            "command": "chart <bar|line|pie|donut|area> <range> [title]",
            "description": "Generates or updates an embedded reactive SVG chart from a range of cells. First column is used for labels, remaining columns for series data. Example: chart bar A1:B5 \"Ventas por Mes\"."
          },
          {
            "command": "chart_hide",
            "description": "Hides the embedded chart panel."
          },
          {
            "command": "rename <title>",
            "description": "Renames the sheet title (e.g. rename \"Top Marketing Channels Distribution\")."
          },
          {
            "command": "resize <cols> <rows>",
            "description": "Expands or resizes the grid dimension (e.g. resize 12 40)."
          },
          {
            "command": "clear",
            "description": "Clears all cells and hides any active chart, resetting the sheet."
          },
          {
            "command": "load_csv <csv_text>",
            "description": "Parses raw CSV string content starting at cell A1."
          }
        ]
      },
      "defaultPayload": {
        "title": "Hoja de Cálculo",
        "theme": "light",
        "cols": 10,
        "rows": 25,
        "data": {},
        "chart": {}
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "SheetGrid",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./SheetGrid"
        }
      }
    },
    {
      "id": "snake-game-v1",
      "name": "Snake",
      "description": "A classic snake game rendered live in the chat. The user can play it with arrow keys or on-screen buttons, and the agent can ALSO control it turn by turn once it is already running, by sending single move commands and reading back the current board state — it is not a one-shot render.",
      "goal": "Let the user play a simple game inside the conversation, and let the agent act as a co-player or director: move the snake on request, react to the current board, and narrate what is happening without needing the full move history.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "width": {
            "type": "integer",
            "description": "Board width in cells.",
            "default": 14
          },
          "height": {
            "type": "integer",
            "description": "Board height in cells.",
            "default": 14
          },
          "speed": {
            "type": "integer",
            "description": "Milliseconds between automatic ticks (lower = faster).",
            "default": 220
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "state_update"
            ],
            "description": "Always \"state_update\" — the current board snapshot, not a diff or a history entry."
          },
          "data": {
            "type": "object",
            "description": "The CURRENT state only: width, height, snake (array of {x,y}, head first), food ({x,y}), direction, score, gameOver."
          }
        },
        "required": [
          "type",
          "data"
        ]
      },
      "controlSchema": {
        "type": "string",
        "commands": [
          {
            "command": "move up",
            "description": "Turns the snake upward. Ignored if it would reverse into the snake's own neck."
          },
          {
            "command": "move down",
            "description": "Turns the snake downward. Ignored if it would reverse into the snake's own neck."
          },
          {
            "command": "move left",
            "description": "Turns the snake left. Ignored if it would reverse into the snake's own neck."
          },
          {
            "command": "move right",
            "description": "Turns the snake right. Ignored if it would reverse into the snake's own neck."
          },
          {
            "command": "reset",
            "description": "Restarts the board from scratch with the same size/speed."
          },
          {
            "command": "speed <ms>",
            "description": "Sets the tick interval in milliseconds, lower = faster (e.g. \"speed 100\"). Replace <ms> with a number and send it AS-IS, even if it looks extreme (e.g. \"speed 10\") — the widget clamps it to a safe 60-1000ms range itself, so never refuse this command or second-guess the number."
          }
        ]
      },
      "defaultPayload": {
        "width": 14,
        "height": 14,
        "speed": 220
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Snake",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./Snake"
        }
      }
    },
    {
      "id": "tag-cloud-v1",
      "name": "Tag Cloud",
      "description": "A word cloud visualization that displays words with varying sizes based on frequency. Supports hover effects and colorful styling.",
      "goal": "Visualize word frequency from text content in an engaging, interactive cloud layout.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The text content to analyze and display as a word cloud.",
            "default": "This is a sample text for the word cloud visualization. Words that appear more frequently will be displayed larger. The cloud creates an engaging visual representation of text content."
          },
          "maxWords": {
            "type": "number",
            "description": "Maximum number of words to display in the cloud.",
            "default": 60
          },
          "minWordLength": {
            "type": "number",
            "description": "Minimum character length for words to be included.",
            "default": 4
          }
        },
        "required": [
          "text"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "cloud_rendered",
              "word_clicked",
              "word_hovered"
            ],
            "description": "Event type emitted by the tag cloud."
          },
          "data": {
            "type": "object",
            "description": "Event-specific data payload.",
            "properties": {
              "word": {
                "type": "string"
              },
              "frequency": {
                "type": "number"
              },
              "totalWords": {
                "type": "number"
              }
            }
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "text": "This is a sample text for the word cloud visualization. Words that appear more frequently will be displayed larger. The cloud creates an engaging visual representation of text content.",
        "maxWords": 60,
        "minWordLength": 4
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Tag Cloud",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./TagCloud"
        }
      }
    },
    {
      "id": "text-to-speech-v1",
      "name": "Text To Speech",
      "description": "An interactive widget that converts text to speech using the device's native TTS capabilities. Compatible with iOS Safari and other mobile browsers.",
      "goal": "Allow users to listen to text read aloud using their device's built-in speech synthesis, with customizable voice, rate, pitch, and volume settings.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The text content to be spoken aloud.",
            "default": "Hello! This text will be spoken out loud using your device's text-to-speech capabilities."
          },
          "language": {
            "type": "string",
            "description": "Preferred language code for voice selection (e.g., 'en', 'es', 'fr'). The widget will try to find a voice matching this language.",
            "default": "en"
          },
          "rate": {
            "type": "number",
            "minimum": 0.1,
            "maximum": 10,
            "description": "Speech rate. 1 is normal speed, < 1 is slower, > 1 is faster.",
            "default": 1
          },
          "pitch": {
            "type": "number",
            "minimum": 0,
            "maximum": 2,
            "description": "Voice pitch. 1 is normal, 0 is lowest, 2 is highest.",
            "default": 1
          },
          "volume": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Speech volume from 0 (muted) to 1 (full volume).",
            "default": 1
          },
          "autoPlay": {
            "type": "boolean",
            "description": "Whether to automatically start speaking when the widget loads.",
            "default": false
          },
          "showControls": {
            "type": "boolean",
            "description": "Whether to show the voice selection and settings controls.",
            "default": true
          }
        },
        "required": [
          "text"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "speech_started",
              "speech_ended",
              "speech_error",
              "voice_changed"
            ],
            "description": "Event type indicating the speech synthesis status."
          },
          "meta": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "The text that was spoken."
              },
              "voice": {
                "type": "string",
                "description": "The name of the voice used."
              },
              "language": {
                "type": "string",
                "description": "The language code of the voice."
              },
              "duration": {
                "type": "number",
                "description": "Duration of the speech in milliseconds (only for speech_ended)."
              },
              "error": {
                "type": "string",
                "description": "Error message if speech synthesis failed."
              }
            }
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "text": "Hello! This text will be spoken out loud using your device's text-to-speech capabilities.",
        "language": "en",
        "rate": 1,
        "pitch": 1,
        "volume": 1,
        "autoPlay": false,
        "showControls": true
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Text To Speech",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./TextToSpeech"
        }
      }
    },
    {
      "id": "trivia-review-v1",
      "name": "Trivia Review",
      "description": "A multi-topic trivia/review widget: pick a topic, answer multiple-choice questions one at a time, and see a final score.",
      "goal": "Help users self-test and reinforce knowledge across different trivia topics, starting with a US Civil Service / Cognitive Aptitude Test (CAT) style exam.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "topics": {
            "type": "array",
            "description": "List of trivia topics available to the user.",
            "default": [
              {
                "id": "examen-cat",
                "name": "CAT Exam (USA)",
                "description": "Quantitative and verbal reasoning, Civil Service / Cognitive Aptitude Test style.",
                "questions": [
                  {
                    "prompt": "If a train travels 180 km in 3 hours, what is its average speed?",
                    "options": [
                      "45 km/h",
                      "60 km/h",
                      "50 km/h",
                      "90 km/h"
                    ],
                    "correctIndex": 1
                  },
                  {
                    "prompt": "Which word does not belong with the others?",
                    "options": [
                      "Apple",
                      "Orange",
                      "Carrot",
                      "Pear"
                    ],
                    "correctIndex": 2
                  },
                  {
                    "prompt": "An item costs $80. It increases by 25% and then decreases by 20%. What is the final price?",
                    "options": [
                      "$76",
                      "$80",
                      "$84",
                      "$78"
                    ],
                    "correctIndex": 1
                  },
                  {
                    "prompt": "Complete the series: 2, 6, 12, 20, 30, ___",
                    "options": [
                      "36",
                      "40",
                      "42",
                      "44"
                    ],
                    "correctIndex": 2
                  },
                  {
                    "prompt": "If 3 workers finish a job in 8 days, how many days will it take 4 workers to finish the same job?",
                    "options": [
                      "6 days",
                      "8 days",
                      "10 days",
                      "4 days"
                    ],
                    "correctIndex": 0
                  },
                  {
                    "prompt": "Doctor is to Hospital as Teacher is to ___",
                    "options": [
                      "School",
                      "Doctor's office",
                      "Office",
                      "Factory"
                    ],
                    "correctIndex": 0
                  },
                  {
                    "prompt": "An employee earns $2400 a month and saves 15% of it. How much do they save?",
                    "options": [
                      "$340",
                      "$360",
                      "$380",
                      "$400"
                    ],
                    "correctIndex": 1
                  },
                  {
                    "prompt": "All Bloops are Razzies. All Razzies are Lazzies. Are all Bloops Lazzies?",
                    "options": [
                      "Yes",
                      "No",
                      "Cannot be determined",
                      "Only some"
                    ],
                    "correctIndex": 0
                  }
                ]
              }
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Unique topic identifier."
                },
                "name": {
                  "type": "string",
                  "description": "Display name of the topic."
                },
                "description": {
                  "type": "string",
                  "description": "Short description shown under the topic name."
                },
                "questions": {
                  "type": "array",
                  "description": "Multiple-choice questions for this topic.",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "prompt": {
                        "type": "string",
                        "description": "The question text."
                      },
                      "options": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Answer choices shown as numbered options."
                      },
                      "correctIndex": {
                        "type": "integer",
                        "description": "Zero-based index of the correct option."
                      }
                    },
                    "required": [
                      "prompt",
                      "options",
                      "correctIndex"
                    ]
                  }
                }
              },
              "required": [
                "id",
                "name",
                "questions"
              ]
            }
          },
          "theme": {
            "type": "string",
            "enum": [
              "dark",
              "light"
            ],
            "description": "Initial color theme; the user can toggle it from the header.",
            "default": "dark"
          }
        },
        "required": [
          "topics"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "topic_selected",
              "answer_selected",
              "quiz_completed",
              "topic_exited"
            ],
            "description": "Event type emitted by the widget."
          },
          "data": {
            "type": "object",
            "description": "Event-specific data payload."
          }
        },
        "required": [
          "type"
        ]
      },
      "controlSchema": null,
      "defaultPayload": {
        "topics": [
          {
            "id": "examen-cat",
            "name": "CAT Exam (USA)",
            "description": "Quantitative and verbal reasoning, Civil Service / Cognitive Aptitude Test style.",
            "questions": [
              {
                "prompt": "If a train travels 180 km in 3 hours, what is its average speed?",
                "options": [
                  "45 km/h",
                  "60 km/h",
                  "50 km/h",
                  "90 km/h"
                ],
                "correctIndex": 1
              },
              {
                "prompt": "Which word does not belong with the others?",
                "options": [
                  "Apple",
                  "Orange",
                  "Carrot",
                  "Pear"
                ],
                "correctIndex": 2
              },
              {
                "prompt": "An item costs $80. It increases by 25% and then decreases by 20%. What is the final price?",
                "options": [
                  "$76",
                  "$80",
                  "$84",
                  "$78"
                ],
                "correctIndex": 1
              },
              {
                "prompt": "Complete the series: 2, 6, 12, 20, 30, ___",
                "options": [
                  "36",
                  "40",
                  "42",
                  "44"
                ],
                "correctIndex": 2
              },
              {
                "prompt": "If 3 workers finish a job in 8 days, how many days will it take 4 workers to finish the same job?",
                "options": [
                  "6 days",
                  "8 days",
                  "10 days",
                  "4 days"
                ],
                "correctIndex": 0
              },
              {
                "prompt": "Doctor is to Hospital as Teacher is to ___",
                "options": [
                  "School",
                  "Doctor's office",
                  "Office",
                  "Factory"
                ],
                "correctIndex": 0
              },
              {
                "prompt": "An employee earns $2400 a month and saves 15% of it. How much do they save?",
                "options": [
                  "$340",
                  "$360",
                  "$380",
                  "$400"
                ],
                "correctIndex": 1
              },
              {
                "prompt": "All Bloops are Razzies. All Razzies are Lazzies. Are all Bloops Lazzies?",
                "options": [
                  "Yes",
                  "No",
                  "Cannot be determined",
                  "Only some"
                ],
                "correctIndex": 0
              }
            ]
          }
        ],
        "theme": "dark"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Trivia Review",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./TriviaReview"
        }
      }
    },
    {
      "id": "vimeo-player-v1",
      "name": "Vimeo Player",
      "description": "An interactive Vimeo video player widget with search functionality. Can play videos by ID, URL, or search query.",
      "goal": "Enable seamless Vimeo video playback with intelligent search capabilities to find and play videos based on text queries.",
      "version": "1.0.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchQuery": {
            "type": "string",
            "description": "Text query to search for videos. The first matching video will be played.",
            "default": "nature documentary"
          },
          "videoId": {
            "type": "string",
            "description": "Direct Vimeo video ID to play (takes priority over searchQuery).",
            "default": ""
          },
          "videoUrl": {
            "type": "string",
            "format": "uri",
            "description": "Full Vimeo video URL to extract ID from and play.",
            "default": ""
          },
          "autoplay": {
            "type": "boolean",
            "description": "Whether to autoplay the video when loaded.",
            "default": false
          },
          "width": {
            "type": "number",
            "description": "Player width in pixels.",
            "default": 640
          },
          "height": {
            "type": "number",
            "description": "Player height in pixels.",
            "default": 360
          },
          "showSearchResults": {
            "type": "boolean",
            "description": "Whether to show a list of search results for selection.",
            "default": false
          }
        },
        "required": []
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "player_ready",
              "search_completed",
              "search_error",
              "video_selected"
            ],
            "description": "Event type indicating player state changes."
          },
          "meta": {
            "type": "object",
            "properties": {
              "embeddedVideoId": {
                "type": "string",
                "description": "The Vimeo video ID that was embedded."
              },
              "platform": {
                "type": "string",
                "description": "Video platform identifier.",
                "default": "Vimeo"
              },
              "searchQuery": {
                "type": "string",
                "description": "The search query that was used."
              },
              "resultsCount": {
                "type": "integer",
                "description": "Number of search results found."
              },
              "videoTitle": {
                "type": "string",
                "description": "Title of the selected/playing video."
              },
              "error": {
                "type": "string",
                "description": "Error message if search failed."
              }
            }
          }
        }
      },
      "controlSchema": null,
      "defaultPayload": {
        "searchQuery": "nature documentary",
        "videoId": "",
        "videoUrl": "",
        "autoplay": false,
        "width": 640,
        "height": 360,
        "showSearchResults": false
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "Vimeo Player",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./VimeoPlayer"
        }
      }
    },
    {
      "id": "voxel-craft-v1",
      "name": "VoxelCraft",
      "description": "A high-performance 3D Minecraft-style voxel sandbox rendered live in chat with an orbit camera, mobile touch controls, and turn-by-turn agent construction. The agent can build houses, towers, landscapes, rooms, and complex geometric structures via simple and composite commands.",
      "goal": "Enable user and agent to collaboratively design and construct 3D voxel worlds, architectural models, buildings, and game environments directly in the conversation with instant visual feedback and live state inspection.",
      "version": "1.2.0",
      "publisher": "Microservicios",
      "icon": "https://microservicios.co/favicon.ico",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "width": {
            "type": "integer",
            "description": "Canvas width in pixels.",
            "default": 900
          },
          "height": {
            "type": "integer",
            "description": "Canvas height in pixels.",
            "default": 520
          },
          "worldSize": {
            "type": "integer",
            "description": "Base terrain dimension in blocks (NxN grid).",
            "default": 14
          },
          "time": {
            "type": "string",
            "enum": [
              "day",
              "sunset",
              "night"
            ],
            "default": "day",
            "description": "Sky lighting atmosphere."
          },
          "theme": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "default": "dark",
            "description": "UI chrome theme."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "state_update"
            ],
            "description": "Always \"state_update\" — snapshot of the current 3D world."
          },
          "data": {
            "type": "object",
            "description": "Current world state: blockCount, builtBlockCount, bounds, time, summary, and builtBlocks."
          }
        },
        "required": [
          "type",
          "data"
        ]
      },
      "controlSchema": {
        "type": "string",
        "description": "3D Voxel World Coordinate Guide:\n- Coordinate system: (x, y, z) where X is East(+)/West(-), Y is Up(+)/Down(-), Z is South(+)/North(-).\n- Origin (0, 0, 0) is the center of the world.\n- Ground surface is at y = 0 (grass layer).\n- Subsurface is at y = -1 (dirt foundation).\n- Construction airspace starts at y = 1 and above.\n- Initial base terrain spans from x: -6..6 and z: -6..6.\n- Available block types: grass, dirt, stone, wood, planks, leaves, brick, glass, water, sand, gold, diamond, tnt, glowstone, obsidian.\n- Batch execution: multiple commands can be joined with newlines \"\\n\" or semicolons \";\".",
        "commands": [
          {
            "command": "house <x> <z> <width> <height> <depth> [wallType] [roofType]",
            "description": "Builds a complete furnished house in one step at base center (x, z) with walls, floor, hollow interior, door opening, glass windows, and a peaked roof. Defaults: wallType=planks, roofType=brick. Example: \"house 0 0 6 4 6 brick planks\""
          },
          {
            "command": "tower <x> <z> <radius> <height> [type]",
            "description": "Builds a cylindrical fortified watchtower with interior air, arrow slit openings, and top battlements/crenellations. Default type=stone. Example: \"tower 4 4 2 8 stone\""
          },
          {
            "command": "tree <x> <z>",
            "description": "Plants a procedural oak tree at ground level (x, z) with a vertical wood trunk and spherical leafy foliage. Example: \"tree 3 -3\""
          },
          {
            "command": "block <x> <y> <z> <type>",
            "description": "Places a single block at integer coordinates (x, y, z). Alias: setblock. Example: \"block 0 1 0 wood\""
          },
          {
            "command": "box <x1> <y1> <z1> <x2> <y2> <z2> <type>",
            "description": "Fills a solid rectangular cuboid of blocks between corners (x1,y1,z1) and (x2,y2,z2). Alias: fill. Example: \"box -2 1 -2 2 3 2 stone\""
          },
          {
            "command": "hollow_box <x1> <y1> <z1> <x2> <y2> <z2> <type>",
            "description": "Builds a hollow room/cuboid with outer walls, ceiling, and floor (inside is air). Ideal for custom rooms in 1 call. Example: \"hollow_box -4 1 -4 4 5 4 planks\""
          },
          {
            "command": "wall <x1> <z1> <x2> <z2> <y> <height> <type>",
            "description": "Builds a vertical wall between horizontal endpoints (x1, z1) and (x2, z2) from base y with specified height. Example: \"wall -5 -5 -5 5 1 3 brick\""
          },
          {
            "command": "road <x1> <z1> <x2> <z2> [type]",
            "description": "Lays a straight paved pathway along the surface at y = 0. Default type=stone. Example: \"road -5 0 5 0 stone\""
          },
          {
            "command": "stairs <x> <y> <z> <steps> <+x|-x|+z|-z> <type>",
            "description": "Builds an ascending staircase of <steps> blocks starting at (x,y,z) extending along the specified direction (+x, -x, +z, -z). Example: \"stairs 0 1 0 5 +x stone\""
          },
          {
            "command": "cylinder <x> <y> <z> <radius> <height> <type>",
            "description": "Builds a solid vertical cylinder centered at (x, z) starting at y. Example: \"cylinder 0 1 0 3 4 stone\""
          },
          {
            "command": "pyramid <x> <y> <z> <size> <type>",
            "description": "Builds a stepped pyramid starting at base center (x,y,z) with the given base dimension in blocks. Example: \"pyramid 0 1 0 5 brick\""
          },
          {
            "command": "sphere <x> <y> <z> <radius> <type>",
            "description": "Builds a voxelized sphere centered at (x,y,z) with radius <r>. Example: \"sphere 0 6 0 3 glass\""
          },
          {
            "command": "line <x1> <y1> <z1> <x2> <y2> <z2> <type>",
            "description": "Draws a 3D Bresenham line of blocks between two arbitrary 3D points. Perfect for diagonal beams, bridges, and fences. Example: \"line -4 1 -4 4 5 4 wood\""
          },
          {
            "command": "move <x1> <y1> <z1> <x2> <y2> <z2>",
            "description": "Moves a single block from coordinate (x1, y1, z1) to coordinate (x2, y2, z2). Aliases: mover, mv. Example: \"move 0 1 0 0 2 0\""
          },
          {
            "command": "shift <dx> <dy> <dz>",
            "description": "Shifts all built structures in the scene by delta offsets (dx, dy, dz). Example: \"shift 0 1 0\""
          },
          {
            "command": "remove <x> <y> <z>",
            "description": "Mines/deletes the block at coordinate (x,y,z). Aliases: destroy, del, mine, eliminar, borrar. Example: \"remove 0 1 0\""
          },
          {
            "command": "time <day|sunset|night>",
            "description": "Changes sky lighting and atmospheric tone. Example: \"time sunset\""
          },
          {
            "command": "camera <reset|top|front|isometric>",
            "description": "Adjusts the 3D camera angle to a preset viewpoint. Example: \"camera top\""
          },
          {
            "command": "get_state",
            "description": "Returns current 3D world snapshot including total blockCount, builtBlockCount, spatial bounds, block summary, and active sky lighting."
          },
          {
            "command": "undo",
            "description": "Reverts the last building action."
          },
          {
            "command": "clear",
            "description": "Clears all user/agent built structures and resets the world to the flat initial grass plane."
          }
        ]
      },
      "defaultPayload": {
        "width": 900,
        "height": 520,
        "worldSize": 14,
        "time": "day",
        "theme": "dark"
      },
      "defaultConfig": {
        "type": "InputNode",
        "inputType": "remote",
        "title": "VoxelCraft",
        "value": "",
        "component": {
          "remoteUrl": "https://unpkg.com/@microservicios/markdown-widgetlet/assets/remoteEntry.js",
          "scope": "remoteApp",
          "module": "./VoxelCraft"
        }
      }
    }
  ],
  "generatedAt": "2026-09-22T01:01:30.861Z"
}