openvibers/openvibe.contracts Commits
Contracts 0.153.0: project delegation (X-OV-Project, network.project.member.read); Watch run-job takes Run's job fields (#109)
Changes
@@@ -4,6 +4,21 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.153.0 — 2026-10-12++++- **Project delegation (ADR-003 amendment 2026-10-12).** A first-party service acting for a person (`X-OV-Subject`)++ may name one project with `X-OV-Project: prj_…`; the receiver checks with Network that the person is an admin or++ owner of the unarchived project (cache at most 60 s), records project, person and `via`, and shows the service only++ what it started. Apps, mods and agents never may (403 `project.not_delegated`).++- **`network.project.member.read`** (first-party, active): `GET /internal/projects/:project_id/members/:subject` on++ Network answers `network.project-member-result@1` (`project_id`, `subject`, `role`, `archived`, `added_at`); a++ non-member and an unknown project are the same 404 `project.member_not_found`. New schema with fixtures.++- **Watch:** `watch.watch-request@1` takes `project_id` (checked at save with that read). The `run-job` action takes++ `run.job-create-request@1` fields (`class`, `artifact`, `args`, `limits`, `egress`, `ttl_ms`) and `firing_arg`; the++ draft's `runtime`/`command`/`workload` stay in the schema for compatibility but Watch refuses them.++- `run.job-create-request@1`'s description states the delegated form. Additive only (compat vs 0.152.0: no breaking++ changes).++## 0.152.0 — 2026-10-12- **`video.playlist.read` and `video.playlist.manage` are active.** openvibe.video's playlist API (MediaHub#33) takes a@@@ -2853,6 +2853,16 @@"status": "active","adr": "ADR-014"},++ {++ "id": "network.project-member-result",++ "version": "1.0.0",++ "owner": "network",++ "schema": "network/project-member-result.v1.json",++ "visibility": "first-party",++ "compatibility": "backward",++ "status": "active",++ "adr": "ADR-003"++ },{"id": "network.project-usage-result","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,41 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/project-member-result.v1.json",++ "title": "NetworkProjectMemberResult",++ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",++ "type": "object",++ "required": [++ "project_id",++ "subject",++ "role",++ "archived"++ ],++ "additionalProperties": false,++ "properties": {++ "project_id": {++ "type": "string",++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "subject": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "role": {++ "enum": [++ "viewer",++ "developer",++ "admin",++ "owner"++ ]++ },++ "archived": {++ "type": "boolean"++ },++ "added_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++}@@@ -2,7 +2,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/run/job-create-request.v1.json","title": "RunJobCreateRequest",-- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",++ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.","type": "object","additionalProperties": false,"required": [@@@ -2,12 +2,13 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/watch/watch-request.v1.json","title": "WatchRequest",-- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",++ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).","type": "object","additionalProperties": false,"properties": {"name": { "type": "string", "minLength": 1, "maxLength": 120 },"labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 60 } },++ "project_id": { "type": ["string", "null"], "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$", "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it." },"source": { "$ref": "watch.v1.json#/$defs/source" },"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },@@@ -591,15 +591,42 @@{"type": "object","required": [-- "kind",-- "runtime",-- "command"++ "kind"],"additionalProperties": false,"properties": {"kind": {"const": "run-job"},++ "class": {++ "$ref": "../platform/runtime-class.v1.json"++ },++ "artifact": {++ "$ref": "../run/job-create-request.v1.json#/$defs/artifact"++ },++ "args": {++ "type": "object",++ "description": "The artifact's declared input as JSON; default {}."++ },++ "limits": {++ "$ref": "../run/job-create-request.v1.json#/$defs/limits"++ },++ "egress": {++ "$ref": "../run/job-create-request.v1.json#/$defs/egress"++ },++ "ttl_ms": {++ "type": "integer",++ "minimum": 1000,++ "maximum": 86400000++ },++ "firing_arg": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_]{0,39}$",++ "description": "The args key the firing is added under; null or absent: none."++ },"runtime": {"enum": ["function",@@@ -618,7 +645,8 @@],"additionalProperties": true}-- }++ },++ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."}]},@@@ -1,6 +1,6 @@# ADR-003: Service/app principal authentication and capability grants--**Status:** Accepted, implemented 2026-09-22. Amended 2026-09-24: delegated authorization semantics and approval UX (roadmap §28.3).++**Status:** Accepted, implemented 2026-09-22. Amended 2026-09-24: delegated authorization semantics and approval UX (roadmap §28.3). Amended 2026-10-12: project delegation (`X-OV-Project`).## Context and current evidence@@@ -104,3 +104,48 @@ Required next, owned by Network (not built yet):`invalid_scope`. A reused or expired code is `invalid_grant`.- Still to add, with items 4 to 6: the chooser lists exactly the issued capabilities, and a revokedauthorization gets no new token.++++## Amendment 2026-10-12: project delegation++++Some work belongs to a project rather than to a person: OpenVibe.Run bills every job to a project and takes the++project only from a token (ADR-036), so a first-party service acting for a person (`X-OV-Subject`) could not start a++job for them. Watch's `run-job` action is the first case: a person's watch should start a Run job billed to a project++the person runs. This amendment lets a first-party service name that project, and says how the receiver checks it.++++### The rule++++- **Who may name a project.** Only a first-party service (`svc:<id>`, `actor_type: service`) that also names the++ person (`X-OV-Subject: usr_…`) may name a project, with `X-OV-Project: prj_…`. An app, mod or agent never may: its++ project is its token's own `project_id`, and a request from one carrying `X-OV-Project` is refused (403++ `project.not_delegated`). A client-credentials call with `X-OV-Project` but no `X-OV-Subject` is refused the same++ way: a service has no project of its own to name.++- **What the receiver checks, every time.** The receiver asks Network whether the person is a member of the project,++ `GET /internal/projects/:project_id/members/:subject` (capability `network.project.member.read`, first-party, never++ grantable to apps; answer `network.project-member-result@1`). The person must be an **admin or owner** (the roles++ that may create production apps and approve grants, `docs/developer-projects.md`), and the project must not be++ archived. Anything else is 403 `project.not_delegated`, with no detail that reveals whether the project exists. A++ receiver may cache a yes for at most 60 seconds, so a removed member or an archived project stops new work within a++ minute. The service checking at save time (Watch, when a watch names a project) does not replace the receiver's++ check at use time.++- **Intersection still holds.** The call is the person's, inside the project: the service's own grants (for example++ `run.job.submit` for audience `openvibe.run`), the project's allowance, tier caps and quotas, and what the person may++ do in that project all apply. Staff power is never delegated, as above.++- **Records name all three.** The job (or other resource) belongs to the project; its requester is the person; the++ service is recorded as `via`. Audit rows and events carry the same three.++- **The service sees only its own.** A delegated caller reads only what it started for that person in that project.++ Listing a project's work, or acting on someone else's, needs a token that names the project itself.++++### First uses++++- **Run** accepts a delegated `POST /api/v1/jobs` and `GET /api/v1/jobs/:id` (the job it started); list, cancel and++ stream stay with project tokens.++- **Watch** lets a watch name one of its owner's projects (`project_id` on `watch.watch-request@1`, checked at save++ with the same Network read), and its `run-job` action starts the job with `X-OV-Subject` + `X-OV-Project`.++++### Tests++++- Receivers: `X-OV-Project` from an app token, or without `X-OV-Subject`, is 403 `project.not_delegated`; a viewer++ or developer member, a non-member and an archived project are 403 `project.not_delegated`; an admin or owner++ member is accepted and the record names project, person and `via`.++- Network: the member read needs `network.project.member.read`; a non-member and an unknown project are both 404++ `project.member_not_found`.@@@ -6,7 +6,7 @@ Platform-wide decisions from the OpenVibe development roadmap (section 10). Each|---|---|---|| [ADR-001](ADR-001-canonical-subjects.md) | Canonical subject IDs and legacy identity mapping | Accepted, implemented 2026-09-22 || [ADR-002](ADR-002-contract-repository.md) | Contract repository and compatibility policy | Accepted, implemented 2026-09-22 (openvibe-contracts v0.1.0+) |--| [ADR-003](ADR-003-service-principals.md) | Service/app principal authentication and capability grants | Accepted, implemented 2026-09-22; amended 2026-09-24 (delegated authorization and approval UX) |++| [ADR-003](ADR-003-service-principals.md) | Service/app principal authentication and capability grants | Accepted, implemented 2026-09-22; amended 2026-09-24 (delegated authorization and approval UX), 2026-10-12 (project delegation) || [ADR-004](ADR-004-durable-events.md) | Durable event store, outbox/inbox and delivery semantics | Accepted 2026-09-22; implementation in progress (OpenVibe.Events) || [ADR-005](ADR-005-realtime.md) | Realtime topics, cursor/resume and whether OpenVibe.Realtime exists | Accepted 2026-09-22: realtime runs inside OpenVibe.Events; amendment 1 (2026-09-26): presence is ephemeral, in Chat's delivery plane; amendment 2 (2026-09-26): a person's topic is `network.notification.*` with subject visibility, and browsers authenticate with two-minute realtime tickets || [ADR-006](ADR-006-media-objects.md) | Media object, location and namespace model | Accepted 2026-09-22; implementation in progress (OpenVibe.Media Wave 4); amended 2026-09-24 (placement classes, local provider, infrequent access deferred) |nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",++ "role": "owner",++ "archived": false,++ "members": [++ "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6"++ ]++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",++ "role": "superuser",++ "archived": false++}nnew file mode 100644@@@ -0,0 +1,7 @@++{++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",++ "role": "admin",++ "archived": false,++ "added_at": "2026-10-01T12:00:00.000Z"++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6",++ "role": "viewer",++ "archived": true++}nnew file mode 100644@@@ -0,0 +1,58 @@++{++ "name": "Rebuild the docs site on release",++ "source": {++ "kind": "event",++ "pattern": "host.release.published",++ "filter": null++ },++ "cadence": null,++ "extraction": {++ "kind": "json",++ "selector": null,++ "fields": null,++ "value_path": "$.release",++ "ai": null++ },++ "comparison": {++ "mode": "changed",++ "tolerance": null,++ "percent": null++ },++ "condition": {++ "op": "changed",++ "value": null,++ "for_sec": null++ },++ "action": [++ {++ "kind": "run-job",++ "class": "function",++ "artifact": {++ "name": "docs-build",++ "version": "1.4.0"++ },++ "args": {++ "site": "docs"++ },++ "limits": {++ "wall_ms": 120000,++ "cpu_ms": 60000,++ "mem_bytes": 268435456++ },++ "egress": "openvibe-only",++ "firing_arg": "firing"++ }++ ],++ "budget": {++ "checks_per_day": 100,++ "usd_per_month": 0,++ "max_runtime_ms": 5000,++ "max_bytes": 1048576++ },++ "retention": {++ "observations_days": 30,++ "keep_snapshots": false++ },++ "status": "active",++ "project_id": "project-1"++}nnew file mode 100644@@@ -0,0 +1,56 @@++{++ "name": "Rebuild the docs site on release",++ "source": {++ "kind": "event",++ "pattern": "host.release.published",++ "filter": null++ },++ "cadence": null,++ "extraction": {++ "kind": "json",++ "selector": null,++ "fields": null,++ "value_path": "$.release",++ "ai": null++ },++ "comparison": {++ "mode": "changed",++ "tolerance": null,++ "percent": null++ },++ "condition": {++ "op": "changed",++ "value": null,++ "for_sec": null++ },++ "action": [++ {++ "kind": "run-job",++ "class": "function",++ "artifact": {++ "name": "docs-build",++ "version": "1.4.0"++ },++ "args": {++ "site": "docs"++ },++ "limits": {++ "wall_ms": 120000++ },++ "egress": "openvibe-only",++ "firing_arg": "firing"++ }++ ],++ "budget": {++ "checks_per_day": 100,++ "usd_per_month": 0,++ "max_runtime_ms": 5000,++ "max_bytes": 1048576++ },++ "retention": {++ "observations_days": 30,++ "keep_snapshots": false++ },++ "status": "active",++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPS"++}nnew file mode 100644@@@ -0,0 +1,58 @@++{++ "name": "Rebuild the docs site on release",++ "source": {++ "kind": "event",++ "pattern": "host.release.published",++ "filter": null++ },++ "cadence": null,++ "extraction": {++ "kind": "json",++ "selector": null,++ "fields": null,++ "value_path": "$.release",++ "ai": null++ },++ "comparison": {++ "mode": "changed",++ "tolerance": null,++ "percent": null++ },++ "condition": {++ "op": "changed",++ "value": null,++ "for_sec": null++ },++ "action": [++ {++ "kind": "run-job",++ "class": "function",++ "artifact": {++ "name": "docs-build",++ "version": "1.4.0"++ },++ "args": {++ "site": "docs"++ },++ "limits": {++ "wall_ms": 120000,++ "cpu_ms": 60000,++ "mem_bytes": 268435456++ },++ "egress": "openvibe-only",++ "firing_arg": "firing"++ }++ ],++ "budget": {++ "checks_per_day": 100,++ "usd_per_month": 0,++ "max_runtime_ms": 5000,++ "max_bytes": 1048576++ },++ "retention": {++ "observations_days": 30,++ "keep_snapshots": false++ },++ "status": "active",++ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPS"++}@@@ -29375,6 +29375,52 @@}}},++ "network.project-member-result": {++ "version": "1.0.0",++ "owner": "network",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/network/project-member-result.v1.json",++ "title": "NetworkProjectMemberResult",++ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",++ "type": "object",++ "required": [++ "project_id",++ "subject",++ "role",++ "archived"++ ],++ "additionalProperties": false,++ "properties": {++ "project_id": {++ "type": "string",++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "subject": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "role": {++ "enum": [++ "viewer",++ "developer",++ "admin",++ "owner"++ ]++ },++ "archived": {++ "type": "boolean"++ },++ "added_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ }++ },"network.project-usage-result": {"version": "1.0.0","owner": "network",@@@ -47306,15 +47352,42 @@{"type": "object","required": [-- "kind",-- "runtime",-- "command"++ "kind"],"additionalProperties": false,"properties": {"kind": {"const": "run-job"},++ "class": {++ "$ref": "../platform/runtime-class.v1.json"++ },++ "artifact": {++ "$ref": "../run/job-create-request.v1.json#/$defs/artifact"++ },++ "args": {++ "type": "object",++ "description": "The artifact's declared input as JSON; default {}."++ },++ "limits": {++ "$ref": "../run/job-create-request.v1.json#/$defs/limits"++ },++ "egress": {++ "$ref": "../run/job-create-request.v1.json#/$defs/egress"++ },++ "ttl_ms": {++ "type": "integer",++ "minimum": 1000,++ "maximum": 86400000++ },++ "firing_arg": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_]{0,39}$",++ "description": "The args key the firing is added under; null or absent: none."++ },"runtime": {"enum": ["function",@@@ -47333,7 +47406,8 @@],"additionalProperties": true}-- }++ },++ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."}]},@@@ -47398,7 +47472,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/watch/watch-request.v1.json","title": "WatchRequest",-- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",++ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).","type": "object","additionalProperties": false,"properties": {@@@ -47414,6 +47488,14 @@"maxLength": 60}},++ "project_id": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."++ },"source": {"$ref": "watch.v1.json#/$defs/source"},@@@ -71843,7 +71925,7 @@"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://openvibe.network/contracts/run/job-create-request.v1.json","title": "RunJobCreateRequest",-- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",++ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.","type": "object","additionalProperties": false,"required": [@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -124,8 +124,8 @@"service": "network","name": "OpenVibe.Network","origin": "https://openvibe.network",-- "operations": 39,-- "capabilities": 27++ "operations": 40,++ "capabilities": 28},{"service": "news",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -2058,6 +2058,70 @@}}},++ "/internal/projects/{project_id}/members/{subject}": {++ "get": {++ "operationId": "get_internal_projects_project_id_members_subject",++ "summary": "Read one person's membership of a developer project as a receiving service: the role and whether the project is archived.",++ "description": "**network.project.member.read** (first-party): Read one person's membership of a developer project as a receiving service: the role and whether the project is archived. A service that accepts project delegation (ADR-003 amendment 2026-10-12: a first-party service names the person with X-OV-Subject and the project with X-OV-Project) checks here that the person is an admin or owner of an unarchived project before it does the project's work. A non-member and an unknown project answer the same 404, so membership is never a way to learn that a project exists. Never grantable to apps.",++ "tags": [++ "network.project"++ ],++ "x-openvibe-capabilities": [++ "network.project.member.read"++ ],++ "x-openvibe-visibility": [++ "first-party"++ ],++ "x-openvibe-quota-class": "projects-read",++ "security": [++ {++ "openvibeToken": [++ "network.project.member.read"++ ]++ }++ ],++ "parameters": [++ {++ "name": "project_id",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ },++ {++ "name": "subject",++ "in": "path",++ "required": true,++ "schema": {++ "type": "string"++ }++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/network.project-member-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/internal/registry/instances/report": {"post": {"operationId": "post_internal_registry_instances_report",@@@ -4210,6 +4274,45 @@}}},++ "network.project-member-result.v1": {++ "title": "NetworkProjectMemberResult",++ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",++ "type": "object",++ "required": [++ "project_id",++ "subject",++ "role",++ "archived"++ ],++ "additionalProperties": false,++ "properties": {++ "project_id": {++ "type": "string",++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "subject": {++ "type": "string",++ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "role": {++ "enum": [++ "viewer",++ "developer",++ "admin",++ "owner"++ ]++ },++ "archived": {++ "type": "boolean"++ },++ "added_at": {++ "type": [++ "string",++ "null"++ ]++ }++ }++ },"network.project-read-result.v1": {"title": "NetworkProjectReadResult","description": "network.project-read-result@1: the service-facing answer from OpenVibe.Network GET /internal/projects/:project_id (network.project.read). It carries project tenancy, allowances, quotas, apps and each app's grants (requested, approved, denied or revoked) without credentials or member identities beyond the owner.",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.152.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -873,7 +873,7 @@},"run.job-create-request.v1": {"title": "RunJobCreateRequest",-- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",++ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.","type": "object","additionalProperties": false,"required": [@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -274,6 +274,20 @@}}},++ {++ "name": "project_id",++ "in": "query",++ "required": false,++ "schema": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."++ },++ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."++ },{"name": "source","in": "query",@@@ -1110,6 +1124,42 @@}]},++ "platform.runtime-class.v1": {++ "title": "RuntimeClass",++ "description": "platform.runtime-class@1: the kind of execution environment a platform.job@1 asks for (plan T14 Run; ADR-034 proposed). A name only: this contract defines no behavior, and a worker runs only the classes it advertises and refuses every other one (`nack`). `function` is the first class implemented (OpenVibe.Node's function worker); the others are reserved names. Each class names one reserved Fabric capability in [email protected] — `worker:` + the class (worker:function, worker:code, worker:browser, worker:linux, worker:desktop, worker:gpu) — and a node advertises the name of each class it runs.",++ "$comment": "Additive: a class may be added to v1; none is removed, renamed or reordered.",++ "type": "string",++ "oneOf": [++ {++ "const": "function",++ "description": "A pre-registered artifact (name and exact version) run once with declared args to one result: single-shot, no persistent filesystem, no dependency resolution, network denied."++ },++ {++ "const": "code",++ "description": "Arbitrary source with its dependency tree in a longer-lived environment; needs image handling and isolation stronger than a container."++ },++ {++ "const": "browser",++ "description": "A headless or headed web browser session driven remotely."++ },++ {++ "const": "linux",++ "description": "A full Linux environment (shell, filesystem, processes) that lives across commands."++ },++ {++ "const": "desktop",++ "description": "A graphical desktop session with screen and input under control levels."++ },++ {++ "const": "gpu",++ "description": "A workload that holds one or more GPUs for its lifetime."++ }++ ],++ "examples": [++ "function",++ "gpu"++ ]++ },"platform.workload-requirements.v1": {"title": "WorkloadRequirements","description": "What a workload needs, so the platform can place it (roadmap WS-Z9). Hard constraints are filtered before any objective is scored; a cheaper candidate that misses one is never chosen.",@@@ -1247,6 +1297,196 @@}}},++ "run.job-create-request.v1": {++ "title": "RunJobCreateRequest",++ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "class",++ "limits"++ ],++ "properties": {++ "class": {++ "$ref": "#/components/schemas/platform.runtime-class.v1"++ },++ "artifact": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/artifact"++ },++ "args": {++ "type": "object",++ "description": "The artifact's declared input as JSON; default {}."++ },++ "inputs": {++ "type": "array",++ "maxItems": 32,++ "items": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/input"++ },++ "description": "Files placed in the job directory before the process starts; names are unique (else 422)."++ },++ "limits": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/limits"++ },++ "ttl_ms": {++ "type": "integer",++ "minimum": 1000,++ "maximum": 86400000,++ "description": "Lifetime from creation, covering the wait for a node and the run (platform.job@1 ttl_ms); when it runs out the job ends expired. Default: limits.wall_ms plus 600000."++ },++ "egress": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/egress"++ },++ "requirements": {++ "$ref": "#/components/schemas/platform.workload-requirements.v1"++ },++ "idempotency_key": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/idempotency_key"++ }++ },++ "allOf": [++ {++ "if": {++ "required": [++ "class"++ ],++ "properties": {++ "class": {++ "enum": [++ "function",++ "code"++ ]++ }++ }++ },++ "then": {++ "required": [++ "artifact"++ ]++ }++ }++ ],++ "$defs": {++ "artifact": {++ "type": "object",++ "additionalProperties": false,++ "description": "The pre-registered artifact to run (platform.job@1 artifact).",++ "required": [++ "name",++ "version"++ ],++ "properties": {++ "name": {++ "type": "string",++ "pattern": "^[a-z0-9][a-z0-9._-]{0,127}$"++ },++ "version": {++ "type": "string",++ "pattern": "^[0-9A-Za-z][0-9A-Za-z.+-]{0,63}$",++ "description": "One exact version, never a range"++ }++ }++ },++ "input": {++ "type": "object",++ "additionalProperties": false,++ "description": "One input file: an OpenVibe.Media object the caller's project can read, pinned by digest.",++ "required": [++ "name",++ "media_id",++ "sha256"++ ],++ "properties": {++ "name": {++ "type": "string",++ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$",++ "description": "File name in the job directory; no path separators."++ },++ "media_id": {++ "type": "string",++ "pattern": "^med_[0-9A-HJKMNP-TV-Z]{26}$"++ },++ "sha256": {++ "type": "string",++ "pattern": "^[0-9a-f]{64}$",++ "description": "Lowercase hex SHA-256 of the object's bytes."++ },++ "size_bytes": {++ "type": "integer",++ "minimum": 0++ }++ }++ },++ "limits": {++ "type": "object",++ "additionalProperties": false,++ "description": "Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.",++ "required": [++ "wall_ms",++ "cpu_ms",++ "mem_bytes"++ ],++ "properties": {++ "wall_ms": {++ "type": "integer",++ "minimum": 1,++ "description": "Running time from `job_started`"++ },++ "cpu_ms": {++ "type": "integer",++ "minimum": 1,++ "description": "CPU time, user plus system"++ },++ "mem_bytes": {++ "type": "integer",++ "minimum": 1,++ "description": "Peak resident memory"++ }++ }++ },++ "egress": {++ "type": "string",++ "enum": [++ "none",++ "public",++ "openvibe-only"++ ],++ "default": "none",++ "description": "OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only)."++ },++ "idempotency_key": {++ "type": "string",++ "pattern": "^[A-Za-z0-9._:-]{1,128}$"++ }++ },++ "examples": [++ {++ "class": "function",++ "artifact": {++ "name": "thumbnail",++ "version": "1.2.0"++ },++ "args": {++ "width": 320++ },++ "inputs": [++ {++ "name": "photo.jpg",++ "media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPQ",++ "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",++ "size_bytes": 482113++ }++ ],++ "limits": {++ "wall_ms": 30000,++ "cpu_ms": 30000,++ "mem_bytes": 268435456++ },++ "egress": "none",++ "idempotency_key": "thumb:photo-7"++ }++ ]++ },"watch.check-run.v1": {"title": "WatchCheckRun","description": "watch.check-run@1: one execution of a watch's check (plan T18), by schedule, manually, or from a delivered event or webhook. carrier names the mechanism that carried it; state is the terminal state (the same values the service's check_runs.state CHECK allows). observations is how many observations the run recorded and triggers how many conditions it fired; cost_usd is what the run cost. Rows are immutable.",@@@ -1415,7 +1655,7 @@},"watch.watch-request.v1": {"title": "WatchRequest",-- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",++ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).","type": "object","additionalProperties": false,"properties": {@@@ -1431,6 +1671,14 @@"maxLength": 60}},++ "project_id": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",++ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."++ },"source": {"$ref": "#/components/schemas/watch.watch.v1/$defs/source"},@@@ -2133,15 +2381,42 @@{"type": "object","required": [-- "kind",-- "runtime",-- "command"++ "kind"],"additionalProperties": false,"properties": {"kind": {"const": "run-job"},++ "class": {++ "$ref": "#/components/schemas/platform.runtime-class.v1"++ },++ "artifact": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/artifact"++ },++ "args": {++ "type": "object",++ "description": "The artifact's declared input as JSON; default {}."++ },++ "limits": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/limits"++ },++ "egress": {++ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/egress"++ },++ "ttl_ms": {++ "type": "integer",++ "minimum": 1000,++ "maximum": 86400000++ },++ "firing_arg": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_]{0,39}$",++ "description": "The args key the firing is added under; null or absent: none."++ },"runtime": {"enum": ["function",@@@ -2160,7 +2435,8 @@],"additionalProperties": true}-- }++ },++ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."}]},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.152.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.153.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"@@@ -141939,6 +141939,18 @@ export interface NetworkProjectReadResult {}[];}++/** [email protected] (owner: network) */++/**++ * network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.++ */++export interface NetworkProjectMemberResult {++ project_id: string;++ subject: string;++ role: "viewer" | "developer" | "admin" | "owner";++ archived: boolean;++ added_at?: string | null;++}++/** [email protected] (owner: network) *//*** network.project-usage-result@1 (roadmap WS-N task 4, ADR-014): what GET /api/v1/projects/:project/usage?days=&env= on OpenVibe.Network answers a project's owner or admin (or staff): the project's usage per day, service, capability and unit, added up from the <service>.usage.recorded rollups (common.usage-recorded@1) the owning services emit after each hour closes; the project's recorded quotas with what the current window has used; and its recent failures with their codes and trace ids. Counts only, never who did what: no subject id, address, input or content.@@@ -154863,8 +154875,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -154906,8 +154959,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -154948,8 +155042,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -154992,8 +155127,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155034,8 +155210,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155076,8 +155293,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155120,8 +155378,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155162,8 +155461,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155204,8 +155544,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155246,8 +155627,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155290,8 +155712,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155332,8 +155795,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155374,17 +155878,58 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;-- workload?: {-- [k: string]: unknown | undefined;-- } | null;-- }-- ),-- (-- | {-- kind: "notification";-- category?: "service" | "social" | "system";++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;++ workload?: {++ [k: string]: unknown | undefined;++ } | null;++ }++ ),++ (++ | {++ kind: "notification";++ category?: "service" | "social" | "system";priority?: "low" | "normal" | "high" | "critical";}| {@@@ -155416,8 +155961,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155458,8 +156044,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155502,8 +156129,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155544,8 +156212,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155586,8 +156295,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155628,8 +156378,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155670,8 +156461,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155712,8 +156544,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155756,8 +156629,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155798,8 +156712,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155840,8 +156795,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155882,8 +156878,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155924,8 +156961,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -155966,8 +157044,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156008,8 +157127,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156052,8 +157212,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156094,8 +157295,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156136,8 +157378,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156178,8 +157461,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156220,8 +157544,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156262,8 +157627,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156304,8 +157710,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156346,8 +157793,49 @@ export interface Watch {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156373,13 +157861,17 @@ export interface Watch {/** [email protected] (owner: watch) *//**-- * watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).++ * watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).*/export interface WatchRequest {name?: string;labels?: {[k: string]: string | undefined;};++ /**++ * The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it.++ */++ project_id?: string | null;source?:| {kind: "webhook";@@@ -156511,8 +158003,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156554,8 +158087,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156596,8 +158170,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156640,8 +158255,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156682,8 +158338,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156724,8 +158421,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156768,8 +158506,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156810,8 +158589,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156852,8 +158672,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156894,8 +158755,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156938,8 +158840,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -156980,8 +158923,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157022,8 +159006,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157064,8 +159089,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157106,8 +159172,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157150,8 +159257,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157192,8 +159340,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157234,8 +159423,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157276,8 +159506,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157318,8 +159589,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157360,8 +159672,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157404,8 +159757,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157446,8 +159840,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157488,8 +159923,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157530,8 +160006,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157572,8 +160089,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157614,8 +160172,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157656,8 +160255,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157700,8 +160340,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157742,8 +160423,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157784,8 +160506,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157826,8 +160589,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157868,8 +160672,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157910,8 +160755,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157952,8 +160838,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -157994,8 +160921,49 @@ export interface WatchRequest {}| {kind: "run-job";-- runtime: "function" | "code" | "browser" | "linux";-- command: string;++ class?: RuntimeClass;++ /**++ * The pre-registered artifact to run (platform.job@1 artifact).++ */++ artifact?: {++ name: string;++ /**++ * One exact version, never a range++ */++ version: string;++ };++ /**++ * The artifact's declared input as JSON; default {}.++ */++ args?: {};++ /**++ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.++ */++ limits?: {++ /**++ * Running time from `job_started`++ */++ wall_ms: number;++ /**++ * CPU time, user plus system++ */++ cpu_ms: number;++ /**++ * Peak resident memory++ */++ mem_bytes: number;++ };++ /**++ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).++ */++ egress?: "none" | "public" | "openvibe-only";++ ttl_ms?: number;++ /**++ * The args key the firing is added under; null or absent: none.++ */++ firing_arg?: string | null;++ runtime?: "function" | "code" | "browser" | "linux";++ command?: string;workload?: {[k: string]: unknown | undefined;} | null;@@@ -166916,7 +169884,7 @@ export interface BotCommandRefusedPayload {/** [email protected] (owner: run) *//**-- * run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.++ * run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.*/export type RunJobCreateRequest = {[k: string]: unknown | undefined;nnew file mode 100644@@@ -0,0 +1,21 @@++{++ "id": "network.project.member.read",++ "version": "1.0",++ "owner": "network",++ "status": "active",++ "visibility": "first-party",++ "description": "Read one person's membership of a developer project as a receiving service: the role and whether the project is archived. A service that accepts project delegation (ADR-003 amendment 2026-10-12: a first-party service names the person with X-OV-Subject and the project with X-OV-Project) checks here that the person is an admin or owner of an unarchived project before it does the project's work. A non-member and an unknown project answer the same 404, so membership is never a way to learn that a project exists. Never grantable to apps.",++ "permissions": [++ "projects:read"++ ],++ "resourceConstraints": [++ "project"++ ],++ "quotaClass": "projects-read",++ "events": [],++ "implementedBy": [++ "GET /internal/projects/:project_id/members/:subject"++ ],++ "inputSchema": "common.no-body@1",++ "outputSchema": "network.project-member-result@1"++}@@@ -55,6 +55,7 @@"network.notifications.push","network.operator.alert","network.project.manage",++ "network.project.member.read","network.project.read","network.registry.read","network.resource.read",@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.152.0",++ "version": "0.153.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",
@@ -4,6 +4,21 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,21 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.153.0 — 2026-10-12
+
+- **Project delegation (ADR-003 amendment 2026-10-12).** A first-party service acting for a person (`X-OV-Subject`)
+ may name one project with `X-OV-Project: prj_…`; the receiver checks with Network that the person is an admin or
+ owner of the unarchived project (cache at most 60 s), records project, person and `via`, and shows the service only
+ what it started. Apps, mods and agents never may (403 `project.not_delegated`).
+- **`network.project.member.read`** (first-party, active): `GET /internal/projects/:project_id/members/:subject` on
+ Network answers `network.project-member-result@1` (`project_id`, `subject`, `role`, `archived`, `added_at`); a
+ non-member and an unknown project are the same 404 `project.member_not_found`. New schema with fixtures.
+- **Watch:** `watch.watch-request@1` takes `project_id` (checked at save with that read). The `run-job` action takes
+ `run.job-create-request@1` fields (`class`, `artifact`, `args`, `limits`, `egress`, `ttl_ms`) and `firing_arg`; the
+ draft's `runtime`/`command`/`workload` stay in the schema for compatibility but Watch refuses them.
+- `run.job-create-request@1`'s description states the delegated form. Additive only (compat vs 0.152.0: no breaking
+ changes).
+
## 0.152.0 — 2026-10-12
## 0.152.0 — 2026-10-12
- **`video.playlist.read` and `video.playlist.manage` are active.** openvibe.video's playlist API (MediaHub#33) takes a
- **`video.playlist.read` and `video.playlist.manage` are active.** openvibe.video's playlist API (MediaHub#33) takes a
@@ -2853,6 +2853,16 @@
@@ -2853,6 +2853,16 @@
"status": "active",
"status": "active",
"adr": "ADR-014"
"adr": "ADR-014"
},
},
+ {
+ "id": "network.project-member-result",
+ "version": "1.0.0",
+ "owner": "network",
+ "schema": "network/project-member-result.v1.json",
+ "visibility": "first-party",
+ "compatibility": "backward",
+ "status": "active",
+ "adr": "ADR-003"
+ },
{
{
"id": "network.project-usage-result",
"id": "network.project-usage-result",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/project-member-result.v1.json",
+ "title": "NetworkProjectMemberResult",
+ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",
+ "type": "object",
+ "required": [
+ "project_id",
+ "subject",
+ "role",
+ "archived"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "project_id": {
+ "type": "string",
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "subject": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "role": {
+ "enum": [
+ "viewer",
+ "developer",
+ "admin",
+ "owner"
+ ]
+ },
+ "archived": {
+ "type": "boolean"
+ },
+ "added_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+}
@@ -2,7 +2,7 @@
@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/run/job-create-request.v1.json",
"$id": "https://openvibe.network/contracts/run/job-create-request.v1.json",
"title": "RunJobCreateRequest",
"title": "RunJobCreateRequest",
- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
+ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -2,12 +2,13 @@
@@ -2,12 +2,13 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/watch/watch-request.v1.json",
"$id": "https://openvibe.network/contracts/watch/watch-request.v1.json",
"title": "WatchRequest",
"title": "WatchRequest",
- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
+ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
"labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 60 } },
"labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 60 } },
+ "project_id": { "type": ["string", "null"], "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$", "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it." },
"source": { "$ref": "watch.v1.json#/$defs/source" },
"source": { "$ref": "watch.v1.json#/$defs/source" },
"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },
"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },
"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },
"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },
@@ -591,15 +591,42 @@
@@ -591,15 +591,42 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "kind",
- "runtime",
- "command"
+ "kind"
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
"kind": {
"kind": {
"const": "run-job"
"const": "run-job"
},
},
+ "class": {
+ "$ref": "../platform/runtime-class.v1.json"
+ },
+ "artifact": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/artifact"
+ },
+ "args": {
+ "type": "object",
+ "description": "The artifact's declared input as JSON; default {}."
+ },
+ "limits": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/limits"
+ },
+ "egress": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/egress"
+ },
+ "ttl_ms": {
+ "type": "integer",
+ "minimum": 1000,
+ "maximum": 86400000
+ },
+ "firing_arg": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_]{0,39}$",
+ "description": "The args key the firing is added under; null or absent: none."
+ },
"runtime": {
"runtime": {
"enum": [
"enum": [
"function",
"function",
@@ -618,7 +645,8 @@
@@ -618,7 +645,8 @@
],
],
"additionalProperties": true
"additionalProperties": true
}
}
- }
+ },
+ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."
}
}
]
]
},
},
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
# ADR-003: Service/app principal authentication and capability grants
# ADR-003: Service/app principal authentication and capability grants
-**Status:** Accepted, implemented 2026-09-22. Amended 2026-09-24: delegated authorization semantics and approval UX (roadmap §28.3).
+**Status:** Accepted, implemented 2026-09-22. Amended 2026-09-24: delegated authorization semantics and approval UX (roadmap §28.3). Amended 2026-10-12: project delegation (`X-OV-Project`).
## Context and current evidence
## Context and current evidence
@@ -104,3 +104,48 @@ Required next, owned by Network (not built yet):
@@ -104,3 +104,48 @@ Required next, owned by Network (not built yet):
`invalid_scope`. A reused or expired code is `invalid_grant`.
`invalid_scope`. A reused or expired code is `invalid_grant`.
- Still to add, with items 4 to 6: the chooser lists exactly the issued capabilities, and a revoked
- Still to add, with items 4 to 6: the chooser lists exactly the issued capabilities, and a revoked
authorization gets no new token.
authorization gets no new token.
+
+## Amendment 2026-10-12: project delegation
+
+Some work belongs to a project rather than to a person: OpenVibe.Run bills every job to a project and takes the
+project only from a token (ADR-036), so a first-party service acting for a person (`X-OV-Subject`) could not start a
+job for them. Watch's `run-job` action is the first case: a person's watch should start a Run job billed to a project
+the person runs. This amendment lets a first-party service name that project, and says how the receiver checks it.
+
+### The rule
+
+- **Who may name a project.** Only a first-party service (`svc:<id>`, `actor_type: service`) that also names the
+ person (`X-OV-Subject: usr_…`) may name a project, with `X-OV-Project: prj_…`. An app, mod or agent never may: its
+ project is its token's own `project_id`, and a request from one carrying `X-OV-Project` is refused (403
+ `project.not_delegated`). A client-credentials call with `X-OV-Project` but no `X-OV-Subject` is refused the same
+ way: a service has no project of its own to name.
+- **What the receiver checks, every time.** The receiver asks Network whether the person is a member of the project,
+ `GET /internal/projects/:project_id/members/:subject` (capability `network.project.member.read`, first-party, never
+ grantable to apps; answer `network.project-member-result@1`). The person must be an **admin or owner** (the roles
+ that may create production apps and approve grants, `docs/developer-projects.md`), and the project must not be
+ archived. Anything else is 403 `project.not_delegated`, with no detail that reveals whether the project exists. A
+ receiver may cache a yes for at most 60 seconds, so a removed member or an archived project stops new work within a
+ minute. The service checking at save time (Watch, when a watch names a project) does not replace the receiver's
+ check at use time.
+- **Intersection still holds.** The call is the person's, inside the project: the service's own grants (for example
+ `run.job.submit` for audience `openvibe.run`), the project's allowance, tier caps and quotas, and what the person may
+ do in that project all apply. Staff power is never delegated, as above.
+- **Records name all three.** The job (or other resource) belongs to the project; its requester is the person; the
+ service is recorded as `via`. Audit rows and events carry the same three.
+- **The service sees only its own.** A delegated caller reads only what it started for that person in that project.
+ Listing a project's work, or acting on someone else's, needs a token that names the project itself.
+
+### First uses
+
+- **Run** accepts a delegated `POST /api/v1/jobs` and `GET /api/v1/jobs/:id` (the job it started); list, cancel and
+ stream stay with project tokens.
+- **Watch** lets a watch name one of its owner's projects (`project_id` on `watch.watch-request@1`, checked at save
+ with the same Network read), and its `run-job` action starts the job with `X-OV-Subject` + `X-OV-Project`.
+
+### Tests
+
+- Receivers: `X-OV-Project` from an app token, or without `X-OV-Subject`, is 403 `project.not_delegated`; a viewer
+ or developer member, a non-member and an archived project are 403 `project.not_delegated`; an admin or owner
+ member is accepted and the record names project, person and `via`.
+- Network: the member read needs `network.project.member.read`; a non-member and an unknown project are both 404
+ `project.member_not_found`.
@@ -6,7 +6,7 @@ Platform-wide decisions from the OpenVibe development roadmap (section 10). Each
@@ -6,7 +6,7 @@ Platform-wide decisions from the OpenVibe development roadmap (section 10). Each
|---|---|---|
|---|---|---|
| [ADR-001](ADR-001-canonical-subjects.md) | Canonical subject IDs and legacy identity mapping | Accepted, implemented 2026-09-22 |
| [ADR-001](ADR-001-canonical-subjects.md) | Canonical subject IDs and legacy identity mapping | Accepted, implemented 2026-09-22 |
| [ADR-002](ADR-002-contract-repository.md) | Contract repository and compatibility policy | Accepted, implemented 2026-09-22 (openvibe-contracts v0.1.0+) |
| [ADR-002](ADR-002-contract-repository.md) | Contract repository and compatibility policy | Accepted, implemented 2026-09-22 (openvibe-contracts v0.1.0+) |
-| [ADR-003](ADR-003-service-principals.md) | Service/app principal authentication and capability grants | Accepted, implemented 2026-09-22; amended 2026-09-24 (delegated authorization and approval UX) |
+| [ADR-003](ADR-003-service-principals.md) | Service/app principal authentication and capability grants | Accepted, implemented 2026-09-22; amended 2026-09-24 (delegated authorization and approval UX), 2026-10-12 (project delegation) |
| [ADR-004](ADR-004-durable-events.md) | Durable event store, outbox/inbox and delivery semantics | Accepted 2026-09-22; implementation in progress (OpenVibe.Events) |
| [ADR-004](ADR-004-durable-events.md) | Durable event store, outbox/inbox and delivery semantics | Accepted 2026-09-22; implementation in progress (OpenVibe.Events) |
| [ADR-005](ADR-005-realtime.md) | Realtime topics, cursor/resume and whether OpenVibe.Realtime exists | Accepted 2026-09-22: realtime runs inside OpenVibe.Events; amendment 1 (2026-09-26): presence is ephemeral, in Chat's delivery plane; amendment 2 (2026-09-26): a person's topic is `network.notification.*` with subject visibility, and browsers authenticate with two-minute realtime tickets |
| [ADR-005](ADR-005-realtime.md) | Realtime topics, cursor/resume and whether OpenVibe.Realtime exists | Accepted 2026-09-22: realtime runs inside OpenVibe.Events; amendment 1 (2026-09-26): presence is ephemeral, in Chat's delivery plane; amendment 2 (2026-09-26): a person's topic is `network.notification.*` with subject visibility, and browsers authenticate with two-minute realtime tickets |
| [ADR-006](ADR-006-media-objects.md) | Media object, location and namespace model | Accepted 2026-09-22; implementation in progress (OpenVibe.Media Wave 4); amended 2026-09-24 (placement classes, local provider, infrequent access deferred) |
| [ADR-006](ADR-006-media-objects.md) | Media object, location and namespace model | Accepted 2026-09-22; implementation in progress (OpenVibe.Media Wave 4); amended 2026-09-24 (placement classes, local provider, infrequent access deferred) |
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
+ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
+ "role": "owner",
+ "archived": false,
+ "members": [
+ "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
+ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
+ "role": "superuser",
+ "archived": false
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
+{
+ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
+ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
+ "role": "admin",
+ "archived": false,
+ "added_at": "2026-10-01T12:00:00.000Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
+ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6",
+ "role": "viewer",
+ "archived": true
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
+{
+ "name": "Rebuild the docs site on release",
+ "source": {
+ "kind": "event",
+ "pattern": "host.release.published",
+ "filter": null
+ },
+ "cadence": null,
+ "extraction": {
+ "kind": "json",
+ "selector": null,
+ "fields": null,
+ "value_path": "$.release",
+ "ai": null
+ },
+ "comparison": {
+ "mode": "changed",
+ "tolerance": null,
+ "percent": null
+ },
+ "condition": {
+ "op": "changed",
+ "value": null,
+ "for_sec": null
+ },
+ "action": [
+ {
+ "kind": "run-job",
+ "class": "function",
+ "artifact": {
+ "name": "docs-build",
+ "version": "1.4.0"
+ },
+ "args": {
+ "site": "docs"
+ },
+ "limits": {
+ "wall_ms": 120000,
+ "cpu_ms": 60000,
+ "mem_bytes": 268435456
+ },
+ "egress": "openvibe-only",
+ "firing_arg": "firing"
+ }
+ ],
+ "budget": {
+ "checks_per_day": 100,
+ "usd_per_month": 0,
+ "max_runtime_ms": 5000,
+ "max_bytes": 1048576
+ },
+ "retention": {
+ "observations_days": 30,
+ "keep_snapshots": false
+ },
+ "status": "active",
+ "project_id": "project-1"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
+{
+ "name": "Rebuild the docs site on release",
+ "source": {
+ "kind": "event",
+ "pattern": "host.release.published",
+ "filter": null
+ },
+ "cadence": null,
+ "extraction": {
+ "kind": "json",
+ "selector": null,
+ "fields": null,
+ "value_path": "$.release",
+ "ai": null
+ },
+ "comparison": {
+ "mode": "changed",
+ "tolerance": null,
+ "percent": null
+ },
+ "condition": {
+ "op": "changed",
+ "value": null,
+ "for_sec": null
+ },
+ "action": [
+ {
+ "kind": "run-job",
+ "class": "function",
+ "artifact": {
+ "name": "docs-build",
+ "version": "1.4.0"
+ },
+ "args": {
+ "site": "docs"
+ },
+ "limits": {
+ "wall_ms": 120000
+ },
+ "egress": "openvibe-only",
+ "firing_arg": "firing"
+ }
+ ],
+ "budget": {
+ "checks_per_day": 100,
+ "usd_per_month": 0,
+ "max_runtime_ms": 5000,
+ "max_bytes": 1048576
+ },
+ "retention": {
+ "observations_days": 30,
+ "keep_snapshots": false
+ },
+ "status": "active",
+ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPS"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
+{
+ "name": "Rebuild the docs site on release",
+ "source": {
+ "kind": "event",
+ "pattern": "host.release.published",
+ "filter": null
+ },
+ "cadence": null,
+ "extraction": {
+ "kind": "json",
+ "selector": null,
+ "fields": null,
+ "value_path": "$.release",
+ "ai": null
+ },
+ "comparison": {
+ "mode": "changed",
+ "tolerance": null,
+ "percent": null
+ },
+ "condition": {
+ "op": "changed",
+ "value": null,
+ "for_sec": null
+ },
+ "action": [
+ {
+ "kind": "run-job",
+ "class": "function",
+ "artifact": {
+ "name": "docs-build",
+ "version": "1.4.0"
+ },
+ "args": {
+ "site": "docs"
+ },
+ "limits": {
+ "wall_ms": 120000,
+ "cpu_ms": 60000,
+ "mem_bytes": 268435456
+ },
+ "egress": "openvibe-only",
+ "firing_arg": "firing"
+ }
+ ],
+ "budget": {
+ "checks_per_day": 100,
+ "usd_per_month": 0,
+ "max_runtime_ms": 5000,
+ "max_bytes": 1048576
+ },
+ "retention": {
+ "observations_days": 30,
+ "keep_snapshots": false
+ },
+ "status": "active",
+ "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPS"
+}
@@ -29375,6 +29375,52 @@
@@ -29375,6 +29375,52 @@
}
}
}
}
},
},
+ "network.project-member-result": {
+ "version": "1.0.0",
+ "owner": "network",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/network/project-member-result.v1.json",
+ "title": "NetworkProjectMemberResult",
+ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",
+ "type": "object",
+ "required": [
+ "project_id",
+ "subject",
+ "role",
+ "archived"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "project_id": {
+ "type": "string",
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "subject": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "role": {
+ "enum": [
+ "viewer",
+ "developer",
+ "admin",
+ "owner"
+ ]
+ },
+ "archived": {
+ "type": "boolean"
+ },
+ "added_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ }
+ },
"network.project-usage-result": {
"network.project-usage-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "network",
"owner": "network",
@@ -47306,15 +47352,42 @@
@@ -47306,15 +47352,42 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "kind",
- "runtime",
- "command"
+ "kind"
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
"kind": {
"kind": {
"const": "run-job"
"const": "run-job"
},
},
+ "class": {
+ "$ref": "../platform/runtime-class.v1.json"
+ },
+ "artifact": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/artifact"
+ },
+ "args": {
+ "type": "object",
+ "description": "The artifact's declared input as JSON; default {}."
+ },
+ "limits": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/limits"
+ },
+ "egress": {
+ "$ref": "../run/job-create-request.v1.json#/$defs/egress"
+ },
+ "ttl_ms": {
+ "type": "integer",
+ "minimum": 1000,
+ "maximum": 86400000
+ },
+ "firing_arg": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_]{0,39}$",
+ "description": "The args key the firing is added under; null or absent: none."
+ },
"runtime": {
"runtime": {
"enum": [
"enum": [
"function",
"function",
@@ -47333,7 +47406,8 @@
@@ -47333,7 +47406,8 @@
],
],
"additionalProperties": true
"additionalProperties": true
}
}
- }
+ },
+ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."
}
}
]
]
},
},
@@ -47398,7 +47472,7 @@
@@ -47398,7 +47472,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/watch/watch-request.v1.json",
"$id": "https://openvibe.network/contracts/watch/watch-request.v1.json",
"title": "WatchRequest",
"title": "WatchRequest",
- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
+ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
@@ -47414,6 +47488,14 @@
@@ -47414,6 +47488,14 @@
"maxLength": 60
"maxLength": 60
}
}
},
},
+ "project_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."
+ },
"source": {
"source": {
"$ref": "watch.v1.json#/$defs/source"
"$ref": "watch.v1.json#/$defs/source"
},
},
@@ -71843,7 +71925,7 @@
@@ -71843,7 +71925,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/run/job-create-request.v1.json",
"$id": "https://openvibe.network/contracts/run/job-create-request.v1.json",
"title": "RunJobCreateRequest",
"title": "RunJobCreateRequest",
- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
+ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -124,8 +124,8 @@
@@ -124,8 +124,8 @@
"service": "network",
"service": "network",
"name": "OpenVibe.Network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
"origin": "https://openvibe.network",
- "operations": 39,
- "capabilities": 27
+ "operations": 40,
+ "capabilities": 28
},
},
{
{
"service": "news",
"service": "news",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -2058,6 +2058,70 @@
@@ -2058,6 +2058,70 @@
}
}
}
}
},
},
+ "/internal/projects/{project_id}/members/{subject}": {
+ "get": {
+ "operationId": "get_internal_projects_project_id_members_subject",
+ "summary": "Read one person's membership of a developer project as a receiving service: the role and whether the project is archived.",
+ "description": "**network.project.member.read** (first-party): Read one person's membership of a developer project as a receiving service: the role and whether the project is archived. A service that accepts project delegation (ADR-003 amendment 2026-10-12: a first-party service names the person with X-OV-Subject and the project with X-OV-Project) checks here that the person is an admin or owner of an unarchived project before it does the project's work. A non-member and an unknown project answer the same 404, so membership is never a way to learn that a project exists. Never grantable to apps.",
+ "tags": [
+ "network.project"
+ ],
+ "x-openvibe-capabilities": [
+ "network.project.member.read"
+ ],
+ "x-openvibe-visibility": [
+ "first-party"
+ ],
+ "x-openvibe-quota-class": "projects-read",
+ "security": [
+ {
+ "openvibeToken": [
+ "network.project.member.read"
+ ]
+ }
+ ],
+ "parameters": [
+ {
+ "name": "project_id",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "subject",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/network.project-member-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/internal/registry/instances/report": {
"/internal/registry/instances/report": {
"post": {
"post": {
"operationId": "post_internal_registry_instances_report",
"operationId": "post_internal_registry_instances_report",
@@ -4210,6 +4274,45 @@
@@ -4210,6 +4274,45 @@
}
}
}
}
},
},
+ "network.project-member-result.v1": {
+ "title": "NetworkProjectMemberResult",
+ "description": "network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.",
+ "type": "object",
+ "required": [
+ "project_id",
+ "subject",
+ "role",
+ "archived"
+ ],
+ "additionalProperties": false,
+ "properties": {
+ "project_id": {
+ "type": "string",
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "subject": {
+ "type": "string",
+ "pattern": "^usr_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "role": {
+ "enum": [
+ "viewer",
+ "developer",
+ "admin",
+ "owner"
+ ]
+ },
+ "archived": {
+ "type": "boolean"
+ },
+ "added_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ }
+ },
"network.project-read-result.v1": {
"network.project-read-result.v1": {
"title": "NetworkProjectReadResult",
"title": "NetworkProjectReadResult",
"description": "network.project-read-result@1: the service-facing answer from OpenVibe.Network GET /internal/projects/:project_id (network.project.read). It carries project tenancy, allowances, quotas, apps and each app's grants (requested, approved, denied or revoked) without credentials or member identities beyond the owner.",
"description": "network.project-read-result@1: the service-facing answer from OpenVibe.Network GET /internal/projects/:project_id (network.project.read). It carries project tenancy, allowances, quotas, apps and each app's grants (requested, approved, denied or revoked) without credentials or member identities beyond the owner.",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.152.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -873,7 +873,7 @@
@@ -873,7 +873,7 @@
},
},
"run.job-create-request.v1": {
"run.job-create-request.v1": {
"title": "RunJobCreateRequest",
"title": "RunJobCreateRequest",
- "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
+ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"required": [
"required": [
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -274,6 +274,20 @@
@@ -274,6 +274,20 @@
}
}
}
}
},
},
+ {
+ "name": "project_id",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."
+ },
+ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."
+ },
{
{
"name": "source",
"name": "source",
"in": "query",
"in": "query",
@@ -1110,6 +1124,42 @@
@@ -1110,6 +1124,42 @@
}
}
]
]
},
},
+ "platform.runtime-class.v1": {
+ "title": "RuntimeClass",
+ "description": "platform.runtime-class@1: the kind of execution environment a platform.job@1 asks for (plan T14 Run; ADR-034 proposed). A name only: this contract defines no behavior, and a worker runs only the classes it advertises and refuses every other one (`nack`). `function` is the first class implemented (OpenVibe.Node's function worker); the others are reserved names. Each class names one reserved Fabric capability in [email protected] — `worker:` + the class (worker:function, worker:code, worker:browser, worker:linux, worker:desktop, worker:gpu) — and a node advertises the name of each class it runs.",
+ "$comment": "Additive: a class may be added to v1; none is removed, renamed or reordered.",
+ "type": "string",
+ "oneOf": [
+ {
+ "const": "function",
+ "description": "A pre-registered artifact (name and exact version) run once with declared args to one result: single-shot, no persistent filesystem, no dependency resolution, network denied."
+ },
+ {
+ "const": "code",
+ "description": "Arbitrary source with its dependency tree in a longer-lived environment; needs image handling and isolation stronger than a container."
+ },
+ {
+ "const": "browser",
+ "description": "A headless or headed web browser session driven remotely."
+ },
+ {
+ "const": "linux",
+ "description": "A full Linux environment (shell, filesystem, processes) that lives across commands."
+ },
+ {
+ "const": "desktop",
+ "description": "A graphical desktop session with screen and input under control levels."
+ },
+ {
+ "const": "gpu",
+ "description": "A workload that holds one or more GPUs for its lifetime."
+ }
+ ],
+ "examples": [
+ "function",
+ "gpu"
+ ]
+ },
"platform.workload-requirements.v1": {
"platform.workload-requirements.v1": {
"title": "WorkloadRequirements",
"title": "WorkloadRequirements",
"description": "What a workload needs, so the platform can place it (roadmap WS-Z9). Hard constraints are filtered before any objective is scored; a cheaper candidate that misses one is never chosen.",
"description": "What a workload needs, so the platform can place it (roadmap WS-Z9). Hard constraints are filtered before any objective is scored; a cheaper candidate that misses one is never chosen.",
@@ -1247,6 +1297,196 @@
@@ -1247,6 +1297,196 @@
}
}
}
}
},
},
+ "run.job-create-request.v1": {
+ "title": "RunJobCreateRequest",
+ "description": "run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "class",
+ "limits"
+ ],
+ "properties": {
+ "class": {
+ "$ref": "#/components/schemas/platform.runtime-class.v1"
+ },
+ "artifact": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/artifact"
+ },
+ "args": {
+ "type": "object",
+ "description": "The artifact's declared input as JSON; default {}."
+ },
+ "inputs": {
+ "type": "array",
+ "maxItems": 32,
+ "items": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/input"
+ },
+ "description": "Files placed in the job directory before the process starts; names are unique (else 422)."
+ },
+ "limits": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/limits"
+ },
+ "ttl_ms": {
+ "type": "integer",
+ "minimum": 1000,
+ "maximum": 86400000,
+ "description": "Lifetime from creation, covering the wait for a node and the run (platform.job@1 ttl_ms); when it runs out the job ends expired. Default: limits.wall_ms plus 600000."
+ },
+ "egress": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/egress"
+ },
+ "requirements": {
+ "$ref": "#/components/schemas/platform.workload-requirements.v1"
+ },
+ "idempotency_key": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/idempotency_key"
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "required": [
+ "class"
+ ],
+ "properties": {
+ "class": {
+ "enum": [
+ "function",
+ "code"
+ ]
+ }
+ }
+ },
+ "then": {
+ "required": [
+ "artifact"
+ ]
+ }
+ }
+ ],
+ "$defs": {
+ "artifact": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "The pre-registered artifact to run (platform.job@1 artifact).",
+ "required": [
+ "name",
+ "version"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "pattern": "^[a-z0-9][a-z0-9._-]{0,127}$"
+ },
+ "version": {
+ "type": "string",
+ "pattern": "^[0-9A-Za-z][0-9A-Za-z.+-]{0,63}$",
+ "description": "One exact version, never a range"
+ }
+ }
+ },
+ "input": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "One input file: an OpenVibe.Media object the caller's project can read, pinned by digest.",
+ "required": [
+ "name",
+ "media_id",
+ "sha256"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$",
+ "description": "File name in the job directory; no path separators."
+ },
+ "media_id": {
+ "type": "string",
+ "pattern": "^med_[0-9A-HJKMNP-TV-Z]{26}$"
+ },
+ "sha256": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{64}$",
+ "description": "Lowercase hex SHA-256 of the object's bytes."
+ },
+ "size_bytes": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "limits": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.",
+ "required": [
+ "wall_ms",
+ "cpu_ms",
+ "mem_bytes"
+ ],
+ "properties": {
+ "wall_ms": {
+ "type": "integer",
+ "minimum": 1,
+ "description": "Running time from `job_started`"
+ },
+ "cpu_ms": {
+ "type": "integer",
+ "minimum": 1,
+ "description": "CPU time, user plus system"
+ },
+ "mem_bytes": {
+ "type": "integer",
+ "minimum": 1,
+ "description": "Peak resident memory"
+ }
+ }
+ },
+ "egress": {
+ "type": "string",
+ "enum": [
+ "none",
+ "public",
+ "openvibe-only"
+ ],
+ "default": "none",
+ "description": "OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only)."
+ },
+ "idempotency_key": {
+ "type": "string",
+ "pattern": "^[A-Za-z0-9._:-]{1,128}$"
+ }
+ },
+ "examples": [
+ {
+ "class": "function",
+ "artifact": {
+ "name": "thumbnail",
+ "version": "1.2.0"
+ },
+ "args": {
+ "width": 320
+ },
+ "inputs": [
+ {
+ "name": "photo.jpg",
+ "media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
+ "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
+ "size_bytes": 482113
+ }
+ ],
+ "limits": {
+ "wall_ms": 30000,
+ "cpu_ms": 30000,
+ "mem_bytes": 268435456
+ },
+ "egress": "none",
+ "idempotency_key": "thumb:photo-7"
+ }
+ ]
+ },
"watch.check-run.v1": {
"watch.check-run.v1": {
"title": "WatchCheckRun",
"title": "WatchCheckRun",
"description": "watch.check-run@1: one execution of a watch's check (plan T18), by schedule, manually, or from a delivered event or webhook. carrier names the mechanism that carried it; state is the terminal state (the same values the service's check_runs.state CHECK allows). observations is how many observations the run recorded and triggers how many conditions it fired; cost_usd is what the run cost. Rows are immutable.",
"description": "watch.check-run@1: one execution of a watch's check (plan T18), by schedule, manually, or from a delivered event or webhook. carrier names the mechanism that carried it; state is the terminal state (the same values the service's check_runs.state CHECK allows). observations is how many observations the run recorded and triggers how many conditions it fired; cost_usd is what the run cost. Rows are immutable.",
@@ -1415,7 +1655,7 @@
@@ -1415,7 +1655,7 @@
},
},
"watch.watch-request.v1": {
"watch.watch-request.v1": {
"title": "WatchRequest",
"title": "WatchRequest",
- "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
+ "description": "watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).",
"type": "object",
"type": "object",
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
@@ -1431,6 +1671,14 @@
@@ -1431,6 +1671,14 @@
"maxLength": 60
"maxLength": 60
}
}
},
},
+ "project_id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",
+ "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it."
+ },
"source": {
"source": {
"$ref": "#/components/schemas/watch.watch.v1/$defs/source"
"$ref": "#/components/schemas/watch.watch.v1/$defs/source"
},
},
@@ -2133,15 +2381,42 @@
@@ -2133,15 +2381,42 @@
{
{
"type": "object",
"type": "object",
"required": [
"required": [
- "kind",
- "runtime",
- "command"
+ "kind"
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
"kind": {
"kind": {
"const": "run-job"
"const": "run-job"
},
},
+ "class": {
+ "$ref": "#/components/schemas/platform.runtime-class.v1"
+ },
+ "artifact": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/artifact"
+ },
+ "args": {
+ "type": "object",
+ "description": "The artifact's declared input as JSON; default {}."
+ },
+ "limits": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/limits"
+ },
+ "egress": {
+ "$ref": "#/components/schemas/run.job-create-request.v1/$defs/egress"
+ },
+ "ttl_ms": {
+ "type": "integer",
+ "minimum": 1000,
+ "maximum": 86400000
+ },
+ "firing_arg": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_]{0,39}$",
+ "description": "The args key the firing is added under; null or absent: none."
+ },
"runtime": {
"runtime": {
"enum": [
"enum": [
"function",
"function",
@@ -2160,7 +2435,8 @@
@@ -2160,7 +2435,8 @@
],
],
"additionalProperties": true
"additionalProperties": true
}
}
- }
+ },
+ "description": "Start one OpenVibe.Run job when the watch fires (run.job-create-request@1 fields). The job is billed to the watch's project_id, which the watch must name; Watch starts it as itself acting for the owner (X-OV-Subject) in that project (X-OV-Project, ADR-003 amendment 2026-10-12), so Run checks the owner is an admin or owner of the project and applies the project's tier caps. CLASS and LIMITS are required, and ARTIFACT for function and code (Watch refuses a watch without them, 422 watch.invalid). FIRING_ARG names the args key the firing (watch id, check run, value, previous value, observed_at) is added under; without it the job gets ARGS as written. The idempotency key watch.<check run>.<action index> makes a retried delivery the same job. RUNTIME, COMMAND and WORKLOAD are the field names of an earlier draft that never ran: they are not accepted (422 watch.invalid)."
}
}
]
]
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.152.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.152.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.153.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.153.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": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -141939,6 +141939,18 @@ export interface NetworkProjectReadResult {
@@ -141939,6 +141939,18 @@ export interface NetworkProjectReadResult {
}[];
}[];
}
}
+/** [email protected] (owner: network) */
+/**
+ * network.project-member-result@1: OpenVibe.Network's answer to GET /internal/projects/:project_id/members/:subject (network.project.member.read). It says whether one person belongs to a developer project, with which role, and whether the project is archived, so a receiver can check a project delegation (ADR-003 amendment 2026-10-12: the person must be an admin or owner of an unarchived project). Only members are answered; a non-member and an unknown project are both 404 project.member_not_found. It carries no other members, no apps and no secrets.
+ */
+export interface NetworkProjectMemberResult {
+ project_id: string;
+ subject: string;
+ role: "viewer" | "developer" | "admin" | "owner";
+ archived: boolean;
+ added_at?: string | null;
+}
+
/** [email protected] (owner: network) */
/** [email protected] (owner: network) */
/**
/**
* network.project-usage-result@1 (roadmap WS-N task 4, ADR-014): what GET /api/v1/projects/:project/usage?days=&env= on OpenVibe.Network answers a project's owner or admin (or staff): the project's usage per day, service, capability and unit, added up from the <service>.usage.recorded rollups (common.usage-recorded@1) the owning services emit after each hour closes; the project's recorded quotas with what the current window has used; and its recent failures with their codes and trace ids. Counts only, never who did what: no subject id, address, input or content.
* network.project-usage-result@1 (roadmap WS-N task 4, ADR-014): what GET /api/v1/projects/:project/usage?days=&env= on OpenVibe.Network answers a project's owner or admin (or staff): the project's usage per day, service, capability and unit, added up from the <service>.usage.recorded rollups (common.usage-recorded@1) the owning services emit after each hour closes; the project's recorded quotas with what the current window has used; and its recent failures with their codes and trace ids. Counts only, never who did what: no subject id, address, input or content.
@@ -154863,8 +154875,49 @@ export interface Watch {
@@ -154863,8 +154875,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -154906,8 +154959,49 @@ export interface Watch {
@@ -154906,8 +154959,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -154948,8 +155042,49 @@ export interface Watch {
@@ -154948,8 +155042,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -154992,8 +155127,49 @@ export interface Watch {
@@ -154992,8 +155127,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155034,8 +155210,49 @@ export interface Watch {
@@ -155034,8 +155210,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155076,8 +155293,49 @@ export interface Watch {
@@ -155076,8 +155293,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155120,8 +155378,49 @@ export interface Watch {
@@ -155120,8 +155378,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155162,8 +155461,49 @@ export interface Watch {
@@ -155162,8 +155461,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155204,8 +155544,49 @@ export interface Watch {
@@ -155204,8 +155544,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155246,8 +155627,49 @@ export interface Watch {
@@ -155246,8 +155627,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155290,8 +155712,49 @@ export interface Watch {
@@ -155290,8 +155712,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155332,8 +155795,49 @@ export interface Watch {
@@ -155332,8 +155795,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155374,17 +155878,58 @@ export interface Watch {
@@ -155374,17 +155878,58 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
- workload?: {
- [k: string]: unknown | undefined;
- } | null;
- }
- ),
- (
- | {
- kind: "notification";
- category?: "service" | "social" | "system";
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
+ workload?: {
+ [k: string]: unknown | undefined;
+ } | null;
+ }
+ ),
+ (
+ | {
+ kind: "notification";
+ category?: "service" | "social" | "system";
priority?: "low" | "normal" | "high" | "critical";
priority?: "low" | "normal" | "high" | "critical";
}
}
| {
| {
@@ -155416,8 +155961,49 @@ export interface Watch {
@@ -155416,8 +155961,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155458,8 +156044,49 @@ export interface Watch {
@@ -155458,8 +156044,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155502,8 +156129,49 @@ export interface Watch {
@@ -155502,8 +156129,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155544,8 +156212,49 @@ export interface Watch {
@@ -155544,8 +156212,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155586,8 +156295,49 @@ export interface Watch {
@@ -155586,8 +156295,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155628,8 +156378,49 @@ export interface Watch {
@@ -155628,8 +156378,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155670,8 +156461,49 @@ export interface Watch {
@@ -155670,8 +156461,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155712,8 +156544,49 @@ export interface Watch {
@@ -155712,8 +156544,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155756,8 +156629,49 @@ export interface Watch {
@@ -155756,8 +156629,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155798,8 +156712,49 @@ export interface Watch {
@@ -155798,8 +156712,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155840,8 +156795,49 @@ export interface Watch {
@@ -155840,8 +156795,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155882,8 +156878,49 @@ export interface Watch {
@@ -155882,8 +156878,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155924,8 +156961,49 @@ export interface Watch {
@@ -155924,8 +156961,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -155966,8 +157044,49 @@ export interface Watch {
@@ -155966,8 +157044,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156008,8 +157127,49 @@ export interface Watch {
@@ -156008,8 +157127,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156052,8 +157212,49 @@ export interface Watch {
@@ -156052,8 +157212,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156094,8 +157295,49 @@ export interface Watch {
@@ -156094,8 +157295,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156136,8 +157378,49 @@ export interface Watch {
@@ -156136,8 +157378,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156178,8 +157461,49 @@ export interface Watch {
@@ -156178,8 +157461,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156220,8 +157544,49 @@ export interface Watch {
@@ -156220,8 +157544,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156262,8 +157627,49 @@ export interface Watch {
@@ -156262,8 +157627,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156304,8 +157710,49 @@ export interface Watch {
@@ -156304,8 +157710,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156346,8 +157793,49 @@ export interface Watch {
@@ -156346,8 +157793,49 @@ export interface Watch {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156373,13 +157861,17 @@ export interface Watch {
@@ -156373,13 +157861,17 @@ export interface Watch {
/** [email protected] (owner: watch) */
/** [email protected] (owner: watch) */
/**
/**
- * watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch; a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).
+ * watch.watch-request@1: the body of POST /api/v1/watches and PATCH /api/v1/watches/:id on OpenVibe.Watch (watch.watch.manage; the acting person). Every field is optional on a patch, project_id included (null clears it); a create requires source, extraction, condition and action, which the service enforces in code (422 watch.invalid).
*/
*/
export interface WatchRequest {
export interface WatchRequest {
name?: string;
name?: string;
labels?: {
labels?: {
[k: string]: string | undefined;
[k: string]: string | undefined;
};
};
+ /**
+ * The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it.
+ */
+ project_id?: string | null;
source?:
source?:
| {
| {
kind: "webhook";
kind: "webhook";
@@ -156511,8 +158003,49 @@ export interface WatchRequest {
@@ -156511,8 +158003,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156554,8 +158087,49 @@ export interface WatchRequest {
@@ -156554,8 +158087,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156596,8 +158170,49 @@ export interface WatchRequest {
@@ -156596,8 +158170,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156640,8 +158255,49 @@ export interface WatchRequest {
@@ -156640,8 +158255,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156682,8 +158338,49 @@ export interface WatchRequest {
@@ -156682,8 +158338,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156724,8 +158421,49 @@ export interface WatchRequest {
@@ -156724,8 +158421,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156768,8 +158506,49 @@ export interface WatchRequest {
@@ -156768,8 +158506,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156810,8 +158589,49 @@ export interface WatchRequest {
@@ -156810,8 +158589,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156852,8 +158672,49 @@ export interface WatchRequest {
@@ -156852,8 +158672,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156894,8 +158755,49 @@ export interface WatchRequest {
@@ -156894,8 +158755,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156938,8 +158840,49 @@ export interface WatchRequest {
@@ -156938,8 +158840,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -156980,8 +158923,49 @@ export interface WatchRequest {
@@ -156980,8 +158923,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157022,8 +159006,49 @@ export interface WatchRequest {
@@ -157022,8 +159006,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157064,8 +159089,49 @@ export interface WatchRequest {
@@ -157064,8 +159089,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157106,8 +159172,49 @@ export interface WatchRequest {
@@ -157106,8 +159172,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157150,8 +159257,49 @@ export interface WatchRequest {
@@ -157150,8 +159257,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157192,8 +159340,49 @@ export interface WatchRequest {
@@ -157192,8 +159340,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157234,8 +159423,49 @@ export interface WatchRequest {
@@ -157234,8 +159423,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157276,8 +159506,49 @@ export interface WatchRequest {
@@ -157276,8 +159506,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157318,8 +159589,49 @@ export interface WatchRequest {
@@ -157318,8 +159589,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157360,8 +159672,49 @@ export interface WatchRequest {
@@ -157360,8 +159672,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157404,8 +159757,49 @@ export interface WatchRequest {
@@ -157404,8 +159757,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157446,8 +159840,49 @@ export interface WatchRequest {
@@ -157446,8 +159840,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157488,8 +159923,49 @@ export interface WatchRequest {
@@ -157488,8 +159923,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157530,8 +160006,49 @@ export interface WatchRequest {
@@ -157530,8 +160006,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157572,8 +160089,49 @@ export interface WatchRequest {
@@ -157572,8 +160089,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157614,8 +160172,49 @@ export interface WatchRequest {
@@ -157614,8 +160172,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157656,8 +160255,49 @@ export interface WatchRequest {
@@ -157656,8 +160255,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157700,8 +160340,49 @@ export interface WatchRequest {
@@ -157700,8 +160340,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157742,8 +160423,49 @@ export interface WatchRequest {
@@ -157742,8 +160423,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157784,8 +160506,49 @@ export interface WatchRequest {
@@ -157784,8 +160506,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157826,8 +160589,49 @@ export interface WatchRequest {
@@ -157826,8 +160589,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157868,8 +160672,49 @@ export interface WatchRequest {
@@ -157868,8 +160672,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157910,8 +160755,49 @@ export interface WatchRequest {
@@ -157910,8 +160755,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157952,8 +160838,49 @@ export interface WatchRequest {
@@ -157952,8 +160838,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -157994,8 +160921,49 @@ export interface WatchRequest {
@@ -157994,8 +160921,49 @@ export interface WatchRequest {
}
}
| {
| {
kind: "run-job";
kind: "run-job";
- runtime: "function" | "code" | "browser" | "linux";
- command: string;
+ class?: RuntimeClass;
+ /**
+ * The pre-registered artifact to run (platform.job@1 artifact).
+ */
+ artifact?: {
+ name: string;
+ /**
+ * One exact version, never a range
+ */
+ version: string;
+ };
+ /**
+ * The artifact's declared input as JSON; default {}.
+ */
+ args?: {};
+ /**
+ * Caps on the running process (platform.job@1 limits); hitting one ends the job failed with run.job.limit.
+ */
+ limits?: {
+ /**
+ * Running time from `job_started`
+ */
+ wall_ms: number;
+ /**
+ * CPU time, user plus system
+ */
+ cpu_ms: number;
+ /**
+ * Peak resident memory
+ */
+ mem_bytes: number;
+ };
+ /**
+ * OpenVibe.Node worker.egress values: none (no network), public (the internet without private, link-local or the network's own ranges), openvibe-only (the network's own endpoints only).
+ */
+ egress?: "none" | "public" | "openvibe-only";
+ ttl_ms?: number;
+ /**
+ * The args key the firing is added under; null or absent: none.
+ */
+ firing_arg?: string | null;
+ runtime?: "function" | "code" | "browser" | "linux";
+ command?: string;
workload?: {
workload?: {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
@@ -166916,7 +169884,7 @@ export interface BotCommandRefusedPayload {
@@ -166916,7 +169884,7 @@ export interface BotCommandRefusedPayload {
/** [email protected] (owner: run) */
/** [email protected] (owner: run) */
/**
/**
- * run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.
+ * run.job-create-request@1 (PLANNED; plan T14 R1, ADR-034): the body of POST /api/v1/jobs on OpenVibe.Run (capability run.job.submit). The job belongs to the project the caller's token names, or, for a first-party service acting for a person (X-OV-Subject), the project it names with X-OV-Project once Network confirms the person is an admin or owner of it (ADR-003 amendment 2026-10-12); the person is then the requester and the service is recorded as via. CLASS is a platform.runtime-class@1 name; Run accepts any of them but places a job only on a node that advertises worker:<class> (platform.resource-offer@1), so a class no node runs today (browser, linux, desktop, gpu) ends expired with run.job.unplaceable. ARTIFACT is the pre-registered artifact to run (name and one exact version), required for function and code, as platform.job@1 carries it. ARGS is the artifact's declared input as JSON (at most 512 KiB serialized, else 413). INPUTS are files placed in the job directory before the process starts, each an OpenVibe.Media object pinned by its sha256: a size or digest mismatch fails the job (run.job.input_digest_mismatch) before the process ever runs; Run never fetches a caller-chosen URL. LIMITS are hard caps merged stricter with the node's own (platform.job@1 limits); a request over the project's tier cap is refused 422 run.limits.exceeded, never silently lowered. EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, carried per job as the same-named platform.job@1 net: none (default; no network), public or openvibe-only. A job asking for public or openvibe-only is placed only on a node whose worker.egress allows it; a worker whose host policy is stricter runs the stricter one. REQUIREMENTS (platform.workload-requirements@1) narrow placement; absent means { kind: run.<class>, mobility: job, latency_class: background, objective: balanced }. IDEMPOTENCY_KEY: a repeat from the same project within 24 h with an identical body answers the first job (200, created false); with a different body 409 run.idempotency.conflict.
*/
*/
export type RunJobCreateRequest = {
export type RunJobCreateRequest = {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
new file mode 100644
new file mode 100644
@@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
+{
+ "id": "network.project.member.read",
+ "version": "1.0",
+ "owner": "network",
+ "status": "active",
+ "visibility": "first-party",
+ "description": "Read one person's membership of a developer project as a receiving service: the role and whether the project is archived. A service that accepts project delegation (ADR-003 amendment 2026-10-12: a first-party service names the person with X-OV-Subject and the project with X-OV-Project) checks here that the person is an admin or owner of an unarchived project before it does the project's work. A non-member and an unknown project answer the same 404, so membership is never a way to learn that a project exists. Never grantable to apps.",
+ "permissions": [
+ "projects:read"
+ ],
+ "resourceConstraints": [
+ "project"
+ ],
+ "quotaClass": "projects-read",
+ "events": [],
+ "implementedBy": [
+ "GET /internal/projects/:project_id/members/:subject"
+ ],
+ "inputSchema": "common.no-body@1",
+ "outputSchema": "network.project-member-result@1"
+}
@@ -55,6 +55,7 @@
@@ -55,6 +55,7 @@
"network.notifications.push",
"network.notifications.push",
"network.operator.alert",
"network.operator.alert",
"network.project.manage",
"network.project.manage",
+ "network.project.member.read",
"network.project.read",
"network.project.read",
"network.registry.read",
"network.registry.read",
"network.resource.read",
"network.resource.read",
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.152.0",
+ "version": "0.153.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",