[
  {
    "id": "image_manager.inspect",
    "operation": "inspect",
    "title": "Read Image Manager state",
    "owner": "Reviewed_Owner::inspect",
    "input_schema": {
      "type": "object",
      "properties": {
        "section": {
          "type": "string",
          "maxLength": 15,
          "enum": [
            "settings",
            "workflow",
            "sources",
            "library",
            "drafts",
            "backups",
            "remote",
            "health",
            "inputs",
            "imports",
            "unused",
            "intent",
            "content_folders",
            "fit",
            "cdn"
          ]
        },
        "query": {
          "type": "string",
          "maxLength": 160
        },
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "source": {
          "type": "string",
          "maxLength": 160
        },
        "snapshot": {
          "type": "string",
          "maxLength": 160
        },
        "marker": {
          "type": "string",
          "maxLength": 100
        },
        "offset": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100000
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 20
        }
      },
      "required": [
        "section"
      ],
      "additionalProperties": false
    },
    "effect": "Read current permitted state and readiness. No media, settings or job changes.",
    "screen": "All screens"
  },
  {
    "id": "image_manager.settings_update",
    "operation": "settings_update",
    "title": "Change image settings",
    "owner": "Settings::patch",
    "input_schema": {
      "type": "object",
      "properties": {
        "settings": {
          "type": "object",
          "properties": {
            "public_policy": {
              "type": "boolean"
            },
            "delivery": {
              "type": "boolean"
            },
            "uploads": {
              "type": "boolean"
            },
            "auto_discovery": {
              "type": "boolean"
            },
            "local_cdn": {
              "type": "boolean"
            },
            "theme_images": {
              "type": "boolean"
            },
            "catalog": {
              "type": "boolean"
            },
            "comments": {
              "type": "boolean"
            },
            "enhanced_ui": {
              "type": "boolean"
            },
            "lazy_loading": {
              "type": "boolean"
            },
            "fit": {
              "type": "boolean"
            },
            "content_folders": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 20
              },
              "minItems": 0,
              "maxItems": 20
            },
            "large_pictures": {
              "type": "string",
              "maxLength": 9,
              "enum": [
                "standard",
                "wordpress",
                "all"
              ]
            },
            "upload_limit": {
              "type": "string",
              "maxLength": 9,
              "enum": [
                "wordpress",
                "off",
                "1920",
                "2048",
                "3200",
                "3840",
                "5120"
              ]
            },
            "compression": {
              "type": "object",
              "properties": {
                "mode": {
                  "type": "string",
                  "maxLength": 8,
                  "enum": [
                    "lossless",
                    "high",
                    "maximum"
                  ]
                },
                "content": {
                  "type": "string",
                  "maxLength": 8,
                  "enum": [
                    "auto",
                    "photo",
                    "graphics"
                  ]
                },
                "effort": {
                  "type": "string",
                  "maxLength": 8,
                  "enum": [
                    "fast",
                    "balanced"
                  ]
                },
                "formats": {
                  "type": "string",
                  "maxLength": 6,
                  "enum": [
                    "auto",
                    "native",
                    "webp",
                    "avif"
                  ]
                },
                "metadata": {
                  "type": "string",
                  "maxLength": 10,
                  "enum": [
                    "preserve",
                    "remove_gps",
                    "remove_all"
                  ]
                }
              },
              "required": [],
              "additionalProperties": false
            },
            "auto_text": {
              "type": "boolean"
            },
            "dimensions": {
              "type": "boolean"
            },
            "skip_sizes": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 64
              },
              "minItems": 0,
              "maxItems": 40
            },
            "picture_folders": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 200,
                "pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$"
              },
              "minItems": 0,
              "maxItems": 10
            },
            "watermark": {
              "type": "boolean"
            },
            "watermark_image": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2147483647
            },
            "watermark_place": {
              "type": "string",
              "maxLength": 20,
              "enum": [
                "top-left",
                "top",
                "top-right",
                "left",
                "center",
                "right",
                "bottom-left",
                "bottom",
                "bottom-right"
              ]
            },
            "watermark_size": {
              "type": "integer",
              "minimum": 5,
              "maximum": 50
            },
            "watermark_opacity": {
              "type": "integer",
              "minimum": 10,
              "maximum": 100
            },
            "watermark_min": {
              "type": "integer",
              "minimum": 100,
              "maximum": 4000
            },
            "svg_uploads": {
              "type": "boolean"
            },
            "svg_roles": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 60,
                "pattern": "^[a-z0-9_-]+$"
              },
              "minItems": 0,
              "maxItems": 20
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "required": [
        "settings"
      ],
      "additionalProperties": false
    },
    "effect": "Save the exact changed settings; advance publication generation. Delivery and lazy loading can change newly rendered public output; automatic processing can schedule future work; Largest picture to make lighter changes which originals later compression reads; Fit pictures to the page changes the sizes attribute of measured pictures on measured public pages; Folders for pages and posts adds private folders to the chosen admin lists (nothing public); SVG uploads let the chosen roles upload SVG files, each cleaned before it is saved.",
    "screen": "Settings"
  },
  {
    "id": "image_manager.scan_start",
    "operation": "scan_start",
    "title": "Scan public image sources",
    "owner": "Workflow::start",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Start a bounded public site scan and save progress. Public page HTTP requests and local source indexing follow; scan-only leaves delivery switches unchanged.",
    "screen": "Optimize"
  },
  {
    "id": "image_manager.optimization_start",
    "operation": "optimization_start",
    "title": "Start an optimization run",
    "owner": "Batch::start",
    "input_schema": {
      "type": "object",
      "properties": {
        "compression": {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "lossless",
                "high",
                "maximum"
              ]
            },
            "content": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "auto",
                "photo",
                "graphics"
              ]
            },
            "effort": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "fast",
                "balanced"
              ]
            },
            "formats": {
              "type": "string",
              "maxLength": 6,
              "enum": [
                "auto",
                "native",
                "webp",
                "avif"
              ]
            },
            "metadata": {
              "type": "string",
              "maxLength": 10,
              "enum": [
                "preserve",
                "remove_gps",
                "remove_all"
              ]
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "bulk_intent": {
          "type": "string",
          "maxLength": 6,
          "enum": [
            "apply",
            "review"
          ]
        },
        "sizing": {
          "type": "string",
          "maxLength": 8,
          "enum": [
            "existing",
            "balanced",
            "fit"
          ]
        },
        "target": {
          "type": "string",
          "maxLength": 7,
          "enum": [
            "all",
            "missing"
          ]
        },
        "public_policy": {
          "type": "boolean"
        },
        "delivery": {
          "type": "boolean"
        },
        "verify_after_apply": {
          "type": "boolean"
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "effect": "Scan the enabled public sources, freeze the selected images and queue the exact compression/size recipe. Apply mode publishes validated copies; review mode leaves comparisons for later approval. Originals remain unchanged.",
    "screen": "Optimize"
  },
  {
    "id": "image_manager.workflow_pause",
    "operation": "workflow_pause",
    "title": "Pause image work",
    "owner": "Workflow::pause",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Pause before the next image operation and invalidate stale publication; prepared copies remain.",
    "screen": "Optimize / Tools"
  },
  {
    "id": "image_manager.workflow_resume",
    "operation": "workflow_resume",
    "title": "Resume image work",
    "owner": "Workflow::resume",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Resume saved image work and scheduling.",
    "screen": "Optimize / Tools"
  },
  {
    "id": "image_manager.workflow_cancel",
    "operation": "workflow_cancel",
    "title": "Stop image run",
    "owner": "Workflow::cancel",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Cancel the saved run and hold queued work; prepared copies and original files remain.",
    "screen": "Optimize / Tools"
  },
  {
    "id": "image_manager.workflow_advance",
    "operation": "workflow_advance",
    "title": "Process image work here",
    "owner": "Workflow::run_batch",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Perform one native bounded batch; local files, indexing and public page checks can advance. Saved work and pause state govern eligibility.",
    "screen": "Optimize / Tools"
  },
  {
    "id": "image_manager.background_check",
    "operation": "background_check",
    "title": "Check background scheduling",
    "owner": "Scheduler::check",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Queue an independent native scheduling probe. Queued is distinct from independently executed.",
    "screen": "Tools"
  },
  {
    "id": "image_manager.codec_check",
    "operation": "codec_check",
    "title": "Check local encoders",
    "owner": "Compression::capabilities",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Run native local encoder self-checks and save host capability results.",
    "screen": "Tools"
  },
  {
    "id": "image_manager.comparison_prepare",
    "operation": "comparison_prepare",
    "title": "Queue a compression comparison",
    "owner": "Preview::start",
    "input_schema": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "maxLength": 160
        },
        "compression": {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "lossless",
                "high",
                "maximum"
              ]
            },
            "content": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "auto",
                "photo",
                "graphics"
              ]
            },
            "effort": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "fast",
                "balanced"
              ]
            },
            "formats": {
              "type": "string",
              "maxLength": 6,
              "enum": [
                "auto",
                "native",
                "webp",
                "avif"
              ]
            },
            "metadata": {
              "type": "string",
              "maxLength": 10,
              "enum": [
                "preserve",
                "remove_gps",
                "remove_all"
              ]
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "required": [
        "source",
        "compression"
      ],
      "additionalProperties": false
    },
    "effect": "Queue comparison files without changing delivery.",
    "screen": "Images / Compare compression"
  },
  {
    "id": "image_manager.comparison_apply",
    "operation": "comparison_apply",
    "title": "Approve prepared compression copies",
    "owner": "Preview::apply",
    "input_schema": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "source",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Publish the exact ready copies after source and output checksum validation; delivery switches remain.",
    "screen": "Images / Compare compression"
  },
  {
    "id": "image_manager.comparison_discard",
    "operation": "comparison_discard",
    "title": "Discard compression comparison",
    "owner": "Preview::discard",
    "input_schema": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "source",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Retire the selected candidate files while retaining approved copies and originals.",
    "screen": "Images / Compare compression"
  },
  {
    "id": "image_manager.source_optimize",
    "operation": "source_optimize",
    "title": "Queue image optimization",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Queue image optimization through the source repository; originals are retained.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_retry",
    "operation": "source_retry",
    "title": "Retry saved image policy",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Retry saved image policy through the source repository; originals are retained.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_exclude",
    "operation": "source_exclude",
    "title": "Exclude images",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Exclude images through the source repository; originals are retained.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_include",
    "operation": "source_include",
    "title": "Include images again",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Include images again through the source repository; originals are retained.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_original",
    "operation": "source_original",
    "title": "Use original delivery",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Disable each selected source delivery switch. Cached pages retain their prior output until cleared.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_optimized",
    "operation": "source_optimized",
    "title": "Allow optimized delivery",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Enable each source delivery switch; global delivery and public eligibility still govern output.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.source_cleanup",
    "operation": "source_cleanup",
    "title": "Remove managed copies",
    "owner": "Reviewed_Owner::source_change",
    "input_schema": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 20
        }
      },
      "required": [
        "sources"
      ],
      "additionalProperties": false
    },
    "effect": "Delete managed alternatives only with global delivery disabled. Clear page/CDN caches before removing files; originals are retained.",
    "screen": "Images / selected actions"
  },
  {
    "id": "image_manager.bulk_run",
    "operation": "bulk_run",
    "title": "Run a frozen image bulk selection",
    "owner": "Batch::start",
    "input_schema": {
      "type": "object",
      "properties": {
        "bulk": {
          "type": "string",
          "maxLength": 9,
          "enum": [
            "optimize",
            "retry",
            "original",
            "optimized",
            "exclude",
            "include",
            "check"
          ]
        },
        "scope": {
          "type": "string",
          "maxLength": 8,
          "enum": [
            "selected",
            "page",
            "matching"
          ]
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 100
        },
        "filter": {
          "type": "string",
          "maxLength": 11,
          "enum": [
            "",
            "ready",
            "queued",
            "waiting",
            "no_saving",
            "held",
            "unsupported",
            "kept",
            "failed",
            "excluded"
          ]
        },
        "search": {
          "type": "string",
          "maxLength": 100
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100000
        },
        "compression": {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "lossless",
                "high",
                "maximum"
              ]
            },
            "content": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "auto",
                "photo",
                "graphics"
              ]
            },
            "effort": {
              "type": "string",
              "maxLength": 8,
              "enum": [
                "fast",
                "balanced"
              ]
            },
            "formats": {
              "type": "string",
              "maxLength": 6,
              "enum": [
                "auto",
                "native",
                "webp",
                "avif"
              ]
            },
            "metadata": {
              "type": "string",
              "maxLength": 10,
              "enum": [
                "preserve",
                "remove_gps",
                "remove_all"
              ]
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "bulk_intent": {
          "type": "string",
          "maxLength": 6,
          "enum": [
            "apply",
            "review"
          ]
        },
        "sizing": {
          "type": "string",
          "maxLength": 8,
          "enum": [
            "existing",
            "balanced",
            "fit"
          ]
        },
        "target": {
          "type": "string",
          "maxLength": 7,
          "enum": [
            "all",
            "missing"
          ]
        },
        "public_policy": {
          "type": "boolean"
        },
        "delivery": {
          "type": "boolean"
        },
        "verify_after_apply": {
          "type": "boolean"
        }
      },
      "required": [
        "bulk",
        "scope"
      ],
      "additionalProperties": false
    },
    "effect": "Freeze the native selected/page/all-matching source set and queue the chosen operation. The approved selection fingerprint is checked again under the owner lock; later discoveries are not silently added.",
    "screen": "Images / Bulk editor"
  },
  {
    "id": "image_manager.folder_create",
    "operation": "folder_create",
    "title": "Create a folder",
    "owner": "Library::create_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "parent": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Create a virtual organization label. File paths, URLs and media IDs remain.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.folder_rename",
    "operation": "folder_rename",
    "title": "Rename a folder",
    "owner": "Library::change_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        },
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      },
      "required": [
        "term",
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Rename a virtual label.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.folder_delete",
    "operation": "folder_delete",
    "title": "Delete a folder",
    "owner": "Library::change_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "term"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the organization label and its relationships; attachments and files remain. Child folders follow native WordPress term deletion behavior.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.folder_add",
    "operation": "folder_add",
    "title": "Add media folder membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.folder_remove",
    "operation": "folder_remove",
    "title": "Remove media folder membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.folder_set",
    "operation": "folder_set",
    "title": "Set media folder membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.collection_create",
    "operation": "collection_create",
    "title": "Create a collection",
    "owner": "Library::create_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      },
      "required": [
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Create a virtual organization label. File paths, URLs and media IDs remain.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.collection_rename",
    "operation": "collection_rename",
    "title": "Rename a collection",
    "owner": "Library::change_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        },
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      },
      "required": [
        "term",
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Rename a virtual label.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.collection_delete",
    "operation": "collection_delete",
    "title": "Delete a collection",
    "owner": "Library::change_term",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "term"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the organization label and its relationships; attachments and files remain. Child folders follow native WordPress term deletion behavior.",
    "screen": "Media / Organization"
  },
  {
    "id": "image_manager.collection_add",
    "operation": "collection_add",
    "title": "Add media collection membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.collection_remove",
    "operation": "collection_remove",
    "title": "Remove media collection membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.collection_set",
    "operation": "collection_set",
    "title": "Set media collection membership",
    "owner": "Library::assign / detach",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "terms": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 0,
          "maxItems": 20
        }
      },
      "required": [
        "attachments",
        "terms"
      ],
      "additionalProperties": false
    },
    "effect": "Change the exact virtual membership; set replaces the selected taxonomy memberships and an empty set clears them. Paths and attachment IDs remain.",
    "screen": "Media / selection and native attachment fields"
  },
  {
    "id": "image_manager.metadata_update",
    "operation": "metadata_update",
    "title": "Change media metadata",
    "owner": "Library::update_metadata",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachments": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        },
        "fields": {
          "type": "object",
          "properties": {
            "title": {
              "type": "string",
              "maxLength": 1000
            },
            "caption": {
              "type": "string",
              "maxLength": 8000
            },
            "alt": {
              "type": "string",
              "maxLength": 4000
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "required": [
        "attachments",
        "fields"
      ],
      "additionalProperties": false
    },
    "effect": "Save supplied title, caption and image alternative text, including explicit empty values. Omitted fields remain. Existing page-specific alternative text is not rewritten; native WordPress hooks run.",
    "screen": "Media / Edit selected details"
  },
  {
    "id": "image_manager.media_upload",
    "operation": "media_upload",
    "title": "Upload securely staged media",
    "owner": "Reviewed_Inputs::upload",
    "input_schema": {
      "type": "object",
      "properties": {
        "input_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        },
        "folder": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "input_reference"
      ],
      "additionalProperties": false
    },
    "effect": "Create WordPress attachments from one to eight human-staged files, generate native metadata and assign the approved folder. Normal upload hooks and enabled future-upload processing may run. New images without an explicit folder receive their automatic Website images category. Explicitly approved folders take precedence.",
    "screen": "Media / Upload to this folder"
  },
  {
    "id": "image_manager.edit_prepare",
    "operation": "edit_prepare",
    "title": "Prepare a private image edit",
    "owner": "Editor::prepare",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "editor": {
          "type": "object",
          "properties": {
            "crop": {
              "type": "string",
              "maxLength": 6,
              "enum": [
                "none",
                "1x1",
                "4x3",
                "3x2",
                "16x9",
                "custom"
              ]
            },
            "rotate": {
              "type": "string",
              "maxLength": 5,
              "enum": [
                "none",
                "cw90",
                "ccw90",
                "180"
              ]
            },
            "flip": {
              "type": "string",
              "maxLength": 10,
              "enum": [
                "none",
                "horizontal",
                "vertical"
              ]
            },
            "crop_x": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            },
            "crop_y": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            },
            "crop_width": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            },
            "crop_height": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            },
            "resize_width": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            },
            "resize_height": {
              "type": "integer",
              "minimum": 0,
              "maximum": 16384
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "required": [
        "attachment",
        "editor"
      ],
      "additionalProperties": false
    },
    "effect": "Render a private draft using rotation, flip, crop then a resize to the width and height given, larger or smaller (an enlargement at most 16,384 pixels a side and 24 megapixels). Replace the prior draft; the original and public uses remain unchanged.",
    "screen": "Media / Editor"
  },
  {
    "id": "image_manager.edit_save",
    "operation": "edit_save",
    "title": "Save edited copy",
    "owner": "Editor::save_copy",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Create a separate attachment with inherited text and organization, native sizes and edit lineage; remove the private draft.",
    "screen": "Media / Editor"
  },
  {
    "id": "image_manager.edit_discard",
    "operation": "edit_discard",
    "title": "Discard image edit",
    "owner": "Editor::discard",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Delete only the selected private edit draft.",
    "screen": "Media / Editor"
  },
  {
    "id": "image_manager.pdf_prepare",
    "operation": "pdf_prepare",
    "title": "Prepare a PDF page image",
    "owner": "PDF::prepare",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "maximum": 500
        },
        "maximum_edge": {
          "type": "integer",
          "minimum": 320,
          "maximum": 2560
        }
      },
      "required": [
        "attachment",
        "page",
        "maximum_edge"
      ],
      "additionalProperties": false
    },
    "effect": "Render one selected PDF page locally to a private white-background PNG draft. Host Imagick/PDF policy governs readiness; PDF remains unchanged.",
    "screen": "Media / Convert"
  },
  {
    "id": "image_manager.pdf_save",
    "operation": "pdf_save",
    "title": "Save a converted PDF page",
    "owner": "PDF::save",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Create one PNG attachment with native sizes and organization from the exact draft; the source PDF remains unchanged.",
    "screen": "Media / Convert"
  },
  {
    "id": "image_manager.pdf_discard",
    "operation": "pdf_discard",
    "title": "Discard PDF page preview",
    "owner": "Media_Draft::discard",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the private page conversion preview.",
    "screen": "Media / Convert"
  },
  {
    "id": "image_manager.pdf_copy_prepare",
    "operation": "pdf_copy_prepare",
    "title": "Prepare a smaller copy of a PDF",
    "owner": "PDF_Copy::prepare",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "preset": {
          "type": "string",
          "maxLength": 7,
          "enum": [
            "quality",
            "small"
          ]
        }
      },
      "required": [
        "attachment",
        "preset"
      ],
      "additionalProperties": false
    },
    "effect": "Write a private smaller copy of one PDF with the host's Ghostscript (quality: pictures kept up to 300 dpi, colours unchanged; small: pictures up to 150 dpi) and keep it only when it is smaller and has the same pages, text, links, comments, titles and look; a PDF with a password, form fields, a signature, attachments, scripts, layers or multimedia is refused. The PDF remains unchanged.",
    "screen": "Media / Smaller PDF"
  },
  {
    "id": "image_manager.pdf_copy_save",
    "operation": "pdf_copy_save",
    "title": "Save a smaller copy of a PDF",
    "owner": "PDF_Copy::save",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Create one new PDF attachment from the exact prepared copy, with the source's caption, description, folders and collections; the source PDF remains unchanged.",
    "screen": "Media / Smaller PDF"
  },
  {
    "id": "image_manager.pdf_copy_discard",
    "operation": "pdf_copy_discard",
    "title": "Discard a smaller PDF preview",
    "owner": "Media_Draft::discard",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the private smaller PDF preview.",
    "screen": "Media / Smaller PDF"
  },
  {
    "id": "image_manager.replace_prepare",
    "operation": "replace_prepare",
    "title": "Prepare a replacement preview",
    "owner": "Reviewed_Inputs::replacement",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "input_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "input_reference"
      ],
      "additionalProperties": false
    },
    "effect": "Stage the human-supplied same-type image as a private replacement draft after source validation; the live attachment remains unchanged.",
    "screen": "Media / Replace"
  },
  {
    "id": "image_manager.replace_apply",
    "operation": "replace_apply",
    "title": "Apply media replacement",
    "owner": "Media_Replacement::apply",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Create a verified recovery ZIP and new native file family, then point the same attachment ID at the new files. New URLs affect attachment-based uses; hardcoded URLs and caches require separate review.",
    "screen": "Media / Replace"
  },
  {
    "id": "image_manager.replace_undo",
    "operation": "replace_undo",
    "title": "Undo media replacement",
    "owner": "Media_Replacement::undo",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Restore the latest verified previous file family and metadata. The replacement files are retained; hardcoded content URLs are not rewritten.",
    "screen": "Media / Replace"
  },
  {
    "id": "image_manager.replace_recover",
    "operation": "replace_recover",
    "title": "Recover media replacement",
    "owner": "Media_Replacement::undo",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Explicitly recover a partially applied replacement to the verified before family. This is a new reviewed compensating intent; automatic reconciliation never invokes it.",
    "screen": "Media / Replace"
  },
  {
    "id": "image_manager.replace_discard",
    "operation": "replace_discard",
    "title": "Discard media replacement",
    "owner": "Media_Draft::discard",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        },
        "draft": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "attachment",
        "draft"
      ],
      "additionalProperties": false
    },
    "effect": "Delete only the selected private replacement draft; applying drafts cannot be discarded.",
    "screen": "Media / Replace"
  },
  {
    "id": "image_manager.backup_start",
    "operation": "backup_start",
    "title": "Create a portable media backup",
    "owner": "Backup::start / Remote_Backup::start_backup",
    "input_schema": {
      "type": "object",
      "properties": {
        "profile": {
          "type": "string",
          "maxLength": 9,
          "enum": [
            "essential",
            "published"
          ]
        },
        "scope": {
          "type": "string",
          "maxLength": 10,
          "enum": [
            "all",
            "folder",
            "collection"
          ]
        },
        "term": {
          "type": "string",
          "maxLength": 160
        },
        "destination": {
          "type": "string",
          "maxLength": 6,
          "enum": [
            "local",
            "remote"
          ]
        },
        "encrypted": {
          "type": "boolean"
        },
        "secret_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "effect": "Freeze eligible attachment IDs and package portable media, text, organization and checksums. Published profile includes approved derivative files. Remote destination queues a transfer after verification; retention and local-copy settings can remove older backup copies.",
    "screen": "Backups / Create"
  },
  {
    "id": "image_manager.backup_pause",
    "operation": "backup_pause",
    "title": "Pause local backup",
    "owner": "Backup::pause",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Pause the current backup while retaining saved staging.",
    "screen": "Backups"
  },
  {
    "id": "image_manager.backup_resume",
    "operation": "backup_resume",
    "title": "Resume local backup",
    "owner": "Backup::resume",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Resume the saved backup.",
    "screen": "Backups"
  },
  {
    "id": "image_manager.backup_cancel",
    "operation": "backup_cancel",
    "title": "Cancel local backup",
    "owner": "Backup::cancel",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Stop the incomplete job and remove its staging; existing media and completed snapshots remain.",
    "screen": "Backups"
  },
  {
    "id": "image_manager.backup_advance",
    "operation": "backup_advance",
    "title": "Advance local backup",
    "owner": "Backup::work",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Perform one bounded native backup batch and verify completed archive entries; completion may queue the configured remote transfer.",
    "screen": "Backups"
  },
  {
    "id": "image_manager.backup_delete",
    "operation": "backup_delete",
    "title": "Delete a local snapshot",
    "owner": "Backup::delete_snapshot",
    "input_schema": {
      "type": "object",
      "properties": {
        "snapshot": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "snapshot"
      ],
      "additionalProperties": false
    },
    "effect": "Delete that local archive and sidecars plus its index record; attachments remain.",
    "screen": "Backups / Local history"
  },
  {
    "id": "image_manager.backup_restore",
    "operation": "backup_restore",
    "title": "Selectively restore media",
    "owner": "Backup::restore",
    "input_schema": {
      "type": "object",
      "properties": {
        "snapshot": {
          "type": "string",
          "maxLength": 160
        },
        "portable_id": {
          "type": "string",
          "maxLength": 64,
          "minLength": 64
        },
        "mode": {
          "type": "string",
          "maxLength": 8,
          "enum": [
            "new",
            "in_place"
          ]
        },
        "secret_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "snapshot",
        "portable_id",
        "mode"
      ],
      "additionalProperties": false
    },
    "effect": "Restore the exact verified original, native metadata and organization. New mode allocates a new attachment; same-site in-place creates a safety recovery point before changing the editable existing attachment. Page/product relationships are not rewritten.",
    "screen": "Backups / Inspect and restore"
  },
  {
    "id": "image_manager.backup_import",
    "operation": "backup_import",
    "title": "Import a human-staged portable ZIP",
    "owner": "Backup::import_file_path",
    "input_schema": {
      "type": "object",
      "properties": {
        "input_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        },
        "secret_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "input_reference"
      ],
      "additionalProperties": false
    },
    "effect": "Validate archive names, manifest, counts and checksums, then add a private local snapshot for inspection. This action does not restore attachments.",
    "screen": "Backups / Bring in a backup"
  },
  {
    "id": "image_manager.remote_settings_update",
    "operation": "remote_settings_update",
    "title": "Change backup destination settings",
    "owner": "Remote_Backup::save_settings",
    "input_schema": {
      "type": "object",
      "properties": {
        "provider": {
          "type": "string",
          "maxLength": 6,
          "enum": [
            "none",
            "google",
            "s3"
          ]
        },
        "schedule": {
          "type": "string",
          "maxLength": 6,
          "enum": [
            "manual",
            "daily",
            "weekly"
          ]
        },
        "profile": {
          "type": "string",
          "maxLength": 9,
          "enum": [
            "essential",
            "published"
          ]
        },
        "scope": {
          "type": "string",
          "maxLength": 10,
          "enum": [
            "all",
            "folder",
            "collection"
          ]
        },
        "term": {
          "type": "string",
          "maxLength": 160
        },
        "retention": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30
        },
        "keep_local": {
          "type": "boolean"
        },
        "schedule_encrypt": {
          "type": "boolean"
        },
        "google_client_id": {
          "type": "string",
          "maxLength": 255
        },
        "s3_endpoint": {
          "type": "string",
          "maxLength": 2048
        },
        "s3_region": {
          "type": "string",
          "maxLength": 32
        },
        "s3_bucket": {
          "type": "string",
          "maxLength": 63
        },
        "s3_prefix": {
          "type": "string",
          "maxLength": 1024
        },
        "s3_path_style": {
          "type": "boolean"
        },
        "secret_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "effect": "Preserve omitted settings and credentials; save supplied fields and reschedule. Changing Google app identity invalidates its saved connection; changing S3 identity invalidates its verification. Retention prunes older destination copies after future verified uploads; keep-local false removes completed local copies after verified transfers.",
    "screen": "Backups / Backup destination"
  },
  {
    "id": "image_manager.remote_google_disconnect",
    "operation": "remote_google_disconnect",
    "title": "Disconnect Google Drive",
    "owner": "Remote_Backup::disconnect_google",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Clear the local Drive refresh token, folder identity and connection time; remote files remain.",
    "screen": "Backups / Google Drive"
  },
  {
    "id": "image_manager.remote_s3_test",
    "operation": "remote_s3_test",
    "title": "Test the S3 destination",
    "owner": "Remote_Backup::test_s3",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "PUT a temporary private object, HEAD its size/checksum and attempt its deletion. Record readiness only after the owner check; report incomplete cleanup instead of verified success.",
    "screen": "Backups / S3 connection"
  },
  {
    "id": "image_manager.remote_upload",
    "operation": "remote_upload",
    "title": "Queue a local snapshot transfer",
    "owner": "Remote_Backup::queue_existing",
    "input_schema": {
      "type": "object",
      "properties": {
        "snapshot": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "snapshot"
      ],
      "additionalProperties": false
    },
    "effect": "Queue a transfer of the verified local ZIP to the current ready destination. Transfer completion, retention pruning and configured local-copy removal happen through the native worker.",
    "screen": "Backups / Local history"
  },
  {
    "id": "image_manager.remote_pause",
    "operation": "remote_pause",
    "title": "Pause remote transfer",
    "owner": "Remote_Backup::pause",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Pause saved transfer progress.",
    "screen": "Backups / Remote transfer"
  },
  {
    "id": "image_manager.remote_resume",
    "operation": "remote_resume",
    "title": "Resume remote transfer",
    "owner": "Remote_Backup::resume",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Resume the saved transfer and schedule.",
    "screen": "Backups / Remote transfer"
  },
  {
    "id": "image_manager.remote_cancel",
    "operation": "remote_cancel",
    "title": "Cancel remote transfer",
    "owner": "Remote_Backup::cancel",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Cancel the transfer and attempt S3 multipart abort when relevant; local media and verified remote snapshots remain.",
    "screen": "Backups / Remote transfer"
  },
  {
    "id": "image_manager.remote_advance",
    "operation": "remote_advance",
    "title": "Advance remote transfer",
    "owner": "Remote_Backup::work",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Perform the native bounded transfer batch; can upload chunks, verify the remote object, prune retention and delete the local copy when configured.",
    "screen": "Backups / Remote transfer"
  },
  {
    "id": "image_manager.remote_fetch",
    "operation": "remote_fetch",
    "title": "Fetch remote backup to local recovery",
    "owner": "Remote_Backup::fetch_local",
    "input_schema": {
      "type": "object",
      "properties": {
        "remote_id": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32
        },
        "secret_reference": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32,
          "pattern": "^[a-f0-9]{32}$"
        }
      },
      "required": [
        "remote_id"
      ],
      "additionalProperties": false
    },
    "effect": "Download and checksum-verify the same destination object before importing it privately for local inspection; no attachment restore.",
    "screen": "Backups / Remote history"
  },
  {
    "id": "image_manager.remote_delete",
    "operation": "remote_delete",
    "title": "Delete a remote backup",
    "owner": "Remote_Backup::delete_remote",
    "input_schema": {
      "type": "object",
      "properties": {
        "remote_id": {
          "type": "string",
          "maxLength": 32,
          "minLength": 32
        }
      },
      "required": [
        "remote_id"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the exact current-destination backup object and remove its native index record after provider acceptance.",
    "screen": "Backups / Remote history"
  },
  {
    "id": "image_manager.usage_start",
    "operation": "usage_start",
    "title": "Start media usage check",
    "owner": "Media_Usage::step",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "attachment"
      ],
      "additionalProperties": false
    },
    "effect": "Check at most 40 saved content items and save the per-actor report. Supported references only, up to 100 findings; native content permissions apply.",
    "screen": "Media / Where is this used"
  },
  {
    "id": "image_manager.usage_continue",
    "operation": "usage_continue",
    "title": "Continue media usage check",
    "owner": "Media_Usage::step",
    "input_schema": {
      "type": "object",
      "properties": {
        "attachment": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "attachment"
      ],
      "additionalProperties": false
    },
    "effect": "Check at most 40 saved content items and save the per-actor report. Supported references only, up to 100 findings; native content permissions apply.",
    "screen": "Media / Where is this used"
  },
  {
    "id": "image_manager.delivery_check",
    "operation": "delivery_check",
    "title": "Check saved public-page markup",
    "owner": "Verification::check_row",
    "input_schema": {
      "type": "object",
      "properties": {
        "source": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "source"
      ],
      "additionalProperties": false
    },
    "effect": "Fetch mapped public page HTML and record the native signature-bound delivery result. HTML matches do not prove the browser downloaded a derivative.",
    "screen": "Images / Compare / Delivery"
  },
  {
    "id": "image_manager.intent_release",
    "operation": "intent_release",
    "title": "Release an uncertain target reservation",
    "owner": "Reviewed_Store::release_intent",
    "input_schema": {
      "type": "object",
      "properties": {
        "marker": {
          "type": "string",
          "maxLength": 79,
          "minLength": 79,
          "pattern": "^(afsd-connector|afsd-im-native):[a-f0-9]{64}$"
        }
      },
      "required": [
        "marker"
      ],
      "additionalProperties": false
    },
    "effect": "Release this exact uncertain operation\u2019s owner reservations after inspecting its native evidence. The prior outcome remains unknown; this never replays, undoes or confirms its business effects. Future changes need a fresh separate approved project. An executing consumer project cannot be released.",
    "screen": "AffStackDev AI / Native recovery review"
  },
  {
    "id": "image_manager.folder_gallery_show",
    "operation": "folder_gallery_show",
    "title": "Show a folder in website galleries",
    "owner": "Folder_Gallery::set_shown",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "term"
      ],
      "additionalProperties": false
    },
    "effect": "Turn this folder on for website galleries: a Folder gallery block or [afsd_im_folder_gallery] shortcode that names it then shows the pictures directly in it to visitors on public pages. Files, folders and the other folders' setting stay as they are.",
    "screen": "Media / Library / Website galleries"
  },
  {
    "id": "image_manager.folder_gallery_hide",
    "operation": "folder_gallery_hide",
    "title": "Hide a folder from website galleries",
    "owner": "Folder_Gallery::set_shown",
    "input_schema": {
      "type": "object",
      "properties": {
        "term": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "term"
      ],
      "additionalProperties": false
    },
    "effect": "Turn this folder off for website galleries: a gallery that names it shows visitors nothing (people who may upload files see a short note in its place). Files and folders stay as they are.",
    "screen": "Media / Library / Website galleries"
  },
  {
    "id": "image_manager.folder_import_start",
    "operation": "folder_import_start",
    "title": "Import folders from another plugin",
    "owner": "Folder_Import::step",
    "input_schema": {
      "type": "object",
      "properties": {
        "plugin": {
          "type": "string",
          "maxLength": 10,
          "enum": [
            "filebird",
            "rml",
            "happyfiles",
            "eml",
            "folders"
          ]
        }
      },
      "required": [
        "plugin"
      ],
      "additionalProperties": false
    },
    "effect": "Make an Image Manager folder for each folder of the chosen media folder plugin (parents first; folders an earlier import made are used again), then put its files into them for about 8 seconds and save the position. Files are only added to folders, never taken out of one. The other plugin's folders and tables are only read.",
    "screen": "Media / Library / Import folders"
  },
  {
    "id": "image_manager.folder_import_continue",
    "operation": "folder_import_continue",
    "title": "Continue a folder import",
    "owner": "Folder_Import::step",
    "input_schema": {
      "type": "object",
      "properties": {
        "plugin": {
          "type": "string",
          "maxLength": 10,
          "enum": [
            "filebird",
            "rml",
            "happyfiles",
            "eml",
            "folders"
          ]
        }
      },
      "required": [
        "plugin"
      ],
      "additionalProperties": false
    },
    "effect": "Continue the saved import from that plugin for about 8 seconds and save the position. Files are only added to folders; the other plugin's folders and tables are only read.",
    "screen": "Media / Library / Import folders"
  },
  {
    "id": "image_manager.unused_check_start",
    "operation": "unused_check_start",
    "title": "Start the no-use-found check",
    "owner": "Unused_Media::step",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Start (or start again) the library-wide check: read saved content, comments, site settings and the Media Library for about 8 seconds and save the position and report. Reads only: no file, post or folder changes. A listed file is one that none of the places checked refers to.",
    "screen": "Media / Library / Files with no use found"
  },
  {
    "id": "image_manager.unused_check_continue",
    "operation": "unused_check_continue",
    "title": "Continue the no-use-found check",
    "owner": "Unused_Media::step",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Continue the saved check for about 8 seconds and save the position and report. Reads only: no file, post or folder changes.",
    "screen": "Media / Library / Files with no use found"
  },
  {
    "id": "image_manager.unused_collect",
    "operation": "unused_collect",
    "title": "Put the files with no use found in a collection",
    "owner": "Unused_Media::collect",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Put the files the finished check listed into a new collection named No use found with the check's date (or keep filling that collection) so they can be looked at in the library. Nothing is deleted, moved or edited.",
    "screen": "Media / Library / Files with no use found"
  },
  {
    "id": "image_manager.content_folder_create",
    "operation": "content_folder_create",
    "title": "Create a folder for an admin list (pages, posts, products ...)",
    "owner": "Content_Folders::create",
    "input_schema": {
      "type": "object",
      "properties": {
        "post_type": {
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "parent": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "post_type",
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Create a private folder in the folder bar of that admin list (Folders for pages and posts must be on for it), at the top or inside a folder. Nothing changes on the website and no address changes.",
    "screen": "Admin lists (Posts, Pages, Products ...) / folder bar / Manage folders"
  },
  {
    "id": "image_manager.content_folder_rename",
    "operation": "content_folder_rename",
    "title": "Rename a folder of an admin list",
    "owner": "Content_Folders::rename",
    "input_schema": {
      "type": "object",
      "properties": {
        "post_type": {
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "folder": {
          "type": "string",
          "maxLength": 160
        },
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        }
      },
      "required": [
        "post_type",
        "folder",
        "name"
      ],
      "additionalProperties": false
    },
    "effect": "Rename the folder. Its items and sub-folders stay in it.",
    "screen": "Admin lists / folder bar / Manage folders"
  },
  {
    "id": "image_manager.content_folder_nest",
    "operation": "content_folder_nest",
    "title": "Move a folder of an admin list into another folder or to the top",
    "owner": "Content_Folders::nest",
    "input_schema": {
      "type": "object",
      "properties": {
        "post_type": {
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "folder": {
          "type": "string",
          "maxLength": 160
        },
        "parent": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "post_type",
        "folder",
        "parent"
      ],
      "additionalProperties": false
    },
    "effect": "Move the folder, with its items and sub-folders, under another folder (an empty parent: the top level). A folder never goes into itself or one of its own sub-folders.",
    "screen": "Admin lists / folder bar / Manage folders"
  },
  {
    "id": "image_manager.content_folder_delete",
    "operation": "content_folder_delete",
    "title": "Delete a folder of an admin list",
    "owner": "Content_Folders::delete",
    "input_schema": {
      "type": "object",
      "properties": {
        "post_type": {
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "folder": {
          "type": "string",
          "maxLength": 160
        }
      },
      "required": [
        "post_type",
        "folder"
      ],
      "additionalProperties": false
    },
    "effect": "Delete the folder only: its items stay as they are, outside any folder, and its sub-folders move up one level. No post, page or product is changed or deleted.",
    "screen": "Admin lists / folder bar / Manage folders"
  },
  {
    "id": "image_manager.content_folder_move",
    "operation": "content_folder_move",
    "title": "Move items of an admin list into a folder or out of their folder",
    "owner": "Content_Folders::move",
    "input_schema": {
      "type": "object",
      "properties": {
        "post_type": {
          "type": "string",
          "maxLength": 20,
          "minLength": 1
        },
        "folder": {
          "type": "string",
          "maxLength": 160
        },
        "items": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 160
          },
          "minItems": 1,
          "maxItems": 100
        }
      },
      "required": [
        "post_type",
        "folder",
        "items"
      ],
      "additionalProperties": false
    },
    "effect": "Put each item (by ID or exact title) into the folder, taking it out of its previous folder; an empty folder takes them out of their folders. Only items you may edit. Nothing changes on the website.",
    "screen": "Admin lists / bulk action Move to folder"
  },
  {
    "id": "image_manager.fit_sizes",
    "operation": "fit_sizes",
    "title": "Make the display sizes the measured pages need",
    "owner": "Batch::start (sizing fit)",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Start one run over the measured pictures with your compression defaults: up to six extra display sizes per picture where no existing size is within 20 % above a width the measured pages need, never larger than the original and never cropped. Originals stay unchanged.",
    "screen": "Optimize / Sizes for the page"
  },
  {
    "id": "image_manager.fit_forget",
    "operation": "fit_forget",
    "title": "Forget the page measurements",
    "owner": "Fit::forget",
    "input_schema": {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    },
    "effect": "Delete every saved page measurement and measured width. Pictures go back to the sizes their theme gives them; display sizes already made stay.",
    "screen": "Optimize / Sizes for the page"
  },
  {
    "id": "image_manager.cdn_check",
    "operation": "cdn_check",
    "title": "Check and save your own CDN",
    "owner": "CDN::save",
    "input_schema": {
      "type": "object",
      "properties": {
        "address": {
          "type": "string",
          "maxLength": 200
        },
        "deliver": {
          "type": "boolean"
        }
      },
      "required": [
        "address",
        "deliver"
      ],
      "additionalProperties": false
    },
    "effect": "Save the CDN address. With deliver on, first write a new small test picture in Image Manager\u2019s folder, ask for it through the CDN address (one request to that address) and switch delivery through the CDN on only when it comes back unchanged; then pictures in the uploads folder on public pages point to the CDN and the check runs daily. With deliver off, pictures come from the site.",
    "screen": "Settings / Deliver pictures through your CDN"
  }
]
