# Proiecte și medii (/ro/docs/environments)

Dă-i agentului o mașină reală — un VM administrat sau propriul tău server — și conectează-te la ea din desktop, din CLI sau din hub.

Un **mediu** (environment) este o mașină pe care agentul codai lucrează efectiv: shell, fișiere, build-uri și servere de dezvoltare. Pe ea rulează un daemon mic, `codaid`, care ține un singur WebSocket **de ieșire** către relay (`wss://relay.codai.ro`) — mașina nu deschide niciodată un port de ascultare. Dispozitivele tale se atașează prin același relay, așa că uneltele rulează în mediu, iar tu urmărești și ghidezi de oriunde te afli.

```text
 desktop / CLI / hub                gateway  ai.codai.ro        (proiecte, medii, membri, porturi)
   │  atașare, terminal, porturi ─▶ relay    relay.codai.ro     (WebSocket-uri daemon + client, prezență)
   │  https://3000-<slug>.preview.codai.ro ─▶ │ router de preview
                                              ▼ WebSocket de ieșire, niciodată de intrare
                               mediu (VM administrat sau propriul server)
                                 codaid: shell · fișiere · terminale · porturi · stare git · lock de build
```

## Vocabular [#vocabular]

| Obiect | Ce este |
| --- | --- |
| **Proiect** | Un repository plus setările lui: `repo_url`, `default_branch`, opțional `devcontainer_path` și un **mod de izolare** care decide cum își împart dezvoltatorii mașinile. Îți aparține și poate fi atașat unei organizații pe care o administrezi. |
| **Mediu** | O mașină dintr-un proiect. Are un `slug` unic la nivel global (devine hostname-ul de preview), un `provider`, o stare (`state`), un timp de inactivitate și, pentru mașinile administrate, o dimensiune și un tarif orar. |
| **Membru** | O persoană cu un rol pe un mediu: `owner` ≥ `maintainer` ≥ `developer` ≥ `viewer`. Fiecare membru primește în mașină propriul cont Linux și un bloc de 100 de porturi. |
| **Port** | Un port pe care îl publici cu o **vizibilitate** (`owner`, `org`, `authenticated`, `public`). Porturile HTTP publicate primesc un URL de preview. |
| **Secret** | O valoare `ENV_STYLE` stocată sigilat; numele pot fi listate, valorile nu sunt returnate niciodată. |
| **Eveniment** | Un rând de audit care doar se adaugă: fiecare schimbare de stare, înrolare, modificare de membru, port sau secret. Ultimele 20 apar pe pagina mediului. |

## Două feluri de a obține o mașină [#două-feluri-de-a-obține-o-mașină]

| | Administrat | Propria mașină (BYO) |
| --- | --- | --- |
| Cine o provizionează | codai, pe OpenStack (Cloudify, UE) sau Hetzner Cloud | Tu — orice server Linux pe care îl controlezi |
| Cum ajunge `codaid` acolo | Instalat și înrolat automat de cloud-init | Rulezi installer-ul cu un token de unică folosință |
| Pornire / oprire | Da, plus oprire automată la inactivitate | Nu — mașina e a ta; doar arhivare sau distrugere |
| Preț | Pe secundă de rulare, din portofel | Gratuit |
| Disponibilitate | În curs de lansare — activat per cont | Deschis oricărei chei |

Detalii: [instalare pe propriul server](./byo-install.mdx), [medii administrate](./managed.mdx), [facturare](./billing.mdx).

## Atașarea de pe dispozitivele tale [#atașarea-de-pe-dispozitivele-tale]

| Suprafață | Ce poți face azi |
| --- | --- |
| **Hub** — [hub.codai.ro/projects](https://hub.codai.ro/projects) | Creezi proiecte și medii (BYO și administrate), pornești/oprești/arhivezi/distrugi, generezi un token de înrolare cu comanda de instalare, gestionezi membrii și cheia ta SSH. Pagina mediului arată porturile redirecționate, numele secretelor, sarcinile agentului, accesul SSH, costul de calcul al lunii și ultimele evenimente. |
| **Desktop** — vizualizarea Medii (Environments; <kbd>Alt</kbd>+<kbd>5</kbd> în skin-ul Developer, <kbd>Ctrl</kbd>+<kbd>5</kbd> în skin-ul Assistant) | Atașezi agentul la un mediu, deschizi un terminal în el, vezi porturile care ascultă și le schimbi vizibilitatea, copiezi sau deschizi URL-uri de preview, creezi un mediu BYO și îl înrolezi. |
| **CLI** — `codaid env …` | Listezi, creezi, pornești, oprești, arhivezi, distrugi; afișezi starea și porturile; setezi sau elimini vizibilitatea porturilor; generezi linkuri de preview; redirecționezi un port pe `127.0.0.1`; deschizi un shell; intri prin SSH cu un certificat valabil 12 ore (`env ssh`, `env ssh-ca`); pui în coadă și urmărești sarcini ale agentului (`env tasks list`, `create`, `get`); gestionezi membrii (`env members list`, `add`, `role`, `remove`) și secretele (`env secrets list`, `set`, `rm`); urmărești jurnalul de evenimente. |
| **Telefon** (Android) | Ecranul *Medii* (Environments): îți listezi mediile, pornești și oprești mediile administrate, deschizi linkurile de preview. |
| **MCP** | Unelte pentru agenți: `list_projects`, `list_environments`, `get_environment`, `start_environment`, `stop_environment`, `list_environment_ports`, `create_environment_task`, `list_environment_tasks`, `get_environment_task`. Distrugerea mediilor și citirea sau scrierea secretelor nu sunt expuse intenționat prin MCP. |

Când agentul de pe desktop este atașat, **bucla agentului rulează pe dispozitivul tău, iar uneltele lui rulează în mediu** — compozitorul afișează *în &lt;nume&gt;*. Rularea întregii bucle în mediu (headless) vine în curând.

Gazdele de preview (`https://{port}-{slug}.preview.codai.ro`) și relay-ul (`wss://relay.codai.ro`) sunt servite direct de load balancer-ul Google Cloud al codai; Cloudflare doar răspunde la DNS pentru ele și nu face proxy traficului.

## Ciclul de viață pe scurt [#ciclul-de-viață-pe-scurt]

```text
 BYO:          pending ──înrolare──▶ enrolling      (online / offline = prezența daemonului pe relay)
 administrat:  creating ──VM pornit──▶ enrolling ──▶ running ⇄ stopping ─▶ stopped ─▶ archiving ─▶ archived
                                                    (inactivitate / buget / fonduri)
 orice stare ──destroy──▶ destroying ──▶ destroyed      (BYO: direct în destroyed)
```

Un mediu BYO nu are un pas la furnizor, așa că `destroy` ajunge imediat în `destroyed` (și revocă cheia daemonului), iar `archive` în `archived`.

Pentru o mașină BYO starea stocată rămâne `enrolling` după înrolare; dacă e accesibilă chiar acum o spune **prezența** din relay (`online`), care dispare la 45 de secunde după ultimul heartbeat al daemonului.

Mai departe: [instalează codaid pe propriul server](./byo-install.mdx) sau [creează un mediu administrat](./managed.mdx).
