{
"id": "io.atcr.hold.notifyManifest",
"defs": {
"main": {
"type": "procedure",
"input": {
"schema": {
"type": "object",
"required": [
"repository",
"userDid",
"manifestDigest",
"manifest"
],
"properties": {
"tag": {
"type": "string",
"maxLength": 128,
"description": "Image tag (optional, required for Bluesky posts)"
},
"userDid": {
"type": "string",
"format": "did",
"description": "DID of the image owner"
},
"manifest": {
"ref": "#manifestInfo",
"type": "ref"
},
"operation": {
"type": "string",
"default": "push",
"maxLength": 16,
"description": "Operation type (defaults to 'push' for backward compatibility)",
"knownValues": [
"push",
"pull"
]
},
"repository": {
"type": "string",
"maxLength": 256,
"description": "Image repository name"
},
"manifestDigest": {
"type": "string",
"maxLength": 128,
"description": "Manifest digest for building layer record AT-URIs"
}
}
},
"encoding": "application/json"
},
"errors": [
{
"name": "InvalidOperation"
},
{
"name": "UserMismatch"
},
{
"name": "QuotaExceeded"
}
],
"output": {
"schema": {
"type": "object",
"required": [
"success",
"operation",
"statsUpdated"
],
"properties": {
"postUri": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the created Bluesky post (if postCreated is true)"
},
"success": {
"type": "boolean",
"description": "Whether the operation completed successfully"
},
"operation": {
"type": "string",
"maxLength": 16,
"description": "The operation that was performed ('push' or 'pull')"
},
"postCreated": {
"type": "boolean",
"description": "Whether a Bluesky post was created (push only)"
},
"statsUpdated": {
"type": "boolean",
"description": "Whether stats were successfully updated"
},
"layersCreated": {
"type": "integer",
"description": "Number of layer records created (push only)"
}
}
},
"encoding": "application/json"
},
"description": "Notify hold about a manifest push or pull operation. For pushes: creates layer records and optionally posts to Bluesky. For pulls: just increments stats. Always increments pull/push counts."
},
"blobInfo": {
"type": "object",
"properties": {
"size": {
"type": "integer"
},
"digest": {
"type": "string",
"maxLength": 128
}
}
},
"layerInfo": {
"type": "object",
"properties": {
"size": {
"type": "integer"
},
"digest": {
"type": "string",
"maxLength": 128
},
"mediaType": {
"type": "string",
"maxLength": 256
}
}
},
"manifestInfo": {
"type": "object",
"properties": {
"config": {
"ref": "#blobInfo",
"type": "ref"
},
"layers": {
"type": "array",
"items": {
"ref": "#layerInfo",
"type": "ref"
}
},
"manifests": {
"type": "array",
"items": {
"ref": "#childManifestInfo",
"type": "ref"
},
"description": "Child manifests for multi-arch images"
},
"mediaType": {
"type": "string",
"maxLength": 256,
"description": "OCI media type"
}
},
"description": "OCI manifest information"
},
"platformInfo": {
"type": "object",
"properties": {
"os": {
"type": "string",
"maxLength": 64
},
"architecture": {
"type": "string",
"maxLength": 64
}
}
},
"childManifestInfo": {
"type": "object",
"properties": {
"size": {
"type": "integer"
},
"digest": {
"type": "string",
"maxLength": 128
},
"platform": {
"ref": "#platformInfo",
"type": "ref"
},
"mediaType": {
"type": "string",
"maxLength": 256
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}