openvibers/openvibe.contracts Commits
v0.17.0: OpenVibe.Wiki is alpha (wiki.* capabilities); Billing emits billing.staff.action
Changes
nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}nnew file mode 100644@@@ -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"++ ]++}@@@ -30,7 +30,8 @@"billing.subscription.canceled","billing.cashout.requested","billing.cashout.paid",-- "billing.cashout.denied"++ "billing.cashout.denied",++ "billing.staff.action"],"eventsConsumed": [],"namespacesOwned": [@@@ -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."}@@@ -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",
new file mode 100644
new file mode 100644
@@ -0,0 +1,19 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,28 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,24 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,28 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,22 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,19 @@
@@ -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"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,23 @@
@@ -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"
+ ]
+}
@@ -30,7 +30,8 @@
@@ -30,7 +30,8 @@
"billing.subscription.canceled",
"billing.subscription.canceled",
"billing.cashout.requested",
"billing.cashout.requested",
"billing.cashout.paid",
"billing.cashout.paid",
- "billing.cashout.denied"
+ "billing.cashout.denied",
+ "billing.staff.action"
],
],
"eventsConsumed": [],
"eventsConsumed": [],
"namespacesOwned": [
"namespacesOwned": [
@@ -1,16 +1,42 @@
@@ -1,16 +1,42 @@
{
{
"version": "0.1.0",
"version": "0.1.0",
"contractRanges": {
"contractRanges": {
- "openvibe-contracts": "^0.1.0"
+ "openvibe-contracts": ">=0.13.0 <1.0.0"
},
},
"id": "wiki",
"id": "wiki",
"name": "OpenVibe.Wiki",
"name": "OpenVibe.Wiki",
- "status": "placeholder",
+ "status": "alpha",
"repository": "OpenVibers/OpenVibe.Wiki",
"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": [],
"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."
}
}
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"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.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",