{
  "version": 1,
  "availability": "Requires an installed plugin offering the requested action; choose from its Quick Actions list",
  "docsUrl": "https://docs.hypermatic.com/copydoc/automation/parameters",
  "inputLimits": {
    "quickActionsPasteMaxCharacters": 149,
    "parserOptionsMaxCharacters": 16384,
    "maxTargetIds": 100,
    "rejectedAmbiguousLength": 150
  },
  "optionDefinitionFormat": "Hypermatic parameter fields v1; not JSON Schema",
  "plugin": "copydoc",
  "parameters": [
    "command",
    "parameters"
  ],
  "shortcuts": [
    {
      "command": "open",
      "name": "Open CopyDoc",
      "action": "open",
      "advanced": false,
      "parameters": [],
      "target": "none"
    },
    {
      "command": "shortcut-export",
      "name": "Export Selected Text",
      "action": "export",
      "advanced": false,
      "parameters": [
        {
          "name": "Format",
          "key": "format",
          "allowFreeform": false,
          "optional": true
        }
      ],
      "target": "current selection"
    },
    {
      "command": "shortcut-replace",
      "name": "Replace Text with CopyDoc",
      "action": "replace",
      "advanced": false,
      "parameters": [
        {
          "name": "Replacement text",
          "key": "text",
          "allowFreeform": true,
          "optional": false
        }
      ],
      "target": "current selection"
    },
    {
      "command": "advanced-export",
      "name": "Advanced: Export Selected Text",
      "action": "export",
      "advanced": true,
      "parameters": [
        {
          "name": "Target (optional node IDs)",
          "key": "target",
          "allowFreeform": true,
          "optional": true
        },
        {
          "name": "Advanced options (JSON)",
          "key": "options",
          "allowFreeform": true,
          "optional": true
        }
      ],
      "target": "optional node IDs or current selection"
    },
    {
      "command": "advanced-replace",
      "name": "Advanced: Replace Text with CopyDoc",
      "action": "replace",
      "advanced": true,
      "parameters": [
        {
          "name": "Advanced options (JSON)",
          "key": "options",
          "allowFreeform": true,
          "optional": false
        },
        {
          "name": "Target (optional node IDs)",
          "key": "target",
          "allowFreeform": true,
          "optional": true
        }
      ],
      "target": "optional node IDs or current selection"
    },
    {
      "command": "advanced-replace-many",
      "name": "Advanced: replace many",
      "action": "replace-many",
      "advanced": true,
      "parameters": [
        {
          "name": "Advanced options (JSON)",
          "key": "options",
          "allowFreeform": true,
          "optional": false
        },
        {
          "name": "Target (optional node IDs)",
          "key": "target",
          "allowFreeform": true,
          "optional": true
        }
      ],
      "target": "optional node IDs or current selection"
    }
  ],
  "actions": {
    "open": {
      "description": "Open the normal interactive plugin",
      "fields": {},
      "target": "none",
      "execution": "builtin"
    },
    "export": {
      "description": "Export text from selected frames",
      "fields": {
        "format": {
          "type": "string",
          "values": [
            "csv",
            "xlsx",
            "json",
            "markdown",
            "xliff1",
            "xliff2"
          ],
          "default": "csv",
          "description": "Text export format"
        }
      },
      "target": "many",
      "execution": "worker"
    },
    "replace": {
      "description": "Replace one text layer using CopyDoc markdown handling",
      "fields": {
        "text": {
          "type": "string",
          "max": 12000,
          "required": true,
          "description": "Replacement text"
        }
      },
      "target": "one",
      "execution": "worker"
    },
    "replace-many": {
      "description": "Apply ordered text updates to exactly the target text nodes using existing markdown handling",
      "fields": {
        "updates": {
          "type": "array",
          "description": "One update per target; partial progress is possible on runtime failure",
          "required": true,
          "min": 1,
          "max": 100,
          "item": {
            "type": "object",
            "description": "Text update",
            "fields": {
              "id": {
                "type": "string",
                "description": "Exact Figma node ID",
                "required": true,
                "max": 100,
                "pattern": "^(?:I)?[0-9]+:[0-9]+(?:;[0-9]+:[0-9]+)*$"
              },
              "text": {
                "type": "string",
                "description": "Replacement text",
                "required": true,
                "max": 12000
              }
            }
          }
        }
      },
      "target": "many",
      "execution": "worker"
    }
  },
  "examples": {
    "export": {
      "format": "csv"
    },
    "replace": {
      "text": "Updated heading"
    },
    "replace-many": {
      "updates": [
        {
          "id": "123:456",
          "text": "Updated heading"
        }
      ]
    }
  },
  "limitsAndBehavior": "Translation imports, spreadsheet synchronization and component population remain interactive. Replace-many validates every target before applying updates; an execution failure can leave earlier updates applied. Replace example IDs with the exact target IDs.",
  "completion": {
    "deadlineMs": 300000,
    "visibleNotifications": true,
    "nativeSaveDialog": true,
    "verifySavedArtifact": true
  },
  "invocation": "Figma Quick Actions or a verified host launcher; no REST/MCP launcher is provided",
  "results": "Normal Figma success/error notifications, document changes, native file downloads and published pages"
}
