openvibers/openvibe.contracts Commits

v0.17.0: OpenVibe.Wiki is alpha (wiki.* capabilities); Billing emits billing.staff.action

OP OpenVibers committed 23 Sept 2026 · 6caa17e4a5 · 11 files, +220 −9


Changes

ddiff --git a/manifests/capabilities/wiki.citation.attach.json b/manifests/capabilities/wiki.citation.attach.json
nnew file mode 100644
iindex 00000000..45357c76
---- /dev/null
++++ b/manifests/capabilities/wiki.citation.attach.json
@@@ -0,0 +1,19 @@
++{
++ "id": "wiki.citation.attach",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Attach citations (an OpenVibe.Sources item id, whose URL, title, retrieval time and license come from the item's provenance, or an http(s) URL with its retrieval time) to the newest, unpublished revision of a page. Citations are append-only and stay with the revision that used them.",
++ "permissions": [
++ "wiki:citation:write"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [],
++ "implementedBy": [
++ "POST /api/v1/pages/:id/revisions/:n/citations"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.page.create.json b/manifests/capabilities/wiki.page.create.json
nnew file mode 100644
iindex 00000000..521cf1f8
---- /dev/null
++++ b/manifests/capabilities/wiki.page.create.json
@@@ -0,0 +1,28 @@
++{
++ "id": "wiki.page.create",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Create pages and write human-authored revisions (text, typed infobox values, citations), move or rename pages (old addresses answer 301), attach OpenVibe.Media objects and check them, on behalf of the person named in X-OV-Subject, who must be an editor of the space. Deleting pages and changing page visibility need the owner role.",
++ "permissions": [
++ "wiki:page:write"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [
++ "wiki.revision.created",
++ "wiki.page.updated",
++ "wiki.page.deleted"
++ ],
++ "implementedBy": [
++ "POST /api/v1/spaces/:space/pages",
++ "POST /api/v1/pages/:id/revisions",
++ "PATCH /api/v1/pages/:id",
++ "DELETE /api/v1/pages/:id",
++ "POST /api/v1/pages/:id/media",
++ "POST /api/v1/pages/:id/media/verify"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.page.read.json b/manifests/capabilities/wiki.page.read.json
nnew file mode 100644
iindex 00000000..7e99e0b8
---- /dev/null
++++ b/manifests/capabilities/wiki.page.read.json
@@@ -0,0 +1,24 @@
++{
++ "id": "wiki.page.read",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Read pages, revisions, diffs, citations and AI proposals as the person named in X-OV-Subject sees them (without a subject: public, published content only). Members-only and private pages follow the space's roles; drafts and history of unpublished pages need the editor role.",
++ "permissions": [
++ "wiki:page:read"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-read",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/pages/:id",
++ "GET /api/v1/pages/:id/revisions",
++ "GET /api/v1/pages/:id/revisions/:n",
++ "GET /api/v1/pages/:id/diff",
++ "GET /api/v1/pages/:id/revisions/:n/citations",
++ "GET /api/v1/proposals/:id"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.revision.propose.json b/manifests/capabilities/wiki.revision.propose.json
nnew file mode 100644
iindex 00000000..ff734437
---- /dev/null
++++ b/manifests/capabilities/wiki.revision.propose.json
@@@ -0,0 +1,21 @@
++{
++ "id": "wiki.revision.propose",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Propose a revision (or a new page) as the output of an OpenVibe.AI workflow run. The proposal becomes an immutable revision with ai authorship (workflow id and run id, stub-provider flag) and a pending proposal; it is never published until a person with the editor role approves it.",
++ "permissions": [
++ "wiki:revision:propose"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [
++ "wiki.revision.created"
++ ],
++ "implementedBy": [
++ "POST /api/v1/proposals"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.revision.publish.json b/manifests/capabilities/wiki.revision.publish.json
nnew file mode 100644
iindex 00000000..f30cd16d
---- /dev/null
++++ b/manifests/capabilities/wiki.revision.publish.json
@@@ -0,0 +1,28 @@
++{
++ "id": "wiki.revision.publish",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Publish a revision now or at a scheduled time (idempotent), unpublish a page, and record a person's approval or rejection of an AI proposal, on behalf of the editor named in X-OV-Subject. AI-generated revisions cannot be published without an approving review by a person.",
++ "permissions": [
++ "wiki:revision:publish"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [
++ "wiki.page.published",
++ "wiki.page.updated",
++ "wiki.page.unpublished",
++ "wiki.index_document.upserted",
++ "wiki.index_document.deleted"
++ ],
++ "implementedBy": [
++ "POST /api/v1/pages/:id/publish",
++ "POST /api/v1/pages/:id/schedule",
++ "POST /api/v1/pages/:id/unpublish",
++ "POST /api/v1/proposals/:id/review"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.revision.revert.json b/manifests/capabilities/wiki.revision.revert.json
nnew file mode 100644
iindex 00000000..e3418339
---- /dev/null
++++ b/manifests/capabilities/wiki.revision.revert.json
@@@ -0,0 +1,22 @@
++{
++ "id": "wiki.revision.revert",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Revert a page to an earlier revision by adding a new revision that copies its text, infobox and citations (history is never rewritten), on behalf of the editor named in X-OV-Subject. A revert of a published page is published.",
++ "permissions": [
++ "wiki:revision:revert"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [
++ "wiki.revision.created",
++ "wiki.page.updated"
++ ],
++ "implementedBy": [
++ "POST /api/v1/pages/:id/revert"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.search.query.json b/manifests/capabilities/wiki.search.query.json
nnew file mode 100644
iindex 00000000..65daa417
---- /dev/null
++++ b/manifests/capabilities/wiki.search.query.json
@@@ -0,0 +1,19 @@
++{
++ "id": "wiki.search.query",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Search published pages by title and text, returning only pages the person named in X-OV-Subject may read (without a subject: public pages only). Network-wide discovery goes through OpenVibe.Search, which Wiki feeds with wiki.index_document.* events.",
++ "permissions": [
++ "wiki:search"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "wiki-read",
++ "events": [],
++ "implementedBy": [
++ "GET /api/v1/search"
++ ]
++}
ddiff --git a/manifests/capabilities/wiki.space.create.json b/manifests/capabilities/wiki.space.create.json
nnew file mode 100644
iindex 00000000..938570c2
---- /dev/null
++++ b/manifests/capabilities/wiki.space.create.json
@@@ -0,0 +1,23 @@
++{
++ "id": "wiki.space.create",
++ "version": "1.0",
++ "owner": "wiki",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Create a wiki space and change a space's settings and roles. People create user spaces they own; official (editorial) spaces are created by staff or by a service acting as itself. Settings and role changes need the owner role of the space (for a service: the X-OV-Subject person).",
++ "permissions": [
++ "wiki:space:write"
++ ],
++ "resourceConstraints": [
++ "space_member"
++ ],
++ "quotaClass": "wiki-write",
++ "events": [
++ "wiki.space.updated"
++ ],
++ "implementedBy": [
++ "POST /api/v1/spaces",
++ "PATCH /api/v1/spaces/:space",
++ "PUT /api/v1/spaces/:space/roles/:subject"
++ ]
++}
ddiff --git a/manifests/services/billing.json b/manifests/services/billing.json
iindex 9b53382f..3ef90ee3 100644
---- a/manifests/services/billing.json
++++ b/manifests/services/billing.json
@@@ -30,7 +30,8 @@
"billing.subscription.canceled",
"billing.cashout.requested",
"billing.cashout.paid",
-- "billing.cashout.denied"
++ "billing.cashout.denied",
++ "billing.staff.action"
],
"eventsConsumed": [],
"namespacesOwned": [
ddiff --git a/manifests/services/wiki.json b/manifests/services/wiki.json
iindex cdb7a33e..a51020d9 100644
---- a/manifests/services/wiki.json
++++ b/manifests/services/wiki.json
@@@ -1,16 +1,42 @@
{
"version": "0.1.0",
"contractRanges": {
-- "openvibe-contracts": "^0.1.0"
++ "openvibe-contracts": ">=0.13.0 <1.0.0"
},
"id": "wiki",
"name": "OpenVibe.Wiki",
-- "status": "placeholder",
++ "status": "alpha",
"repository": "OpenVibers/OpenVibe.Wiki",
-- "domains": [],
-- "capabilities": [],
-- "eventsProduced": [],
++ "domains": [
++ "openvibe.wiki"
++ ],
++ "publicOrigin": "https://openvibe.wiki",
++ "health": "/api/health",
++ "ready": "/api/ready",
++ "capabilities": [
++ "wiki.space.create",
++ "wiki.page.create",
++ "wiki.page.read",
++ "wiki.revision.propose",
++ "wiki.revision.publish",
++ "wiki.revision.revert",
++ "wiki.citation.attach",
++ "wiki.search.query"
++ ],
++ "eventsProduced": [
++ "wiki.space.updated",
++ "wiki.revision.created",
++ "wiki.page.published",
++ "wiki.page.updated",
++ "wiki.page.unpublished",
++ "wiki.page.deleted",
++ "wiki.watch.triggered",
++ "wiki.index_document.upserted",
++ "wiki.index_document.deleted"
++ ],
"eventsConsumed": [],
-- "namespacesOwned": [],
-- "notes": "Wiki spaces with page trees, revisions, citations, media and discussion \u2014 editable together, source-backed. Charter only; no runtime."
++ "namespacesOwned": [
++ "wiki.*"
++ ],
++ "notes": "Wiki spaces (official and user), page trees with canonical slugs and history-aware redirects, immutable revisions with diff and revert, typed infoboxes, [[internal links]] with red links, citations per revision (Sources items or URLs with retrieval time), Media attachments with an explicit broken state, Community discussion references, watchers notified through wiki.watch.triggered, AI proposals held for a person's approval. Server-rendered public routes useful without JavaScript; sitemaps, Atom/JSON feeds and Search index events only for public, published, indexable pages (openvibe-publishing v0.2.0). Not deployed; openvibe.wiki stays on OpenVibe.Sites until launch."
}
ddiff --git a/package.json b/package.json
iindex 89414d5d..fcf89aa9 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.16.0",
++ "version": "0.17.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",