{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://beeuni.ai/schema/beeuni.v2.schema.json",
  "title": "Beeuni manifest (beeuni_version 2)",
  "description": "beeuni.yaml, schema version 2 — YAML-only. `agents` is a name→block MAP, GOVERNANCE ONLY (connectors/secrets/skills/beeuni_permissions/repository_access/enabled); every agent must be declared, and OpenCode behavior (description/model/mode/temperature/permission/the prompt itself) lives entirely in that agent’s own native `.beeuni/opencode/agents/<name>.md` frontmatter + body — authoring any of those fields here is a hard error. `[[channels]]` is removed outright. See docs/specs/2026-07-05-agent-first-config-unification.md §2.1/§2.2/§2.5.",
  "type": "object",
  "required": [
    "beeuni_version",
    "default_agent",
    "agents"
  ],
  "properties": {
    "beeuni_version": {
      "const": 2
    },
    "default_agent": {
      "type": "string",
      "minLength": 1
    },
    "runtime": {
      "type": "string",
      "enum": [
        "opencode",
        "pi"
      ]
    },
    "harnesses": {
      "type": "object",
      "properties": {
        "opencode": {
          "type": "object",
          "properties": {
            "plugins": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9_-]+\\.[cm]?[jt]s$"
              }
            }
          },
          "additionalProperties": false
        },
        "pi": {
          "type": "object",
          "properties": {
            "packages": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "oneOf": [
                  {
                    "type": "string",
                    "anyOf": [
                      {
                        "pattern": "^npm:(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*@\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$"
                      },
                      {
                        "pattern": "^\\.\\/(?!.*(^|\\/)\\.\\.(\\/|$))[^\\s:]+$"
                      }
                    ]
                  },
                  {
                    "type": "object",
                    "required": [
                      "source"
                    ],
                    "properties": {
                      "source": {
                        "type": "string",
                        "anyOf": [
                          {
                            "pattern": "^npm:(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*@\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$"
                          },
                          {
                            "pattern": "^\\.\\/(?!.*(^|\\/)\\.\\.(\\/|$))[^\\s:]+$"
                          }
                        ]
                      },
                      "extensions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "skills": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "prompts": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "themes": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                ]
              }
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "tools": {
      "type": [
        "object",
        "null"
      ],
      "description": "Tools: tool name → repo-relative path of the module that implements it, or `beeuni:<name>` for a Beeuni tool. Each module default-exports { description, parameters (JSON Schema), execute(args, context) }. Every harness loads them. With a `tools` key, sessions get only the Beeuni tools it lists; without one, they get all five.",
      "propertyNames": {
        "pattern": "^[a-z][a-z0-9_]{0,63}$"
      },
      "properties": {
        "web_search": {
          "anyOf": [
            {
              "const": "beeuni:web_search",
              "description": "The Beeuni web_search tool, maintained by Beeuni."
            },
            {
              "type": "string",
              "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
            }
          ]
        },
        "image_search": {
          "anyOf": [
            {
              "const": "beeuni:image_search",
              "description": "The Beeuni image_search tool, maintained by Beeuni."
            },
            {
              "type": "string",
              "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
            }
          ]
        },
        "scrape_webpage": {
          "anyOf": [
            {
              "const": "beeuni:scrape_webpage",
              "description": "The Beeuni scrape_webpage tool, maintained by Beeuni."
            },
            {
              "type": "string",
              "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
            }
          ]
        },
        "memory": {
          "anyOf": [
            {
              "const": "beeuni:memory",
              "description": "The Beeuni memory tool, maintained by Beeuni."
            },
            {
              "type": "string",
              "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
            }
          ]
        },
        "show": {
          "anyOf": [
            {
              "const": "beeuni:show",
              "description": "The Beeuni show tool, maintained by Beeuni."
            },
            {
              "type": "string",
              "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
            }
          ]
        }
      },
      "additionalProperties": {
        "type": "string",
        "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.[cm]?[jt]s$"
      }
    },
    "agents": {
      "type": "object",
      "minProperties": 1,
      "propertyNames": {
        "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "file": {
            "type": "string",
            "pattern": "^(?!-)(?!(?:.*/)?\\.\\.?(?:/|$))(?:[\\w .-]+/)*[\\w .-]+\\.md$",
            "description": "Repo-relative path of this agent's .md (frontmatter + prompt). Defaults to agents/<name>.md."
          },
          "enabled": {
            "type": "boolean"
          },
          "tools": {
            "description": "Which tools this agent may use: harness tools (bash, read, edit, …), Beeuni tools (web_search, memory, show, …) and project tools (top-level `tools`). `all` (default) or `none`; a list allows only those; `{ exclude: [...] }` allows every tool but those. A map of tool name → boolean is the earlier form.",
            "oneOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "none"
                ]
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              {
                "type": "object",
                "required": [
                  "exclude"
                ],
                "properties": {
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1
                    }
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "object",
                "not": {
                  "required": [
                    "exclude"
                  ]
                },
                "additionalProperties": {
                  "type": "boolean"
                }
              }
            ]
          },
          "sandbox": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
          },
          "network_egress": {
            "type": "object",
            "required": [
              "version",
              "default",
              "rules"
            ],
            "properties": {
              "version": {
                "const": 1
              },
              "default": {
                "const": "deny"
              },
              "rules": {
                "type": "array",
                "maxItems": 0
              }
            },
            "additionalProperties": false,
            "description": "Non-enforcing declaration. Outbound network access remains unrestricted until provider gateway isolation ships."
          },
          "connectors": {
            "description": "An allowlist of names, or the \"all\" / \"none\" sentinel. \"*\" (alone or in the list) means \"all\".",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ]
          },
          "connectors_required": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "Connector profile slugs that must resolve before the session starts."
          },
          "connectors_personal": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "deprecated": true,
            "description": "Deprecated input alias for connectors_required."
          },
          "secrets": {
            "description": "An allowlist of names, or the \"all\" / \"none\" sentinel. \"*\" (alone or in the list) means \"all\".",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ]
          },
          "skills": {
            "description": "An allowlist of names, or the \"all\" / \"none\" sentinel. \"*\" (alone or in the list) means \"all\".",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ]
          },
          "apps": {
            "description": "Beeuni Apps (by App slug) this agent may open when the App is restricted or private. Deny by default.",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^(?:[a-z0-9][a-z0-9_-]{0,127}|\\*)$"
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ]
          },
          "beeuni_permissions": {
            "description": "Beeuni permissions: the project.* IAM actions this agent may exercise, or \"all\" / \"none\".",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "project.read",
                    "project.write",
                    "project.delete",
                    "project.session.read",
                    "project.session.start",
                    "project.session.stop",
                    "project.session.bindings.write",
                    "project.members.read",
                    "project.members.manage",
                    "project.trigger.read",
                    "project.trigger.create",
                    "project.trigger.update",
                    "project.trigger.delete",
                    "project.trigger.fire",
                    "project.gateway.logs.read",
                    "project.gateway.spend.read",
                    "project.usage.read",
                    "project.gateway.budget.set",
                    "project.gateway.keys.manage",
                    "project.agent.read",
                    "project.agent.write",
                    "project.skill.read",
                    "project.skill.write",
                    "project.command.read",
                    "project.command.write",
                    "project.file.read",
                    "project.file.write",
                    "project.settings.write",
                    "project.sandbox.write",
                    "project.model.read",
                    "project.model.write",
                    "project.gitops.read",
                    "project.gitops.push",
                    "project.gitops.merge",
                    "project.gitops.ref.any",
                    "project.gitops.ref.delete",
                    "project.secret.read",
                    "project.secret.write",
                    "project.connector.read",
                    "project.connector.connections.manage",
                    "project.connector.write",
                    "project.app.read",
                    "project.app.write",
                    "project.app.deploy",
                    "project.app.admin",
                    "project.review.read",
                    "project.review.submit",
                    "project.review.act",
                    "project.credentials.issue",
                    "project.cr.open",
                    "project.cr.merge",
                    "project.customize.read",
                    "project.customize.write",
                    "*"
                  ]
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ]
          },
          "beeuni_cli": {
            "description": "Deprecated alias for beeuni_permissions.",
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "project.read",
                    "project.write",
                    "project.delete",
                    "project.session.read",
                    "project.session.start",
                    "project.session.stop",
                    "project.session.bindings.write",
                    "project.members.read",
                    "project.members.manage",
                    "project.trigger.read",
                    "project.trigger.create",
                    "project.trigger.update",
                    "project.trigger.delete",
                    "project.trigger.fire",
                    "project.gateway.logs.read",
                    "project.gateway.spend.read",
                    "project.usage.read",
                    "project.gateway.budget.set",
                    "project.gateway.keys.manage",
                    "project.agent.read",
                    "project.agent.write",
                    "project.skill.read",
                    "project.skill.write",
                    "project.command.read",
                    "project.command.write",
                    "project.file.read",
                    "project.file.write",
                    "project.settings.write",
                    "project.sandbox.write",
                    "project.model.read",
                    "project.model.write",
                    "project.gitops.read",
                    "project.gitops.push",
                    "project.gitops.merge",
                    "project.gitops.ref.any",
                    "project.gitops.ref.delete",
                    "project.secret.read",
                    "project.secret.write",
                    "project.connector.read",
                    "project.connector.connections.manage",
                    "project.connector.write",
                    "project.app.read",
                    "project.app.write",
                    "project.app.deploy",
                    "project.app.admin",
                    "project.review.read",
                    "project.review.submit",
                    "project.review.act",
                    "project.credentials.issue",
                    "project.cr.open",
                    "project.cr.merge",
                    "project.customize.read",
                    "project.customize.write",
                    "*"
                  ]
                }
              },
              {
                "type": "string",
                "enum": [
                  "all",
                  "*",
                  "none"
                ]
              }
            ],
            "deprecated": true
          },
          "repository_access": {
            "type": "boolean",
            "description": "Allow new sessions to access the project repository. Defaults to true."
          },
          "workspace": {
            "type": "string",
            "enum": [
              "runtime",
              "read",
              "branch"
            ],
            "deprecated": true
          },
          "harnesses": {
            "type": "object",
            "properties": {
              "opencode": {
                "type": "object",
                "properties": {
                  "plugins": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-zA-Z0-9_-]+\\.[cm]?[jt]s$"
                    }
                  },
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^[a-zA-Z0-9_-]+\\.[cm]?[jt]s$"
                    }
                  }
                },
                "additionalProperties": false
              },
              "pi": {
                "type": "object",
                "properties": {
                  "packages": {
                    "type": "array",
                    "maxItems": 20,
                    "items": {
                      "oneOf": [
                        {
                          "type": "string",
                          "anyOf": [
                            {
                              "pattern": "^npm:(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*@\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$"
                            },
                            {
                              "pattern": "^\\.\\/(?!.*(^|\\/)\\.\\.(\\/|$))[^\\s:]+$"
                            }
                          ]
                        },
                        {
                          "type": "object",
                          "required": [
                            "source"
                          ],
                          "properties": {
                            "source": {
                              "type": "string",
                              "anyOf": [
                                {
                                  "pattern": "^npm:(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*@\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$"
                                },
                                {
                                  "pattern": "^\\.\\/(?!.*(^|\\/)\\.\\.(\\/|$))[^\\s:]+$"
                                }
                              ]
                            },
                            "extensions": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "skills": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "prompts": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "themes": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      ]
                    }
                  },
                  "exclude": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "anyOf": [
                        {
                          "pattern": "^(@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$"
                        },
                        {
                          "pattern": "^\\.\\/(?!.*(^|\\/)\\.\\.(\\/|$))[^\\s:]+$"
                        }
                      ]
                    }
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "required": [
                "workspace"
              ],
              "properties": {
                "workspace": {
                  "const": "branch"
                }
              }
            },
            "then": {
              "properties": {
                "repository_access": {
                  "const": true
                }
              }
            }
          },
          {
            "if": {
              "required": [
                "workspace"
              ],
              "properties": {
                "workspace": {
                  "enum": [
                    "runtime",
                    "read"
                  ]
                }
              }
            },
            "then": {
              "properties": {
                "repository_access": {
                  "const": false
                }
              }
            }
          }
        ]
      }
    },
    "imports": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^(?![/\\s])(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)[^\\\\*?\\[\\]{}]*[^\\\\*?\\[\\]{}\\s/]/?$"
      }
    },
    "project": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "description": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "env": {
      "type": "object",
      "properties": {
        "required": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
          }
        },
        "optional": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
          }
        }
      },
      "additionalProperties": true
    },
    "opencode": {
      "type": "object",
      "properties": {
        "config_dir": {
          "type": "string",
          "minLength": 1,
          "not": {
            "pattern": "^/|(^|/)\\.\\.($|/)"
          },
          "description": "Directory with the OpenCode-only files (opencode.jsonc, plugins/, tools/). Defaults to harnesses/opencode, then the legacy .beeuni/opencode."
        }
      },
      "additionalProperties": true
    },
    "sandbox": {
      "type": "object",
      "properties": {
        "image": false,
        "dockerfile": false,
        "slug": false,
        "cpu": false,
        "memory": false,
        "disk": false,
        "entrypoint": false,
        "context": false,
        "context_dir": false,
        "gpu": false,
        "templates": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "slug"
            ],
            "properties": {
              "slug": {
                "allOf": [
                  {
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
                  },
                  {
                    "not": {
                      "const": "default"
                    }
                  }
                ]
              },
              "name": {
                "type": "string"
              },
              "entrypoint": {
                "type": "string"
              },
              "image": {
                "type": "string",
                "minLength": 1
              },
              "dockerfile": {
                "type": "string",
                "minLength": 1,
                "not": {
                  "pattern": "^/|(^|/)\\.\\.($|/)"
                }
              },
              "cpu": {
                "type": "integer",
                "minimum": 1
              },
              "memory": {
                "type": "integer",
                "minimum": 1
              },
              "disk": {
                "type": "integer",
                "minimum": 1
              },
              "container_runtime": {
                "type": "boolean"
              }
            },
            "oneOf": [
              {
                "required": [
                  "image"
                ],
                "not": {
                  "required": [
                    "dockerfile"
                  ]
                }
              },
              {
                "required": [
                  "dockerfile"
                ],
                "not": {
                  "required": [
                    "image"
                  ]
                }
              }
            ]
          }
        },
        "default": {
          "type": "string",
          "minLength": 1
        }
      },
      "additionalProperties": true
    },
    "sandboxes": false,
    "triggers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "slug",
          "type"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
          },
          "type": {
            "type": "string",
            "enum": [
              "cron",
              "webhook",
              "monitor",
              "event"
            ]
          },
          "name": {
            "type": "string"
          },
          "agent": {
            "type": "string",
            "minLength": 1
          },
          "agent_name": {
            "type": "string",
            "minLength": 1
          },
          "enabled": {
            "oneOf": [
              {
                "type": "boolean"
              },
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]|1|0|[yY][eE][sS]|[nN][oO]|[oO][nN]|[oO][fF][fF])$"
              }
            ]
          },
          "session_mode": {
            "type": "string",
            "enum": [
              "fresh",
              "reuse",
              "pinned",
              "keyed"
            ]
          },
          "session_key": {
            "type": "string"
          },
          "sessionKey": {
            "type": "string"
          },
          "filter": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "sessionMode": {
            "type": "string",
            "enum": [
              "fresh",
              "reuse",
              "pinned",
              "keyed"
            ]
          },
          "session_id": {
            "type": "string",
            "minLength": 1
          },
          "sessionId": {
            "type": "string",
            "minLength": 1
          },
          "prompt": {
            "type": "string",
            "minLength": 1
          },
          "prompt_template": {
            "type": "string",
            "minLength": 1
          },
          "cron": {
            "type": "string",
            "minLength": 1
          },
          "schedule": {
            "type": "string",
            "minLength": 1
          },
          "run_at": {
            "type": "string",
            "minLength": 1
          },
          "runAt": {
            "type": "string",
            "minLength": 1
          },
          "timezone": {
            "type": "string"
          },
          "secret_env": {
            "type": "string",
            "pattern": "^[A-Z_][A-Z0-9_]*$"
          },
          "secretEnv": {
            "type": "string",
            "pattern": "^[A-Z_][A-Z0-9_]*$"
          },
          "run": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          },
          "mode": {
            "type": "string",
            "enum": [
              "poll",
              "stream"
            ]
          },
          "interval": {
            "type": "string",
            "pattern": "^([1-9][0-9]*)(s|m|h|d)$"
          },
          "expect_event_within": {
            "type": "string",
            "pattern": "^([1-9][0-9]*)(s|m|h|d)$"
          },
          "connector": {
            "type": "string",
            "minLength": 1
          },
          "account": {
            "type": "string",
            "minLength": 1
          },
          "source": {
            "type": "string",
            "minLength": 1
          },
          "event": {
            "type": "string",
            "minLength": 1
          },
          "config": {
            "type": "object"
          }
        },
        "additionalProperties": true,
        "allOf": [
          {
            "anyOf": [
              {
                "required": [
                  "prompt"
                ]
              },
              {
                "required": [
                  "prompt_template"
                ]
              }
            ]
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "cron"
                }
              }
            },
            "then": {
              "anyOf": [
                {
                  "required": [
                    "cron"
                  ]
                },
                {
                  "required": [
                    "schedule"
                  ]
                },
                {
                  "required": [
                    "run_at"
                  ]
                },
                {
                  "required": [
                    "runAt"
                  ]
                }
              ]
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "webhook"
                }
              }
            },
            "then": {
              "anyOf": [
                {
                  "required": [
                    "secret_env"
                  ]
                },
                {
                  "required": [
                    "secretEnv"
                  ]
                }
              ]
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "monitor"
                }
              }
            },
            "then": {
              "required": [
                "run",
                "mode"
              ],
              "properties": {
                "cron": false,
                "schedule": false,
                "run_at": false,
                "runAt": false,
                "timezone": false,
                "secret_env": false,
                "secretEnv": false
              }
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "event"
                }
              }
            },
            "then": {
              "required": [
                "connector",
                "event"
              ],
              "properties": {
                "cron": false,
                "schedule": false,
                "run_at": false,
                "runAt": false,
                "timezone": false,
                "secret_env": false,
                "secretEnv": false,
                "run": false,
                "mode": false,
                "interval": false,
                "expect_event_within": false
              }
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "enum": [
                    "cron",
                    "webhook",
                    "monitor"
                  ]
                }
              },
              "required": [
                "type"
              ]
            },
            "then": {
              "properties": {
                "connector": false,
                "account": false,
                "source": false,
                "event": false,
                "config": false
              }
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "monitor"
                },
                "mode": {
                  "const": "poll"
                }
              },
              "required": [
                "mode"
              ]
            },
            "then": {
              "required": [
                "interval"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "monitor"
                },
                "mode": {
                  "const": "stream"
                }
              },
              "required": [
                "mode"
              ]
            },
            "then": {
              "properties": {
                "interval": false
              }
            }
          }
        ]
      }
    },
    "connectors": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "slug",
          "provider"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "provider": {
            "type": "string",
            "enum": [
              "pipedream",
              "composio",
              "mcp",
              "openapi",
              "postman",
              "graphql",
              "http",
              "channel"
            ]
          },
          "app": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "endpoint": {
            "type": "string"
          },
          "base_url": {
            "type": "string"
          },
          "baseUrl": {
            "type": "string"
          },
          "transport": {
            "type": "string",
            "enum": [
              "http",
              "sse"
            ]
          },
          "spec": {
            "type": "string"
          },
          "platform": {
            "type": "string",
            "enum": [
              "slack",
              "teams",
              "email"
            ]
          },
          "credential": {
            "const": "shared"
          },
          "authorization_strategy": {
            "type": "string",
            "enum": [
              "project",
              "user"
            ],
            "default": "project"
          },
          "agent_scope": false,
          "auth": {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "bearer",
                  "basic",
                  "custom",
                  "api_key",
                  "oauth1",
                  "hmac",
                  "aws_sigv4",
                  "mtls",
                  "none"
                ]
              },
              "secret": false
            },
            "additionalProperties": true
          },
          "headers": {
            "type": "object",
            "maxProperties": 32,
            "propertyNames": {
              "pattern": "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
              "maxLength": 128
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 2048,
              "pattern": "^[^\\r\\n]*$"
            }
          },
          "policies": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "match",
                "action"
              ],
              "properties": {
                "match": {
                  "type": "string",
                  "minLength": 1
                },
                "action": {
                  "type": "string",
                  "enum": [
                    "always_run",
                    "require_approval",
                    "block"
                  ]
                }
              }
            }
          }
        },
        "additionalProperties": true,
        "allOf": [
          {
            "if": {
              "properties": {
                "slug": {
                  "const": "beeuni_slack"
                }
              }
            },
            "then": {
              "properties": {
                "provider": {
                  "const": "channel"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "slug": {
                  "const": "beeuni_teams"
                }
              }
            },
            "then": {
              "properties": {
                "provider": {
                  "const": "channel"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "slug": {
                  "const": "beeuni_email"
                }
              }
            },
            "then": {
              "properties": {
                "provider": {
                  "const": "channel"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "slug": {
                  "const": "computer"
                }
              }
            },
            "then": {
              "properties": {
                "provider": {
                  "const": "computer"
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "pipedream"
                }
              }
            },
            "then": {
              "required": [
                "app"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "mcp"
                }
              }
            },
            "then": {
              "required": [
                "url"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "graphql"
                }
              }
            },
            "then": {
              "required": [
                "endpoint"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "http"
                }
              }
            },
            "then": {
              "anyOf": [
                {
                  "required": [
                    "base_url"
                  ]
                },
                {
                  "required": [
                    "baseUrl"
                  ]
                }
              ]
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "channel"
                }
              }
            },
            "then": {
              "required": [
                "platform"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "provider": {
                  "const": "channel"
                }
              },
              "required": [
                "auth"
              ]
            },
            "then": {
              "properties": {
                "auth": {
                  "properties": {
                    "type": {
                      "const": "none"
                    }
                  }
                }
              }
            }
          }
        ]
      }
    },
    "apps": {
      "type": "object",
      "propertyNames": {
        "pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "minLength": 1,
            "not": {
              "pattern": "^/|(^|/)\\.\\.($|/)"
            }
          },
          "type": {
            "type": "string",
            "enum": [
              "static",
              "bundle",
              "dockerfile",
              "oci_image"
            ]
          },
          "image": {
            "type": "string",
            "minLength": 1
          },
          "dockerfile": {
            "type": "string",
            "minLength": 1,
            "not": {
              "pattern": "^/|(^|/)\\.\\.($|/)"
            }
          },
          "command": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "port": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535,
            "not": {
              "enum": [
                7331,
                8080
              ]
            }
          },
          "root": {
            "type": "string",
            "minLength": 1,
            "not": {
              "pattern": "^/|(^|/)\\.\\.($|/)"
            }
          },
          "output_dir": {
            "type": "string",
            "minLength": 1,
            "not": {
              "pattern": "^/|(^|/)\\.\\.($|/)"
            }
          },
          "install_command": {
            "type": "string",
            "minLength": 1
          },
          "build_command": {
            "type": "string",
            "minLength": 1
          },
          "spa": {
            "type": "boolean"
          },
          "readiness_path": {
            "type": "string",
            "pattern": "^/"
          },
          "idle_timeout_seconds": {
            "type": "integer",
            "minimum": 120,
            "maximum": 86400
          },
          "always_on": {
            "type": "boolean"
          },
          "uses": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$"
            }
          },
          "resources": {
            "type": "object",
            "properties": {
              "cpu": {
                "type": "integer",
                "minimum": 1,
                "maximum": 64
              },
              "memory_gb": {
                "type": "integer",
                "minimum": 1,
                "maximum": 512
              },
              "disk_gb": {
                "type": "integer",
                "minimum": 1,
                "maximum": 2048
              }
            },
            "additionalProperties": false
          },
          "env": {
            "type": "object",
            "propertyNames": {
              "pattern": "^[A-Z_][A-Z0-9_]*$"
            },
            "additionalProperties": {
              "type": "string",
              "minLength": 1
            }
          },
          "secrets": {
            "type": "object",
            "propertyNames": {
              "pattern": "^[A-Z_][A-Z0-9_]*$"
            },
            "additionalProperties": {
              "type": "string",
              "minLength": 1
            }
          },
          "processes": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "http_service": {
            "type": "object",
            "properties": {
              "internal_port": {
                "type": "integer",
                "minimum": 1,
                "maximum": 65535,
                "not": {
                  "enum": [
                    7331,
                    8080
                  ]
                }
              },
              "protocol": {
                "type": "string",
                "enum": [
                  "http",
                  "tcp"
                ]
              },
              "access": {
                "type": "string",
                "enum": [
                  "public",
                  "app",
                  "admins"
                ]
              },
              "auto_stop_machines": {
                "type": "string",
                "enum": [
                  "off",
                  "stop",
                  "suspend"
                ]
              },
              "auto_start_machines": {
                "type": "boolean"
              },
              "min_machines_running": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "processes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "http",
                        "tcp"
                      ]
                    },
                    "port": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 65535
                    },
                    "path": {
                      "type": "string",
                      "pattern": "^/"
                    },
                    "interval_s": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 3600
                    },
                    "timeout_s": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 600
                    },
                    "grace_period_s": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 3600
                    }
                  },
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "services": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9-]{0,30}$"
                },
                "internal_port": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 65535,
                  "not": {
                    "enum": [
                      7331,
                      8080
                    ]
                  }
                },
                "protocol": {
                  "type": "string",
                  "enum": [
                    "http",
                    "tcp"
                  ]
                },
                "access": {
                  "type": "string",
                  "enum": [
                    "public",
                    "app",
                    "admins"
                  ]
                },
                "auto_stop_machines": {
                  "type": "string",
                  "enum": [
                    "off",
                    "stop",
                    "suspend"
                  ]
                },
                "auto_start_machines": {
                  "type": "boolean"
                },
                "min_machines_running": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100
                },
                "processes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "checks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "enum": [
                          "http",
                          "tcp"
                        ]
                      },
                      "port": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 65535
                      },
                      "path": {
                        "type": "string",
                        "pattern": "^/"
                      },
                      "interval_s": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 3600
                      },
                      "timeout_s": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 600
                      },
                      "grace_period_s": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 3600
                      }
                    },
                    "additionalProperties": false
                  }
                }
              },
              "required": [
                "name",
                "internal_port"
              ],
              "additionalProperties": false
            }
          },
          "mounts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string",
                  "pattern": "^[a-z0-9_]{1,30}$"
                },
                "destination": {
                  "type": "string",
                  "pattern": "^/.+[^/]$"
                },
                "initial_size_gb": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 100
                },
                "snapshot_retention_days": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 60
                },
                "processes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "source",
                "destination"
              ],
              "additionalProperties": false
            }
          },
          "vm": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "cpu": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 32
                  },
                  "memory_gb": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 128
                  },
                  "disk_gb": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 500
                  },
                  "processes": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "cpu": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 32
                    },
                    "memory_gb": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 128
                    },
                    "disk_gb": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 500
                    },
                    "processes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "additionalProperties": false
                }
              }
            ]
          },
          "deploy": {
            "type": "object",
            "properties": {
              "strategy": {
                "type": "string",
                "enum": [
                  "rolling",
                  "immediate",
                  "bluegreen",
                  "canary"
                ]
              },
              "release_command": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "labels": {
            "type": "array",
            "maxItems": 10,
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9][a-z0-9-]{0,30}$"
            }
          }
        },
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "type": {
                  "enum": [
                    "dockerfile",
                    "oci_image"
                  ]
                }
              },
              "required": [
                "type"
              ]
            },
            "then": {
              "required": [
                "command"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "type": {
                  "const": "oci_image"
                }
              },
              "required": [
                "type"
              ]
            },
            "then": {
              "required": [
                "image"
              ]
            }
          }
        ]
      }
    },
    "pi": {
      "type": "object",
      "properties": {
        "config_dir": {
          "type": "string",
          "minLength": 1,
          "not": {
            "pattern": "^/|(^|/)\\.\\.($|/)"
          },
          "description": "Directory with the OpenCode-only files (opencode.jsonc, plugins/, tools/). Defaults to harnesses/opencode, then the legacy .beeuni/opencode."
        }
      },
      "additionalProperties": true,
      "description": "Pi native config directory (defaults to harnesses/pi, then .beeuni/pi)."
    },
    "channels": false
  },
  "additionalProperties": true,
  "$defs": {
    "agentMdFrontmatter": {
      "type": "object",
      "description": "OpenCode behavior for one agent — lives in .beeuni/opencode/agents/<name>.md frontmatter, never in the manifest. Provided here as an authoring aid; not itself part of beeuni.yaml.",
      "properties": {
        "description": {
          "type": "string"
        },
        "model": {
          "type": "string"
        },
        "mode": {
          "type": "string",
          "enum": [
            "primary",
            "subagent",
            "all"
          ]
        },
        "variant": {
          "type": "string"
        },
        "temperature": {
          "type": "number"
        },
        "top_p": {
          "type": "number"
        },
        "steps": {
          "type": "integer",
          "minimum": 1
        },
        "color": {
          "oneOf": [
            {
              "type": "string",
              "pattern": "^#[0-9a-fA-F]{6}$"
            },
            {
              "type": "string",
              "enum": [
                "primary",
                "secondary",
                "accent",
                "success",
                "warning",
                "error",
                "info"
              ]
            }
          ]
        },
        "hidden": {
          "type": "boolean"
        },
        "disable": {
          "type": "boolean"
        },
        "options": {
          "type": "object"
        },
        "permission": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "ask",
                "allow",
                "deny"
              ]
            },
            {
              "type": "object",
              "properties": {
                "todowrite": {
                  "type": "string",
                  "enum": [
                    "ask",
                    "allow",
                    "deny"
                  ]
                },
                "question": {
                  "type": "string",
                  "enum": [
                    "ask",
                    "allow",
                    "deny"
                  ]
                },
                "webfetch": {
                  "type": "string",
                  "enum": [
                    "ask",
                    "allow",
                    "deny"
                  ]
                },
                "websearch": {
                  "type": "string",
                  "enum": [
                    "ask",
                    "allow",
                    "deny"
                  ]
                },
                "doom_loop": {
                  "type": "string",
                  "enum": [
                    "ask",
                    "allow",
                    "deny"
                  ]
                }
              },
              "additionalProperties": {
                "oneOf": [
                  {
                    "type": "string",
                    "enum": [
                      "ask",
                      "allow",
                      "deny"
                    ]
                  },
                  {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "ask",
                        "allow",
                        "deny"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      },
      "additionalProperties": true
    }
  }
}
