# Referenca manifesta

Svaki ključ beeuni.yaml v2, sa podrazumevanim vrednostima, ograničenjima i pravilima validacije.

Canonical page: https://beeuni.ai/docs/sr/project/manifest

Манифест је датотека коју платформа сматра меродавном за пројекат. На овој страници наведени су сви кључеви `beeuni.yaml` (v2), њихови типови и подразумеване вредности, као и начин на који их платформа валидира. За верзију једноставнијим језиком погледајте [Ваш пројекат](/docs/sr/project).

<a id="two-configuration-surfaces"></a>

## Две површине конфигурације

Beeuni пројекат има две површине конфигурације са строгим, међусобно искључивим надлежностима.

- **Beeuni конфигурација** — `beeuni.yaml` у корену репозиторијума дефинише окружење пројекта, агенте, алате, конекторе и окидаче. Sandbox шаблони могу да користе сопствени Dockerfile.
- **Конфигурација агента** — датотеке агента, вештине и датотеке harness-а. Њих чита harness агента, у sandbox-у и локално.

| Путања | Садржај |
| --- | --- |
| `beeuni.yaml` | Манифест: агенти и чему сваки може да приступи, окидачи, конектори, env, шаблони sandbox-а. |
| `agents/<name>.md` | Један агент: frontmatter и системски упит. Именује га `agents.<name>.file`. |
| `skills/<name>/SKILL.md` | Једна вештина. Учитавају је сви harness-и. |
| `memory/` | Меморија пројекта. |
| `tools/<name>.ts` | Алати пројекта, по један модул за сваки. Декларише их `tools:`; покрећу их сви harness-и. Погледајте [Алати](/docs/sr/project/tools). |
| `harnesses/opencode/` | Датотеке које чита само стандардни harness: `opencode.jsonc`, `plugins/`, `tools/`, `commands/`. `opencode.config_dir` упућује овде. |

Пројекти настали пре 2026-09 чувају агенте и вештине у `.beeuni/opencode/`, а меморију у `.beeuni/memory/`. Beeuni чита оба распореда.

Спој између ова два дела је датотека `.md` агента. Кључ манифеста `agents.<name>` управља датотеком коју именује `agents.<name>.file`, или `agents/<name>.md` ако је `file` изостављен. Сва поља понашања налазе се искључиво у frontmatter-у и телу те датотеке `.md`, никада у `beeuni.yaml`:

- системски упит
- `model`, `mode`
- `temperature`, `top_p`
- `steps`, `permission`

Блок манифеста `agents:` задаје само правила управљања: који агенти могу да се покрену и чему сваки од њих може да приступи. Валидатор то спроводи. Одбацује блок v2 агента који садржи било које поље понашања, уз грешку која упућује на сопствену датотеку `.md` агента.

<a id="location-and-versions"></a>

## Локација и верзије

Сваки репозиторијум са важећим манифестом у корену је Beeuni пројекат. `beeuni.yaml` (v2, само YAML) је тренутни формат за нове пројекте, које креира веб-ток „Create project“ и `beeuni init`. `beeuni.toml` (v1) и даље ради за постојеће пројекте, али платформа за њега не прихвата нове функције v2. За шему v1 и кораке миграције са v1 на v2 погледајте [Застарели TOML](/docs/sr/project/legacy-toml).

`beeuni_version: 2` захтева YAML — датотека `.toml` која декларише `beeuni_version: 2` не пролази валидацију. Манифест који декларише верзију већу од `2` одмах се одбацује, тако да платформа никада не протумачи погрешно неко будуће поље. Непознати кључеви највишег нивоа се игноришу, па у датотеку можете да сместите сопствене метаподатке.

`validateManifest()` је јединствени пролаз који стоји иза `beeuni ship`, провере спајања захтева за измену и `beeuni validate`. Свуда важе иста правила, па је све што се споји у `main` структурно исправно. Шема је јавна и генерише се из истог пакета:

- [`beeuni.v2.schema.json`](/schema/beeuni.v2.schema.json)
- [`beeuni.v1.schema.json`](/schema/beeuni.v1.schema.json)
- [`beeuni.schema.json`](/schema/beeuni.schema.json) (бира на основу `beeuni_version`)

Усмерите `beeuni.yaml` на шему v2 ради валидације у уређивачу или је преузмите преко CLI-ја:

```yaml
# yaml-language-server: $schema=https://beeuni.ai/schema/beeuni.v2.schema.json
beeuni_version: 2
```

```bash
beeuni schema --version 2
```

<a id="full-example"></a>

## Потпун пример

```yaml
beeuni_version: 2
default_agent: beeuni

project:
  name: my-project
  description: What this project is.

env:
  required: [DATABASE_URL]
  optional: [STRIPE_API_KEY, WEBHOOK_SLACK_SECRET]

sandbox:
  templates:
    - slug: ml
      name: ML Development
      dockerfile: Dockerfile.ml
      cpu: 4
      memory: 16

opencode:
  config_dir: harnesses/opencode

agents:
  beeuni:
    file: agents/beeuni.md
    connectors: all
    secrets: all
    beeuni_permissions: all
    skills: all

  release-bot:
    file: agents/release-bot.md
    sandbox: ml
    connectors: [github]
    beeuni_permissions: [project.gitops.push]
    secrets: [GITHUB_AGENT_TOKEN]

triggers:
  - slug: daily-digest
    type: cron
    agent: beeuni
    cron: '0 0 9 * * 1-5'
    timezone: America/Los_Angeles
    prompt: |
      Summarize yesterday's commits. Open a CR against main.
```

<a id="top-level-keys"></a>

## Кључеви највишег нивоа

| Кључ                                                 | Обавезно | Напомене                                                                                      |
| --------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ |
| `beeuni_version`                                    | да      | мора бити `2`                                                                                |
| `default_agent`                                     | да      | мора да именује декларисаног, омогућеног агента                                                        |
| `imports`                                           | не       | друге YAML датотеке или директоријуми чији се `triggers`, `connectors`, `agents`, `apps` и `tools` спајају у овај манифест. Погледајте [`imports:`](#imports) |
| `tools`                                             | не       | алати доступни свакој сесији: назив алата → путања модула релативна у односу на репозиторијум или `beeuni:<name>` за Beeuni алат. Уз кључ `tools`, сесије добијају само Beeuni алате наведене у њему. Покрећу их сви harness-и. Погледајте [`tools:`](#tools) |
| `runtime`                                           | не       | `"opencode"` (подразумевано) или `"pi"` — harness агента који се покреће унутар sandbox-а сесије; `pi` покреће експериментални harness у истом процесу као демон sandbox-а и чита исте датотеке агента `.md` и вештине. Заставица функције `pi_harness` пројекта бира експериментални harness без овог реда. За експериментални harness је потребна заставица `llm_gateway`; без ње сесија покреће стандардни harness. |
| `harnesses.pi.packages`                             | не       | експериментални harness пакети које учитавају експериментални harness сесије пројекта. Погледајте [`harnesses:`](#harnesses) |
| `pi.config_dir`                                    | не       | `harnesses/pi`, затим `.beeuni/pi` ако постоји. експериментални harness-изворни `settings.json`, `extensions/`, `skills/` и `prompts/`. |
| `project.name` / `project.description`              | не       | метаподаци за приказ; платформа не чита `project.name` за назив пројекта који се приказује |
| `env.required` / `env.optional`                     | не       | називи env променљивих; `required` служи само као смерница и никада се не намеће при покретању сесије                |
| `sandbox` / `sandbox.templates` / `sandbox.default` | не       | слика(е) sandbox-а и хардвер                                                              |
| `opencode.config_dir`                               | не       | подразумевани `harnesses/opencode`, затим застарели `.beeuni/opencode`                           |
| `triggers`                                          | не       | листа cron, webhook и monitor окидача                                                |
| `connectors`                                        | не       | листа дефиниција конектора                                                              |
| `policy.default_mode`                               | не       | `allow_all` (подразумевано) или `risk`; режим одобравања конектора за цео пројекат                      |
| `agents`                                            | да      | мапа управљања називима и блоковима; не сме бити празна. Уз `imports`, мапа може да се налази у увезеној датотеци |

## `imports:`

Поделите један манифест на више YAML датотека. Користите ово када `beeuni.yaml` прерасте један екран: 30 окидача са вишередним упитима, конектор за сваки тим, по једна датотека за сваку групу агената.

```yaml
# beeuni.yaml
beeuni_version: 2
default_agent: beeuni
imports:
  - triggers/                # a directory: every .yaml and .yml file below it
  - agents.yaml              # a single file
agents:
  beeuni:
    connectors: all
```

```text
beeuni.yaml
agents.yaml
triggers/
  reports/
    weekly.yaml
    monthly.yaml
  dockets/
    freedom-forever.yaml
```

```yaml
# triggers/reports/weekly.yaml
triggers:
  - slug: weekly-report
    name: Cross-Sector Weekly Report
    type: cron
    agent: galileo
    cron: "0 15 * * 0"
    prompt: |-
      Build the weekly report.
```

Коренска датотека и њени увози чине једну конфигурацију пројекта. Окидач у једној датотеци може да именује агента декларисаног у другој.

**Правила**

1. Putanja je relativna u odnosu na koren repozitorijuma. `..`, apsolutne putanje i glob obrasci se odbacuju.
2. Uvoz direktorijuma obuhvata sve datoteke `.yaml` i `.yml` u njemu i svim poddirektorijumima, sortirane po putanji. Ostale datoteke se preskaču.
3. Uvezena datoteka definiše `triggers`, `connectors`, `agents`, `apps`, `tools` i `imports`. Svi ostali ključevi (`beeuni_version`, `default_agent`, `runtime`, `project`, `env`, `opencode`, `sandbox`, `policy`, `policies`) ostaju у коренској датотеци. Ако уvezена датотека постави неки од њих, валидација не успева.
4. Увезена датотека може да увози друге датотеке. Ограничење је 8 нивоа и 200 датотека. Циклус је грешка. Датотека до које се стигне више пута спаја се само једном.
5. Једно име, једна датотека. Ако су окидач, конектор, агент, апликација или алат са истим именом дефинисани у две датотеке, то је грешка у којој се наводе обе датотеке. Ништа се не преписује без упозорења.
6. Ставке се спајају редом: прво датотека која увози, затим њене увезене датотеке наведеним редоследом.

Неисправан увоз поништава цео манифест, као и синтаксна грешка у YAML-у. `beeuni validate`, `beeuni ship` и провера спајања захтева за измену пријављују грешку пре него што стигне до `main`:

```text
imports: triggers "weekly-report" is declared in both triggers/a.yaml and triggers/b.yaml — one name, one file
```

**Измене се уписују у датотеку у којој је ставка дефинисана.** Када контролна табла, API или `beeuni triggers enable|disable|rm` измени окидач, конектор, агента или апликацију дефинисану у увезеној датотеци, уписује се само та датотека. Коренска датотека се не преписује. Нова ставка се уписује у коренску датотеку. Ако желите да буде у увезеној датотеци, преместите је ручно.

`imports` захтева `beeuni.yaml`. Манифест који је `beeuni.toml` игнорише кључ.

## `tools:`

Алати који су доступни сесији, наведени по имену. Вредност има један од два облика:

| Облик | Значење |
| --- | --- |
| `beeuni:<name>` | Beeuni алат (`web_search`, `image_search`, `scrape_webpage`, `memory`, `show`), чије одржавање води Beeuni. Кључ мора бити `<name>`. |
| Путања до модула релативна у односу на корен репозиторијума | Алат самог пројекта, у било којој фасцикли. Ако се наведе под именом Beeuni алата, модул замењује Beeuni алат. |

```yaml
tools:
  web_search: beeuni:web_search
  image_search: beeuni:image_search
  scrape_webpage: beeuni:scrape_webpage
  memory: tools/memory.ts                # replaces the Beeuni memory tool
  lookup_order: tools/lookup_order.ts
  crm_note: integrations/crm/note.ts
```

стандардни harness и експериментални harness покрећу исти модул. Уговор модула, `beeuni tools ls`,
`beeuni tools eject` и упутство за миграцију са `harnesses/opencode/tools/` налазе се у одељку
[Tools](/docs/sr/project/tools).

**Правило избора.**

- Нема кључа `tools` ни у коренској ни у било којој увезеној датотеци: сесије добијају свих пет Beeuni алата. Сваки пројекат направљен пре увођења ове листе задржава их.
- Постоји кључ `tools`, чак и ако је празан (`tools: {}` или `tools:` са обрисаним свим редовима): сесије добијају само Beeuni алате наведене у њему, као `beeuni:<name>` или као путању до модула. Рачуна се и кључ `tools` у увезеној датотеци.

Обришите ред `beeuni:<name>` да бисте уклонили тај алат за све агенте. Користите
[`agents.<name>.tools`](/docs/sr/project/tools#who-may-use-which-tool) да бисте ограничили алате за једног
агента.

**Грешке.**

- Име мора бити у snake_case формату: `^[a-z][a-z0-9_]{0,63}$`.
- Име алата из окружења за извршавање (`bash`, `read`, `write`, `edit`, `apply_patch`, `glob`, `grep`, `list`, `task`, `question`, `todowrite`, `webfetch`, `websearch`, `skill`, `lsp`, `invalid`, `execute`, `plan_exit`, `pty_*`) представља грешку.
- Путања се завршава са `.ts`, `.js`, `.mts`, `.mjs`, `.cts` или `.cjs`. Не сме да почиње са `/` или `-`, нити да садржи сегмент `.` или `..`.
- `beeuni:<name>` под другим кључем представља грешку. На пример, под именом Beeuni алата `web_search: beeuni:image_search`:

  ```text
  tools.web_search: мора бити `beeuni:web_search` (Beeuni алат) или путања релативна у односу на корен репозиторијума до .ts или .js модула (нпр. `tools/web_search.ts`) који га замењује.
  ```

- `beeuni:<name>` за име које није име Beeuni алата представља грешку, на пример `web_serch: beeuni:web_serch`:

  ```text
  tools.web_serch: мора бити путања релативна у односу на корен репозиторијума до .ts или .js модула (нпр. `tools/web_serch.ts`). `beeuni:<name>` именује Beeuni алат под његовим именом: `web_search: beeuni:web_search`, `image_search: beeuni:image_search`, `scrape_webpage: beeuni:scrape_webpage`, `memory: beeuni:memory`, `show: beeuni:show`.
  ```

- `beeuni validate` пријављује и дефинисани модул који не постоји. Вредност `beeuni:` не захтева датотеку.

**Упозорења.** Упозорење никада не доводи до неуспеха `beeuni validate`.

- Кључ `tools` у ком није наведен ниједан од пет Beeuni алата:

  ```text
  tools: Сесије овог пројекта не добијају ниједан Beeuni алат (web_search, image_search, scrape_webpage, memory, show). Додајте `<name>: beeuni:<name>` да бисте задржали неки алат.
  ```

  Ово открива случај када пројекат дода свој први алат и случајно уклони свих пет подразумеваних.
- Вредност `tools` агента која именује Beeuni алат који пројекат не учитава:

  ```text
  agents.beeuni.tools: „show“ је Beeuni алат који овај пројекат не учитава: додајте `show: beeuni:show` у највиши ниво `tools` или га овде уклоните.
  ```

## `project:`

Опционални метаподаци намењени људима: `name` и `description`. Платформа не користи ову табелу ни за шта — назив пројекта који се приказује преузима се из његовог записа у бази података. Сматрајте је документацијом за оне који читају репозиторијум.

## `env:`

Наводи имена променљивих окружења које су потребне вашим сесијама. Вредности се чувају на страници Environment variables у контролној табли, никада у самом манифесту. Платформа их дешифрује и убризгава као обичне променљиве окружења при покретању сесије.

```yaml
env:
  required: [DATABASE_URL]
  optional: [STRIPE_API_KEY]
```

| Поље      | Тип       | Напомене                                                                                                    |
| ---------- | ---------- | -------------------------------------------------------------------------------------------------------- |
| `required` | `string[]` | Информативно. Контролна табла тражи од корисника ове вредности, али покретање сесије се не блокира ако нека вредност недостаје. |
| `optional` | `string[]` | Доступно сесијама ако је постављено. Није проблем ако изостаје.                                                           |

Имена променљивих окружења морају одговарати `^[A-Z_][A-Z0-9_]*$`. Secrets Manager ограничава дужину имена на 64 знака — дуже име се овде успешно парсира, али за њега никада не може да се постави вредност. Ни имена која почињу са `BEEUNI_` не могу добити вредност. Имена нека имају највише 64 знака и избегавајте префикс `BEEUNI_`. Цео уговор: [Secrets](/docs/sr/project/secrets).

<a id="sandbox-and-sandboxtemplates"></a>

## `sandbox:` и `sandbox.templates`

Листа именованих слика окружења за изоловано извршавање које могу да се покрену. Опционо — ако нема ставки, свака сесија се покреће са подразумеваном сликом платформе. Сваки шаблон мора да садржи тачно једно од следећег: `dockerfile` (путања релативна у односу на корен репозиторијума) или `image` (јавна Docker референца, са верзијом или digest-ом који су фиксирани).

```yaml
sandbox:
  templates:
    - slug: ml
      name: ML Development
      dockerfile: Dockerfile.ml
      cpu: 4
      memory: 16
      disk: 50
```

| Поље | Тип | Подразумевано | Напомене |
| ------------ | ------ | ------------------- | --------------------------------------------------------------------------------- |
| `slug` | string | — | Обавезно. Јединствено за сваки пројекат. `default` је резервисано. |
| `name` | string | slug | Ознака која се приказује у бирачу на контролној табли. |
| `dockerfile` | string | — | Путања релативна у односу на репозиторијум. Не може да се користи истовремено са `image`. |
| `image` | string | — | Јавна Docker слика, са тачно наведеном ознаком или digest вредношћу. Не може да се користи истовремено са `dockerfile`. |
| `entrypoint` | string | сопствена вредност runtime слоја | Замена за улазну тачку контејнера. |
| `cpu` | int | подразумевано код провајдера | vCPU језгра. Опсег: 1–32. |
| `memory` | int | подразумевано код провајдера | RAM у GiB. Опсег: 1–128. |
| `disk` | int | подразумевано код провајдера | Диск у GiB. Опсег: 1–500. |
| `container_runtime` | bool | `false` | Покреће Docker у изолованом окружењу са bridge и overlay умрежавањем. Погледајте [Runtime](/docs/sr/work/runtime#docker-in-the-sandbox). |

Свака вредност мора бити позитиван цео број. Вредност испод минимума не пролази валидацију и јавља се грешка. Вредност изнад максимума пролази уз упозорење, а затим се при извршавању ограничава на максимум. GPU уређаји нису подржани — навођење `gpu` доводи до упозорења, не до грешке. Погледајте [Runtime](/docs/sr/work/runtime) да бисте сазнали шта runtime слој додаје вашој слици.

### `sandbox.default`

Поставите `default` у `sandbox` да бисте поставили један шаблон као подразумевани за цео пројекат. Свака сесија, окидач и канал ће га затим покренути без навођења slug вредности.

```yaml
sandbox:
  default: dev
  templates:
    - slug: dev
      dockerfile: Dockerfile.dev
```

`default` мора да именује шаблон наведен у овом манифесту или резервисану вредност `"default"` за слику платформе.

Агент може да изабере своје окружење помоћу `agents.<name>.sandbox`. Вредност мора да именује шаблон из манифеста или контролне табле, или `"default"`.

```yaml
agents:
  researcher:
    sandbox: ml
```

Шаблон за сесију се одређује овим редоследом:

1. Изричито наведен `sandbox_slug` сесије.
2. `sandbox` изабраног агента.
3. `sandbox.default` пројекта.
4. `"default"` платформе.

Cron окидачи, webhook окидачи, распореди и канали користе шаблон изабраног агента.

Измена спецификације (`cpu`, `memory`, `disk`, `container_runtime` или саме слике) поново прави снимак пројекта. Нова величина примењује се на следећу сесију, а не на ону која је већ покренута.

## `opencode:`

Локација директоријума за конфигурацију стандардни harness-а. Опционално, уз подразумевану вредност.

```yaml
opencode:
  config_dir: harnesses/opencode
```

| Поље | Тип | Подразумевано | Напомене |
| ------------ | ------ | ----------------------------------------------- | ------------------------ |
| `config_dir` | string | `harnesses/opencode`, па `.beeuni/opencode` | Директоријум релативан у односу на репозиторијум. |

Ако `config_dir` није постављено, Beeuni користи први од `harnesses/opencode` и `.beeuni/opencode` који садржи `opencode.json` или `opencode.jsonc`. Тај директоријум садржи само датотеке које чита стандардни harness: `opencode.jsonc`, `plugins/`, `tools/` и `commands/`. Агенти и вештине налазе се у корену репозиторијума, у `agents/` и `skills/`. `opencode.jsonc` остаје изворни регистар стандардни harness-а за додатке, MCP сервере, провајдере и дозволе — немојте те поставке дуплирати у манифесту. Погледајте [Agents](/docs/sr/project/agents).

## `harnesses:`

Подешавања за појединачни harness. `pi.config_dir` показује на директоријум експериментални harness конфигурације, изворне за експериментални harness и релативне у односу на репозиторијум (подразумевано: `harnesses/pi`, па `.beeuni/pi`). Директоријум се увози при покретању експериментални harness-ја. `pi.packages` је засебно подешавање: оно инсталира пакете из `harnesses.pi.packages` манифеста за сваког агента. Тренутно постоји један кључ пакета: `pi.packages`, пакети за експериментални harness које учитава свака експериментални harness сесија овог пројекта (`runtime: pi` или ознака `pi_harness`). Пакет може бити било шта са packages: додаци (алати, hook-ови, команде) и вештине и упити које пакет садржи.

```yaml
runtime: pi
harnesses:
  pi:
    packages:
      - npm:pi-web-access@0.30.0            # pinned extension version
      - source: npm:pi-mcp-adapter@2.36.0
        extensions: ["extensions/*.ts"]     # load only these files of the package
        skills: []                          # load none of its skills
      - ./harnesses/pi/audit.ts             # an extension file in this repository
```

| Формат уноса | Значење |
| --- | --- |
| `npm:<name>@<x.y.z>` | npm пакет са тачно одређеном верзијом. Опсег верзија или изостављена верзија не пролазе валидацију. |
| `./<path>` | Датотека додатка или директоријум пакета у овом репозиторијуму. Не сме да изађе из репозиторијума помоћу `..`. |
| `{ source, extensions, skills, prompts, themes }` | Исти извор са експериментални harness филтерима за укључивање/изузимање. Ако се филтер изостави, учитава се све; `[]` не учитава ништа. |

Највише 20 уноса. Git извори нису дозвољени.

<a id="per-agent"></a>

### По агенту

Агент може да дода своје пакете и изостави оне на највишем нивоу помоћу `agents.<name>.harnesses`:

```yaml
harnesses:
  pi:
    packages: [npm:pi-web-access@0.30.0]            # every agent
agents:
  researcher:
    harnesses:
      pi:
        packages: [npm:@juicesharp/rpiv-todo@2.11.0] # researcher only
  reviewer:
    harnesses:
      pi:
        exclude: [pi-web-access]                     # reviewer loads no web tools
```

- Пакети агента су листа са највишег нивоа, умањена за `exclude` агента, увећана за његове `packages`.
- Ако унос агента наводи пакет који је наведен и на највишем нивоу, за тог агента замењује унос са највишег нивоа (другом верзијом или другим филтерима).
- `exclude` наводи имена пакета (`pi-web-access`, `@scope/name`) или путање `./`, онако како су наведени на највишем нивоу. Верзија се никада не наводи.
- Свака јединствена листа пакета гради се једном. Агенти са истом листом деле ту верзију.
- Пакети припадају агенту са којим сесија почиње. Подагент који други агент покрене помоћу алата `task` користи само стандардне алате радног простора (`bash`, `read`, `write`, `edit`, `glob`, `grep`), а не своје пакете нити пакете надређеног агента; hook-ови додатака надређеног агента и даље се примењују на његове позиве. Покрените сесију са тим агентом да бисте користили његове пакете.

Како пакети стижу до сесије:

1. Спајање захтева за измену ове листе покреће једнократну изградњу пакета за sandbox платформу, без инсталационих скрипти. Сваки додатак се унапред уграђује у једну минимизовану датотеку. Изградња задржава остале датотеке пакета, осим кода који та датотека већ садржи, декларација типова, мапа изворног кода и датотека README и CHANGELOG у корену. Пројекти са истом листом деле исту изградњу.
2. Нова или поново покренута сесија преузима изграђени пакет док клонира свој репозиторијум и директно учитава сваки додатак. Сесија никада не покреће `npm install` нити компајлира пакет.
3. Пакет који не може да се унапред изгради (на пример, пакет чији `pi.extensions` користи glob обрасце) и даље ради: сесија га учитава из инсталираних пакета, али то траје дуже. Ако код пакета чита неку датотеку која се изоставља приликом изградње, додајте у његов унос филтер `extensions`: сесија ће га онда такође учитавати из инсталираних пакета.
4. Сесија која почне пре него што изградња постане доступна покреће се без пакета пројекта и започиње изградњу; следећа сесија ће их имати.

Beeuni такође инсталира скуп системских пакета у сваку експериментални harness сесију. Унос пројекта за исти пакет замењује системску верзију. Репозиторијум такође може да садржи експериментални harness додатке, изворне за експериментални harness, у `.pi/extensions/*.ts`; експериментални harness их учитава без уноса у манифесту.

Додаци раде без терминалског корисничког интерфејса: алати, hook-ови и команде функционишу; виџети намењени само терминалу не раде ништа.

## `triggers:`

Листа дефиниција за cron, webhook и надзор. Сваки унос покреће сесију која као прву поруку извршава `prompt`.

```yaml
triggers:
  - slug: daily-digest
    type: cron
    cron: '0 0 9 * * 1-5'
    prompt: Summarize yesterday's commits.
```

| Поље          | Обавезно              | Подразумевано          | Напомене                                                                                                 |
| -------------- | --------------------- | --------------------- | ----------------------------------------------------------------------------------------------------- |
| `slug`         | да                   | —                     | `[a-z0-9][a-z0-9_-]{0,127}`, јединствено међу окидачима.                                                   |
| `type`         | да                   | —                     | `cron`, `webhook` или `monitor` (експериментално).                                                       |
| `prompt`       | да                   | —                     | Не сме бити празно. Подржава шаблонизацију.                                                                       |
| `name`         | не                    | slug                  | Назив за приказ.                                                                                          |
| `agent`        | не                    | `default_agent`       | Мора да буде назив кључа у `agents:`. Изоставите га да бисте користили `default_agent`; немојте уписивати дословно `default`.      |
| `enabled`      | не                    | `true`                | `false` прескаче ставку.                                                                              |
| `model`        | не                    | разрешава се у тренутку активирања | Облик за пренос `provider/model`. Закачи активирану сесију за тај модел. Погледајте [Models](/docs/sr/project/models). |
| `session_mode` | не                    | `fresh`               | `fresh`, `reuse`, `pinned` или `keyed`.                                                               |
| `session_id`   | обавезно за `pinned` | —                     | Тачна сесија за поновно слање упита.                                                                           |

Cron окидачи захтевају тачно једно од поља `cron` (израз са 6 поља) или `run_at` (једнократна временска ознака ISO-8601), као и `timezone` као IANA назив. Webhook окидачима је потребан `secret_env`, назив тајне која користи испоруку `broker` са потрошачем `connector`. Окидачима надгледања су потребни `run` (команда релативна у односу на репозиторијум) и `mode` (`poll` или `stream`), а одбијају сва поља за cron и webhook. Комплетан опис поља, подешавање акредитива, шаблонизација корисног садржаја, крајње тачке и стратегија сесије: погледајте [Triggers](/docs/sr/connect/triggers).

## `connectors:`

Списак спољних алатки које агент може да позива. Дефиниција се налази у Git-у; акредитиви се чувају на платформи, никада у манифесту. Концептуални модел погледајте у одељку [Connectors](/docs/sr/connect/connectors).

```yaml
connectors:
  - slug: gmail-read
    name: Gmail read only
    provider: pipedream
    app: gmail
    authorization_strategy: user
    policies:
      - match: search_email
        action: always_run
```

| Поље                    | Обавезно | Напомене                                                                                                                                                                  |
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slug`                   | да      | `[a-z0-9][a-z0-9_-]{0,127}`, јединствено међу конекторима.                                                                                                                  |
| `provider`               | да      | `pipedream`, `mcp`, `openapi`, `postman`, `graphql`, `http` или `channel`.                                                                                             |
| `name`                   | не       | Назив за приказ. Подразумевано је slug.                                                                                                                                        |
| `authorization_strategy` | не       | `project` или `user`. Ако се изостави, подразумевано је `project`. Стратегија пројекта користи активне везе пројекта. Стратегија корисника користи само везу члана који је обавио радњу. |
| `enabled`                | не       | Подразумевано је `true`.                                                                                                                                                    |
| `credential`             | не       | Подржан је само `shared`. Укинути режим `per_user` доводи до фаталне грешке.                                                                                               |
| `sensitive`              | не       | Подразумевано је `false`. `true` поставља `require_approval` као подразумевану радњу за неподударајуће захтеве, укључујући читање. Експлицитна правила пројекта и конектора се и даље прво примењују.          |

Поља специфична за добављача:

| Добављач    | Обавезно поље | Напомене                                                                                                                                      |
| ----------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `pipedream` | `app`          | `account` није обавезно; подразумевано је slug.                                                                                                      |
| `mcp`       | `url`          | `transport`: `http` (подразумевано) или `sse`.                                                                                                    |
| `openapi`   | `spec`         | URL или путања релативна у односу на репозиторијум.                                                                                                               |
| `postman`   | `spec`         | URL или путања JSON колекције, манифест `.postman/api` или URL Postman радног простора.                                                      |
| `graphql`   | `endpoint`     | `spec` није обавезно (SDL).                                                                                                                     |
| `http`      | `base_url`     | `spec` није обавезно.                                                                                                                           |
| `channel`   | `platform`     | `slack`, `teams`, `email` или `voice`.                                                                                                     |
| `computer`  | —              | Њиме управља API. Не можете га ручно декларисати. Сваки повезани рачунар је један од његових налога. Погледајте [Computers](/docs/sr/connect/computers). |

За конекторе `channel` ретко је потребан ручно написан унос — повезивањем канала са контролне табле аутоматски се креира. Погледајте [Slack & channels](/docs/sr/connect/slack). Платформа резервише слагове `beeuni_slack`, `beeuni_teams`, `beeuni_email` и `computer`; њихова употреба са другим добављачем је грешка при валидацији. Конектор `computer` се креира када први члан повеже рачунар, јер су ИД-ови машина идентитети контролне равни налога и не смеју да се нађу у манифесту.

`connectors.auth`: опционално, за провајдере који нису `pipedream`. `type` је `bearer`, `basic`, `custom`, `api_key`, `oauth1`, `hmac`, `aws_sigv4`, `mtls` или `none` (подразумевано). `oauth1` је ограничен на провајдере `openapi`, `postman` и `http`. `in` је `header` (подразумевано), `query` или `cookie`. `name` је обавезан када је `type` `custom` или `api_key`.

`connectors.policies`: листа парова `{match, action}`. `match` је glob образац који се примењује на
називе алата. `action` је `always_run`, `require_approval` или `block`. Политике
припадају конектору. Све везе у оквиру тог конектора користе исте
политике.

`policy.default_mode`: кључ највишег нивоа, засебан од `connectors:`, који поставља режим одобравања конектора за цео пројекат. Прихвата вредност `allow_all` (подразумевано; покреће се сваки алат који се не подудара) или `risk` (захтева одобрење за неподударајуће позиве који уписују податке или их уништавају). Подесите га помоћу `beeuni connectors policy set --default <risk|allow_all>` — погледајте [CLI](/docs/sr/cli).

<a id="channels"></a>

## Канали

v2 уклања `channels:` из шеме. Усмеравање канала ка агентима (тренутно Slack, Microsoft Teams, имејл и глас) јесте активно оперативно стање, а не декларативна конфигурација. Подешава се на страници Channels на контролној табли или помоћу команди за ћаскање; то је иста граница која чува акредитиве ван git-а. Повезивањем канала и даље се ствара унос `connectors` са `provider: channel` који агент може да позива. Погледајте [Slack и канали](/docs/sr/connect/slack). Табела `[[channels]]` из v1 обрађена је у одељку [Застарели TOML](/docs/sr/project/legacy-toml).

## `agents:`

Мапа назива и блокова, са кључевима по називу агента. Ова мапа служи само за управљање — она одређује чему агент сме да приступи, а не шта говори или ради.

Овај блок је **друго од два повезивања**: principal добија улоге од Beeuni-ја, а агент додатно носи Beeuni дозволе наведене овде. Сесија може да ради само оно што обе стране дозвољавају. Погледајте [Један речник, два повезивања](/docs/sr/accounts#one-vocabulary-two-bindings).

```yaml
default_agent: beeuni

agents:
  beeuni:
    file: agents/beeuni.md
    connectors: all
    secrets: all
    beeuni_permissions: all
    skills: all

  release-bot:
    file: agents/release-bot.md
    connectors: [github]
    connectors_required: [github]
    beeuni_permissions: [project.gitops.push]
    secrets: [GITHUB_AGENT_TOKEN]
```

| Поље                 | Подразумевано | Напомене                                                                                                                                                                                                     |
| --------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| _(кључ мапе)_           | —       | `[a-z0-9][a-z0-9_-]{0,127}`, јединствено у оквиру пројекта. Ако није наведено `file`, уједно је и назив датотеке `.md`.                                                                                                           |
| `file`                | `agents/<name>.md` | Путања до датотеке агента `.md` у односу на корен репозиторијума. Погледајте [Датотека агента](#the-agent-file).                                                                                                                |
| `enabled`             | `true`  | `false` третира агента као ненаведеног — платформа га неће покренути.                                                                                                                                 |
| `connectors`          | `none`  | Слагови конектора које агент сме да позива. `all` значи сваки конектор.                                                                                                                                   |
| `connectors_required` | `none`  | Застарело: анализира се и занемарује. Покретање sandbox-а више не зависи од повезаности конектора; позив конектору са којим ништа није повезано враћа `connector_not_connected` са везом за повезивање. Ако је наведено, и даље мора бити подскуп од `connectors`. |
| `secrets`             | `none`  | Тајне пројекта које овај агент добија као променљиве окружења у sandbox-у. Преименовано из `env` у v1.                                                                                                                   |
| `beeuni_permissions`  | `none`  | Beeuni дозволе (радње у пројекту) које агент сме да користи преко CLI-ја, API-ја или git-а. `all` значи све дозволе пројекта, али је и даље ограничено највишом улогом агента и никада не обухвата дозволе намењене само људима. `beeuni_cli` је застарели назив: и даље је прихваћен, уз упозорење при валидацији; ако су оба поља постављена на различите вредности, јавља се грешка. |
| `skills`              | `none`  | Вештине које агент сме да учита.                                                                                                                                                                         |
| `apps`                | `none`  | Beeuni App слагови које агент сме да отвори када је App `restricted` или `private`. `all` значи сваки App у пројекту. Погледајте [Агенти и App-ови](/docs/sr/feature-flags/apps#agents-and-apps). |
| `tools`               | `all`   | Алати које агент сме да користи: алати harness-а, Beeuni-ја и пројекта. `all`, `none`, листа (само наведени алати) или `{ exclude: [...] }` (сви осим наведених). И даље је подржан и ранији облик мапе `{ bash: false }`. За разлику од претходно наведених додела, ако се `tools` изостави, то значи да су доступни сви алати. Погледајте [Ко сме да користи који алат](/docs/sr/project/tools#who-may-use-which-tool). |
| `repository_access` | `true` | Да ли нове сесије добијају репозиторијум пројекта. `false` онемогућава испоруку репозиторијума и приступ репозиторијуму преко акредитива сесије. Постојеће сесије задржавају сачувану политику. |

v2 подразумевано одбија приступ: ако се `connectors`, `secrets`, `beeuni_permissions`, `skills` или `apps` изостави код декларисаног агента, добија вредност `none`. Изричито доделите сваку дозволу која је агенту потребна, као што то чини агент `beeuni` из почетног примера изнад. Пројекат који прелази са v1 мора ручно поново да додели све дозволе — у v1 се за `env` (тајне), ако је изостављено, подразумевано поставља `all`, што је супротно од v2.

`connectors_personal` остаје застарели улазни алијас за
`connectors_required`. Нови манифести морају да користе `connectors_required`. Вредност `authorization_strategy` конектора одређује да ли овлашћење припада пројекту или члану.

Доделе `beeuni_permissions` потичу из фиксног скупа дозвола везаних за пројекат (`project.read`, `project.gitops.push`, `project.gitops.merge`, `project.gitops.ref.any`, `project.trigger.*`, `project.secret.*`, `project.connector.*` и друге). Дозволе везане за налог — `member.*`, `billing.*`, `project.create` — никада се не могу доделити агенту. Покрените `beeuni validate --scopes` из сесије да бисте приказали тренутну листу дозвола које се могу доделити.

<a id="the-agent-file"></a>

### Датотека агента

`agents.<name>.file` наводи датотеку `.md` агента, у односу на корен репозиторијума.

```yaml
agents:
  support:
    file: agents/support.md
```

- Путања мора да се завршава са `.md`.
- Путања не сме да почиње са `/` или `-`. Не сме да садржи сегмент `.` или `..`, нити празан сегмент.
- Сваки сегмент сме да садржи само слова, цифре, `_`, `-`, `.` и размаке.
- Ако се `file` изостави, Beeuni чита `agents/<name>.md`, па затим `.beeuni/opencode/agents/<name>.md`. Када је постављен `opencode.config_dir`, друга путања је `<config_dir>/agents/<name>.md`.
- Када контролна табла сачува агента који има `.md`, уписује `file` са том путањом.
- API одбија захтев којим се мења `file` (`400`, код `invalid_config`). Да бисте преместили агента, преместите његов `.md` и ажурирајте `file` у `beeuni.yaml` у истом commit-у.

`beeuni validate` и провера спајања захтева за измену одбијају неважећи `file` и приказују грешку за `agents.<name>.file`.

<a id="when-config-changes-take-effect"></a>

## Када промене конфигурације ступају на снагу

- Измена манифеста, `agents/`, `skills/` или конфигурационог директоријума стандардни harness примењује се тек након што се захтев за измену споји са `main`. Сесије и провера покретача читају подразумевану грану, а не гране сесија.
- Планер преузима измену cron или webhook конфигурације покретача у року од неколико секунди од спајања.
- Измена слике sandbox-а или хардвера поново гради снимак. Нова спецификација примењује се на следећу сесију, а не на тренутну.
- Измена вредности тајне на контролној табли разрешава се при креирању sandbox-а. Примењује се на следећу сесију, а не на ону која је у току.

<a id="round-trip-rules"></a>

## Правила за повратно уписивање

Измене на контролној табли подразумевају читање, измену и уписивање у датотеку у којој је унос дефинисан: `beeuni.yaml` или [увезену датотеку](#imports). Да би разлике између измена у корисничком интерфејсу и током сесије биле чисте:

1. Поставите `beeuni_version` као први кључ.
2. Унутар уноса покретача ређајте поља овим редоследом: `slug`, `name`, `type`, `agent`, `enabled`, затим поља специфична за тип, а на крају `prompt`.
3. Ако додате webhook покретач пре него што подесите његову тајну, наведите име тајне у `env.optional`. Оставите покретач `enabled: false` док се вредност не унесе.

<a id="repository-access"></a>

### Приступ репозиторијуму

Подесите `agents.<name>.repository_access` на `false` за агенте којима нису потребне изворне датотеке пројекта.
И даље могу да праве датотеке у sandbox-у и користе додељене алате, тајне и конекторе.
Подесите на `true` за агенте којима је потребан репозиторијум. Git дозволе се подешавају засебно.
Ово подешавање промените у уређивачу агента, у одељку **Workspace → Project repository access**.
Подешавање се примењује на нове сесије. Постојеће сесије задржавају сачувану политику, укључујући и након замене окружења за извршавање.

```yaml
agents:
  support:
    repository_access: false
  engineer:
    repository_access: true
```

Застарело поље `workspace` и даље може да се чита: `branch` значи `true`, а `runtime` значи `false`.
Конфигурације са застарелим `read` и даље одбијају креирање сесије док поље не замените експлицитном логичком вредношћу.
Не постоји режим приступа репозиторијуму само за читање. Неусаглашена стара и нова поља се одбијају.
Уређивач и SDK шаљу `repository_access`. Када је приступ онемогућен, API чува и `workspace: runtime` као компатибилну копију. Тиме се ограничење чува за старије реплике API-ја током постепеног пуштања измена или враћања на претходну верзију. API одговори не садрже ту копију. За ручно написане манифесте који користе само `repository_access` потребан је ажуриран API.
