openvibers/openvibe.contracts Commits
Define read-only Actor task view tickets (#357)
Changes
nnew file mode 100644@@@ -0,0 +1,23 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/task-view-ticket.v1.json",++ "title": "ActorTaskViewTicket",++ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "url",++ "expires_at"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri",++ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"++ },++ "expires_at": {++ "type": "string",++ "format": "date-time"++ }++ }++}@@@ -10198,6 +10198,16 @@"visibility": "first-party","compatibility": "backward","status": "active"++ },++ {++ "id": "actor.task-view-ticket",++ "version": "1.0.0",++ "owner": "actor",++ "schema": "actor/task-view-ticket.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active",++ "adr": "ADR-044"}]}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "url": "https://openvibe.actor/"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "url": "https://openvibe.actor/embed/task/tsk_example?t=wpt_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",++ "expires_at": "2026-11-08T12:15:00Z"++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "url": "https://openvibe.actor/embed/task/tsk_example?t=tvt_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",++ "expires_at": "2026-11-08T12:15:00Z"++}@@@ -113039,6 +113039,34 @@}}}++ },++ "actor.task-view-ticket": {++ "version": "1.0.0",++ "owner": "actor",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/actor/task-view-ticket.v1.json",++ "title": "ActorTaskViewTicket",++ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "url",++ "expires_at"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri",++ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"++ },++ "expires_at": {++ "type": "string",++ "format": "date-time"++ }++ }++ }}}}@@@ -2856,6 +2856,62 @@}}},++ "/api/v1/tasks/{id}/view-ticket": {++ "post": {++ "operationId": "post_api_v1_tasks_id_view_ticket",++ "summary": "Mint a 15-minute reusable read-only task embed ticket.",++ "description": "**actor.task.view_ticket** (public): Mint a 15-minute reusable read-only task embed ticket. Only the person's own Bearer token and their own task are accepted; session cookies, service and delegated tokens cannot mint. Another person's task returns 404. Tickets work only on /embed/task/:id and its events/still reads, never on a write route. Wrong-task or expired tickets return 403. Stored only as SHA-256 hashes, bound to task and requester.",++ "tags": [++ "actor.task"++ ],++ "x-openvibe-capabilities": [++ "actor.task.view_ticket"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "actor-read",++ "security": [++ {++ "openvibeToken": [++ "actor.task.view_ticket"++ ]++ }++ ],++ "parameters": [++ {++ "name": "id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/actor.task-view-ticket.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/internal/config": {"get": {"operationId": "get_internal_config",@@@ -4652,6 +4708,27 @@}}},++ "actor.task-view-ticket.v1": {++ "title": "ActorTaskViewTicket",++ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "url",++ "expires_at"++ ],++ "properties": {++ "url": {++ "type": "string",++ "format": "uri",++ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"++ },++ "expires_at": {++ "type": "string",++ "format": "date-time"++ }++ }++ },"agent.timeline-entry.v1": {"title": "AgentTimelineEntry","description": "One entry of the agent's timeline (design 2026-11-07 §2): one step of the agent's work, in one mode, for one person. The Dock shows it: the mode's icon and word, the title, where it ran and why, the outcome, the time and the cost. Only a title, an outcome and a link: never a prompt, a diff or a page. A person sees their own entries; another person's entry is a 404. The audience is 'private' (Only me) unless the person shared the entry through the one Share sheet.",@@@ -5,8 +5,8 @@"service": "actor","name": "OpenVibe.Actor","origin": "https://openvibe.actor",-- "operations": 54,-- "capabilities": 16++ "operations": 55,++ "capabilities": 17},{"service": "ai",@@@ -316603,3 +316603,12 @@ export interface MailInboxAnswering {*/changed_at: string | null;}++++/** [email protected] (owner: actor) */++/**++ * actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.++ */++export interface ActorTaskViewTicket {++ url: string;++ expires_at: string;++}nnew file mode 100644@@@ -0,0 +1,21 @@++{++ "id": "actor.task.view_ticket",++ "version": "1.0",++ "owner": "actor",++ "status": "active",++ "visibility": "public",++ "description": "Mint a 15-minute reusable read-only task embed ticket. Only the person's own Bearer token and their own task are accepted; session cookies, service and delegated tokens cannot mint. Another person's task returns 404. Tickets work only on /embed/task/:id and its events/still reads, never on a write route. Wrong-task or expired tickets return 403. Stored only as SHA-256 hashes, bound to task and requester.",++ "inputSchema": "common.no-body@1",++ "outputSchema": "actor.task-view-ticket@1",++ "permissions": [++ "actor:tasks:read"++ ],++ "resourceConstraints": [++ "owner"++ ],++ "quotaClass": "actor-read",++ "events": [],++ "implementedBy": [++ "POST /api/v1/tasks/:id/view-ticket"++ ]++}@@@ -31,7 +31,8 @@"actor.config.manage","actor.timeline.read","actor.assignment.read",-- "actor.assignment.cancel"++ "actor.assignment.cancel",++ "actor.task.view_ticket"],"eventsProduced": ["agent.step.started",
new file mode 100644
new file mode 100644
@@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/task-view-ticket.v1.json",
+ "title": "ActorTaskViewTicket",
+ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "url",
+ "expires_at"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"
+ },
+ "expires_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+}
@@ -10198,6 +10198,16 @@
@@ -10198,6 +10198,16 @@
"visibility": "first-party",
"visibility": "first-party",
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
+ },
+ {
+ "id": "actor.task-view-ticket",
+ "version": "1.0.0",
+ "owner": "actor",
+ "schema": "actor/task-view-ticket.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active",
+ "adr": "ADR-044"
}
}
]
]
}
}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "url": "https://openvibe.actor/"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "url": "https://openvibe.actor/embed/task/tsk_example?t=wpt_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "expires_at": "2026-11-08T12:15:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "url": "https://openvibe.actor/embed/task/tsk_example?t=tvt_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "expires_at": "2026-11-08T12:15:00Z"
+}
@@ -113039,6 +113039,34 @@
@@ -113039,6 +113039,34 @@
}
}
}
}
}
}
+ },
+ "actor.task-view-ticket": {
+ "version": "1.0.0",
+ "owner": "actor",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/actor/task-view-ticket.v1.json",
+ "title": "ActorTaskViewTicket",
+ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "url",
+ "expires_at"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"
+ },
+ "expires_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ }
}
}
}
}
}
}
@@ -2856,6 +2856,62 @@
@@ -2856,6 +2856,62 @@
}
}
}
}
},
},
+ "/api/v1/tasks/{id}/view-ticket": {
+ "post": {
+ "operationId": "post_api_v1_tasks_id_view_ticket",
+ "summary": "Mint a 15-minute reusable read-only task embed ticket.",
+ "description": "**actor.task.view_ticket** (public): Mint a 15-minute reusable read-only task embed ticket. Only the person's own Bearer token and their own task are accepted; session cookies, service and delegated tokens cannot mint. Another person's task returns 404. Tickets work only on /embed/task/:id and its events/still reads, never on a write route. Wrong-task or expired tickets return 403. Stored only as SHA-256 hashes, bound to task and requester.",
+ "tags": [
+ "actor.task"
+ ],
+ "x-openvibe-capabilities": [
+ "actor.task.view_ticket"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "actor-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "actor.task.view_ticket"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/actor.task-view-ticket.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/internal/config": {
"/internal/config": {
"get": {
"get": {
"operationId": "get_internal_config",
"operationId": "get_internal_config",
@@ -4652,6 +4708,27 @@
@@ -4652,6 +4708,27 @@
}
}
}
}
},
},
+ "actor.task-view-ticket.v1": {
+ "title": "ActorTaskViewTicket",
+ "description": "actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "url",
+ "expires_at"
+ ],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://[^/?#]+/embed/task/[^/?#]+\\?t=tvt_[A-Za-z0-9_-]{43}$"
+ },
+ "expires_at": {
+ "type": "string",
+ "format": "date-time"
+ }
+ }
+ },
"agent.timeline-entry.v1": {
"agent.timeline-entry.v1": {
"title": "AgentTimelineEntry",
"title": "AgentTimelineEntry",
"description": "One entry of the agent's timeline (design 2026-11-07 §2): one step of the agent's work, in one mode, for one person. The Dock shows it: the mode's icon and word, the title, where it ran and why, the outcome, the time and the cost. Only a title, an outcome and a link: never a prompt, a diff or a page. A person sees their own entries; another person's entry is a 404. The audience is 'private' (Only me) unless the person shared the entry through the one Share sheet.",
"description": "One entry of the agent's timeline (design 2026-11-07 §2): one step of the agent's work, in one mode, for one person. The Dock shows it: the mode's icon and word, the title, where it ran and why, the outcome, the time and the cost. Only a title, an outcome and a link: never a prompt, a diff or a page. A person sees their own entries; another person's entry is a 404. The audience is 'private' (Only me) unless the person shared the entry through the one Share sheet.",
@@ -5,8 +5,8 @@
@@ -5,8 +5,8 @@
"service": "actor",
"service": "actor",
"name": "OpenVibe.Actor",
"name": "OpenVibe.Actor",
"origin": "https://openvibe.actor",
"origin": "https://openvibe.actor",
- "operations": 54,
- "capabilities": 16
+ "operations": 55,
+ "capabilities": 17
},
},
{
{
"service": "ai",
"service": "ai",
@@ -316603,3 +316603,12 @@ export interface MailInboxAnswering {
@@ -316603,3 +316603,12 @@ export interface MailInboxAnswering {
*/
*/
changed_at: string | null;
changed_at: string | null;
}
}
+
+/** [email protected] (owner: actor) */
+/**
+ * actor.task-view-ticket@1: a reusable read-only view of one task for its owner, valid for 15 minutes. The URL contains a bearer credential; never log it or forward it in a referrer.
+ */
+export interface ActorTaskViewTicket {
+ url: string;
+ expires_at: string;
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
+{
+ "id": "actor.task.view_ticket",
+ "version": "1.0",
+ "owner": "actor",
+ "status": "active",
+ "visibility": "public",
+ "description": "Mint a 15-minute reusable read-only task embed ticket. Only the person's own Bearer token and their own task are accepted; session cookies, service and delegated tokens cannot mint. Another person's task returns 404. Tickets work only on /embed/task/:id and its events/still reads, never on a write route. Wrong-task or expired tickets return 403. Stored only as SHA-256 hashes, bound to task and requester.",
+ "inputSchema": "common.no-body@1",
+ "outputSchema": "actor.task-view-ticket@1",
+ "permissions": [
+ "actor:tasks:read"
+ ],
+ "resourceConstraints": [
+ "owner"
+ ],
+ "quotaClass": "actor-read",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/tasks/:id/view-ticket"
+ ]
+}
@@ -31,7 +31,8 @@
@@ -31,7 +31,8 @@
"actor.config.manage",
"actor.config.manage",
"actor.timeline.read",
"actor.timeline.read",
"actor.assignment.read",
"actor.assignment.read",
- "actor.assignment.cancel"
+ "actor.assignment.cancel",
+ "actor.task.view_ticket"
],
],
"eventsProduced": [
"eventsProduced": [
"agent.step.started",
"agent.step.started",