openvibers/openvibe.contracts Commits

Contracts 0.105.0: chat.ticket.write is active (Chat #26); chat.messages.read lists the DM block-state read (Chat #27) (#50)

OP OpenVibers committed 5 Oct 2026 · dec51f5ab6 · 39 files, +481 −65

**Changes (file:line)**

1. `manifests/capabilities/chat.ticket.write.json:5` — status `planned` → `active`.
2. `manifests/capabilities/chat.ticket.write.json:18-19` — `implementedBy` `[]` → `GET /internal/chat/tickets/:ticket_id`, `POST /internal/chat/tickets/:ticket_id/messages` (exact routes from Chat `server/chat/internal-tickets.js:361-362`).
3. `manifests/capabilities/chat.ticket.write.json:8` — description de-PLANNED (now says it reads the service's own conversation too).
4. `contracts/catalog.json:4819` — `chat.ticket-conversation` catalog status `planned` → `active`.
5. `manifests/capabilities/chat.messages.read.json:18` — added `GET /internal/chat/dm/block-state` to the route list.
6. `contracts/chat/dm-block-state-result.v1.json:1` — new `chat.dm-block-state-result@1` (`{ ok, blocked }`, `anyOf` ok shape + `chat.ingress-ack@1` error), following `first-chat-result`/`sound-result` (route-specific schemas live in the catalog, not in `outputSchema`).
7. `contracts/catalog.json:4750` — new `chat.dm-block-state-result` entry (owner `chat`, first-party, active).
8. `fixtures/chat.dm-block-state-result/valid/blocked.json:1`, `fixtures/chat.dm-block-state-result/invalid/missing-blocked.json:1` — valid + invalid fixtures.
9. `fixtures/chat.ticket-conversation/…` — unchanged (schema unchanged).
10. `CHANGELOG.md:7` — new `## 0.105.0 — 2026-10-05` entry.
11. `STATUS.json:12` version → `v0.105.0`; `:24` ticket feature line planned→active with the two routes; `:25` new `chat.dm-block-state-result@1` line.
12. `package.json:3`, `package-lock.json:3,9` — version → `0.105.0`.
13. `generated/openapi/chat.json` — 3 new operations (`/internal/chat/tickets/{ticket_id}`, `/internal/chat/tickets/{ticket_id}/messages`, `/internal/chat/dm/block-state`); `generated/openapi/index.json` chat operations 19→22, capabilities 11→12; all OpenAPI docs + `json-schema/bundle.json` + `typescript/index.d.ts` regenerated to 0.105.0 via `npm run generate` (kept).

**Verification**
- `node scripts/compat.js v0.104.0` → `no breaking changes`.
- `nice -n 15 ov test --no-cache test/platform-fabric.test.js test/product-catalog.test.js test/capability-schemas.test.js test/openapi.test.js` → `4 passed in 28 s`.
- Direct check of the new fixtures: valid passes, invalid fails; `chat.dm-block-state-result@1` resolves.

One scope note: I did update `chat.ticket.write`'s description (line 8) because it still said "PLANNED … becomes active when OpenVibe.Chat implements the route" — leaving that in an active capability would be contradicted by this release. Everything else is limited to the two capabilities and the release files, exactly as the 0.104.0 commit did.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex d6c64c9f..0da3afd8 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,25 @@ 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.105.0 — 2026-10-05
++
++**Chat's ticket conversation and DM block-state reads are live** (Chat #26 and #27). `chat.ticket.write` is active
++and `chat.messages.read` gains Chat's DM block-state route. Additive: one new chat result contract, one capability
++activated with the routes it names, one route list extended; no existing schema changed.
++- `chat.ticket.write` (owner `chat`, first-party, **active**): OpenVibe.Chat serves the per-ticket conversation it
++ names (`server/chat/internal-tickets.js`) — `POST /internal/chat/tickets/:ticket_id/messages` creates the
++ (ticket id, calling service) conversation on first use and appends one message, and
++ `GET /internal/chat/tickets/:ticket_id` reads that service's own conversation, paged; both guarded by the
++ capability, so an app, node or agent token is refused.
++- `chat.dm-block-state-result@1` (new, owner `chat`, first-party): the answer of
++ `GET /internal/chat/dm/block-state?a&b` — `{ blocked }`, true when either user blocked the other, in Chat's
++ `dm_blocks` or as a Network platform block — added to `chat.messages.read`'s route list. It follows the other
++ `chat.*` internal-read schemas: an `anyOf` of the ok shape and `chat.ingress-ack@1`'s error, with valid and
++ invalid fixtures.
++- `chat.ticket-conversation@1` moves from planned to active in the catalog. `generated/openapi/chat.json` gains both
++ ticket operations (the generator emits an active capability's `implementedBy` routes), and the generated docs move
++ to 0.105.0.
++
## 0.104.0 — 2026-10-05
**Network's resource index is live** (Network PR #62; ADR-048). `network.resource.read` is active: OpenVibe.Network
ddiff --git a/STATUS.json b/STATUS.json
iindex a07fbaf1..0e394eb8 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -9,7 +9,7 @@
"plan": "OpenVibe Development Roadmap (combined), Wave 1; implementation plan rev 3 section 3.1",
"deployed": false,
"deployment": "none of its own: a library and artifact repository published as release tags; services pin a tag and deploy it with their own releases",
-- "contracts": "openvibe-contracts v0.104.0 (this package; the newest tag)",
++ "contracts": "openvibe-contracts v0.105.0 (this package; the newest tag)",
"features": [
"589 JSON Schemas with valid and invalid fixtures",
"31 service manifests with lifecycle declarations",
@@@ -21,7 +21,8 @@
"compatibility check against the previous tag (scripts/compat.js)",
"documentation-currency check (scripts/docs-currency.js)",
"generated estate: docs/ESTATE.md and manifests/repositories/ from the checkouts (scripts/estate.js; --check fails on drift)",
-- "chat.ticket-conversation@1 and the planned chat.ticket.write capability: a per-ticket conversation keyed by ticket id and calling service, with author_kind person|agent|staff",
++ "chat.ticket-conversation@1 and the active chat.ticket.write capability: a per-ticket conversation keyed by ticket id and calling service, with author_kind person|agent|staff (POST /internal/chat/tickets/:ticket_id/messages and GET /internal/chat/tickets/:ticket_id)",
++ "chat.dm-block-state-result@1: Chat's DM block-state read ({ blocked }, GET /internal/chat/dm/block-state) joined to chat.messages.read's route list",
"platform.task@1 (planned, owner network) and ADR-044: one task at OpenVibe.Actor's router with a mode, a per-task and per-day budget, result, cost and explanation, SSE progress, cancel and webhooks",
"watch.watch@1 and the other Watch contracts (plan T18, planned), three watch events, four capabilities and the placeholder service manifest: user-defined persistent observations over pages, feeds, APIs, events and devices",
"chat.site-daily-result@1, chat.first-chat-result@1 and chat.sound-result@1: Chat's three new internal reads (kind site-daily for Live's home series, the welcome check, and the sound a !command plays), with chat.stats-request@1 now accepting kind site-daily and the two route lists extended",
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex fb924efb..45cc6057 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -4746,6 +4746,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "chat.dm-block-state-result",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/dm-block-state-result.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "chat.timeline-result",
"version": "1.0.0",
@@@ -4807,7 +4816,7 @@
"schema": "chat/ticket-conversation.v1.json",
"visibility": "first-party",
"compatibility": "backward",
-- "status": "planned"
++ "status": "active"
},
{
"id": "live.moderation.action",
ddiff --git a/contracts/chat/dm-block-state-result.v1.json b/contracts/chat/dm-block-state-result.v1.json
nnew file mode 100644
iindex 00000000..be2203e4
---- /dev/null
++++ b/contracts/chat/dm-block-state-result.v1.json
@@@ -0,0 +1,26 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/dm-block-state-result.v1.json",
++ "title": "ChatDmBlockStateResult",
++ "description": "chat.dm-block-state-result@1: the answer of GET /internal/chat/dm/block-state?a&b on OpenVibe.Chat (capability chat.messages.read): blocked is true when either user has blocked the other, in Chat's dm_blocks or as a Network platform block (dm.js isBlockedEither, the check the DM and call routes use). a and b are positive Live user ids and must differ; OpenVibe.Live asks this before sending a call invite. A failure is chat.ingress-ack@1's error.",
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "blocked"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "ok": {
++ "const": true
++ },
++ "blocked": {
++ "type": "boolean"
++ }
++ }
++ },
++ {
++ "$ref": "ingress-ack.v1.json#/$defs/error"
++ }
++ ]
++}
ddiff --git a/fixtures/chat.dm-block-state-result/invalid/missing-blocked.json b/fixtures/chat.dm-block-state-result/invalid/missing-blocked.json
nnew file mode 100644
iindex 00000000..0287aedd
---- /dev/null
++++ b/fixtures/chat.dm-block-state-result/invalid/missing-blocked.json
@@@ -0,0 +1,3 @@
++{
++ "ok": true
++}
ddiff --git a/fixtures/chat.dm-block-state-result/valid/blocked.json b/fixtures/chat.dm-block-state-result/valid/blocked.json
nnew file mode 100644
iindex 00000000..c6c734ed
---- /dev/null
++++ b/fixtures/chat.dm-block-state-result/valid/blocked.json
@@@ -0,0 +1,4 @@
++{
++ "ok": true,
++ "blocked": true
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 011baa71..65bd7d24 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -53313,6 +53313,37 @@
}
}
},
++ "chat.dm-block-state-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/dm-block-state-result.v1.json",
++ "title": "ChatDmBlockStateResult",
++ "description": "chat.dm-block-state-result@1: the answer of GET /internal/chat/dm/block-state?a&b on OpenVibe.Chat (capability chat.messages.read): blocked is true when either user has blocked the other, in Chat's dm_blocks or as a Network platform block (dm.js isBlockedEither, the check the DM and call routes use). a and b are positive Live user ids and must differ; OpenVibe.Live asks this before sending a call invite. A failure is chat.ingress-ack@1's error.",
++ "anyOf": [
++ {
++ "type": "object",
++ "required": [
++ "blocked"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "ok": {
++ "const": true
++ },
++ "blocked": {
++ "type": "boolean"
++ }
++ }
++ },
++ {
++ "$ref": "ingress-ack.v1.json#/$defs/error"
++ }
++ ]
++ }
++ },
"chat.timeline-result": {
"version": "1.0.0",
"owner": "chat",
@@@ -53888,7 +53919,7 @@
"chat.ticket-conversation": {
"version": "1.0.0",
"owner": "chat",
-- "status": "planned",
++ "status": "active",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/chat/ticket-conversation.v1.json",
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex f1b786ea..2dab65a6 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.104.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 d1b7c021..62fb68f9 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.104.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 a4120271..d18721ce 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.104.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ac0e6861..dc4bd4c5 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.104.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 cb40c6b3..e8963934 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.104.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.105.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,52 @@
}
],
"paths": {
++ "/internal/chat/dm/block-state": {
++ "get": {
++ "operationId": "get_internal_chat_dm_block_state",
++ "summary": "Page OpenVibe.Chat's stored messages of one channel, stream, person, anonymous id or name, or read one by id, with a cursor on the message id and the latest id: for OpenVibe.Live's AI context, clip an",
++ "description": "**chat.messages.read** (internal): Page OpenVibe.Chat's stored messages of one channel, stream, person, anonymous id or name, or read one by id, with a cursor on the message id and the latest id: for OpenVibe.Live's AI context, clip and viewer jobs and its moderator search and history (plan T3, J4b). Loopback only, Chat service token (Live's principal today); never granted to an app or delegated to an agent.",
++ "tags": [
++ "chat.messages"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.messages.read"
++ ],
++ "x-openvibe-visibility": [
++ "internal"
++ ],
++ "x-openvibe-quota-class": "internal-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.messages.read"
++ ]
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.messages-page.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/internal/chat/events": {
"post": {
"operationId": "post_internal_chat_events",
@@@ -728,6 +774,186 @@
}
}
},
++ "/internal/chat/tickets/{ticket_id}": {
++ "get": {
++ "operationId": "get_internal_chat_tickets_ticket_id",
++ "summary": "Create or continue one conversation per (ticket id, calling service) and post a message into it, or read that service's own conversation, paged: with author_kind person, agent or staff and the author'",
++ "description": "**chat.ticket.write** (first-party): Create or continue one conversation per (ticket id, calling service) and post a message into it, or read that service's own conversation, paged: with author_kind person, agent or staff and the author's subject, so a service (Help's agent worker, staff tooling) can answer a ticket without the person send route POST /api/chat/send, which needs a person's session. Loopback only, first-party service token; never granted to an app or delegated to an agent.",
++ "tags": [
++ "chat.ticket"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.ticket.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "internal-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.ticket.write"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/chat.ticket-conversation.v1"
++ },
++ "parameters": [
++ {
++ "name": "ticket_id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ },
++ {
++ "name": "service",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40,
++ "pattern": "^[a-z][a-z0-9-]*$",
++ "description": "The Contracts manifest id of the calling service (e.g. `help`, `ai`), the service token's principal. Together with `ticket_id` it keys the conversation, so two services on one ticket get two conversations."
++ },
++ "description": "The Contracts manifest id of the calling service (e.g. `help`, `ai`), the service token's principal. Together with `ticket_id` it keys the conversation, so two services on one ticket get two conversations."
++ },
++ {
++ "name": "message",
++ "in": "query",
++ "required": true,
++ "schema": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "author_kind",
++ "author",
++ "body",
++ "created_at"
++ ],
++ "properties": {
++ "author_kind": {
++ "enum": [
++ "person",
++ "agent",
++ "staff"
++ ],
++ "description": "Who wrote the message: the ticket's `person`, an `agent` (a service acting for one, e.g. Help's AI worker), or `staff` (a human on the service's team)."
++ },
++ "author": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The author's subject: `user:<id>` for a person, or the service/agent subject that posted on its behalf. Never a display name."
++ },
++ "body": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 6000,
++ "description": "The message text; not blank."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the message was written (the author's clock; Chat keeps its own ordering)."
++ }
++ }
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.ticket-conversation.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
++ "/internal/chat/tickets/{ticket_id}/messages": {
++ "post": {
++ "operationId": "post_internal_chat_tickets_ticket_id_messages",
++ "summary": "Create or continue one conversation per (ticket id, calling service) and post a message into it, or read that service's own conversation, paged: with author_kind person, agent or staff and the author'",
++ "description": "**chat.ticket.write** (first-party): Create or continue one conversation per (ticket id, calling service) and post a message into it, or read that service's own conversation, paged: with author_kind person, agent or staff and the author's subject, so a service (Help's agent worker, staff tooling) can answer a ticket without the person send route POST /api/chat/send, which needs a person's session. Loopback only, first-party service token; never granted to an app or delegated to an agent.",
++ "tags": [
++ "chat.ticket"
++ ],
++ "x-openvibe-capabilities": [
++ "chat.ticket.write"
++ ],
++ "x-openvibe-visibility": [
++ "first-party"
++ ],
++ "x-openvibe-quota-class": "internal-write",
++ "security": [
++ {
++ "openvibeToken": [
++ "chat.ticket.write"
++ ]
++ }
++ ],
++ "requestBody": {
++ "required": false,
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.ticket-conversation.v1"
++ }
++ }
++ }
++ },
++ "parameters": [
++ {
++ "name": "ticket_id",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/chat.ticket-conversation.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/internal/chat/timeline": {
"get": {
"operationId": "get_internal_chat_timeline",
@@@ -4390,6 +4616,82 @@
}
}
},
++ "chat.ticket-conversation.v1": {
++ "title": "ChatTicketConversation",
++ "description": "chat.ticket-conversation@1: one conversation between an OpenVibe.Help ticket and one calling service, keyed by the ticket id and the service, carrying one posted message. The person side reads and answers it through Chat's person APIs (POST /api/chat/send needs a person's session); a service-side author (Help's agent worker, staff tooling) posts here with a service token, which is why the write needs the chat.ticket.write capability rather than the person send route. author_kind says who wrote the message (`person`, `agent` or `staff`), author is that author's subject, body is the text, and created_at is when the message was written.",
++ "$comment": "Additive optional fields may extend this v1 contract.",
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "ticket_id",
++ "service",
++ "message"
++ ],
++ "properties": {
++ "ticket_id": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The OpenVibe.Help ticket this conversation belongs to. Together with `service` it keys the conversation: one conversation per (ticket id, calling service)."
++ },
++ "service": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 40,
++ "pattern": "^[a-z][a-z0-9-]*$",
++ "description": "The Contracts manifest id of the calling service (e.g. `help`, `ai`), the service token's principal. Together with `ticket_id` it keys the conversation, so two services on one ticket get two conversations."
++ },
++ "message": {
++ "type": "object",
++ "additionalProperties": false,
++ "required": [
++ "author_kind",
++ "author",
++ "body",
++ "created_at"
++ ],
++ "properties": {
++ "author_kind": {
++ "enum": [
++ "person",
++ "agent",
++ "staff"
++ ],
++ "description": "Who wrote the message: the ticket's `person`, an `agent` (a service acting for one, e.g. Help's AI worker), or `staff` (a human on the service's team)."
++ },
++ "author": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 200,
++ "description": "The author's subject: `user:<id>` for a person, or the service/agent subject that posted on its behalf. Never a display name."
++ },
++ "body": {
++ "type": "string",
++ "minLength": 1,
++ "maxLength": 6000,
++ "description": "The message text; not blank."
++ },
++ "created_at": {
++ "type": "string",
++ "format": "date-time",
++ "description": "When the message was written (the author's clock; Chat keeps its own ordering)."
++ }
++ }
++ }
++ },
++ "examples": [
++ {
++ "ticket_id": "tkt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "help",
++ "message": {
++ "author_kind": "person",
++ "author": "user:usr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "body": "My export from yesterday is missing the last day of records.",
++ "created_at": "2026-10-05T09:00:00Z"
++ }
++ }
++ ]
++ },
"chat.timeline-result.v1": {
"title": "ChatTimelineResult",
"description": "chat.timeline-result@1: the answer of GET /internal/chat/timeline on OpenVibe.Chat (capability chat.analysis.read): non-deleted chat_messages of one channel (channel_user_id) or stream (stream_id) counted per bucket between since and until (epoch ms), bucket_ms wide, for OpenVibe.Live's AI moments, chat spikes and activity. Empty buckets are left out; buckets are oldest first. max_id is the highest message id in the window, null when none. A failure is chat.ingress-ack@1's error.",
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex adffeb1f..25ada9fe 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.104.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 31967a0e..2b17ac87 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.104.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 d678818b..e1cfabaa 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.104.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 7473c2f9..106e59ca 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.104.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 603596cf..e16769f3 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.104.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 6e924a9b..96420759 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.104.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 a755f8ba..34ffdd84 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.104.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 30758230..05b779a4 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -33,8 +33,8 @@
"service": "chat",
"name": "OpenVibe.Chat",
"origin": "https://openvibe.chat",
-- "operations": 19,
-- "capabilities": 11
++ "operations": 22,
++ "capabilities": 12
},
{
"service": "codes",
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex a29cfe09..d7c20e84 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.104.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 85ca7c11..9cae5be7 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.104.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 a6fb104d..675842ec 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.104.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ab3b3396..751ecab5 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.104.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 e9b872a1..5af0a2d1 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": "OpenRe.Stream API",
-- "version": "0.104.0",
-- "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 d8fa7418..8c395506 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.104.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 1ebe5229..29a804de 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.104.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ade8004a..5b975297 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.104.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 937fe4ab..c22b1e1b 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.104.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ea966e83..20ae5553 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.104.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 18a4e464..f3811d98 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.104.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ed79495c..c1911cad 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.104.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 ebfec82a..48bffe97 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.104.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 f92ed95e..ace76574 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.104.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.104.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.105.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.105.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 e2d8223f..e56f0166 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -51320,6 +51320,23 @@ export type ChatMessagesPage =
error: string;
};
++/** [email protected] (owner: chat) */
++/**
++ * chat.dm-block-state-result@1: the answer of GET /internal/chat/dm/block-state?a&b on OpenVibe.Chat (capability chat.messages.read): blocked is true when either user has blocked the other, in Chat's dm_blocks or as a Network platform block (dm.js isBlockedEither, the check the DM and call routes use). a and b are positive Live user ids and must differ; OpenVibe.Live asks this before sending a call invite. A failure is chat.ingress-ack@1's error.
++ */
++export type ChatDmBlockStateResult =
++ | {
++ ok?: true;
++ blocked: boolean;
++ }
++ | {
++ ok: false;
++ /**
++ * A human-readable reason.
++ */
++ error: string;
++ };
++
/** [email protected] (owner: chat) */
/**
* chat.timeline-result@1: the answer of GET /internal/chat/timeline on OpenVibe.Chat (capability chat.analysis.read): non-deleted chat_messages of one channel (channel_user_id) or stream (stream_id) counted per bucket between since and until (epoch ms), bucket_ms wide, for OpenVibe.Live's AI moments, chat spikes and activity. Empty buckets are left out; buckets are oldest first. max_id is the highest message id in the window, null when none. A failure is chat.ingress-ack@1's error.
ddiff --git a/manifests/capabilities/chat.messages.read.json b/manifests/capabilities/chat.messages.read.json
iindex 641b1a9a..075f691c 100644
---- a/manifests/capabilities/chat.messages.read.json
++++ b/manifests/capabilities/chat.messages.read.json
@@@ -14,7 +14,8 @@
"quotaClass": "internal-read",
"events": [],
"implementedBy": [
-- "GET /internal/chat/messages"
++ "GET /internal/chat/messages",
++ "GET /internal/chat/dm/block-state"
],
"inputSchema": "common.no-body@1",
"outputSchema": "chat.messages-page@1"
ddiff --git a/manifests/capabilities/chat.ticket.write.json b/manifests/capabilities/chat.ticket.write.json
iindex 06cbe946..3516e684 100644
---- a/manifests/capabilities/chat.ticket.write.json
++++ b/manifests/capabilities/chat.ticket.write.json
@@@ -2,10 +2,10 @@
"id": "chat.ticket.write",
"version": "1.0",
"owner": "chat",
-- "status": "planned",
++ "status": "active",
"visibility": "first-party",
"sensitive": true,
-- "description": "PLANNED (OpenVibe.Help is not built yet; Help's per-ticket conversation has no service-token path into Chat today): create or continue one conversation per (ticket id, calling service) and post a message into it, with author_kind person, agent or staff and the author's subject, so a service (Help's agent worker, staff tooling) can answer a ticket without the person send route POST /api/chat/send, which needs a person's session. Loopback only, first-party service token; never granted to an app or delegated to an agent. It becomes active, and enters generated/openapi/chat.json, when OpenVibe.Chat implements the route.",
++ "description": "Create or continue one conversation per (ticket id, calling service) and post a message into it, or read that service's own conversation, paged: with author_kind person, agent or staff and the author's subject, so a service (Help's agent worker, staff tooling) can answer a ticket without the person send route POST /api/chat/send, which needs a person's session. Loopback only, first-party service token; never granted to an app or delegated to an agent.",
"permissions": [
"chat:write"
],
@@@ -14,7 +14,10 @@
],
"quotaClass": "internal-write",
"events": [],
-- "implementedBy": [],
++ "implementedBy": [
++ "POST /internal/chat/tickets/:ticket_id/messages",
++ "GET /internal/chat/tickets/:ticket_id"
++ ],
"inputSchema": "chat.ticket-conversation@1",
"outputSchema": "chat.ticket-conversation@1"
}
ddiff --git a/package-lock.json b/package-lock.json
iindex 81c3dd3e..9672e5db 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.104.0",
++ "version": "0.105.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.104.0",
++ "version": "0.105.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex bdbb1985..405bd887 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.104.0",
++ "version": "0.105.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",