openvibers/openvibe.contracts Commits

Add account and guest trust contracts (#360)

OP OpenVibers committed 5 days ago · bdf4350678 · 62 files, +713 −95

* Add account and guest trust contracts

* Merge remote-tracking branch 'origin/main' into feat/identity-trust-contracts

* CHANGELOG 0.347.0: the locker and computer manifests (#359)

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex aef2c4c8..9f3eb66b 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,14 @@
# Changelog
++## 0.347.0 — 2026-11-08
++
++- Add `identity.trust@1` and `identity.trust-request@1` for account and guest abuse signals, plus the app-grantable
++ `identity.trust.read` capability.
++ Responses contain coarse age bands and aggregate counts only; IPs, emails, last-seen timestamps, service user ids and
++ linked account identities are forbidden by the schema and fixtures.
++- Service manifests: `locker` (OpenVibe.Locker at openvibe.locker, live; it owns the `locker` namespace), and
++ `computer` is live (its exposure was still "repository").
++
## 0.346.0 — 2026-11-08
- `actor.skill-listing@2` (2.1.0) gains `visibility` (plan HO11, the agent writes its own skills): `public` (the
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 7513adcc..ad2a6aac 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -69,6 +69,24 @@
"compatibility": "backward",
"status": "active"
},
++ {
++ "id": "identity.trust",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "identity/trust.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
++ {
++ "id": "identity.trust-request",
++ "version": "1.0.0",
++ "owner": "network",
++ "schema": "identity/trust-request.v1.json",
++ "visibility": "public",
++ "compatibility": "backward",
++ "status": "active"
++ },
{
"id": "identity.subject-projection",
"version": "1.0.0",
ddiff --git a/contracts/identity/trust-request.v1.json b/contracts/identity/trust-request.v1.json
nnew file mode 100644
iindex 00000000..ed1932b4
---- /dev/null
++++ b/contracts/identity/trust-request.v1.json
@@@ -0,0 +1,17 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/identity/trust-request.v1.json",
++ "title": "IdentityTrustRequest",
++ "description": "identity.trust-request@1: GET /api/v1/trust/{subject} names the account or guest subject in the path; GET /api/v1/me/trust takes no subject and derives it from the caller's own token.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": ["subject"],
++ "properties": {
++ "subject": { "type": "string", "pattern": "^(usr|gst)_[0-9A-HJKMNP-TV-Z]{26}$" }
++ },
++ "additionalProperties": false
++ },
++ { "$ref": "../common/no-body.v1.json" }
++ ]
++}
ddiff --git a/contracts/identity/trust.v1.json b/contracts/identity/trust.v1.json
nnew file mode 100644
iindex 00000000..21224c0f
---- /dev/null
++++ b/contracts/identity/trust.v1.json
@@@ -0,0 +1,45 @@
++{
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/identity/trust.v1.json",
++ "title": "IdentityTrust",
++ "description": "identity.trust@1: privacy-limited age and abuse signals for an account or guest. Never includes an IP address, email, last-seen timestamp, service user id, or linked account identities. Only coarse age bands and aggregate counts are exposed.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": ["kind", "age_band", "account_age_hours", "account_age_days", "passkey", "linked_accounts", "active_30d", "email_verified", "verified", "verified_by"],
++ "properties": {
++ "kind": { "const": "account" },
++ "age_band": { "$ref": "#/$defs/ageBand" },
++ "account_age_hours": { "type": "integer", "minimum": 0 },
++ "account_age_days": { "type": "integer", "minimum": 0 },
++ "passkey": { "type": "boolean" },
++ "linked_accounts": { "type": "integer", "minimum": 0 },
++ "active_30d": { "type": "boolean" },
++ "email_verified": { "type": "boolean" },
++ "verified": { "type": "boolean" },
++ "verified_by": { "type": "array", "items": { "enum": ["passkey", "linked_account", "30_days_active"] }, "uniqueItems": true }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "required": ["kind", "age_band", "age_hours", "age_days", "networks_seen", "guests_from_same_networks_24h", "converted"],
++ "properties": {
++ "kind": { "const": "guest" },
++ "age_band": { "$ref": "#/$defs/ageBand" },
++ "age_hours": { "type": "integer", "minimum": 0 },
++ "age_days": { "type": "integer", "minimum": 0 },
++ "sessions": { "type": "integer", "minimum": 0, "description": "Distinct days seen, included only when the server tracks session days." },
++ "networks_seen": { "type": "integer", "minimum": 0, "description": "Count of distinct network identifiers seen; identifiers are never returned." },
++ "guests_from_same_networks_24h": { "type": "integer", "minimum": 0, "description": "Count of other guests first seen from any of this guest's networks in the last 24 hours; no network identifiers are returned." },
++ "banned": { "type": "boolean" },
++ "restricted": { "type": "boolean" },
++ "converted": { "type": "boolean" }
++ },
++ "additionalProperties": false
++ }
++ ],
++ "$defs": {
++ "ageBand": { "type": "string", "enum": ["under_1h", "under_1d", "under_7d", "under_30d", "30d_plus"] }
++ }
++}
ddiff --git a/fixtures/identity.trust-request/invalid/malformed-subject.json b/fixtures/identity.trust-request/invalid/malformed-subject.json
nnew file mode 100644
iindex 00000000..02eaa94d
---- /dev/null
++++ b/fixtures/identity.trust-request/invalid/malformed-subject.json
@@@ -0,0 +1,3 @@
++{
++ "subject": "anon_101"
++}
ddiff --git a/fixtures/identity.trust-request/valid/guest.json b/fixtures/identity.trust-request/valid/guest.json
nnew file mode 100644
iindex 00000000..d2707e8d
---- /dev/null
++++ b/fixtures/identity.trust-request/valid/guest.json
@@@ -0,0 +1,3 @@
++{
++ "subject": "gst_01JAB2C3D4E5F6G7H8J9K0MNP1"
++}
ddiff --git a/fixtures/identity.trust-request/valid/me.json b/fixtures/identity.trust-request/valid/me.json
nnew file mode 100644
iindex 00000000..0967ef42
---- /dev/null
++++ b/fixtures/identity.trust-request/valid/me.json
@@@ -0,0 +1 @@
++{}
ddiff --git a/fixtures/identity.trust/invalid/ip-exposed.json b/fixtures/identity.trust/invalid/ip-exposed.json
nnew file mode 100644
iindex 00000000..f3cb2920
---- /dev/null
++++ b/fixtures/identity.trust/invalid/ip-exposed.json
@@@ -0,0 +1,10 @@
++{
++ "kind": "guest",
++ "age_band": "under_1d",
++ "age_hours": 3,
++ "age_days": 0,
++ "networks_seen": 1,
++ "guests_from_same_networks_24h": 0,
++ "converted": false,
++ "ip": "192.0.2.1"
++}
ddiff --git a/fixtures/identity.trust/valid/account.json b/fixtures/identity.trust/valid/account.json
nnew file mode 100644
iindex 00000000..c689341a
---- /dev/null
++++ b/fixtures/identity.trust/valid/account.json
@@@ -0,0 +1,12 @@
++{
++ "kind": "account",
++ "age_band": "30d_plus",
++ "account_age_hours": 960,
++ "account_age_days": 40,
++ "passkey": true,
++ "linked_accounts": 2,
++ "active_30d": true,
++ "email_verified": true,
++ "verified": true,
++ "verified_by": ["passkey", "linked_account", "30_days_active"]
++}
ddiff --git a/fixtures/identity.trust/valid/guest.json b/fixtures/identity.trust/valid/guest.json
nnew file mode 100644
iindex 00000000..fcdf83aa
---- /dev/null
++++ b/fixtures/identity.trust/valid/guest.json
@@@ -0,0 +1,9 @@
++{
++ "kind": "guest",
++ "age_band": "under_1d",
++ "age_hours": 3,
++ "age_days": 0,
++ "networks_seen": 2,
++ "guests_from_same_networks_24h": 4,
++ "converted": false
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 44782b3c..47e598f5 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -612,6 +612,172 @@
]
}
},
++ "identity.trust": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/identity/trust.v1.json",
++ "title": "IdentityTrust",
++ "description": "identity.trust@1: privacy-limited age and abuse signals for an account or guest. Never includes an IP address, email, last-seen timestamp, service user id, or linked account identities. Only coarse age bands and aggregate counts are exposed.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": [
++ "kind",
++ "age_band",
++ "account_age_hours",
++ "account_age_days",
++ "passkey",
++ "linked_accounts",
++ "active_30d",
++ "email_verified",
++ "verified",
++ "verified_by"
++ ],
++ "properties": {
++ "kind": {
++ "const": "account"
++ },
++ "age_band": {
++ "$ref": "#/$defs/ageBand"
++ },
++ "account_age_hours": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "account_age_days": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "passkey": {
++ "type": "boolean"
++ },
++ "linked_accounts": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "active_30d": {
++ "type": "boolean"
++ },
++ "email_verified": {
++ "type": "boolean"
++ },
++ "verified": {
++ "type": "boolean"
++ },
++ "verified_by": {
++ "type": "array",
++ "items": {
++ "enum": [
++ "passkey",
++ "linked_account",
++ "30_days_active"
++ ]
++ },
++ "uniqueItems": true
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "required": [
++ "kind",
++ "age_band",
++ "age_hours",
++ "age_days",
++ "networks_seen",
++ "guests_from_same_networks_24h",
++ "converted"
++ ],
++ "properties": {
++ "kind": {
++ "const": "guest"
++ },
++ "age_band": {
++ "$ref": "#/$defs/ageBand"
++ },
++ "age_hours": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "age_days": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "sessions": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Distinct days seen, included only when the server tracks session days."
++ },
++ "networks_seen": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Count of distinct network identifiers seen; identifiers are never returned."
++ },
++ "guests_from_same_networks_24h": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Count of other guests first seen from any of this guest's networks in the last 24 hours; no network identifiers are returned."
++ },
++ "banned": {
++ "type": "boolean"
++ },
++ "restricted": {
++ "type": "boolean"
++ },
++ "converted": {
++ "type": "boolean"
++ }
++ },
++ "additionalProperties": false
++ }
++ ],
++ "$defs": {
++ "ageBand": {
++ "type": "string",
++ "enum": [
++ "under_1h",
++ "under_1d",
++ "under_7d",
++ "under_30d",
++ "30d_plus"
++ ]
++ }
++ }
++ }
++ },
++ "identity.trust-request": {
++ "version": "1.0.0",
++ "owner": "network",
++ "status": "active",
++ "schema": {
++ "$schema": "https://json-schema.org/draft/2020-12/schema",
++ "$id": "https://openvibe.network/contracts/identity/trust-request.v1.json",
++ "title": "IdentityTrustRequest",
++ "description": "identity.trust-request@1: GET /api/v1/trust/{subject} names the account or guest subject in the path; GET /api/v1/me/trust takes no subject and derives it from the caller's own token.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": [
++ "subject"
++ ],
++ "properties": {
++ "subject": {
++ "type": "string",
++ "pattern": "^(usr|gst)_[0-9A-HJKMNP-TV-Z]{26}$"
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "$ref": "../common/no-body.v1.json"
++ }
++ ]
++ }
++ },
"identity.subject-projection": {
"version": "1.0.0",
"owner": "network",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 80ced999..1bc23823 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 52dbb01f..b55a5aa5 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.346.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/bench.json b/generated/openapi/bench.json
iindex 9b40ba15..96824b9c 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 5ee774fe..c4a9ed4f 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.346.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 61e34fdc..7f348627 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.346.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 098f633b..bfa367ae 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.346.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 9bf07798..1e80b8fb 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.346.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 1e373520..660028bb 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.346.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 624ae7d6..971a6c70 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.346.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/connect.json b/generated/openapi/connect.json
iindex f67d2624..e5a963aa 100644
---- a/generated/openapi/connect.json
++++ b/generated/openapi/connect.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe Connect API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe Connect as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 626b32f5..3012c2da 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.346.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 0067ee6a..2180f796 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.346.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/design.json b/generated/openapi/design.json
iindex dc4f31c7..8bf3527a 100644
---- a/generated/openapi/design.json
++++ b/generated/openapi/design.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Design API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Design as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/domains.json b/generated/openapi/domains.json
iindex 3de5146d..4d285868 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 59c4921a..0b3e6da4 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.346.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 9b1db12f..3b4bd2e9 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 5f2e3b5a..8f8987e5 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.346.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 60cae701..bdc6090e 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.346.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 fcaf0253..99a8ddee 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -166,8 +166,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 63,
-- "capabilities": 36
++ "operations": 65,
++ "capabilities": 37
},
{
"service": "news",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex 39d307f1..16c7a04f 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 820b0973..46326042 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.346.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/mail.json b/generated/openapi/mail.json
iindex d8e0c14e..8e0a7088 100644
---- a/generated/openapi/mail.json
++++ b/generated/openapi/mail.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Mail API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Mail as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 47fd0bec..1068ec14 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 f01c9ca2..b4f0361c 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.346.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 3ab49588..53af48df 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.346.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.347.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"
@@@ -1280,6 +1280,55 @@
}
}
},
++ "/api/v1/me/trust": {
++ "get": {
++ "operationId": "get_api_v1_me_trust",
++ "summary": "Read privacy-limited trust signals for an account or guest by Network subject.",
++ "description": "**identity.trust.read** (public): Read privacy-limited trust signals for an account or guest by Network subject. The caller receives only age bands, booleans and aggregate counts, never an IP, email, last-seen timestamp, service user id or linked account identities. Services may use the capability; an app needs the owner's explicit capability grant.",
++ "tags": [
++ "identity.trust"
++ ],
++ "x-openvibe-capabilities": [
++ "identity.trust.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "identity-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "identity.trust.read"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/identity.trust-request.v1"
++ },
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/identity.trust.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/api/v1/node/self/capabilities": {
"put": {
"operationId": "put_api_v1_node_self_capabilities",
@@@ -1929,6 +1978,65 @@
}
}
},
++ "/api/v1/trust/{subject}": {
++ "get": {
++ "operationId": "get_api_v1_trust_subject",
++ "summary": "Read privacy-limited trust signals for an account or guest by Network subject.",
++ "description": "**identity.trust.read** (public): Read privacy-limited trust signals for an account or guest by Network subject. The caller receives only age bands, booleans and aggregate counts, never an IP, email, last-seen timestamp, service user id or linked account identities. Services may use the capability; an app needs the owner's explicit capability grant.",
++ "tags": [
++ "identity.trust"
++ ],
++ "x-openvibe-capabilities": [
++ "identity.trust.read"
++ ],
++ "x-openvibe-visibility": [
++ "public"
++ ],
++ "x-openvibe-quota-class": "identity-read",
++ "security": [
++ {
++ "openvibeToken": [
++ "identity.trust.read"
++ ]
++ }
++ ],
++ "x-openvibe-input": {
++ "$ref": "#/components/schemas/identity.trust-request.v1"
++ },
++ "parameters": [
++ {
++ "name": "subject",
++ "in": "path",
++ "required": true,
++ "schema": {
++ "type": "string"
++ }
++ }
++ ],
++ "responses": {
++ "2XX": {
++ "description": "Success",
++ "content": {
++ "application/json": {
++ "schema": {
++ "$ref": "#/components/schemas/identity.trust.v1"
++ }
++ }
++ }
++ },
++ "default": {
++ "description": "An error (RFC 9457 problem details)",
++ "content": {
++ "application/problem+json": {
++ "schema": {
++ "$ref": "#/components/schemas/errors.problem.v1"
++ }
++ }
++ }
++ }
++ }
++ }
++ },
"/internal/account-deletions/{deletion_id}/confirmations": {
"post": {
"operationId": "post_internal_account_deletions_deletion_id_confirmations",
@@@ -4564,6 +4672,158 @@
}
]
},
++ "identity.trust-request.v1": {
++ "title": "IdentityTrustRequest",
++ "description": "identity.trust-request@1: GET /api/v1/trust/{subject} names the account or guest subject in the path; GET /api/v1/me/trust takes no subject and derives it from the caller's own token.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": [
++ "subject"
++ ],
++ "properties": {
++ "subject": {
++ "type": "string",
++ "pattern": "^(usr|gst)_[0-9A-HJKMNP-TV-Z]{26}$"
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "$ref": "#/components/schemas/common.no-body.v1"
++ }
++ ]
++ },
++ "identity.trust.v1": {
++ "title": "IdentityTrust",
++ "description": "identity.trust@1: privacy-limited age and abuse signals for an account or guest. Never includes an IP address, email, last-seen timestamp, service user id, or linked account identities. Only coarse age bands and aggregate counts are exposed.",
++ "oneOf": [
++ {
++ "type": "object",
++ "required": [
++ "kind",
++ "age_band",
++ "account_age_hours",
++ "account_age_days",
++ "passkey",
++ "linked_accounts",
++ "active_30d",
++ "email_verified",
++ "verified",
++ "verified_by"
++ ],
++ "properties": {
++ "kind": {
++ "const": "account"
++ },
++ "age_band": {
++ "$ref": "#/components/schemas/identity.trust.v1/$defs/ageBand"
++ },
++ "account_age_hours": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "account_age_days": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "passkey": {
++ "type": "boolean"
++ },
++ "linked_accounts": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "active_30d": {
++ "type": "boolean"
++ },
++ "email_verified": {
++ "type": "boolean"
++ },
++ "verified": {
++ "type": "boolean"
++ },
++ "verified_by": {
++ "type": "array",
++ "items": {
++ "enum": [
++ "passkey",
++ "linked_account",
++ "30_days_active"
++ ]
++ },
++ "uniqueItems": true
++ }
++ },
++ "additionalProperties": false
++ },
++ {
++ "type": "object",
++ "required": [
++ "kind",
++ "age_band",
++ "age_hours",
++ "age_days",
++ "networks_seen",
++ "guests_from_same_networks_24h",
++ "converted"
++ ],
++ "properties": {
++ "kind": {
++ "const": "guest"
++ },
++ "age_band": {
++ "$ref": "#/components/schemas/identity.trust.v1/$defs/ageBand"
++ },
++ "age_hours": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "age_days": {
++ "type": "integer",
++ "minimum": 0
++ },
++ "sessions": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Distinct days seen, included only when the server tracks session days."
++ },
++ "networks_seen": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Count of distinct network identifiers seen; identifiers are never returned."
++ },
++ "guests_from_same_networks_24h": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "Count of other guests first seen from any of this guest's networks in the last 24 hours; no network identifiers are returned."
++ },
++ "banned": {
++ "type": "boolean"
++ },
++ "restricted": {
++ "type": "boolean"
++ },
++ "converted": {
++ "type": "boolean"
++ }
++ },
++ "additionalProperties": false
++ }
++ ],
++ "$defs": {
++ "ageBand": {
++ "type": "string",
++ "enum": [
++ "under_1h",
++ "under_1d",
++ "under_7d",
++ "under_30d",
++ "30d_plus"
++ ]
++ }
++ }
++ },
"modules.module-record.v1": {
"title": "ModuleRecord",
"description": "One subject's value in one namespace, as returned by Network. revision increases by one on every write; a write names the revision it read (If-Match) and fails with 412 if it moved.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex a2ae96de..33b0c407 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.346.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 717d4513..6440924f 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.346.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex e9b97b12..5dbf4c76 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex 9af2296f..9bb52901 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/report.json b/generated/openapi/report.json
iindex d552ed66..b33b1276 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 1b6407bd..35551175 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.346.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 465b3913..e7b3e27b 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 e9ad572f..cf19f987 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.346.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 2c0855eb..de3882af 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 808214d5..bfd49c82 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.346.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 25b66502..dbf2846e 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.346.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 057c541f..12755442 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.346.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/today.json b/generated/openapi/today.json
iindex 3615c28c..98e72132 100644
---- a/generated/openapi/today.json
++++ b/generated/openapi/today.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Today API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Today as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 320609da..0b4c3518 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.346.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 3e0541fe..49d0eee7 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.346.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 f888be9e..099a4191 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.346.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.347.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/vision.json b/generated/openapi/vision.json
iindex 4f48a4f8..0436638c 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 803c0354..4323794f 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 d766818b..b82e5efa 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.346.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex 98d12323..6c0ed493 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.347.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex 6ac986d2..6ae4f94e 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.346.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.346.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.347.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.347.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 795508e6..2cecb947 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -245,6 +245,55 @@ export type IdentityResolveResult =
};
};
++/** [email protected] (owner: network) */
++/**
++ * identity.trust@1: privacy-limited age and abuse signals for an account or guest. Never includes an IP address, email, last-seen timestamp, service user id, or linked account identities. Only coarse age bands and aggregate counts are exposed.
++ */
++export type IdentityTrust =
++ | {
++ kind: "account";
++ age_band: "under_1h" | "under_1d" | "under_7d" | "under_30d" | "30d_plus";
++ account_age_hours: number;
++ account_age_days: number;
++ passkey: boolean;
++ linked_accounts: number;
++ active_30d: boolean;
++ email_verified: boolean;
++ verified: boolean;
++ verified_by: ("passkey" | "linked_account" | "30_days_active")[];
++ }
++ | {
++ kind: "guest";
++ age_band: "under_1h" | "under_1d" | "under_7d" | "under_30d" | "30d_plus";
++ age_hours: number;
++ age_days: number;
++ /**
++ * Distinct days seen, included only when the server tracks session days.
++ */
++ sessions?: number;
++ /**
++ * Count of distinct network identifiers seen; identifiers are never returned.
++ */
++ networks_seen: number;
++ /**
++ * Count of other guests first seen from any of this guest's networks in the last 24 hours; no network identifiers are returned.
++ */
++ guests_from_same_networks_24h: number;
++ banned?: boolean;
++ restricted?: boolean;
++ converted: boolean;
++ };
++
++/** [email protected] (owner: network) */
++/**
++ * identity.trust-request@1: GET /api/v1/trust/{subject} names the account or guest subject in the path; GET /api/v1/me/trust takes no subject and derives it from the caller's own token.
++ */
++export type IdentityTrustRequest =
++ | {
++ subject: string;
++ }
++ | NoBody;
++
/** [email protected] (owner: network) */
/**
* identity.subject-projection@1: what OpenVibe.Network's identity resolver answers about a subject (server/identity/subjects.js resolve): the SubjectRef, the Network account behind it, its display fields, whether it is banned, and every legacy id mapped to it.
ddiff --git a/manifests/capabilities/identity.trust.read.json b/manifests/capabilities/identity.trust.read.json
nnew file mode 100644
iindex 00000000..c034c38e
---- /dev/null
++++ b/manifests/capabilities/identity.trust.read.json
@@@ -0,0 +1,15 @@
++{
++ "id": "identity.trust.read",
++ "version": "1.0",
++ "owner": "network",
++ "status": "active",
++ "visibility": "public",
++ "description": "Read privacy-limited trust signals for an account or guest by Network subject. The caller receives only age bands, booleans and aggregate counts, never an IP, email, last-seen timestamp, service user id or linked account identities. Services may use the capability; an app needs the owner's explicit capability grant.",
++ "inputSchema": "identity.trust-request@1",
++ "outputSchema": "identity.trust@1",
++ "permissions": ["identity:read"],
++ "resourceConstraints": ["none"],
++ "quotaClass": "identity-read",
++ "events": [],
++ "implementedBy": ["GET /api/v1/trust/{subject}", "GET /api/v1/me/trust"]
++}
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex f523f3d6..f7b91c71 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -50,6 +50,7 @@
},
"capabilities": [
"identity.subject.resolve",
++ "identity.trust.read",
"mods.grant.manage",
"network.account.deletion.confirm",
"network.account.export.contribute",
ddiff --git a/package-lock.json b/package-lock.json
iindex 77b9b083..52577941 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.346.0",
++ "version": "0.347.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.346.0",
++ "version": "0.347.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 3eb759af..455b05b2 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.346.0",
++ "version": "0.347.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",