{
  "schema": "miscsubjects/blocks/1/capabilities",
  "version": 1,
  "adapters": [
    {
      "id": "spaces",
      "label": "Spaces",
      "types": [
        "space",
        "asset",
        "ad",
        "competitor",
        "page",
        "product",
        "claim",
        "analysis",
        "hypothesis",
        "variant",
        "policy",
        "observation",
        "research",
        "metric",
        "projection",
        "need",
        "view"
      ],
      "renderer": "space-card",
      "identity": "The graph’s own ids: ad:<sha of the source>, competitor:<domain>, page:<url>, analysis:<ad id>, variant:<ad id>:<n>, policy:<space>:<sha of the text>, observation:<policy>:<time>.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "The graph is the provider; nothing is read back from elsewhere when an object is shown. A policy’s check reads the watched pages again on its clock."
      },
      "permissions": {
        "read": "members and anyone the space is shared with",
        "write": "members by role (viewer, editor, approver), the owner"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "ad.drop": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "url": {
              "t": "string",
              "max": 2000
            },
            "image_url": {
              "t": "string",
              "max": 2000
            },
            "text": {
              "t": "string",
              "max": 4000
            },
            "note": {
              "t": "string",
              "max": 2000
            },
            "via": {
              "t": "string",
              "max": 80
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.transcribe": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.create": {
          "effect": "write",
          "input": {
            "name": {
              "t": "string",
              "max": 120,
              "req": true
            },
            "purpose": {
              "t": "string",
              "max": 1000
            },
            "domain": {
              "t": "string",
              "max": 200
            },
            "our_products": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.update": {
          "effect": "write",
          "input": {
            "name": {
              "t": "string",
              "max": 120
            },
            "purpose": {
              "t": "string",
              "max": 1000
            },
            "domain": {
              "t": "string",
              "max": 200
            },
            "our_products": {
              "t": "string",
              "max": 2000
            },
            "our_message": {
              "t": "string",
              "max": 300
            },
            "our_offer": {
              "t": "string",
              "max": 300
            },
            "our_cta": {
              "t": "string",
              "max": 120
            },
            "our_audience": {
              "t": "string",
              "max": 300
            },
            "our_positioning": {
              "t": "string",
              "max": 300
            },
            "our_claims": {
              "t": "string",
              "max": 1000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.read_own": {
          "effect": "write",
          "input": {
            "urls": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "analysis.infer": {
          "effect": "write",
          "input": {
            "field": {
              "t": "string",
              "max": 60,
              "req": true
            },
            "value": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "model": {
              "t": "string",
              "max": 160,
              "req": true
            },
            "prompt": {
              "t": "string",
              "max": 8000,
              "req": true
            },
            "answer": {
              "t": "string",
              "max": 8000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.infer": {
          "effect": "write",
          "input": {
            "field": {
              "t": "string",
              "req": true,
              "in": [
                "our_audience",
                "our_positioning"
              ]
            },
            "value": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "model": {
              "t": "string",
              "max": 160,
              "req": true
            },
            "prompt": {
              "t": "string",
              "max": 8000,
              "req": true
            },
            "answer": {
              "t": "string",
              "max": 8000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.library_fetch": {
          "effect": "exec",
          "input": {
            "max_scrolls": {
              "t": "number"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.layout": {
          "effect": "write",
          "input": {
            "positions": {
              "t": "object"
            },
            "canvas": {
              "t": "object"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.member_add": {
          "effect": "write",
          "input": {
            "person": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "role": {
              "t": "string",
              "req": true,
              "in": [
                "viewer",
                "editor",
                "approver"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.add": {
          "effect": "write",
          "input": {
            "object_id": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.wire": {
          "effect": "write",
          "input": {
            "src": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "dst": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "op": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "field": {
              "t": "string",
              "max": 40
            },
            "text": {
              "t": "string",
              "max": 1000
            },
            "if_field": {
              "t": "string",
              "max": 60
            },
            "if_op": {
              "t": "string",
              "max": 4
            },
            "if_value": {
              "t": "string",
              "max": 300
            },
            "label": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.unwire": {
          "effect": "write",
          "input": {
            "edge": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "space.drop": {
          "effect": "write",
          "input": {
            "src": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "dst": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "relation": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.ingest": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "url": {
              "t": "string",
              "max": 2000
            },
            "image_url": {
              "t": "string",
              "max": 2000
            },
            "note": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.resolve": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "competitor.expand": {
          "effect": "write",
          "input": {
            "max_pages": {
              "t": "number"
            },
            "space": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.interpret": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "analysis.confirm": {
          "effect": "write",
          "input": {
            "field": {
              "t": "string",
              "max": 60,
              "req": true
            },
            "decision": {
              "t": "string",
              "req": true,
              "in": [
                "confirm",
                "correct",
                "reject",
                "infer"
              ]
            },
            "value": {
              "t": "string",
              "max": 4000
            },
            "note": {
              "t": "string",
              "max": 1000
            },
            "model": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.variants": {
          "effect": "write",
          "input": {
            "n": {
              "t": "number"
            },
            "brief": {
              "t": "string",
              "max": 2000
            },
            "space": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "variant.render": {
          "effect": "exec",
          "input": {
            "model": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        },
        "variant.review": {
          "effect": "write",
          "input": {
            "decision": {
              "t": "string",
              "req": true,
              "in": [
                "approved",
                "rejected",
                "hold"
              ]
            },
            "note": {
              "t": "string",
              "max": 1000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.create": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "watches": {
              "t": "string",
              "max": 40
            },
            "name": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.revise": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 2000
            },
            "rules": {
              "t": "object"
            },
            "note": {
              "t": "string",
              "max": 500
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.dryrun": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.activate": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.deactivate": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.check": {
          "effect": "write",
          "input": {
            "force": {
              "t": "boolean"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "metric.set": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "kind": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "value": {
              "t": "number",
              "req": true
            },
            "source": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "as_of": {
              "t": "string",
              "max": 40
            },
            "period": {
              "t": "string",
              "max": 80
            },
            "note": {
              "t": "string",
              "max": 500
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "metric.read": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 2000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "metric.import": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "from": {
              "t": "string",
              "req": true,
              "in": [
                "views"
              ]
            },
            "slugs": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "metric.refresh": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "projection.create": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 1000
            },
            "assumptions": {
              "t": "object"
            },
            "name": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "projection.revise": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 1000
            },
            "assumptions": {
              "t": "object"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "projection.refresh": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "view.create": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 1000
            },
            "def": {
              "t": "object"
            },
            "name": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "view.revise": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 1000
            },
            "def": {
              "t": "object"
            },
            "name": {
              "t": "string",
              "max": 120
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "need.create": {
          "effect": "write",
          "input": {
            "space": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "key": {
              "t": "string",
              "max": 60,
              "req": true
            },
            "what": {
              "t": "string",
              "max": 300
            },
            "how": {
              "t": "string",
              "in": [
                "connect",
                "import",
                "research"
              ]
            },
            "note": {
              "t": "string",
              "max": 1000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "need.update": {
          "effect": "write",
          "input": {
            "status": {
              "t": "string",
              "req": true,
              "in": [
                "open",
                "taken",
                "met",
                "dropped"
              ]
            },
            "note": {
              "t": "string",
              "max": 1000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "asset.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "ad.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "competitor.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "page.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "product.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "claim.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "analysis.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "hypothesis.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "variant.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "policy.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "observation.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "research.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "metric.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "projection.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "need.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "rules",
      "label": "Rules",
      "types": [
        "rule",
        "research"
      ],
      "renderer": "rule-card",
      "identity": "rule:<execution that made it>",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "The object is the record."
      },
      "permissions": {
        "create": "the owner; a person for their own assistant",
        "edit": "whoever made it, the owner",
        "fire": "the scheduler, message routing, the owner",
        "approve": "the owner’s press"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "rule.create": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 2000
            },
            "rule": {
              "t": "object"
            },
            "assistant": {
              "t": "string",
              "max": 60
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "rule.revise": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 2000
            },
            "rule": {
              "t": "object"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "rule.toggle": {
          "effect": "write",
          "input": {
            "on": {
              "t": "boolean"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "rule.dryrun": {
          "effect": "write",
          "input": {
            "facts": {
              "t": "object"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "rule.fire": {
          "effect": "write",
          "input": {
            "trigger": {
              "t": "string",
              "max": 40
            },
            "facts": {
              "t": "object"
            },
            "due": {
              "t": "string",
              "max": 40
            },
            "source": {
              "t": "string",
              "max": 200
            },
            "manual": {
              "t": "boolean"
            },
            "memo": {
              "t": "object"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "rule.approve": {
          "effect": "write",
          "input": {
            "token": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "by": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "research.keep": {
          "effect": "write",
          "input": {
            "rule": {
              "t": "string",
              "max": 60
            },
            "query": {
              "t": "string",
              "max": 1000,
              "req": true
            },
            "runs": {
              "t": "array"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "assistants",
      "label": "Assistants",
      "types": [
        "assistant",
        "research"
      ],
      "renderer": "ios-assistant",
      "identity": "assistant:<person id>",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "The object is the record; nothing is read back from elsewhere."
      },
      "permissions": {
        "create": "the owner (POST /api/assistants makes it and grants the person)",
        "program": "the person it belongs to, and the owner",
        "line": "the owner",
        "handle": "message routing (the build), the owner",
        "memory": "the memory agent adds (message routing, the owner); the person and the owner remove one item, and switch it off",
        "research": "message routing and the owner write a research object"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "assistant.create": {
          "effect": "write",
          "input": {
            "person": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "name": {
              "t": "string",
              "max": 120
            },
            "phones": {
              "t": "string",
              "max": 400
            },
            "disclosure": {
              "t": "string",
              "max": 300
            },
            "seed": {
              "t": "string",
              "max": 12000
            },
            "pair_code": {
              "t": "string",
              "max": 12
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.configure": {
          "effect": "write",
          "input": {
            "name": {
              "t": "string",
              "max": 120
            },
            "instructions": {
              "t": "string",
              "max": 12000
            },
            "model": {
              "t": "string",
              "max": 160
            },
            "allowed_tools": {
              "t": "string",
              "max": 20000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.program": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 2000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.remember": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.forget": {
          "effect": "write",
          "input": {
            "what": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.rule": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.rule_remove": {
          "effect": "write",
          "input": {
            "id": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.rule_toggle": {
          "effect": "write",
          "input": {
            "id": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.line": {
          "effect": "write",
          "input": {
            "line": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "channel": {
              "t": "string",
              "max": 20
            },
            "remove": {
              "t": "boolean"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.seed": {
          "effect": "write",
          "input": {
            "seed": {
              "t": "string",
              "max": 12000
            },
            "pair_code": {
              "t": "string",
              "max": 12
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.pair": {
          "effect": "write",
          "input": {
            "phone": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "how": {
              "t": "string",
              "max": 80
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.handle": {
          "effect": "write",
          "input": {
            "channel": {
              "t": "string",
              "max": 20
            },
            "line": {
              "t": "string",
              "max": 80
            },
            "from": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 4000,
              "req": true
            },
            "at": {
              "t": "string",
              "max": 40
            },
            "is_group": {
              "t": "boolean"
            },
            "from_is_owner": {
              "t": "boolean"
            },
            "dry_run": {
              "t": "boolean"
            },
            "message_id": {
              "t": "string",
              "max": 80
            },
            "attachments": {
              "t": "string",
              "max": 12000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.answered": {
          "effect": "write",
          "input": {
            "entry": {
              "t": "string",
              "max": 40
            },
            "from": {
              "t": "string",
              "max": 80
            },
            "text": {
              "t": "string",
              "max": 4000
            },
            "answer": {
              "t": "string",
              "max": 8000,
              "req": true
            },
            "model": {
              "t": "string",
              "max": 120
            },
            "research": {
              "t": "string",
              "max": 80
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.memory_add": {
          "effect": "write",
          "input": {
            "items": {
              "t": "string",
              "max": 12000,
              "req": true
            },
            "source": {
              "t": "string",
              "max": 300
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.memory_remove": {
          "effect": "write",
          "input": {
            "id": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "assistant.memory_agent": {
          "effect": "write",
          "input": {
            "on": {
              "t": "boolean"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "research.record": {
          "effect": "write",
          "input": {
            "query": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "providers": {
              "t": "string",
              "max": 8000,
              "req": true
            },
            "results": {
              "t": "string",
              "max": 60000
            },
            "cost_usd": {
              "t": "string",
              "max": 200
            },
            "assistant": {
              "t": "string",
              "max": 80
            },
            "person": {
              "t": "string",
              "max": 80
            },
            "from": {
              "t": "string",
              "max": 80
            },
            "text": {
              "t": "string",
              "max": 4000
            },
            "line": {
              "t": "string",
              "max": 80
            },
            "channel": {
              "t": "string",
              "max": 20
            },
            "label": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "tasks",
      "label": "Tasks (this build)",
      "types": [
        "task"
      ],
      "renderer": "ios-reminders",
      "identity": "The task id, T-0000, as /api/tasks names it.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "The row is read back from /api/tasks when a widget is shown (at most every 20 seconds) and when sync is asked for, so a task ticked on the Tasks tab shows ticked in every widget that holds it."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "task.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            },
            "where": {
              "t": "string",
              "max": 1000
            },
            "current_state": {
              "t": "string",
              "max": 1000
            },
            "required_result": {
              "t": "string",
              "max": 1000
            },
            "constraints": {
              "t": "string",
              "max": 1000
            },
            "done_when": {
              "t": "string",
              "max": 1000
            },
            "verify": {
              "t": "string",
              "max": 1000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.complete": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.reopen": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.edit": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "status": {
              "t": "string",
              "in": [
                "new",
                "doing",
                "review",
                "done",
                "dropped"
              ]
            },
            "priority": {
              "t": "string",
              "in": [
                "low",
                "normal",
                "high"
              ]
            },
            "note": {
              "t": "string",
              "max": 4000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "automations",
      "label": "Automations",
      "types": [
        "automation"
      ],
      "renderer": "ios-settings",
      "identity": "The build (one object: every switch).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown, at most every 20 seconds."
      },
      "permissions": {
        "read": "owner",
        "switch": "owner"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "automation.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "automation.switch": {
          "effect": "write",
          "input": {
            "key": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "on": {
              "t": "boolean",
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "maps",
      "label": "Maps",
      "types": [
        "place"
      ],
      "renderer": "ios-maps",
      "identity": "The Google place id of the first result, or the query.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "The search is run again when shown (at most every 20 seconds)."
      },
      "permissions": {
        "read": "anyone",
        "open": "owner only (opens the Maps app on the Mac)"
      },
      "connection": {
        "kind": "public"
      },
      "ops": {
        "place.search": {
          "effect": "read",
          "input": {
            "q": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "near": {
              "t": "string",
              "max": 200
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "place.open": {
          "effect": "exec",
          "input": {
            "app": {
              "t": "string",
              "in": [
                "apple",
                "google"
              ]
            },
            "index": {
              "t": "number"
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "wikipedia",
      "label": "Wikipedia",
      "types": [
        "wiki"
      ],
      "renderer": "ios-wikipedia",
      "identity": "The page title.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown."
      },
      "permissions": {
        "read": "anyone"
      },
      "connection": {
        "kind": "public"
      },
      "ops": {
        "wiki.read": {
          "effect": "read",
          "input": {
            "title": {
              "t": "string",
              "max": 300,
              "req": true
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "safari",
      "label": "Safari",
      "types": [
        "webpage"
      ],
      "renderer": "ios-safari",
      "identity": "The address.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown."
      },
      "permissions": {
        "read": "anyone",
        "open": "owner only"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "webpage.read": {
          "effect": "read",
          "input": {
            "url": {
              "t": "string",
              "max": 2000,
              "req": true
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "webpage.open": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "notifications",
      "label": "Notifications",
      "types": [
        "notification"
      ],
      "renderer": "ios-notification",
      "identity": "The execution id.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A banner is posted once."
      },
      "permissions": {
        "post": "owner only"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "notification.post": {
          "effect": "exec",
          "input": {
            "title": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 1000
            },
            "sound": {
              "t": "string",
              "max": 40
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "speech",
      "label": "Speech",
      "types": [
        "speech"
      ],
      "renderer": "ios-speech",
      "identity": "The execution id.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "Spoken once."
      },
      "permissions": {
        "speak": "owner only"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "speech.say": {
          "effect": "exec",
          "input": {
            "text": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "voice": {
              "t": "string",
              "max": 60
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "x",
      "label": "X",
      "types": [
        "post"
      ],
      "renderer": "ios-x",
      "identity": "The post id X answers with.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A post is not read back."
      },
      "permissions": {
        "post": "owner only"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "post.publish": {
          "effect": "send",
          "input": {
            "text": {
              "t": "string",
              "max": 280,
              "req": true
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "email",
      "label": "Mail",
      "types": [
        "email"
      ],
      "renderer": "ios-email",
      "identity": "The provider’s message id.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A sent mail is not read back here; tracking events land on the Ledger."
      },
      "permissions": {
        "send": "owner only"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "email.send": {
          "effect": "send",
          "input": {
            "to": {
              "t": "string",
              "max": 254,
              "req": true
            },
            "subject": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 20000,
              "req": true
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "messages",
      "label": "Messages",
      "types": [
        "imessage"
      ],
      "renderer": "ios-messages",
      "identity": "The conversation’s chat id in the Mac’s Messages store.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "The conversation is read back from the Mac when the widget is shown (at most every 20 seconds) and when sync is asked for, so a reply that arrives shows here."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "send": "the owner, pressing Send"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "imessage.open": {
          "effect": "read",
          "input": {
            "chat": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "imessage.send": {
          "effect": "send",
          "input": {
            "text": {
              "t": "string",
              "max": 4000,
              "req": true
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "whatsapp",
      "label": "WhatsApp",
      "types": [
        "whatsapp"
      ],
      "renderer": "ios-whatsapp",
      "identity": "The recipient (E.164) on the linked number.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "WhatsApp sends are not read back; the object holds what was sent and WhatsApp’s message id."
      },
      "permissions": {
        "send": "the owner, pressing Send"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "whatsapp.send": {
          "effect": "send",
          "input": {
            "to": {
              "t": "string",
              "max": 40,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 4000,
              "req": true
            },
            "session": {
              "t": "string",
              "max": 60
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "telegram",
      "label": "Telegram",
      "types": [
        "telegram"
      ],
      "renderer": "ios-telegram",
      "identity": "The group chat id and Telegram’s message id, written <chat>:<message>.",
      "sync": {
        "method": "none",
        "webhook": true,
        "note": "Messages into the group arrive through the webhook at /telegram; a sent message is not read back."
      },
      "permissions": {
        "send": "the owner, pressing Send"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "telegram.send": {
          "effect": "send",
          "input": {
            "text": {
              "t": "string",
              "max": 4000,
              "req": true
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "google_sheets",
      "label": "Google Sheets",
      "types": [
        "sheet"
      ],
      "renderer": "ios-sheets",
      "identity": "The spreadsheet id and the A1 range.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "The range is read again when the widget is shown (at most every 20 seconds), so an edit made in Sheets appears here."
      },
      "permissions": {
        "read": "owner",
        "write": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "sheet.read": {
          "effect": "read",
          "input": {
            "sheet_id": {
              "t": "string",
              "max": 120,
              "req": true
            },
            "range": {
              "t": "string",
              "max": 120,
              "req": true
            },
            "title": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "sheet.append": {
          "effect": "write",
          "input": {
            "row": {
              "t": "string",
              "max": 4000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "scripts",
      "label": "Script Editor",
      "types": [
        "script_run"
      ],
      "renderer": "mac-script",
      "identity": "The execution id.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A run is finished when it is recorded."
      },
      "permissions": {
        "run": "owner only"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "script.run": {
          "effect": "exec",
          "input": {
            "source": {
              "t": "string",
              "max": 20000,
              "req": true
            },
            "language": {
              "t": "string",
              "in": [
                "applescript",
                "jxa"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "mac",
      "label": "System",
      "types": [
        "mac_status"
      ],
      "renderer": "mac-system",
      "identity": "The Mac (one object per read).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown, at most every 20 seconds."
      },
      "permissions": {
        "read": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "mac.status": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "finder",
      "label": "Finder",
      "types": [
        "folder"
      ],
      "renderer": "mac-finder",
      "identity": "The absolute path of the folder.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Listed again when shown, at most every 20 seconds."
      },
      "permissions": {
        "read": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "folder.list": {
          "effect": "read",
          "input": {
            "path": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "photos",
      "label": "Photos",
      "types": [
        "photo"
      ],
      "renderer": "ios-photos",
      "identity": "The image’s address in this build’s store.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A picture does not change."
      },
      "permissions": {
        "take": "owner only"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "photo.screenshot": {
          "effect": "exec",
          "input": {
            "caption": {
              "t": "string",
              "max": 300
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "markets",
      "label": "Stocks",
      "types": [
        "quote"
      ],
      "renderer": "ios-stocks",
      "identity": "The symbol (XAU-USD-SPOT, XAG-USD-SPOT).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown, at most every 20 seconds."
      },
      "permissions": {
        "read": "anyone"
      },
      "connection": {
        "kind": "public"
      },
      "ops": {
        "quote.read": {
          "effect": "read",
          "input": {
            "symbol": {
              "t": "string",
              "max": 40,
              "req": true
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "starlink",
      "label": "Starlink",
      "types": [
        "dish"
      ],
      "renderer": "ios-starlink",
      "identity": "The dish.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown, at most every 20 seconds."
      },
      "permissions": {
        "read": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "dish.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "clock",
      "label": "Clock",
      "types": [
        "clock"
      ],
      "renderer": "ios-clock",
      "identity": "The reading.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "The page ticks on its own."
      },
      "permissions": {
        "read": "anyone"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "clock.read": {
          "effect": "read",
          "input": {
            "zone": {
              "t": "string",
              "max": 60
            },
            "label": {
              "t": "string",
              "max": 60
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "apple_reminders",
      "label": "Apple Reminders",
      "types": [
        "task"
      ],
      "renderer": "task-card",
      "identity": "The reminder’s own id, x-apple-reminder://<UUID>, as Reminders reports it.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Reminders has no webhook. The reminder is read back from the Mac when a block is shown (at most every 20 seconds) and when sync is asked for, so a change made in Reminders itself appears here."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "task.lists": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "task.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            },
            "list": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "task.complete": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "task.reopen": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "task.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "task.delete": {
          "effect": "destroy",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        }
      }
    },
    {
      "id": "google_tasks",
      "label": "Google Tasks",
      "types": [
        "task"
      ],
      "renderer": "task-card",
      "identity": "Google’s task id inside its task list, written <list id>|<task id>.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Google Tasks sends no push events. The task is read back from Google when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "task.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            },
            "list": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.complete": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.reopen": {
          "effect": "write",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "task.delete": {
          "effect": "destroy",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "things",
      "label": "Things",
      "types": [
        "task"
      ],
      "renderer": "task-card",
      "identity": "Things’ own to-do id.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "Not connected."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "task.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Things 3 is not installed on this Mac (no Things3.app in /Applications), so there is nothing to call. When it is, the way in is its URL scheme (open things:///json?data=[{type:\"to-do\",attributes:{title,notes,when}}]) and its id comes back only through x-callback-url, so a canonical object could be bound to it then. Even installed, Things’ URL scheme can add a to-do but does not return its id, and changing one needs a Things-issued token the owner has not made, so a canonical object could not be bound to a Things to-do."
        },
        "task.complete": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Things 3 is not installed on this Mac (no Things3.app in /Applications), so there is nothing to call. When it is, the way in is its URL scheme (open things:///json?data=[{type:\"to-do\",attributes:{title,notes,when}}]) and its id comes back only through x-callback-url, so a canonical object could be bound to it then. Even installed, Things’ URL scheme can add a to-do but does not return its id, and changing one needs a Things-issued token the owner has not made, so a canonical object could not be bound to a Things to-do."
        },
        "task.reopen": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Things 3 is not installed on this Mac (no Things3.app in /Applications), so there is nothing to call. When it is, the way in is its URL scheme (open things:///json?data=[{type:\"to-do\",attributes:{title,notes,when}}]) and its id comes back only through x-callback-url, so a canonical object could be bound to it then. Even installed, Things’ URL scheme can add a to-do but does not return its id, and changing one needs a Things-issued token the owner has not made, so a canonical object could not be bound to a Things to-do."
        },
        "task.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Things 3 is not installed on this Mac (no Things3.app in /Applications), so there is nothing to call. When it is, the way in is its URL scheme (open things:///json?data=[{type:\"to-do\",attributes:{title,notes,when}}]) and its id comes back only through x-callback-url, so a canonical object could be bound to it then. Even installed, Things’ URL scheme can add a to-do but does not return its id, and changing one needs a Things-issued token the owner has not made, so a canonical object could not be bound to a Things to-do."
        },
        "task.delete": {
          "effect": "destroy",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "due": {
              "t": "datetime"
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Things 3 is not installed on this Mac (no Things3.app in /Applications), so there is nothing to call. When it is, the way in is its URL scheme (open things:///json?data=[{type:\"to-do\",attributes:{title,notes,when}}]) and its id comes back only through x-callback-url, so a canonical object could be bound to it then. Even installed, Things’ URL scheme can add a to-do but does not return its id, and changing one needs a Things-issued token the owner has not made, so a canonical object could not be bound to a Things to-do."
        }
      }
    },
    {
      "id": "trello",
      "label": "Trello",
      "types": [
        "card"
      ],
      "renderer": "task-card",
      "identity": "The Trello card id.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Trello offers webhooks; none is registered. The card is read back from Trello when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "card.create": {
          "effect": "write",
          "input": {
            "list_id": {
              "t": "string",
              "max": 100
            },
            "name": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "desc": {
              "t": "string",
              "max": 4000
            },
            "list": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TRELLO_KEY or TRELLO_TOKEN (vault ~/.build-vault.env). No call to Trello is made until the owner adds both."
        },
        "card.move": {
          "effect": "write",
          "input": {
            "list_id": {
              "t": "string",
              "max": 100,
              "req": true
            },
            "card_id": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TRELLO_KEY or TRELLO_TOKEN (vault ~/.build-vault.env). No call to Trello is made until the owner adds both."
        },
        "card.list": {
          "effect": "read",
          "input": {
            "board_id": {
              "t": "string",
              "max": 100,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TRELLO_KEY or TRELLO_TOKEN (vault ~/.build-vault.env). No call to Trello is made until the owner adds both."
        },
        "card.close": {
          "effect": "destroy",
          "input": {
            "card_id": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TRELLO_KEY or TRELLO_TOKEN (vault ~/.build-vault.env). No call to Trello is made until the owner adds both."
        }
      }
    },
    {
      "id": "todoist",
      "label": "Todoist",
      "types": [
        "task"
      ],
      "renderer": "task-card",
      "identity": "The Todoist task id.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Todoist offers webhooks; none is registered. The task is read back from Todoist when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "task.create": {
          "effect": "write",
          "input": {
            "content": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "due_string": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TODOIST_TOKEN (vault ~/.build-vault.env). No call to Todoist is made until the owner adds it."
        },
        "task.close": {
          "effect": "write",
          "input": {
            "task_id": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TODOIST_TOKEN (vault ~/.build-vault.env). No call to Todoist is made until the owner adds it."
        },
        "task.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "no connection: the Mac environment holds no TODOIST_TOKEN (vault ~/.build-vault.env). No call to Todoist is made until the owner adds it."
        }
      }
    },
    {
      "id": "notion",
      "label": "Notion",
      "types": [
        "page"
      ],
      "renderer": "task-card",
      "identity": "The Notion page id (a UUID, dashes optional).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Notion offers webhooks; none is registered. The page is read back from Notion when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "page.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "body": {
              "t": "string",
              "max": 20000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "page.append": {
          "effect": "write",
          "input": {
            "page_id": {
              "t": "string",
              "max": 100
            },
            "text": {
              "t": "string",
              "max": 20000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "page.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "linear",
      "label": "Linear",
      "types": [
        "issue"
      ],
      "renderer": "task-card",
      "identity": "The Linear issue id (a UUID).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Linear offers webhooks; none is registered. The issue is read back from Linear when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "issue.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "description": {
              "t": "string",
              "max": 20000
            },
            "team_id": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "issue.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "apple_calendar",
      "label": "Apple Calendar",
      "types": [
        "event"
      ],
      "renderer": "event-card",
      "identity": "The event’s uid in Calendar.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Calendar has no webhook. The event is read back from the Mac when shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "event.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "start": {
              "t": "datetime",
              "req": true
            },
            "end": {
              "t": "datetime"
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "location": {
              "t": "string",
              "max": 300
            },
            "calendar": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "event.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "start": {
              "t": "datetime"
            },
            "end": {
              "t": "datetime"
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "location": {
              "t": "string",
              "max": 300
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "event.delete": {
          "effect": "destroy",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        }
      }
    },
    {
      "id": "google_calendar",
      "label": "Google Calendar",
      "types": [
        "event"
      ],
      "renderer": "event-card",
      "identity": "Google’s event id on a calendar, written <calendar id>|<event id>; the calendar part is left off for the owner’s primary calendar.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Google Calendar supports push channels; none is registered. Read back when shown and on sync."
      },
      "permissions": {
        "read": "owner",
        "write": "owner",
        "destroy": "owner"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "event.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "start": {
              "t": "datetime",
              "req": true
            },
            "end": {
              "t": "datetime"
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "location": {
              "t": "string",
              "max": 300
            },
            "calendar": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "event.update": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300
            },
            "start": {
              "t": "datetime"
            },
            "end": {
              "t": "datetime"
            },
            "notes": {
              "t": "string",
              "max": 4000
            },
            "location": {
              "t": "string",
              "max": 300
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "event.delete": {
          "effect": "destroy",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "invitations",
      "label": "Invitations (this build)",
      "types": [
        "invitation"
      ],
      "renderer": "invitation-card",
      "identity": "The canonical object id (the invitation lives only in this build).",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "The object is the only copy; there is nothing to sync."
      },
      "permissions": {
        "read": "owner or addressee",
        "write": "owner",
        "respond": "the addressee only, as themselves"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "invitation.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 300,
              "req": true
            },
            "addressee_email": {
              "t": "string",
              "max": 254,
              "req": true
            },
            "start": {
              "t": "datetime"
            },
            "end": {
              "t": "datetime"
            },
            "notes": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "invitation.respond": {
          "effect": "write",
          "input": {
            "response": {
              "t": "string",
              "req": true,
              "in": [
                "accepted",
                "declined",
                "tentative"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "invitation.deliver": {
          "effect": "send",
          "input": {},
          "public": false,
          "outward": true,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Delivering an invitation sends a message to another person. This build does not send one from a block; it needs the owner’s explicit approval of that exact send, and the sending channel (email or iMessage) chosen by the owner."
        }
      }
    },
    {
      "id": "calendly",
      "label": "Calendly booking",
      "types": [
        "booking"
      ],
      "renderer": "booking-card",
      "identity": "Calendly’s scheduled-event uri.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "Calendly webhooks need a Calendly API token, which this build does not hold."
      },
      "permissions": {
        "read": "public (the scheduling link only)",
        "write": "public booking only; never any calendar read, edit or administration"
      },
      "connection": {
        "kind": "public"
      },
      "ops": {
        "booking.open": {
          "effect": "read",
          "input": {},
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "booking.create": {
          "effect": "write",
          "input": {
            "slot": {
              "t": "datetime",
              "req": true
            },
            "name": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "email": {
              "t": "string",
              "max": 254,
              "req": true
            }
          },
          "public": true,
          "outward": true,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "This build holds no Calendly API token, so it cannot create a booking itself. A visitor books on Calendly’s own page through the booking.open link."
        }
      }
    },
    {
      "id": "apple_contacts",
      "label": "Contacts",
      "types": [
        "contact"
      ],
      "renderer": "contact-card",
      "identity": "The contact’s id in Contacts.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Contacts has no webhook; read back when shown and on sync."
      },
      "permissions": {
        "read": "owner",
        "write": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "contact.card": {
          "effect": "read",
          "input": {
            "query": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "contact.search": {
          "effect": "read",
          "input": {
            "query": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "contact.create": {
          "effect": "write",
          "input": {
            "name": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "email": {
              "t": "string",
              "max": 254
            },
            "phone": {
              "t": "string",
              "max": 60
            },
            "org": {
              "t": "string",
              "max": 200
            },
            "note": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "shopify",
      "label": "Shopify products",
      "types": [
        "product"
      ],
      "renderer": "product-card",
      "identity": "Shopify’s product gid, gid://shopify/Product/<n>.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Shopify supports webhooks; none is registered. The product is read back when shown and on sync."
      },
      "permissions": {
        "read": "public (a published product’s card) or owner",
        "write": "owner",
        "commerce": "none: no cart, checkout or order is made from a block"
      },
      "connection": {
        "kind": "account"
      },
      "ops": {
        "product.list": {
          "effect": "read",
          "input": {
            "limit": {
              "t": "number"
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "product.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 255,
              "req": true
            },
            "vendor": {
              "t": "string",
              "max": 255
            },
            "status": {
              "t": "string",
              "in": [
                "DRAFT",
                "ACTIVE"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "The build’s Shopify tools are read only: SHOPIFY_PRODUCTS and SHOPIFY_SHOP list and read, and the build’s Shopify code refuses any mutation (src/tools/money.js). So no product can be created from a block yet."
        },
        "product.buy": {
          "effect": "send",
          "input": {},
          "public": false,
          "outward": true,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Buying is a purchase. A block never makes one: no Shopify cart, checkout or order call exists in this build’s tools, and a purchase needs the buyer’s own payment on Shopify’s checkout page."
        }
      }
    },
    {
      "id": "team_threads",
      "label": "Team conversations",
      "types": [
        "thread"
      ],
      "renderer": "thread-card",
      "identity": "The room id, room_<n>.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "The room is read back when shown and on sync."
      },
      "permissions": {
        "read": "owner, or a member of the room",
        "write": "a member of the room"
      },
      "connection": {
        "kind": "build"
      },
      "ops": {
        "thread.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "thread.post": {
          "effect": "send",
          "input": {
            "thread": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "text": {
              "t": "string",
              "max": 4000,
              "req": true
            }
          },
          "public": false,
          "outward": true,
          "needs": "approval",
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "terminal",
      "label": "Terminal",
      "types": [
        "terminal_run"
      ],
      "renderer": "terminal-run",
      "identity": "The execution id (a run exists once and is never re-run).",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A run is finished when it is recorded; its record does not change."
      },
      "permissions": {
        "run": "owner only; never a visitor"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "terminal.run": {
          "effect": "exec",
          "input": {
            "command": {
              "t": "string",
              "max": 8000,
              "req": true
            },
            "cwd": {
              "t": "string",
              "max": 500
            },
            "timeout_ms": {
              "t": "number"
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": true
        }
      }
    },
    {
      "id": "alfred",
      "label": "Alfred",
      "types": [
        "alfred_run"
      ],
      "renderer": "alfred-run",
      "identity": "workflow bundle id + trigger id of the run record.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A trigger returns nothing; the run record shows what was sent."
      },
      "permissions": {
        "list": "owner",
        "trigger": "owner only"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "alfred.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": "owner-mac",
          "status": "supported",
          "verified": true
        },
        "alfred.trigger": {
          "effect": "exec",
          "input": {
            "workflow": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "trigger": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "argument": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "alfred.search": {
          "effect": "read",
          "input": {
            "query": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Alfred 5 has no search call that anything outside Alfred can use: its scripting offers only search (opening the Alfred window with text typed in), run trigger (an External Trigger of one workflow) and a few settings. The one installed External Trigger is pagejson in the workflow Line Search (alfred.list shows it); Alfred returns no result text to the caller."
        }
      }
    },
    {
      "id": "apple_shortcuts",
      "label": "Apple Shortcuts",
      "types": [
        "shortcut_run"
      ],
      "renderer": "shortcut-run",
      "identity": "The shortcut’s name, exactly as `shortcuts list` prints it.",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A run is finished when it is recorded; the list is read fresh from the Mac on every shortcut.list."
      },
      "permissions": {
        "read": "owner",
        "run": "owner only; running a shortcut is always the owner’s own approval, pressed by hand"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "shortcut.gallery": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "shortcut.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": "owner-mac",
          "status": "supported",
          "verified": true
        },
        "shortcut.run": {
          "effect": "exec",
          "input": {
            "name": {
              "t": "string",
              "max": 200,
              "req": true
            },
            "input": {
              "t": "string",
              "max": 2000
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "apple_notes",
      "label": "Apple Notes",
      "types": [
        "note"
      ],
      "renderer": "note-card",
      "identity": "The note’s persistent id in the Notes store, p<N> — the same number AppleScript’s x-coredata note id ends in.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Notes has no webhook. A note is read back from the Mac’s Notes store when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "note.create": {
          "effect": "write",
          "input": {
            "title": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "body": {
              "t": "string",
              "max": 20000
            },
            "folder": {
              "t": "string",
              "max": 100
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "note.append": {
          "effect": "write",
          "input": {
            "text": {
              "t": "string",
              "max": 20000,
              "req": true
            },
            "title": {
              "t": "string",
              "max": 500
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": true
        },
        "note.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "note.find": {
          "effect": "read",
          "input": {
            "query": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "apple_mail",
      "label": "Apple Mail",
      "types": [
        "draft"
      ],
      "renderer": "draft-card",
      "identity": "The draft’s own id as Mail reports it.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Mail has no webhook. The draft is read back from the Mac when a block is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "write": "owner"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "mail.compose": {
          "effect": "write",
          "input": {
            "to": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "subject": {
              "t": "string",
              "max": 500,
              "req": true
            },
            "body": {
              "t": "string",
              "max": 20000
            },
            "cc": {
              "t": "string",
              "max": 500
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "draft.list": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "draft.open": {
          "effect": "read",
          "input": {
            "id": {
              "t": "string",
              "max": 500
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "mail.send": {
          "effect": "send",
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "Sending is off: this adapter composes a draft in Mail and never sends it. No operation that sends mail exists in this build."
        }
      }
    },
    {
      "id": "browser_tabs",
      "label": "Safari & Chrome",
      "types": [
        "browser_tab"
      ],
      "renderer": "ax-tabs",
      "identity": "The owner’s Mac browsers (one object holds every open tab).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "open": "owner (press)",
        "run_js": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "browser_tab.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "browser_tab.visit": {
          "effect": "exec",
          "input": {
            "url": {
              "t": "string",
              "max": 2000,
              "req": true
            },
            "browser": {
              "t": "string",
              "in": [
                "safari",
                "chrome"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "unavailable",
          "verified": false,
          "reason": "The owner’s Mac runner refuses to open an address in a visible browser on the owner’s Mac (links, never tabs). The tabs are read; JavaScript runs in the front tab on a press."
        },
        "browser_tab.js": {
          "effect": "exec",
          "input": {
            "js": {
              "t": "string",
              "max": 4000,
              "req": true
            },
            "browser": {
              "t": "string",
              "in": [
                "safari",
                "chrome"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "photos_library",
      "label": "Photos",
      "types": [
        "photo_library"
      ],
      "renderer": "ax-photos",
      "identity": "The owner’s Photos library on the Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown; only while Photos is open (a read never opens it)."
      },
      "permissions": {
        "read": "owner",
        "open": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "photo_library.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "photo_library.launch": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "music",
      "label": "Music",
      "types": [
        "music"
      ],
      "renderer": "ax-music",
      "identity": "The Music app on the owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown; only while Music is open (a read never opens it)."
      },
      "permissions": {
        "read": "owner",
        "control": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "music.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "music.playpause": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "music.next": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "music.previous": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "apple_tv",
      "label": "TV",
      "types": [
        "tv_player"
      ],
      "renderer": "ax-music",
      "identity": "The TV app on the owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown; only while TV is open (a read never opens it)."
      },
      "permissions": {
        "read": "owner",
        "control": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "tv_player.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "tv_player.playpause": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "tv_player.next": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "tv_player.previous": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "tv_player.podcasts": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "unavailable",
          "verified": false,
          "reason": "The Podcasts app on the Mac has no scripting dictionary (osascript cannot read or control it); nothing is read and nothing is pretended."
        }
      }
    },
    {
      "id": "documents",
      "label": "Numbers, Pages, Keynote, Excel, Word",
      "types": [
        "documents"
      ],
      "renderer": "ax-docs",
      "identity": "The documents open on the owner’s Mac and the iWork files changed lately.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "open": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "documents.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "documents.launch": {
          "effect": "exec",
          "input": {
            "path": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "mail_inbox",
      "label": "Mail inbox",
      "types": [
        "mailbox"
      ],
      "renderer": "ax-inbox",
      "identity": "The unified inbox of Mail on the owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again when shown; only while Mail is open (a read never opens it)."
      },
      "permissions": {
        "read": "owner",
        "mark": "owner (press)",
        "open": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "mailbox.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "mailbox.mark_read": {
          "effect": "write",
          "input": {
            "id": {
              "t": "number",
              "req": true
            },
            "read": {
              "t": "boolean"
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "mailbox.launch": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "home",
      "label": "Home",
      "types": [
        "home"
      ],
      "renderer": "ax-home",
      "identity": "The owner’s Home, through the Home shortcuts on the Mac (the Directory rows HOME_DOOR_LOCK, HOME_GATE_CODE, HOME_SCENE run the same shortcuts).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "act": "owner (press, or the owner’s own assistant rule from the owner’s paired phone)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "home.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "home.lock": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "home.gate": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "home.scene": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "bluetooth",
      "label": "Bluetooth",
      "types": [
        "bluetooth"
      ],
      "renderer": "ax-bluetooth",
      "identity": "The Mac’s Bluetooth controller.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "open": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "bluetooth.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "bluetooth.settings": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "weather",
      "label": "Weather",
      "types": [
        "weather"
      ],
      "renderer": "ax-weather",
      "identity": "The place asked for.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "anyone",
        "open": "owner (press)"
      },
      "connection": {
        "kind": "public"
      },
      "ops": {
        "weather.read": {
          "effect": "read",
          "input": {
            "place": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": true,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "weather.launch": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "system_settings",
      "label": "System Settings",
      "types": [
        "settings_pane"
      ],
      "renderer": "ax-settings",
      "identity": "The owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "change": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "settings_pane.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "settings_pane.volume": {
          "effect": "write",
          "input": {
            "level": {
              "t": "number",
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "settings_pane.dark_mode": {
          "effect": "write",
          "input": {
            "on": {
              "t": "boolean",
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "settings_pane.show": {
          "effect": "exec",
          "input": {
            "pane": {
              "t": "string",
              "in": [
                "general",
                "sound",
                "wifi",
                "bluetooth",
                "displays",
                "battery",
                "privacy",
                "appearance"
              ]
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "hammerspoon",
      "label": "Hammerspoon",
      "types": [
        "hammerspoon"
      ],
      "renderer": "ax-hammerspoon",
      "identity": "Hammerspoon on the owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "run": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "hammerspoon.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "hammerspoon.lua": {
          "effect": "exec",
          "input": {
            "lua": {
              "t": "string",
              "max": 4000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "iphone",
      "label": "iPhone",
      "types": [
        "iphone"
      ],
      "renderer": "ax-iphone",
      "identity": "The owner’s physical iPhone paired to the Mac (devicectl; never a simulator).",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "act": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "iphone.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "iphone.launch_app": {
          "effect": "exec",
          "input": {
            "bundle_id": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "iphone.camera": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "iphone.location": {
          "effect": "write",
          "input": {
            "label": {
              "t": "string",
              "max": 200,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "iphone.notify": {
          "effect": "send",
          "input": {
            "text": {
              "t": "string",
              "max": 1000,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "computer",
      "label": "Computer",
      "types": [
        "screen",
        "computer_action",
        "computer_app"
      ],
      "renderer": "ax-computer",
      "identity": "The screen of the owner’s Mac; each action is its own object (the execution id).",
      "sync": {
        "method": "none",
        "webhook": false,
        "note": "A picture of the screen is not retaken by being shown (every capture is stored); press See again (screen.capture) for a new one. An action is finished when its after-picture is taken."
      },
      "permissions": {
        "see": "owner",
        "act": "owner (press, or the owner’s own assistant rule from the owner’s paired phone)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "screen.read": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "screen.capture": {
          "effect": "read",
          "input": {},
          "public": false,
          "outward": false,
          "needs": null,
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "computer_action.do": {
          "effect": "exec",
          "input": {
            "kind": {
              "t": "string",
              "in": [
                "click",
                "type",
                "key"
              ],
              "req": true
            },
            "label": {
              "t": "string",
              "max": 200
            },
            "role": {
              "t": "string",
              "max": 40
            },
            "app": {
              "t": "string",
              "max": 80
            },
            "x": {
              "t": "number"
            },
            "y": {
              "t": "number"
            },
            "text": {
              "t": "string",
              "max": 2000
            },
            "key": {
              "t": "string",
              "max": 40
            },
            "via": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "computer_app.do": {
          "effect": "exec",
          "input": {
            "app": {
              "t": "string",
              "max": 80,
              "req": true
            },
            "action": {
              "t": "string",
              "in": [
                "open",
                "focus",
                "quit"
              ]
            },
            "via": {
              "t": "string",
              "max": 200
            }
          },
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    },
    {
      "id": "mac_apps",
      "label": "Mac apps",
      "types": [
        "mac_app"
      ],
      "renderer": "ax-macapp",
      "identity": "The app’s name on the owner’s Mac.",
      "sync": {
        "method": "poll",
        "webhook": false,
        "note": "Read again from the Mac when the card is shown (at most every 20 seconds) and when sync is asked for."
      },
      "permissions": {
        "read": "owner",
        "act": "owner (press)"
      },
      "connection": {
        "kind": "device"
      },
      "ops": {
        "mac_app.read": {
          "effect": "read",
          "input": {
            "app": {
              "t": "string",
              "max": 80,
              "req": true
            }
          },
          "public": false,
          "outward": false,
          "needs": null,
          "device": null,
          "status": "supported",
          "verified": false
        },
        "mac_app.launch": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "mac_app.focus": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        },
        "mac_app.quit": {
          "effect": "exec",
          "input": {},
          "public": false,
          "outward": false,
          "needs": "approval",
          "device": "owner-mac",
          "status": "supported",
          "verified": false
        }
      }
    }
  ]
}