openvibers/openvibe.contracts Commits

Support inboxes open to developer apps: chat.inbox.read, chat.inbox.reply and chat.inbox.manage (public, sensitive) with their schemas (0.214.0) (#211)

OP OpenVibers committed 19 days ago · c3829ee50c · 68 files, +4549 −82

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex bcbe87d0..78d9827b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,20 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
++## 0.214.0 — 2026-10-26
++
++- **Support inboxes open to developer apps** (the owner, 2026-10-24/25: openvibe.chat "fully modular and SDK and
++ API"). Three public, sensitive capabilities owned by `chat`, on the routes OpenVibe.Chat already serves; an app acts
++ only for the person who authorized it (`on_behalf_of`), and that person's role in the inbox decides the rest:
++ - `chat.inbox.read`: the inboxes the person works in, conversations (waiting first), messages, saved replies, and
++ the owner's export (JSON or CSV);
++ - `chat.inbox.reply`: reply, resolve, reopen, give back to Vibe, assign, mark read, translate;
++ - `chat.inbox.manage`: make an inbox, and as its owner change it (Vibe, sites, hours, routing, retention), its people,
++ saved replies, webhooks, actions and verified visitors.
++- **Schemas:** `chat.inbox-request@1`, `chat.inbox-result@1`, `chat.inbox-reply-request@1`,
++ `chat.inbox-conversations-result@1` (public), with fixtures.
++- **`capability@1`:** `resourceConstraints` may say `inbox_member`.
++
## 0.213.0 — 2026-10-25
- **Plain names in every menu** (the owner, 2026-10-24: make the products consumer-friendly and familiar, with the
ddiff --git a/contracts/capabilities/capability.v1.json b/contracts/capabilities/capability.v1.json
iindex 2af04424..33751258 100644
---- a/contracts/capabilities/capability.v1.json
++++ b/contracts/capabilities/capability.v1.json
@@@ -16,7 +16,7 @@
"inputSchema": { "type": "string" },
"outputSchema": { "type": "string" },
"permissions": { "type": "array", "items": { "type": "string" } },
-- "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "project", "none"] } },
++ "resourceConstraints": { "type": "array", "items": { "enum": ["namespace", "owner", "room_member", "space_member", "inbox_member", "project", "none"] } },
"quotaClass": { "type": "string" },
"events": { "type": "array", "items": { "type": "string" } },
"implementedBy": { "type": "array", "items": { "type": "string" }, "description": "Current route(s) that perform this action today, e.g. 'POST /api/v1/:app/files'." },
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 23ede23b..48b6a8e9 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -7413,6 +7413,42 @@
"visibility": "public",
"compatibility": "backward",
"status": "active"
++ },
++ {
++ "id": "chat.inbox-request",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/inbox-request.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "chat.inbox-result",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/inbox-result.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "chat.inbox-reply-request",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/inbox-reply-request.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "chat.inbox-conversations-result",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/inbox-conversations-result.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
}
]
}
ddiff --git a/contracts/chat/inbox-conversations-result.v1.json b/contracts/chat/inbox-conversations-result.v1.json
nnew file mode 100644
iindex 00000000..3764466a
---- /dev/null
++++ b/contracts/chat/inbox-conversations-result.v1.json
@@@ -0,0 +1,75 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",
++ "title": "ChatInboxConversationsResult",
++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
++ "type": "object",
++ "properties": {
++ "conversations": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "status"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "status": {
++ "enum": [
++ "bot",
++ "waiting",
++ "open",
++ "resolved"
++ ]
++ }
++ }
++ }
++ },
++ "conversation": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "messages": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "author",
++ "body"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer"
++ },
++ "author": {
++ "enum": [
++ "visitor",
++ "agent",
++ "ai",
++ "system"
++ ]
++ },
++ "body": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "message": {
++ "type": "object"
++ },
++ "replies": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ }
++ }
++}
ddiff --git a/contracts/chat/inbox-reply-request.v1.json b/contracts/chat/inbox-reply-request.v1.json
nnew file mode 100644
iindex 00000000..8ed1cbc5
---- /dev/null
++++ b/contracts/chat/inbox-reply-request.v1.json
@@@ -0,0 +1,72 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",
++ "title": "ChatInboxReplyRequest",
++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "message": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "properties": {
++ "status": {
++ "enum": [
++ "open",
++ "resolved",
++ "bot"
++ ]
++ },
++ "assignee_id": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
++ }
++ },
++ "additionalProperties": false,
++ "anyOf": [
++ {
++ "required": [
++ "status"
++ ]
++ },
++ {
++ "required": [
++ "assignee_id"
++ ]
++ }
++ ]
++ },
++ {
++ "type": "object",
++ "required": [
++ "to"
++ ],
++ "properties": {
++ "to": {
++ "type": "string",
++ "maxLength": 16,
++ "description": "A language code (en, es, ja, …)."
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ }
++ ]
++}
ddiff --git a/contracts/chat/inbox-request.v1.json b/contracts/chat/inbox-request.v1.json
nnew file mode 100644
iindex 00000000..93ecac2c
---- /dev/null
++++ b/contracts/chat/inbox-request.v1.json
@@@ -0,0 +1,115 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",
++ "title": "ChatInboxRequest",
++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
++ "type": "object",
++ "properties": {
++ "name": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ },
++ "greeting": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "color": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ },
++ "ai_enabled": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "ai_instructions": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "knowledge_urls": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "allowed_origins": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "handoff": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "hours": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "route": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "retention_days": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ }
++ }
++}
ddiff --git a/contracts/chat/inbox-result.v1.json b/contracts/chat/inbox-result.v1.json
nnew file mode 100644
iindex 00000000..5da99bce
---- /dev/null
++++ b/contracts/chat/inbox-result.v1.json
@@@ -0,0 +1,73 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",
++ "title": "ChatInboxResult",
++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
++ "type": "object",
++ "properties": {
++ "inbox": {
++ "type": "object",
++ "required": [
++ "id",
++ "name"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "name": {
++ "type": "string"
++ }
++ }
++ },
++ "inboxes": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "role"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "role": {
++ "enum": [
++ "owner",
++ "agent"
++ ]
++ },
++ "waiting": {
++ "type": "integer"
++ },
++ "open": {
++ "type": "integer"
++ }
++ }
++ }
++ },
++ "members": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ },
++ "embed": {
++ "type": "object",
++ "properties": {
++ "script": {
++ "type": "string"
++ },
++ "panel": {
++ "type": "string"
++ }
++ }
++ }
++ }
++}
ddiff --git a/fixtures/chat.inbox-conversations-result/invalid/unknown-author.json b/fixtures/chat.inbox-conversations-result/invalid/unknown-author.json
nnew file mode 100644
iindex 00000000..e432182e
---- /dev/null
++++ b/fixtures/chat.inbox-conversations-result/invalid/unknown-author.json
@@@ -0,0 +1,9 @@
++{
++ "messages": [
++ {
++ "id": 1,
++ "author": "robot",
++ "body": "hi"
++ }
++ ]
++}
ddiff --git a/fixtures/chat.inbox-conversations-result/valid/messages.json b/fixtures/chat.inbox-conversations-result/valid/messages.json
nnew file mode 100644
iindex 00000000..c7b6c288
---- /dev/null
++++ b/fixtures/chat.inbox-conversations-result/valid/messages.json
@@@ -0,0 +1,22 @@
++{
++ "conversation": {
++ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",
++ "status": "open"
++ },
++ "messages": [
++ {
++ "id": 1,
++ "author": "visitor",
++ "author_name": "Dana",
++ "body": "My lamp arrived cracked",
++ "created_at": "2026-10-25 02:00:00"
++ },
++ {
++ "id": 2,
++ "author": "agent",
++ "author_name": "Ann",
++ "body": "Sorry! A new shade ships today.",
++ "created_at": "2026-10-25 02:01:00"
++ }
++ ]
++}
ddiff --git a/fixtures/chat.inbox-conversations-result/valid/waiting-first.json b/fixtures/chat.inbox-conversations-result/valid/waiting-first.json
nnew file mode 100644
iindex 00000000..07315866
---- /dev/null
++++ b/fixtures/chat.inbox-conversations-result/valid/waiting-first.json
@@@ -0,0 +1,12 @@
++{
++ "conversations": [
++ {
++ "id": "cnv_01J9ZQ3M5K8V2R4T6Y8W0X2C4C",
++ "status": "waiting",
++ "visitor_name": "Dana",
++ "verified": true,
++ "preview": "My lamp arrived cracked",
++ "agent_unread": 1
++ }
++ ]
++}
ddiff --git a/fixtures/chat.inbox-reply-request/invalid/empty-reply.json b/fixtures/chat.inbox-reply-request/invalid/empty-reply.json
nnew file mode 100644
iindex 00000000..2ded3315
---- /dev/null
++++ b/fixtures/chat.inbox-reply-request/invalid/empty-reply.json
@@@ -0,0 +1,3 @@
++{
++ "message": ""
++}
ddiff --git a/fixtures/chat.inbox-reply-request/invalid/unknown-status.json b/fixtures/chat.inbox-reply-request/invalid/unknown-status.json
nnew file mode 100644
iindex 00000000..cc789993
---- /dev/null
++++ b/fixtures/chat.inbox-reply-request/invalid/unknown-status.json
@@@ -0,0 +1,3 @@
++{
++ "status": "closed"
++}
ddiff --git a/fixtures/chat.inbox-reply-request/valid/a-reply.json b/fixtures/chat.inbox-reply-request/valid/a-reply.json
nnew file mode 100644
iindex 00000000..6f2c3ab8
---- /dev/null
++++ b/fixtures/chat.inbox-reply-request/valid/a-reply.json
@@@ -0,0 +1,3 @@
++{
++ "message": "Hi! Your order ships today."
++}
ddiff --git a/fixtures/chat.inbox-reply-request/valid/resolve-and-assign.json b/fixtures/chat.inbox-reply-request/valid/resolve-and-assign.json
nnew file mode 100644
iindex 00000000..2847b5fc
---- /dev/null
++++ b/fixtures/chat.inbox-reply-request/valid/resolve-and-assign.json
@@@ -0,0 +1,4 @@
++{
++ "status": "resolved",
++ "assignee_id": 42
++}
ddiff --git a/fixtures/chat.inbox-reply-request/valid/translate.json b/fixtures/chat.inbox-reply-request/valid/translate.json
nnew file mode 100644
iindex 00000000..8f511abd
---- /dev/null
++++ b/fixtures/chat.inbox-reply-request/valid/translate.json
@@@ -0,0 +1,4 @@
++{
++ "to": "es",
++ "text": "Your order ships today."
++}
ddiff --git a/fixtures/chat.inbox-request/invalid/bad-colour.json b/fixtures/chat.inbox-request/invalid/bad-colour.json
nnew file mode 100644
iindex 00000000..81b3c966
---- /dev/null
++++ b/fixtures/chat.inbox-request/invalid/bad-colour.json
@@@ -0,0 +1,3 @@
++{
++ "color": "orange"
++}
ddiff --git a/fixtures/chat.inbox-request/invalid/retention-too-short.json b/fixtures/chat.inbox-request/invalid/retention-too-short.json
nnew file mode 100644
iindex 00000000..926fc0e2
---- /dev/null
++++ b/fixtures/chat.inbox-request/invalid/retention-too-short.json
@@@ -0,0 +1,3 @@
++{
++ "retention_days": 3
++}
ddiff --git a/fixtures/chat.inbox-request/valid/hours-routing-retention.json b/fixtures/chat.inbox-request/valid/hours-routing-retention.json
nnew file mode 100644
iindex 00000000..d7332ece
---- /dev/null
++++ b/fixtures/chat.inbox-request/valid/hours-routing-retention.json
@@@ -0,0 +1,16 @@
++{
++ "hours": {
++ "tz": "America/Los_Angeles",
++ "days": [
++ 1,
++ 2,
++ 3,
++ 4,
++ 5
++ ],
++ "start": "09:00",
++ "end": "17:00"
++ },
++ "route": "round_robin",
++ "retention_days": 90
++}
ddiff --git a/fixtures/chat.inbox-request/valid/make-an-inbox.json b/fixtures/chat.inbox-request/valid/make-an-inbox.json
nnew file mode 100644
iindex 00000000..baedfa54
---- /dev/null
++++ b/fixtures/chat.inbox-request/valid/make-an-inbox.json
@@@ -0,0 +1,13 @@
++{
++ "name": "Pixel Lamp Co.",
++ "greeting": "Questions about your lamp? Ask away.",
++ "color": "#7c5cff",
++ "ai_enabled": true,
++ "ai_instructions": "We sell smart lamps.",
++ "knowledge_urls": [
++ "https://pixellamp.example/faq"
++ ],
++ "allowed_origins": [
++ "https://pixellamp.example"
++ ]
++}
ddiff --git a/fixtures/chat.inbox-result/invalid/bad-role.json b/fixtures/chat.inbox-result/invalid/bad-role.json
nnew file mode 100644
iindex 00000000..58375c95
---- /dev/null
++++ b/fixtures/chat.inbox-result/invalid/bad-role.json
@@@ -0,0 +1,9 @@
++{
++ "inboxes": [
++ {
++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
++ "name": "x",
++ "role": "boss"
++ }
++ ]
++}
ddiff --git a/fixtures/chat.inbox-result/valid/an-inbox.json b/fixtures/chat.inbox-result/valid/an-inbox.json
nnew file mode 100644
iindex 00000000..8718d3d9
---- /dev/null
++++ b/fixtures/chat.inbox-result/valid/an-inbox.json
@@@ -0,0 +1,10 @@
++{
++ "inbox": {
++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
++ "name": "Pixel Lamp Co."
++ },
++ "embed": {
++ "script": "<script src=\"https://openvibe.chat/widget.js\" data-inbox=\"inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B\" async></script>",
++ "panel": "https://openvibe.chat/embed/inbox/inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B"
++ }
++}
ddiff --git a/fixtures/chat.inbox-result/valid/my-inboxes.json b/fixtures/chat.inbox-result/valid/my-inboxes.json
nnew file mode 100644
iindex 00000000..80be2cfe
---- /dev/null
++++ b/fixtures/chat.inbox-result/valid/my-inboxes.json
@@@ -0,0 +1,11 @@
++{
++ "inboxes": [
++ {
++ "id": "inb_01J9ZQ3M5K8V2R4T6Y8W0X2C4B",
++ "name": "Pixel Lamp Co.",
++ "role": "owner",
++ "waiting": 2,
++ "open": 5
++ }
++ ]
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 3e37a4e9..bec242e2 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -1699,6 +1699,7 @@
"owner",
"room_member",
"space_member",
++ "inbox_member",
"project",
"none"
]
@@@ -82803,6 +82804,361 @@
}
}
}
++ },
++ "chat.inbox-request": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-request.v1.json",
++ "title": "ChatInboxRequest",
++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
++ "type": "object",
++ "properties": {
++ "name": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ },
++ "greeting": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "color": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ },
++ "ai_enabled": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "ai_instructions": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "knowledge_urls": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "allowed_origins": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "handoff": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "hours": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "route": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "retention_days": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ }
++ }
++ }
++ },
++ "chat.inbox-result": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-result.v1.json",
++ "title": "ChatInboxResult",
++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
++ "type": "object",
++ "properties": {
++ "inbox": {
++ "type": "object",
++ "required": [
++ "id",
++ "name"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "name": {
++ "type": "string"
++ }
++ }
++ },
++ "inboxes": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "role"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "role": {
++ "enum": [
++ "owner",
++ "agent"
++ ]
++ },
++ "waiting": {
++ "type": "integer"
++ },
++ "open": {
++ "type": "integer"
++ }
++ }
++ }
++ },
++ "members": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ },
++ "embed": {
++ "type": "object",
++ "properties": {
++ "script": {
++ "type": "string"
++ },
++ "panel": {
++ "type": "string"
++ }
++ }
++ }
++ }
++ }
++ },
++ "chat.inbox-reply-request": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-reply-request.v1.json",
++ "title": "ChatInboxReplyRequest",
++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "message": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "properties": {
++ "status": {
++ "enum": [
++ "open",
++ "resolved",
++ "bot"
++ ]
++ },
++ "assignee_id": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
++ }
++ },
++ "additionalProperties": false,
++ "anyOf": [
++ {
++ "required": [
++ "status"
++ ]
++ },
++ {
++ "required": [
++ "assignee_id"
++ ]
++ }
++ ]
++ },
++ {
++ "type": "object",
++ "required": [
++ "to"
++ ],
++ "properties": {
++ "to": {
++ "type": "string",
++ "maxLength": 16,
++ "description": "A language code (en, es, ja, …)."
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ }
++ ]
++ }
++ },
++ "chat.inbox-conversations-result": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/inbox-conversations-result.v1.json",
++ "title": "ChatInboxConversationsResult",
++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
++ "type": "object",
++ "properties": {
++ "conversations": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "status"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "status": {
++ "enum": [
++ "bot",
++ "waiting",
++ "open",
++ "resolved"
++ ]
++ }
++ }
++ }
++ },
++ "conversation": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "messages": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "author",
++ "body"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer"
++ },
++ "author": {
++ "enum": [
++ "visitor",
++ "agent",
++ "ai",
++ "system"
++ ]
++ },
++ "body": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "message": {
++ "type": "object"
++ },
++ "replies": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ }
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 54dd4b5f..ef122de3 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 9246914c..5f8cf47b 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex fec7cfc9..f9d25f03 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 6263193b..665d6ffb 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex f9fef5d8..6ef3652d 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 4600d76b..13964128 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
@@@ -16,6 +16,2931 @@
}
],
"paths": {
++ "/api/chat/inboxes": {
++ "get": {
++ "operationId": "get_api_chat_inboxes",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_chat_inboxes",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}": {
++ "delete": {
++ "operationId": "delete_api_chat_inboxes_id",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "get": {
++ "operationId": "get_api_chat_inboxes_id",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "patch": {
++ "operationId": "patch_api_chat_inboxes_id",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/actions": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_actions",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_actions",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/actions/{actionId}": {
++ "delete": {
++ "operationId": "delete_api_chat_inboxes_id_actions_actionId",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "actionId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/actions/{actionId}/test": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_actions_actionId_test",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "actionId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/conversations": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_conversations",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/conversations/{cid}": {
++ "patch": {
++ "operationId": "patch_api_chat_inboxes_id_conversations_cid",
++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.reply"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-reply",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.reply"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "cid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/conversations/{cid}/messages": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_conversations_cid_messages",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "cid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages",
++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.reply"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-reply",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.reply"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "cid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/conversations/{cid}/messages/{mid}/translate": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_conversations_cid_messages_mid_translate",
++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.reply"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-reply",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.reply"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "cid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "mid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/conversations/{cid}/read": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_conversations_cid_read",
++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.reply"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-reply",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.reply"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "cid",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/export": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_export",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/identity": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_identity",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/members": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_members",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/members/{userId}": {
++ "delete": {
++ "operationId": "delete_api_chat_inboxes_id_members_userId",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "userId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/replies": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_replies",
++ "summary": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports ever",
++ "description": "**chat.inbox.read** (public): Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.read"
++ ]
++ }
++ ],
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_replies",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/replies/{replyId}": {
++ "delete": {
++ "operationId": "delete_api_chat_inboxes_id_replies_replyId",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "replyId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/translate": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_translate",
++ "summary": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it t",
++ "description": "**chat.inbox.reply** (public): Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.reply"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-reply",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.reply"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-reply-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-conversations-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/webhooks": {
++ "get": {
++ "operationId": "get_api_chat_inboxes_id_webhooks",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ },
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_webhooks",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/webhooks/{hookId}": {
++ "delete": {
++ "operationId": "delete_api_chat_inboxes_id_webhooks_hookId",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "hookId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "name",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ }
++ },
++ {
++ "name": "greeting",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "description": "The first line a visitor sees."
++ },
++ {
++ "name": "color",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ }
++ },
++ {
++ "name": "ai_enabled",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "description": "Vibe, the assistant, answers first."
++ },
++ {
++ "name": "ai_instructions",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ {
++ "name": "knowledge_urls",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ {
++ "name": "allowed_origins",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "description": "The sites the widget answers (empty: any)."
++ },
++ {
++ "name": "handoff",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ {
++ "name": "hours",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "description": "When the people answer; null: always."
++ },
++ {
++ "name": "route",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ {
++ "name": "retention_days",
++ "in": "query",
++ "required": false,
++ "schema": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ },
++ "description": "How long finished conversations stay; null: forever."
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/api/chat/inboxes/{id}/webhooks/{hookId}/test": {
++ "post": {
++ "operationId": "post_api_chat_inboxes_id_webhooks_hookId_test",
++ "summary": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing,",
++ "description": "**chat.inbox.manage** (public): Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "tags": [
++ "chat.inbox"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.inbox.manage"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "chat-inbox-manage",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.inbox.manage"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-request.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "hookId",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.inbox-result.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/resources": {
"get": {
"operationId": "get_api_v1_resources",
@@@ -2395,6 +5320,333 @@
}
]
},
++ "chat.inbox-conversations-result.v1": {
++ "title": "ChatInboxConversationsResult",
++ "description": "chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.",
++ "type": "object",
++ "properties": {
++ "conversations": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "status"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^cnv_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "status": {
++ "enum": [
++ "bot",
++ "waiting",
++ "open",
++ "resolved"
++ ]
++ }
++ }
++ }
++ },
++ "conversation": {
++ "type": [
++ "object",
++ "null"
++ ]
++ },
++ "messages": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "author",
++ "body"
++ ],
++ "properties": {
++ "id": {
++ "type": "integer"
++ },
++ "author": {
++ "enum": [
++ "visitor",
++ "agent",
++ "ai",
++ "system"
++ ]
++ },
++ "body": {
++ "type": "string"
++ }
++ }
++ }
++ },
++ "message": {
++ "type": "object"
++ },
++ "replies": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ }
++ }
++ },
++ "chat.inbox-reply-request.v1": {
++ "title": "ChatInboxReplyRequest",
++ "description": "chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.",
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "message"
++ ],
++ "properties": {
++ "message": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "properties": {
++ "status": {
++ "enum": [
++ "open",
++ "resolved",
++ "bot"
++ ]
++ },
++ "assignee_id": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 1
++ }
++ },
++ "additionalProperties": false,
++ "anyOf": [
++ {
++ "required": [
++ "status"
++ ]
++ },
++ {
++ "required": [
++ "assignee_id"
++ ]
++ }
++ ]
++ },
++ {
++ "type": "object",
++ "required": [
++ "to"
++ ],
++ "properties": {
++ "to": {
++ "type": "string",
++ "maxLength": 16,
++ "description": "A language code (en, es, ja, …)."
++ },
++ "text": {
++ "type": "string",
++ "maxLength": 4000
++ }
++ },
++ "additionalProperties": false
++ }
++ ]
++ },
++ "chat.inbox-request.v1": {
++ "title": "ChatInboxRequest",
++ "description": "chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.",
++ "type": "object",
++ "properties": {
++ "name": {
++ "type": "string",
++ "minLength": 2,
++ "maxLength": 60
++ },
++ "greeting": {
++ "type": "string",
++ "maxLength": 300,
++ "description": "The first line a visitor sees."
++ },
++ "color": {
++ "type": "string",
++ "pattern": "^#[0-9a-fA-F]{6}$"
++ },
++ "ai_enabled": {
++ "type": "boolean",
++ "description": "Vibe, the assistant, answers first."
++ },
++ "ai_instructions": {
++ "type": "string",
++ "maxLength": 4000,
++ "description": "What Vibe should know and how to answer (content, never rules that override Chat's)."
++ },
++ "knowledge_urls": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 10,
++ "items": {
++ "type": "string",
++ "maxLength": 500
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 5000
++ }
++ ],
++ "description": "https pages Vibe may read (an array, or one a line)."
++ },
++ "allowed_origins": {
++ "anyOf": [
++ {
++ "type": "array",
++ "maxItems": 20,
++ "items": {
++ "type": "string",
++ "maxLength": 200
++ }
++ },
++ {
++ "type": "string",
++ "maxLength": 4000
++ }
++ ],
++ "description": "The sites the widget answers (empty: any)."
++ },
++ "handoff": {
++ "type": "boolean",
++ "description": "The inbox's people answer too (false: a site assistant where only Vibe answers)."
++ },
++ "hours": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "properties": {
++ "tz": {
++ "type": "string",
++ "maxLength": 64
++ },
++ "days": {
++ "type": "array",
++ "items": {
++ "type": "integer",
++ "minimum": 0,
++ "maximum": 6
++ }
++ },
++ "start": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ },
++ "end": {
++ "type": "string",
++ "pattern": "^\\d{2}:\\d{2}$"
++ }
++ },
++ "description": "When the people answer; null: always."
++ },
++ "route": {
++ "enum": [
++ "none",
++ "round_robin"
++ ],
++ "description": "round_robin: a visitor waiting for a person goes to the next of the people."
++ },
++ "retention_days": {
++ "type": [
++ "integer",
++ "null"
++ ],
++ "minimum": 7,
++ "maximum": 3650,
++ "description": "How long finished conversations stay; null: forever."
++ }
++ }
++ },
++ "chat.inbox-result.v1": {
++ "title": "ChatInboxResult",
++ "description": "chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.",
++ "type": "object",
++ "properties": {
++ "inbox": {
++ "type": "object",
++ "required": [
++ "id",
++ "name"
++ ],
++ "properties": {
++ "id": {
++ "type": "string",
++ "pattern": "^inb_[0-9A-HJKMNP-TV-Z]{26}$"
++ },
++ "name": {
++ "type": "string"
++ }
++ }
++ },
++ "inboxes": {
++ "type": "array",
++ "items": {
++ "type": "object",
++ "required": [
++ "id",
++ "name",
++ "role"
++ ],
++ "properties": {
++ "id": {
++ "type": "string"
++ },
++ "name": {
++ "type": "string"
++ },
++ "role": {
++ "enum": [
++ "owner",
++ "agent"
++ ]
++ },
++ "waiting": {
++ "type": "integer"
++ },
++ "open": {
++ "type": "integer"
++ }
++ }
++ }
++ },
++ "members": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ }
++ },
++ "embed": {
++ "type": "object",
++ "properties": {
++ "script": {
++ "type": "string"
++ },
++ "panel": {
++ "type": "string"
++ }
++ }
++ }
++ }
++ },
"chat.ingress-ack.v1": {
"title": "ChatIngressAck",
"description": "chat.ingress-ack@1: what OpenVibe.Chat's service ingress answers when there is nothing to return (POST /internal/chat/events, chat.event.publish; POST /internal/chat/invalidate, chat.cache.invalidate), and the error every /internal/chat route answers: 400 a body Chat refuses, 401/403 no service token or no grant for the capability, 403/404 a refused or unknown DM participant or stream, 409 an idempotency key reused with another body, 503 Chat unavailable or a delivery in progress (retry with the same key).",
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex d8335efe..40505445 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex b78092bd..9f8ade40 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 6ef5170a..b0cf3528 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 7d2aaadb..e184c723 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 6f233268..c25b24a0 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 7b77cfef..d2d9a4be 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex 33df21f5..8a03f08c 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex fae73365..53c8099b 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 3c994361..ece880d7 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -40,8 +40,8 @@
"service": "chat",
"name": "OpenVibe.Chat",
"origin": "https://openvibe.chat",
-- "operations": 25,
-- "capabilities": 14
++ "operations": 52,
++ "capabilities": 17
},
{
"service": "codes",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 711baca6..c51514f3 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 8468a49a..e60a134c 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 9fb4fe91..e4787dec 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 1a5058a6..c138f30a 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex db826545..b5710689 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex b650f678..721342a5 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 1f976f5c..870a117b 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.213.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex 8e47aace..ef96616c 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex d104d282..dae2df58 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex 702186f2..af562cd2 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 15d38e6d..95163646 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 570b0684..a7aa77b3 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 4be8c4c1..a23dd846 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 5db37f88..b13a0d66 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex f6a9d371..f02ffb2d 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 2743e7b3..25d0c8e4 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex a6fac7b9..c0495d40 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 7df98a28..4e14b98f 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 91b93d1f..914e0348 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex c679b82a..497b5041 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 80eca480..516b1d29 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 3d5e6c83..23b7e619 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 1b5844a1..b5b1fce9 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.213.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.213.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.214.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.214.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 6b051edf..7ff135e9 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -4042,7 +4042,7 @@ export interface Capability {
inputSchema?: string;
outputSchema?: string;
permissions: string[];
-- resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "project" | "none")[];
++ resourceConstraints: ("namespace" | "owner" | "room_member" | "space_member" | "inbox_member" | "project" | "none")[];
quotaClass: string;
events: string[];
/**
@@@ -205667,3 +205667,259 @@ export interface QuestAppQuest {
updated_at: string;
completions: number;
}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.inbox-request@1: a support inbox, made (POST /api/chat/inboxes, name required) or changed by its owner (PATCH /api/chat/inboxes/:id, any subset). Unknown fields are ignored; a bad value is 422 with a code (inbox.name, inbox.origin, inbox.hours, inbox.retention, …). Members (POST /:id/members { username }), saved replies (POST /:id/replies { shortcut, body }), webhooks (POST /:id/webhooks { url }), actions (POST /:id/actions { name, description, url, params }) and verified visitors (POST /:id/identity { action: on | rotate | off }) take their own small bodies on the routes chat.inbox.manage names.
++ */
++export interface ChatInboxRequest {
++ name?: string;
++ /**
++ * The first line a visitor sees.
++ */
++ greeting?: string;
++ color?: string;
++ /**
++ * Vibe, the assistant, answers first.
++ */
++ ai_enabled?: boolean;
++ /**
++ * What Vibe should know and how to answer (content, never rules that override Chat's).
++ */
++ ai_instructions?: string;
++ /**
++ * https pages Vibe may read (an array, or one a line).
++ */
++ knowledge_urls?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string]
++ | [string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string]
++ | string;
++ /**
++ * The sites the widget answers (empty: any).
++ */
++ allowed_origins?:
++ | []
++ | [string]
++ | [string, string]
++ | [string, string, string]
++ | [string, string, string, string]
++ | [string, string, string, string, string]
++ | [string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string, string]
++ | [string, string, string, string, string, string, string, string, string, string, string, string, string, string]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | [
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string,
++ string
++ ]
++ | string;
++ /**
++ * The inbox's people answer too (false: a site assistant where only Vibe answers).
++ */
++ handoff?: boolean;
++ /**
++ * When the people answer; null: always.
++ */
++ hours?: {
++ tz?: string;
++ days?: number[];
++ start?: string;
++ end?: string;
++ } | null;
++ /**
++ * round_robin: a visitor waiting for a person goes to the next of the people.
++ */
++ route?: "none" | "round_robin";
++ /**
++ * How long finished conversations stay; null: forever.
++ */
++ retention_days?: number | null;
++}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.inbox-result@1: a support inbox as its people see it ({ inbox, members?, embed? }: the widget snippet and panel address), or the inboxes a person works in ({ inboxes }, each with their role and how many conversations wait and are open). Secrets (the identity secret, webhook and action secrets) appear only on the answer that made them.
++ */
++export interface ChatInboxResult {
++ inbox?: {
++ id: string;
++ name: string;
++ };
++ inboxes?: {
++ id: string;
++ name: string;
++ role: "owner" | "agent";
++ waiting?: number;
++ open?: number;
++ }[];
++ members?: {}[];
++ embed?: {
++ script?: string;
++ panel?: string;
++ };
++}
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.inbox-reply-request@1: what one of an inbox's people sends while working a conversation (chat.inbox.reply). A reply (POST /api/chat/inboxes/:id/conversations/:cid/messages { message }: the conversation becomes open, Vibe stays quiet in it, and the person takes it if nobody has); a status or an assignment (PATCH /:id/conversations/:cid { status: open | resolved | bot, assignee_id: one of the inbox's people | null }); a translation (POST /:id/conversations/:cid/messages/:mid/translate { to } or POST /:id/translate { text, to }). Marking read (POST /:id/conversations/:cid/read) takes no body.
++ */
++export type ChatInboxReplyRequest =
++ | {
++ message: string;
++ }
++ | {
++ [k: string]: unknown | undefined;
++ }
++ | {
++ /**
++ * A language code (en, es, ja, …).
++ */
++ to: string;
++ text?: string;
++ };
++
++/** [email protected] (owner: chat) */
++/**
++ * chat.inbox-conversations-result@1: an inbox's conversations ({ conversations }: waiting first, each with status, who has it, the visitor's name and whether their site verified them, a preview and unread count), one conversation's messages ({ conversation, messages }, ?after= a message id), a reply ({ message }), its saved replies ({ replies }), or the owner's export (?format=json: { inbox, exported_at, conversations: [{ …, messages }] }; ?format=csv is text/csv, one row per message). A message is { id, author: visitor | agent | ai | system, author_name, body, created_at, account? }.
++ */
++export interface ChatInboxConversationsResult {
++ conversations?: {
++ id: string;
++ status: "bot" | "waiting" | "open" | "resolved";
++ }[];
++ conversation?: {} | null;
++ messages?: {
++ id: number;
++ author: "visitor" | "agent" | "ai" | "system";
++ body: string;
++ }[];
++ message?: {};
++ replies?: {}[];
++}
ddiff --git a/manifests/capabilities/chat.inbox.manage.json b/manifests/capabilities/chat.inbox.manage.json
nnew file mode 100644
iindex 00000000..f3ba9707
---- /dev/null
++++ b/manifests/capabilities/chat.inbox.manage.json
@@@ -0,0 +1,37 @@
++{
++ "id": "chat.inbox.manage",
++ "version": "1.0",
++ "owner": "chat",
++ "status": "active",
++ "visibility": "public",
++ "sensitive": true,
++ "description": "Set up support inboxes for the person on OpenVibe.Chat: make one (it is theirs), and as its owner change it (name, greeting, colour, Vibe and its instructions and pages, allowed sites, hours, routing, retention), add and remove its people, keep saved replies, and connect webhooks, actions (endpoints Vibe may call) and verified visitors. Secrets are shown only on the answer that made them. Deleting an inbox archives it.",
++ "permissions": [
++ "chat:inbox:manage"
++ ],
++ "resourceConstraints": [
++ "inbox_member"
++ ],
++ "quotaClass": "chat-inbox-manage",
++ "events": [],
++ "implementedBy": [
++ "POST /api/chat/inboxes",
++ "PATCH /api/chat/inboxes/:id",
++ "DELETE /api/chat/inboxes/:id",
++ "POST /api/chat/inboxes/:id/members",
++ "DELETE /api/chat/inboxes/:id/members/:userId",
++ "POST /api/chat/inboxes/:id/replies",
++ "DELETE /api/chat/inboxes/:id/replies/:replyId",
++ "GET /api/chat/inboxes/:id/webhooks",
++ "POST /api/chat/inboxes/:id/webhooks",
++ "POST /api/chat/inboxes/:id/webhooks/:hookId/test",
++ "DELETE /api/chat/inboxes/:id/webhooks/:hookId",
++ "GET /api/chat/inboxes/:id/actions",
++ "POST /api/chat/inboxes/:id/actions",
++ "POST /api/chat/inboxes/:id/actions/:actionId/test",
++ "DELETE /api/chat/inboxes/:id/actions/:actionId",
++ "POST /api/chat/inboxes/:id/identity"
++ ],
++ "inputSchema": "chat.inbox-request@1",
++ "outputSchema": "chat.inbox-result@1"
++}
ddiff --git a/manifests/capabilities/chat.inbox.read.json b/manifests/capabilities/chat.inbox.read.json
nnew file mode 100644
iindex 00000000..3dfb554b
---- /dev/null
++++ b/manifests/capabilities/chat.inbox.read.json
@@@ -0,0 +1,27 @@
++{
++ "id": "chat.inbox.read",
++ "version": "1.0",
++ "owner": "chat",
++ "status": "active",
++ "visibility": "public",
++ "sensitive": true,
++ "description": "Read the support inboxes the person works in on OpenVibe.Chat (docs/platform.md): the inboxes, each one's conversations (waiting first) and messages, and its saved replies; the owner also exports every conversation (JSON or CSV). Visitors' messages are people's words to a team, so an app sees only inboxes its person works in, and the person's own role decides the rest (the export is the owner's).",
++ "permissions": [
++ "chat:inbox:read"
++ ],
++ "resourceConstraints": [
++ "inbox_member"
++ ],
++ "quotaClass": "chat-inbox-read",
++ "events": [],
++ "implementedBy": [
++ "GET /api/chat/inboxes",
++ "GET /api/chat/inboxes/:id",
++ "GET /api/chat/inboxes/:id/conversations",
++ "GET /api/chat/inboxes/:id/conversations/:cid/messages",
++ "GET /api/chat/inboxes/:id/replies",
++ "GET /api/chat/inboxes/:id/export"
++ ],
++ "inputSchema": "common.no-body@1",
++ "outputSchema": "chat.inbox-conversations-result@1"
++}
ddiff --git a/manifests/capabilities/chat.inbox.reply.json b/manifests/capabilities/chat.inbox.reply.json
nnew file mode 100644
iindex 00000000..24994b83
---- /dev/null
++++ b/manifests/capabilities/chat.inbox.reply.json
@@@ -0,0 +1,26 @@
++{
++ "id": "chat.inbox.reply",
++ "version": "1.0",
++ "owner": "chat",
++ "status": "active",
++ "visibility": "public",
++ "sensitive": true,
++ "description": "Answer visitors for the person in a support inbox they work in on OpenVibe.Chat: reply in a conversation (it becomes open, Vibe stays quiet in it), resolve, reopen or give it back to Vibe, assign it to one of the inbox's people, mark it read, and translate a visitor's message or a reply. The reply is the person's, under their name.",
++ "permissions": [
++ "chat:inbox:reply"
++ ],
++ "resourceConstraints": [
++ "inbox_member"
++ ],
++ "quotaClass": "chat-inbox-reply",
++ "events": [],
++ "implementedBy": [
++ "POST /api/chat/inboxes/:id/conversations/:cid/messages",
++ "PATCH /api/chat/inboxes/:id/conversations/:cid",
++ "POST /api/chat/inboxes/:id/conversations/:cid/read",
++ "POST /api/chat/inboxes/:id/conversations/:cid/messages/:mid/translate",
++ "POST /api/chat/inboxes/:id/translate"
++ ],
++ "inputSchema": "chat.inbox-reply-request@1",
++ "outputSchema": "chat.inbox-conversations-result@1"
++}
ddiff --git a/manifests/services/chat.json b/manifests/services/chat.json
iindex 04151a8f..41fb5f98 100644
---- a/manifests/services/chat.json
++++ b/manifests/services/chat.json
@@@ -27,7 +27,10 @@
"chat.stats.read",
"chat.ticket.write",
"chat.resource.read",
-- "chat.resource.control"
++ "chat.resource.control",
++ "chat.inbox.read",
++ "chat.inbox.reply",
++ "chat.inbox.manage"
],
"eventsProduced": [
"chat.message.created",
ddiff --git a/package-lock.json b/package-lock.json
iindex 356f13d9..643032e5 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.213.0",
++ "version": "0.214.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.213.0",
++ "version": "0.214.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex f7978313..9b9f9fd7 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.213.0",
++ "version": "0.214.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",