Declanșatoare
Webhook-uri care transformă evenimentele din GitHub, Sentry, monitorizare sau surse proprii în sesiuni de agent, plus inbox-ul de notificări.
Un declanșator (trigger) este un webhook de intrare semnat, legat de contul tău. Fiecare livrare e verificată cu secretul propriu al declanșatorului, transformată într-o fișă de eveniment, trecută prin politica declanșatorului (filtre, buget, limită de rată, deduplicare) și apoi deschide o sesiune, se adaugă la una deja deschisă sau doar publică o notificare.
Semnarea livrărilor generice
Expeditorii proprii semnează cu schema codai:
x-codai-signature: t=<secunde unix>,v1=<hex HMAC-SHA256(secret, "<t>.<corp brut>")>
x-codai-delivery: <id-ul livrării tale>- HMAC-ul acoperă marcajul de timp, un
.literal și corpul brut al cererii, octet cu octet — semnează înainte de orice reserializare. ttrebuie să fie la cel mult 5 minute de ceasul gateway-ului; marcajele mai vechi sau din viitor sunt respinse custale_timestamp.x-codai-deliveryeste cheia de idempotență: un id de livrare repetat se înregistrează o singură dată. Fără el, gateway-ul derivă un id dintși dintr-un hash al corpului.- Sursele GitHub (
X-Hub-Signature-256) și Sentry (Sentry-Hook-Signature) folosesc în schimb semnăturile lor native.
Căi de intrare
Câmpul ingress din politica declanșatorului stabilește unde sunt acceptate livrările:
public(implicit) — endpoint-ul expus pe internetPOST /v1/hooks/{id}.local— surse doar din rețeaua locală. URL-ul public răspunde 404; livrările ajung prin daemonul codaid sau prin brokerul aplicației desktop din rețeaua ta, care le transmit mai departe cu aceeași verificare de semnătură.both— oricare dintre cele două.
Folosește rotate-secret ca să generezi un secret nou sau PUT …/secret ca să setezi secretul cu care semnează deja un serviciu terț. POST …/test trimite o livrare de probă semnată prin tot fluxul.
bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Trigger-ele apelantului.
application/json- response
data*array<>sources*array<>curl -X GET 'https://ai.codai.ro/v1/triggers'{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "source": "github", "enabled": true, "policy": { "mode": "notify", "smart": { "assistedAt": "info", "autopilotAt": "info", "keywords": { "property1": "notify", "property2": "notify" } }, "subjects": [ "string" ], "minSeverity": "info", "permissions": "read", "quietHours": { "from": "string", "to": "string", "tz": "Europe/Bucharest" }, "budgetMicroUsdPerEvent": 2000000, "budgetMicroUsdPerDay": 10000000, "maxSessionsPerHour": 6, "dedupeWindowMin": 1440, "promptTemplate": "string", "skill": "string", "target": { "kind": "any", "id": "string" }, "ttlMin": 240 }, "hook_url": "http://example.com", "last_event_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z" } ], "sources": [ "github" ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name*string1 <= length <= 120source*TriggerSourceCum sunt autentificate și normalizate livrările (vezi POST /v1/hooks/{id}).
"github""sentry""gcp""generic""form""manual"policy?TriggerPolicy parțială; cheile omise primesc valorile implicite, valorile invalide dau 400.
enabled?booleantrueCreat; secret este afișat o singură dată.
application/json- response
id*stringuuidname*stringsource*TriggerSourceCum sunt autentificate și normalizate livrările (vezi POST /v1/hooks/{id}).
"github""sentry""gcp""generic""form""manual"enabled*booleanpolicy*Politica trigger-ului cu toate valorile implicite completate (așa cum o returnează API-ul).
hook_url*stringUnde postează expeditorul, https://api.codai.ro/v1/hooks/<id> în producție.
urilast_event_at*|date-timecreated_at*stringdate-timesecret*stringSecret de semnare, prefix whsec_. Afișat doar în acest răspuns.
curl -X POST 'https://ai.codai.ro/v1/triggers' \ -H 'Content-Type: application/json' \ -d '{ "name": "string", "source": "github"}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "source": "github", "enabled": true, "policy": { "mode": "notify", "smart": { "assistedAt": "info", "autopilotAt": "info", "keywords": { "property1": "notify", "property2": "notify" } }, "subjects": [ "string" ], "minSeverity": "info", "permissions": "read", "quietHours": { "from": "string", "to": "string", "tz": "Europe/Bucharest" }, "budgetMicroUsdPerEvent": 2000000, "budgetMicroUsdPerDay": 10000000, "maxSessionsPerHour": 6, "dedupeWindowMin": 1440, "promptTemplate": "string", "skill": "string", "target": { "kind": "any", "id": "string" }, "ttlMin": 240 }, "hook_url": "http://example.com", "last_event_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z", "secret": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
name?string1 <= length <= 120policy?Înlocuiește politica stocată (nu se combină); cheile omise primesc valorile implicite.
enabled?booleanTrigger-ul actualizat.
application/json- response
id*stringuuidname*stringsource*TriggerSourceCum sunt autentificate și normalizate livrările (vezi POST /v1/hooks/{id}).
"github""sentry""gcp""generic""form""manual"enabled*booleanpolicy*Politica trigger-ului cu toate valorile implicite completate (așa cum o returnează API-ul).
hook_url*stringUnde postează expeditorul, https://api.codai.ro/v1/hooks/<id> în producție.
urilast_event_at*|date-timecreated_at*stringdate-timecurl -X PATCH 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "source": "github", "enabled": true, "policy": { "mode": "notify", "smart": { "assistedAt": "info", "autopilotAt": "info", "keywords": { "property1": "notify", "property2": "notify" } }, "subjects": [ "string" ], "minSeverity": "info", "permissions": "read", "quietHours": { "from": "string", "to": "string", "tz": "Europe/Bucharest" }, "budgetMicroUsdPerEvent": 2000000, "budgetMicroUsdPerDay": 10000000, "maxSessionsPerHour": 6, "dedupeWindowMin": 1440, "promptTemplate": "string", "skill": "string", "target": { "kind": "any", "id": "string" }, "ttlMin": 240 }, "hook_url": "http://example.com", "last_event_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Șters.
application/json- response
id*stringuuiddeleted*truetruecurl -X DELETE 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "deleted": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Secretul nou (afișat o singură dată).
application/json- response
id*stringuuidsecret*stringSecret de semnare nou, prefix whsec_. Nu mai este returnat niciodată.
curl -X POST 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08/rotate-secret'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "secret": "string"}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
secret*string16 <= length <= 512Secret înlocuit.
application/json- response
id*stringuuidreplaced*booleancurl -X PUT 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08/secret' \ -H 'Content-Type: application/json' \ -d '{ "secret": "stringstringstri"}'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "replaced": true}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidx-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
title?stringlength <= 200message?stringlength <= 4000severity?TriggerSeverity"info""low""medium""high""critical"url?stringurisubject?stringlength <= 200Evenimentul înregistrat și decizia politicii.
application/json- response
event_id*integerId-ul livrării înregistrate (vezi GET /v1/triggers/{id}/events).
decision*Ce a decis politica pentru un eveniment și de ce (reason este afișat pe sesiune).
session_id*|Sesiunea pornită sau completată; null pentru deciziile notify/ignore.
uuidcard*O livrare normalizată într-o formă unică, independentă de sursă.
curl -X POST 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08/test' \ -H 'Content-Type: application/json' \ -d '{}'{ "event_id": 0, "decision": { "action": "ignore", "reason": "string", "mode": "notify", "wanted": "notify", "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459" }, "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82", "card": { "source": "github", "kind": "string", "title": "string", "summary": "string", "severity": "info", "url": "string", "subject": "string", "dedupeKey": "string", "labels": [ "string" ], "resolved": true }}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*stringUUID-ul trigger-ului. Un id malformat, necunoscut sau străin primește 404.
uuidlimit?integerDimensiunea paginii, limitată la 1–200; orice valoare nenumerică revine la 50.
1 <= value <= 20050x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Livrări ordonate descrescător după receivedAt.
application/json- response
data*array<>curl -X GET 'https://ai.codai.ro/v1/triggers/497f6eca-6276-4993-bfeb-53cbbbba6f08/events'{ "data": [ { "id": 0, "deliveryId": "string", "status": "received", "card": { "source": "github", "kind": "string", "title": "string", "summary": "string", "severity": "info", "url": "string", "subject": "string", "dedupeKey": "string", "labels": [ "string" ], "resolved": true }, "decision": { "action": "ignore", "reason": "string", "mode": "notify", "wanted": "notify", "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459" }, "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459", "attempts": 0, "error": "string", "receivedAt": "2019-08-24T14:15:22Z", "processedAt": "2019-08-24T14:15:22Z" } ]}id*stringUUID-ul trigger-ului (ultimul segment din hook_url).
uuidtoken?stringDoar sursa gcp: secretul trigger-ului, când expeditorul nu poate seta un header Authorization.
x-hub-signature-256?stringSursa github: sha256= urmat de HMAC-SHA256 hex al corpului brut.
x-github-delivery?stringSursa github (obligatoriu acolo): GUID-ul livrării, folosit drept cheie de idempotență.
x-github-event?stringSursa github: tipul evenimentului (issues, pull_request, workflow_run, …).
sentry-hook-signature?stringSursa sentry: HMAC-SHA256 hex al corpului brut, cu secretul trigger-ului.
sentry-hook-resource?stringSursa sentry: resursa la care se referă evenimentul (issue, event_alert, metric_alert, …).
request-id?stringSursa sentry: id-ul livrării, folosit drept cheie de idempotență.
x-codai-signature?stringSursele generic / form / manual: t=<unix>,v1=<HMAC-SHA256 hex al "<t>.<corp brut>">.
x-codai-delivery?stringSursele generic / form / manual: cheie de idempotență opțională pentru livrare.
application/json- body
Payload-ul JSON propriu al expeditorului. Expeditorii generic / form / manual pot folosi title,
message, severity (info…critical), url, subject și kind pentru a modela cardul evenimentului.
[key: string]?anyAcceptat (înregistrat; procesat după răspuns).
application/json- response
accepted*truetrueduplicate*booleantrue când acest id de livrare a fost deja înregistrat; nu mai este procesat.
event_id*integerId-ul livrării înregistrate.
curl -X POST 'https://ai.codai.ro/v1/hooks/497f6eca-6276-4993-bfeb-53cbbbba6f08' \ -H 'Content-Type: application/json' \ -d '{}'{ "accepted": true, "duplicate": true, "event_id": 0}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
unread?"1"1 pentru a returna doar notificările necitite.
"1"limit?integerDimensiunea paginii, limitată la 1–200; orice valoare nenumerică revine la 50.
1 <= value <= 20050x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Notificări ordonate descrescător după createdAt.
application/json- response
data*array<>curl -X GET 'https://ai.codai.ro/v1/notifications'{ "data": [ { "id": 0, "userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b", "kind": "string", "severity": "info", "title": "string", "body": "string", "url": "string", "sessionId": "f6567dd8-e069-418e-8893-7d22fcf12459", "triggerEventId": 0, "readAt": "2019-08-24T14:15:22Z", "createdAt": "2019-08-24T14:15:22Z" } ]}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
ids?array<>items <= 500Câte notificări au fost actualizate.
application/json- response
read*integer0 <= valuecurl -X POST 'https://ai.codai.ro/v1/notifications/read' \ -H 'Content-Type: application/json' \ -d '{}'{ "read": 0}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
id*integer1 <= valuex-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128Câte notificări au fost șterse (0 sau 1).
application/json- response
deleted*integer0 <= valuecurl -X DELETE 'https://ai.codai.ro/v1/notifications/1'{ "deleted": 0}bearerAuthAutorizareBearer <codai_…>O cheie API codai (prefix codai_). Tokenurile efemere de la POST /v1/tokens sunt acceptate doar de suprafețele media potrivite scope-ului lor (/v1/realtime, /v1/audio/*, /v1/embeddings).
x-request-id?stringId de corelare ales de client; e returnat ca x-codai-trace-id și persistat pe rândul de usage.
length <= 128application/json- body
ids*array<>1 <= items <= 200Câte notificări au fost șterse.
application/json- response
deleted*integer0 <= valuecurl -X POST 'https://ai.codai.ro/v1/notifications/delete' \ -H 'Content-Type: application/json' \ -d '{ "ids": [ 1 ]}'{ "deleted": 0}Ultima actualizare:
Task-uri
Facturare pe rezultat: listezi task-urile deschise de cererile tale și confirmi sau respingi rezultatul lor.
Prompturi în așteptare
Prompturi gata de lipit pe care agenții (sau tu) le lasă pentru un chat viitor — predări, continuări programate — cu mementouri și lansare dintr-un clic pe un dispozitiv.