{"uri":"at://did:web:lexicon.atcr.io/com.atproto.lexicon.schema/io.atcr.hold.notifyManifest","cid":"bafyreihuiwxnikwoai3qfuveusjn5ibyt3kqzzkmzoeqqqyd6obugb4axy","value":{"id":"io.atcr.hold.notifyManifest","defs":{"main":{"type":"procedure","input":{"schema":{"type":"object","required":["repository","userDid","manifestDigest"],"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","description":"The pushed manifest. Required for 'push'; absent for 'pull' and 'visibility'."},"operation":{"type":"string","default":"push","maxLength":16,"description":"Operation type (defaults to 'push' for backward compatibility). 'visibility' records a new visibility for an already pushed manifest and does nothing else; it carries no manifest body and moves no counter.","knownValues":["push","pull","visibility"]},"repository":{"type":"string","maxLength":256,"description":"Image repository name"},"visibility":{"type":"string","default":"public","maxLength":16,"description":"Visibility of the sailor repository this manifest belongs to. The hold records it against the manifest and enforces it on OCI blob reads: a layer or image config blob named only by private manifests is served to the hold's owner and crew only, even on a public hold. Absent means public. Re-sending the notification with a different value is how a repository is flipped. Honoured on a push only; ignored on a pull, whose token belongs to the puller rather than the repository owner.","knownValues":["public","private"]},"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, pull or visibility change. For pushes: records the repository's visibility and the manifest's blobs, creates layer records and optionally posts to Bluesky. For pulls: just increments stats. Pushes and pulls always increment the matching count. For visibility changes: records the new visibility and nothing else, so no counter moves and no manifest body is needed."},"blobInfo":{"type":"object","properties":{"size":{"type":"integer"},"digest":{"type":"string","maxLength":128},"mediaType":{"type":"string","maxLength":256}}},"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"}},"subject":{"ref":"#blobInfo","type":"ref","description":"Manifest this artifact refers to (attestations, signatures, SBOMs). Absent for ordinary images."},"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}}