openvibers/openvibe.contracts Commits

Contracts 0.100.0: usage-sample resource is the rate-card metric, placement-result may select no candidate, chat.ticket.write (planned) (#43)

OP OpenVibers committed 5 Oct 2026 · 1e2441958f · 46 files, +406 −65

## Changes (file:line)

**1. `resource` = the rate-card metric (usage-sample)**
- `contracts/platform/usage-sample.v1.json:40` — added a `resource` description: it must be the producing service's `platform.rate-card@1` `metric` for that `provider` (never a run/job/object id), and the reading's `unit` must be that metric's unit.
- `fixtures/platform.usage-sample/valid/ai-per-metric.json:1` — new valid AI reading (`service: ai`, `provider: openai`, `resource/unit: tokens`, `operation: chat.completion`, `quantity: 1500`, `cost_estimate`, `free_allowance_used`, all required fields).
- `fixtures/platform.rate-card/valid/ai-tokens.json:1` — **supporting** rate card for that reading. `fixtures/platform.rate-card` had only one metric (`queue-operation-64kb`, provider `example-queues`), which no AI reading could legitimately name; AI's real rate cards use `metric: tokens` (OpenVibe.AI `server/providers/index.js:177`), so I grounded the AI reading with a matching card instead of pairing an AI service with a queue metric.

**2. `selected` may be null (placement-result)**
- `contracts/platform/placement-result.v1.json:16` — `selected` is now `type: ["string","null"]` with a description that null means no eligible candidate.
- `fixtures/platform.placement-result/valid/none.json:1` — new `{"selected":null,"objective":"balanced","candidates":[],"decided_at":"2026-10-05T00:00:00Z"}`.
- `compatibility/corrections.json:11` — recorded correction for `platform.placement-result` against `v0.99.0`. The compat gate treats a type widening as a retype (`scripts/compat.js` compares `type` verbatim), so without this `compat v0.99.0` fails; the recorded reason is that the string-only shape was never sent — openvibe-sdk/placement `plan()` already returns `selected: null` (`OpenVibe.SDK/src/placement.js:146`) and the endpoint is roadmap WS-Z9.

**3. Chat per-ticket conversation**
- `contracts/chat/ticket-conversation.v1.json:1` — new contract: keyed by `ticket_id` + calling `service`, one `message` with `author_kind` (`person|agent|staff`), `author` (subject), `body`, `created_at`.
- `fixtures/chat.ticket-conversation/valid/person-question.json:1`, `valid/agent-answer.json:1`, `invalid/bad-author-kind.json:1`, `invalid/missing-body.json:1`.
- `manifests/capabilities/chat.ticket.write.json:1` — new capability, `owner: chat`, `visibility: first-party`, `status: planned`, `implementedBy: []`, `inputSchema`/`outputSchema: chat.ticket-conversation@1`.
- `manifests/services/chat.json:28` — added `chat.ticket.write`.
- `contracts/catalog.json:4705` — catalog entry, `status: "planned"` (the catalog's not-yet-implemented value; there is no `proposed`).

**Release 0.100.0**
- `package.json:3`, `package-lock.json:3,9` — version `0.100.0`.
- `STATUS.json:10,22` — `contracts` v0.100.0, `updated` 2026-10-05, feature line added.
- `CHANGELOG.md:7` — new `0.100.0 — 2026-10-05` section.
- `generated/` — regenerated and kept (28 files: bundle, TypeScript, 26 OpenAPI docs; the new contract/capability did not add a route since it is planned).

## Test results
- `node scripts/compat.js v0.99.0` → `platform.placement-result is a recorded correction` / `no breaking changes`, exit 0.
- `npm run generate` → written; `node scripts/generate.js --check` → `up to date`, exit 0.
- `git diff --check` → clean, exit 0.
- All 12 test files run directly (`node test/<file>`): capability-schemas, openapi, loyalty-policy, presence-policy, bot-manifest, product-catalog, zones, usage-topics, billing-grace

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 75f32d75..7d6fbca4 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,26 @@ 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.100.0 — 2026-10-05
++
++**Three small contract fixes** (plan follow-ups). Additive and widening, no contract removed.
++- `platform.usage-sample@1` now says what `resource` is: the producing service's `platform.rate-card@1` `metric` for
++ the reading's `provider` (e.g. `tokens`), never a run, job or object id, with a `unit` that is that metric's unit —
++ which is exactly what Billing looks the card up by (`provider` + `resource`, then a unit that fits the metric).
++ Without the description AI shipped `resource` as a run id and no card matched. A valid AI reading,
++ `fixtures/platform.usage-sample/valid/ai-per-metric.json` (service `ai`, provider `openai`, resource/unit `tokens`),
++ and a matching `fixtures/platform.rate-card/valid/ai-tokens.json` ground it.
++- `platform.placement-result@1`: `selected` is now `type: [string, null]` and says null means no eligible candidate.
++ openvibe-sdk/placement `plan()` already answers `{ selected: null, … }` when nothing qualifies; the string-only
++ schema refused the only shape that is sent, so this is recorded in `compatibility/corrections.json` against
++ v0.99.0. Valid fixture `fixtures/platform.placement-result/valid/none.json`.
++- `chat.ticket-conversation@1` (new, owner `chat`, first-party, **planned**) and the planned `chat.ticket.write`
++ capability on Chat's manifest: one conversation per (ticket id, calling service), with a posted message whose
++ `author_kind` is `person`, `agent` or `staff`, `author` is the author's subject, `body` the text and `created_at`
++ when it was written. It gives Help's service tokens a path into Chat without the person-only `POST /api/chat/send`;
++ until Chat implements the route the capability stays out of `generated/openapi/chat.json`. Valid and invalid
++ fixtures are in `fixtures/chat.ticket-conversation/`.
++
## 0.99.0 — 2026-10-04
**The estate, generated** (plan T1 step 3). `scripts/estate.js` reads every checkout under the estate root (default
ddiff --git a/STATUS.json b/STATUS.json
iindex 93b98ec4..7b01d508 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -7,7 +7,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.99.0 (this package; the newest tag)",
++ "contracts": "openvibe-contracts v0.100.0 (this package; the newest tag)",
"features": [
"589 JSON Schemas with valid and invalid fixtures",
"31 service manifests with lifecycle declarations",
@@@ -18,7 +18,8 @@
"generated TypeScript types, JSON Schema bundle and per-service OpenAPI 3.1",
"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)"
++ "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"
],
-- "updated": "2026-10-04"
++ "updated": "2026-10-05"
}
ddiff --git a/compatibility/corrections.json b/compatibility/corrections.json
iindex 5ae2380c..c6c4e737 100644
---- a/compatibility/corrections.json
++++ b/compatibility/corrections.json
@@@ -6,6 +6,12 @@
"base": "v0.47.0",
"fixedIn": "0.48.0",
"reason": "0.47.0 gave network.grant.changed a service-principal payload, but Network's developer relay already sent it for developer-app grants ({ project_id, capability, audience, from, to }) and OpenVibe.Events acts on that shape. Nothing produced or consumed the 0.47.0 shape; it moved to network.principal_grant.changed."
++ },
++ {
++ "id": "platform.placement-result",
++ "base": "v0.99.0",
++ "fixedIn": "0.100.0",
++ "reason": "0.99.0 required `selected` to be a string, but the only producer of this shape, openvibe-sdk/placement plan(), already answers `selected: null` when nothing qualifies (and the POST /api/v1/placement/explain route it describes is roadmap WS-Z9, not built). The schema never matched what is actually sent, so `selected` widens to [string, null]; nothing consumed the string-only shape."
}
]
}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 2f78306c..0ff19b56 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -4701,6 +4701,15 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "chat.ticket-conversation",
++ "version": "1.0.0",
++ "owner": "chat",
++ "schema": "chat/ticket-conversation.v1.json",
++ "visibility": "first-party",
++ "compatibility": "backward",
++ "status": "planned"
++ },
{
"id": "live.moderation.action",
"version": "1.0.0",
ddiff --git a/contracts/chat/ticket-conversation.v1.json b/contracts/chat/ticket-conversation.v1.json
nnew file mode 100644
iindex 00000000..74479cc7
---- /dev/null
++++ b/contracts/chat/ticket-conversation.v1.json
@@@ -0,0 +1,78 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/ticket-conversation.v1.json",
++ "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"
++ }
++ }
++ ]
++}
ddiff --git a/contracts/platform/placement-result.v1.json b/contracts/platform/placement-result.v1.json
iindex 9148fcf2..44134c83 100644
---- a/contracts/platform/placement-result.v1.json
++++ b/contracts/platform/placement-result.v1.json
@@@ -13,7 +13,11 @@
],
"properties": {
"selected": {
-- "type": "string"
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The id of the chosen candidate, or null when none qualified — every candidate was ineligible or none was offered — in which case `reasons` says why. openvibe-sdk/placement plan() returns null on the same condition."
},
"objective": {
"type": "string",
ddiff --git a/contracts/platform/usage-sample.v1.json b/contracts/platform/usage-sample.v1.json
iindex eaf1c2cc..ebf7ba40 100644
---- a/contracts/platform/usage-sample.v1.json
++++ b/contracts/platform/usage-sample.v1.json
@@@ -36,7 +36,8 @@
"type": "string"
},
"resource": {
-- "type": "string"
++ "type": "string",
++ "description": "The producing service's billing resource: the platform.rate-card@1 `metric` for this reading's `provider` (e.g. `tokens`, `queue-operation-64kb`), and never a run, job, object or other work id. The reading's `unit` must be that metric's unit, so Billing rates it against the card found by (provider, resource): a resource that names no card, or a unit the card's metric does not fit, is left unrated (`billing.no_card` / `billing.unit_mismatch`)."
},
"provider": {
"type": "string"
ddiff --git a/fixtures/chat.ticket-conversation/invalid/bad-author-kind.json b/fixtures/chat.ticket-conversation/invalid/bad-author-kind.json
nnew file mode 100644
iindex 00000000..fd7e0580
---- /dev/null
++++ b/fixtures/chat.ticket-conversation/invalid/bad-author-kind.json
@@@ -0,0 +1,10 @@
++{
++ "ticket_id": "tkt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "help",
++ "message": {
++ "author_kind": "bot",
++ "author": "agent:agent_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "body": "This author kind is not one of person, agent or staff.",
++ "created_at": "2026-10-05T09:02:00Z"
++ }
++}
ddiff --git a/fixtures/chat.ticket-conversation/invalid/missing-body.json b/fixtures/chat.ticket-conversation/invalid/missing-body.json
nnew file mode 100644
iindex 00000000..13f599a9
---- /dev/null
++++ b/fixtures/chat.ticket-conversation/invalid/missing-body.json
@@@ -0,0 +1,9 @@
++{
++ "ticket_id": "tkt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "help",
++ "message": {
++ "author_kind": "person",
++ "author": "user:usr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "created_at": "2026-10-05T09:03:00Z"
++ }
++}
ddiff --git a/fixtures/chat.ticket-conversation/valid/agent-answer.json b/fixtures/chat.ticket-conversation/valid/agent-answer.json
nnew file mode 100644
iindex 00000000..7fb999da
---- /dev/null
++++ b/fixtures/chat.ticket-conversation/valid/agent-answer.json
@@@ -0,0 +1,10 @@
++{
++ "ticket_id": "tkt_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "service": "help",
++ "message": {
++ "author_kind": "agent",
++ "author": "agent:agent_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "body": "The export job finished at 23:59 UTC; the last hour is in the next day's file.",
++ "created_at": "2026-10-05T09:01:30Z"
++ }
++}
ddiff --git a/fixtures/chat.ticket-conversation/valid/person-question.json b/fixtures/chat.ticket-conversation/valid/person-question.json
nnew file mode 100644
iindex 00000000..a89aa65e
---- /dev/null
++++ b/fixtures/chat.ticket-conversation/valid/person-question.json
@@@ -0,0 +1,10 @@
++{
++ "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"
++ }
++}
ddiff --git a/fixtures/platform.placement-result/valid/none.json b/fixtures/platform.placement-result/valid/none.json
nnew file mode 100644
iindex 00000000..560a4d20
---- /dev/null
++++ b/fixtures/platform.placement-result/valid/none.json
@@@ -0,0 +1,6 @@
++{
++ "selected": null,
++ "objective": "balanced",
++ "candidates": [],
++ "decided_at": "2026-10-05T00:00:00Z"
++}
ddiff --git a/fixtures/platform.rate-card/valid/ai-tokens.json b/fixtures/platform.rate-card/valid/ai-tokens.json
nnew file mode 100644
iindex 00000000..d67f2a36
---- /dev/null
++++ b/fixtures/platform.rate-card/valid/ai-tokens.json
@@@ -0,0 +1,13 @@
++{
++ "id": "rc_openai_tokens",
++ "provider": "openai",
++ "adapter": "openai-v1",
++ "metric": "tokens",
++ "unit_size": 1000000,
++ "unit_price_usd": 0.15,
++ "free_allowance": 0,
++ "reset_period": "month",
++ "effective_from": "2026-09-01",
++ "source": "https://openai.com/api/pricing/",
++ "verified_at": "2026-09-28"
++}
ddiff --git a/fixtures/platform.usage-sample/valid/ai-per-metric.json b/fixtures/platform.usage-sample/valid/ai-per-metric.json
nnew file mode 100644
iindex 00000000..ab0965e7
---- /dev/null
++++ b/fixtures/platform.usage-sample/valid/ai-per-metric.json
@@@ -0,0 +1,15 @@
++{
++ "id": "use-ai-1",
++ "idempotency_key": "ai:run_01JAB2C3D4E5F6G7H8J9K0MNPQ:tokens",
++ "service": "ai",
++ "subject": "user:usr_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "provider": "openai",
++ "resource": "tokens",
++ "operation": "chat.completion",
++ "quantity": 1500,
++ "unit": "tokens",
++ "at": "2026-10-02T10:00:00Z",
++ "cost_estimate": 0.000225,
++ "free_allowance_used": 0,
++ "source": "ai.provider-router"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex ca902804..6b15d50a 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -52563,6 +52563,89 @@
}
}
},
++ "chat.ticket-conversation": {
++ "version": "1.0.0",
++ "owner": "chat",
++ "status": "planned",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/chat/ticket-conversation.v1.json",
++ "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"
++ }
++ }
++ ]
++ }
++ },
"live.moderation.action": {
"version": "1.0.0",
"owner": "live",
@@@ -61992,7 +62075,11 @@
],
"properties": {
"selected": {
-- "type": "string"
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The id of the chosen candidate, or null when none qualified — every candidate was ineligible or none was offered — in which case `reasons` says why. openvibe-sdk/placement plan() returns null on the same condition."
},
"objective": {
"type": "string",
@@@ -62619,7 +62706,8 @@
"type": "string"
},
"resource": {
-- "type": "string"
++ "type": "string",
++ "description": "The producing service's billing resource: the platform.rate-card@1 `metric` for this reading's `provider` (e.g. `tokens`, `queue-operation-64kb`), and never a run, job, object or other work id. The reading's `unit` must be that metric's unit, so Billing rates it against the card found by (provider, resource): a resource that names no card, or a unit the card's metric does not fit, is left unrated (`billing.no_card` / `billing.unit_mismatch`)."
},
"provider": {
"type": "string"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 5dd21c22..9af50a50 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.99.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 a06e7590..3c7955d0 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.99.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.100.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"
@@@ -3652,7 +3652,8 @@
"type": "string"
},
"resource": {
-- "type": "string"
++ "type": "string",
++ "description": "The producing service's billing resource: the platform.rate-card@1 `metric` for this reading's `provider` (e.g. `tokens`, `queue-operation-64kb`), and never a run, job, object or other work id. The reading's `unit` must be that metric's unit, so Billing rates it against the card found by (provider, resource): a resource that names no card, or a unit the card's metric does not fit, is left unrated (`billing.no_card` / `billing.unit_mismatch`)."
},
"provider": {
"type": "string"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex b7edcb44..72f2401c 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.99.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 fe10e831..569e590f 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.99.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 6d900957..d0a067e9 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.99.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.100.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/codes.json b/generated/openapi/codes.json
iindex 885b9385..f627f212 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.99.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 80da5b2a..53b75a57 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.99.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 0385748f..7fd4890a 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.99.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 8b76d582..9e8ed83d 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.99.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 c76a1835..aaba4c30 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.99.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 36b0e04f..b5c19144 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.99.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 990ce844..74f2b7f2 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.99.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 6ea17ee7..40d0fe6a 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.99.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 2763e06e..e35765a2 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.99.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 dd3a6b84..ce3a18af 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.99.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 36ef5552..77d70afe 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.99.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 7ab1080d..3ba89b66 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.99.0",
-- "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenRe.Stream as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 d8cb22d1..289f0e21 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.99.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 0209eff1..379c4b5b 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.99.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 6b805420..16016788 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.99.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 aeff4879..f345266a 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.99.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 2c5fe470..30f733fb 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.99.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 960991bf..38a59b50 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.99.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 2d999621..0632fcf6 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.99.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 a4ee9103..b2c3b41b 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.99.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 fd2d8481..968f819c 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.99.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.99.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.100.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.100.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 54f9c619..c516f301 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -48381,6 +48381,39 @@ export interface ChatSoundAssetRequest {
media_asset_id: number;
}
++/** [email protected] (owner: chat) */
++/**
++ * 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.
++ */
++export interface ChatTicketConversation {
++ /**
++ * The OpenVibe.Help ticket this conversation belongs to. Together with `service` it keys the conversation: one conversation per (ticket id, calling service).
++ */
++ ticket_id: string;
++ /**
++ * 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.
++ */
++ service: string;
++ message: {
++ /**
++ * 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_kind: "person" | "agent" | "staff";
++ /**
++ * The author's subject: `user:<id>` for a person, or the service/agent subject that posted on its behalf. Never a display name.
++ */
++ author: string;
++ /**
++ * The message text; not blank.
++ */
++ body: string;
++ /**
++ * When the message was written (the author's clock; Chat keeps its own ordering).
++ */
++ created_at: string;
++ };
++}
++
/** [email protected] (owner: live) */
/**
* live.moderation.action v1 (OpenVibe.Live server/db/database.js logModerationAction; ADR-022). A staff or channel moderator action taken on OpenVibe.Live outside chat: site and global bans, IP bans, message deletes and purges from Live's admin panel, a stream force-ended, relay users hidden, channel moderators added or removed. Not a person tidying their own messages or configuring their own channel. Written to Live's outbox in the transaction that records the action. OpenVibe.Network keeps it in the moderation audit log. Envelope: subject { type: moderation_action, id: <action_id> }, visibility internal, actor the acting person when known. details is free-form per action (never secrets or message text beyond what moderators saw).
@@@ -51781,7 +51814,10 @@ export interface WorkloadRequirements {
* Where a workload was (or would be) placed and why: the chosen candidate, the reasons, and every candidate with its eligibility, estimated cost and latency (POST /api/v1/placement/explain; roadmap WS-Z9).
*/
export interface PlacementResult {
-- selected: string;
++ /**
++ * The id of the chosen candidate, or null when none qualified — every candidate was ineligible or none was offered — in which case `reasons` says why. openvibe-sdk/placement plan() returns null on the same condition.
++ */
++ selected: string | null;
objective:
| "cheapest"
| "lowest-latency"
@@@ -52003,6 +52039,9 @@ export interface UsageSample {
service: string;
project?: string;
subject?: string;
++ /**
++ * The producing service's billing resource: the platform.rate-card@1 `metric` for this reading's `provider` (e.g. `tokens`, `queue-operation-64kb`), and never a run, job, object or other work id. The reading's `unit` must be that metric's unit, so Billing rates it against the card found by (provider, resource): a resource that names no card, or a unit the card's metric does not fit, is left unrated (`billing.no_card` / `billing.unit_mismatch`).
++ */
resource?: string;
provider?: string;
node?: string;
ddiff --git a/manifests/capabilities/chat.ticket.write.json b/manifests/capabilities/chat.ticket.write.json
nnew file mode 100644
iindex 00000000..06cbe946
---- /dev/null
++++ b/manifests/capabilities/chat.ticket.write.json
@@@ -0,0 +1,20 @@
++{
++ "id": "chat.ticket.write",
++ "version": "1.0",
++ "owner": "chat",
++ "status": "planned",
++ "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.",
++ "permissions": [
++ "chat:write"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "internal-write",
++ "events": [],
++ "implementedBy": [],
++ "inputSchema": "chat.ticket-conversation@1",
++ "outputSchema": "chat.ticket-conversation@1"
++}
ddiff --git a/manifests/services/chat.json b/manifests/services/chat.json
iindex f3515a8e..874b497a 100644
---- a/manifests/services/chat.json
++++ b/manifests/services/chat.json
@@@ -24,7 +24,8 @@
"chat.presence.read",
"chat.sounds.read",
"chat.sounds.write",
-- "chat.stats.read"
++ "chat.stats.read",
++ "chat.ticket.write"
],
"eventsProduced": [
"chat.message.created",
ddiff --git a/package-lock.json b/package-lock.json
iindex 11b7c772..42dfd031 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.99.0",
++ "version": "0.100.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.99.0",
++ "version": "0.100.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 8d9f40cd..4e33e7f7 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.99.0",
++ "version": "0.100.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",