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)

OP OpenVibers committed 12 Oct 2026 · 37d73f5b2d · 54 files, +4035 −244

OpenVibe.Run bills every job to a project, and it takes that project only from a token (ADR-036). So a first-party service acting for a person (`X-OV-Subject`, ADR-003) cannot start a job for them. Watch's `run-job` action (plan T18: "run-job waits on project-scoped watches") is the first case. This release sets the rule, adds the Network read the rule needs, and shapes Watch's contract for it.

**ADR-003 amendment: project delegation**
- **Who may name a project.** A first-party service that names the person may also name one project with `X-OV-Project: prj_…`.
  - Apps, mods and agents never may: their project is their token's own `project_id`.
  - A client-credentials call with `X-OV-Project` but no subject is refused too.
  - Both cases: 403 `project.not_delegated`.
- **What the receiver checks, every time.** It asks Network whether the person is an **admin or owner** of an **unarchived** project. These are the roles that may create production apps and approve grants. It may cache a yes for at most 60 s. A save-time check (Watch) does not replace this use-time check.
- **Intersection still holds:** the service's grants, the project's allowance, tier caps and quotas, and the person's role all apply.
- **Records** name project, person and `via`.
- **The service sees only what it started** for that person in that project.
- **First uses:** Run's `POST /api/v1/jobs` and `GET /api/v1/jobs/:id` (list, cancel and stream stay with project tokens), and Watch's `run-job`.

**Network:** `network.project.member.read` (first-party, active) for `GET /internal/projects/:project_id/members/:subject` → `network.project-member-result@1` (`project_id`, `subject`, `role`, `archived`, `added_at`). A non-member and an unknown project both answer 404 `project.member_not_found`, so a membership check never shows that a project exists. Valid and invalid fixtures.

**Watch:**
- `watch.watch-request@1` gains `project_id`.
- The `run-job` action takes `run.job-create-request@1` fields by reference (`class`, `artifact`, `args`, `limits`, `egress`, `ttl_ms`) plus `firing_arg`, the args key the firing goes under.
- The draft's `runtime` / `command` / `workload` never ran. They stay in the schema, because the compat gate forbids removing properties, but the description says Watch refuses them.
- `required` relaxes to `kind`, since class and limits are enforced in code.
- New fixtures: a project-scoped run-job watch (valid), a bad project id and partial limits (invalid).

**Run:** `run.job-create-request@1`'s description states the delegated form.

Version 0.153.0. `compat.js v0.152.0`: no breaking changes. `test/run.js`: 19,402 checks pass. `generated/` was regenerated.

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 273b2a89..556ea1fd 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -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,
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
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex 83e36270..f343918a 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -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",
ddiff --git a/contracts/network/project-member-result.v1.json b/contracts/network/project-member-result.v1.json
nnew file mode 100644
iindex 00000000..5317a4ae
---- /dev/null
++++ b/contracts/network/project-member-result.v1.json
@@@ -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"
++ ]
++ }
++ }
++}
ddiff --git a/contracts/run/job-create-request.v1.json b/contracts/run/job-create-request.v1.json
iindex 8cca557b..1a134897 100644
---- a/contracts/run/job-create-request.v1.json
++++ b/contracts/run/job-create-request.v1.json
@@@ -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": [
ddiff --git a/contracts/watch/watch-request.v1.json b/contracts/watch/watch-request.v1.json
iindex 41dbab6f..5051ed51 100644
---- a/contracts/watch/watch-request.v1.json
++++ b/contracts/watch/watch-request.v1.json
@@@ -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" },
ddiff --git a/contracts/watch/watch.v1.json b/contracts/watch/watch.v1.json
iindex 0f50b16c..6f610a60 100644
---- a/contracts/watch/watch.v1.json
++++ b/contracts/watch/watch.v1.json
@@@ -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)."
}
]
},
ddiff --git a/docs/adr/ADR-003-service-principals.md b/docs/adr/ADR-003-service-principals.md
iindex 53ac0052..cf5a72b7 100644
---- a/docs/adr/ADR-003-service-principals.md
++++ b/docs/adr/ADR-003-service-principals.md
@@@ -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 revoked
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`.
ddiff --git a/docs/adr/README.md b/docs/adr/README.md
iindex e462f381..0cca8d04 100644
---- a/docs/adr/README.md
++++ b/docs/adr/README.md
@@@ -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) |
ddiff --git a/fixtures/network.project-member-result/invalid/other-members.json b/fixtures/network.project-member-result/invalid/other-members.json
nnew file mode 100644
iindex 00000000..0f51c1fa
---- /dev/null
++++ b/fixtures/network.project-member-result/invalid/other-members.json
@@@ -0,0 +1,9 @@
++{
++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
++ "role": "owner",
++ "archived": false,
++ "members": [
++ "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6"
++ ]
++}
ddiff --git a/fixtures/network.project-member-result/invalid/unknown-role.json b/fixtures/network.project-member-result/invalid/unknown-role.json
nnew file mode 100644
iindex 00000000..51633961
---- /dev/null
++++ b/fixtures/network.project-member-result/invalid/unknown-role.json
@@@ -0,0 +1,6 @@
++{
++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
++ "role": "superuser",
++ "archived": false
++}
ddiff --git a/fixtures/network.project-member-result/valid/admin.json b/fixtures/network.project-member-result/valid/admin.json
nnew file mode 100644
iindex 00000000..aea82a44
---- /dev/null
++++ b/fixtures/network.project-member-result/valid/admin.json
@@@ -0,0 +1,7 @@
++{
++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N7",
++ "role": "admin",
++ "archived": false,
++ "added_at": "2026-10-01T12:00:00.000Z"
++}
ddiff --git a/fixtures/network.project-member-result/valid/archived-viewer.json b/fixtures/network.project-member-result/valid/archived-viewer.json
nnew file mode 100644
iindex 00000000..243a1efe
---- /dev/null
++++ b/fixtures/network.project-member-result/valid/archived-viewer.json
@@@ -0,0 +1,6 @@
++{
++ "project_id": "prj_01J9Z8Y7X6W5V4T3S2R1Q0P9N8",
++ "subject": "usr_01J9Z8Y7X6W5V4T3S2R1Q0P9N6",
++ "role": "viewer",
++ "archived": true
++}
ddiff --git a/fixtures/watch.watch-request/invalid/bad-project-id.json b/fixtures/watch.watch-request/invalid/bad-project-id.json
nnew file mode 100644
iindex 00000000..77f96e4c
---- /dev/null
++++ b/fixtures/watch.watch-request/invalid/bad-project-id.json
@@@ -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"
++}
ddiff --git a/fixtures/watch.watch-request/invalid/run-job-partial-limits.json b/fixtures/watch.watch-request/invalid/run-job-partial-limits.json
nnew file mode 100644
iindex 00000000..4b7e0ab7
---- /dev/null
++++ b/fixtures/watch.watch-request/invalid/run-job-partial-limits.json
@@@ -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"
++}
ddiff --git a/fixtures/watch.watch-request/valid/project-run-job.json b/fixtures/watch.watch-request/valid/project-run-job.json
nnew file mode 100644
iindex 00000000..f06ebe43
---- /dev/null
++++ b/fixtures/watch.watch-request/valid/project-run-job.json
@@@ -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"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex fc067fb6..0c505b58 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -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": [
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex d624b7d6..f674d1f4 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.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"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 809b2c31..936e0202 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.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"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex fea98817..9caab73a 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.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"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex af286608..e1d572df 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.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"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex fb21d328..bb7e8992 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.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"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 725e6c59..4ccf86fa 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.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"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex 8350f8d4..a07c3a09 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.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"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex 104c7f02..6abff4f0 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.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"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 313b8027..e0bb4596 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.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"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 505addac..76d87c4f 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.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"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex 100a17b1..3008ede7 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.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"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex b4086508..b5c97222 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.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"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex 9bd491ef..166b22eb 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.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"
ddiff --git a/generated/openapi/index.json b/generated/openapi/index.json
iindex 977ebf4c..60a2532e 100644
---- a/generated/openapi/index.json
++++ b/generated/openapi/index.json
@@@ -124,8 +124,8 @@
"service": "network",
"name": "OpenVibe.Network",
"origin": "https://openvibe.network",
-- "operations": 39,
-- "capabilities": 27
++ "operations": 40,
++ "capabilities": 28
},
{
"service": "news",
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex a0cede48..4125550e 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.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"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 9b064685..6915b5aa 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 0231a30d..4a9e8e25 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.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"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 00f4acf8..9c955b5a 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.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"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 318bcf73..9659c7b2 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.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.",
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex aa255c89..cd6e1281 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.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"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 13c9e8b7..aa4aa54b 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.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"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex a3fac657..4c775c41 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.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"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex d1070203..fa9ea109 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.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": [
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex 47cc4254..30c049ba 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.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"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex f52c7d37..55b267c2 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.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"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 894d9d54..ba690ad2 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.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"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex 0dd4158c..2cba70fc 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex 6fb57980..a32e49a1 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.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"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex 41224639..d592e295 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.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"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex c1fef412..f302fc53 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.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"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 8d35fd9b..40ba3a82 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.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"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex 62baa7c2..c41f2700 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.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)."
}
]
},
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex d1568f30..efb544d7 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.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"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex df055ea6..93643d73 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.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"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 8a7e027e..97a2acb5 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -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;
ddiff --git a/manifests/capabilities/network.project.member.read.json b/manifests/capabilities/network.project.member.read.json
nnew file mode 100644
iindex 00000000..5c533040
---- /dev/null
++++ b/manifests/capabilities/network.project.member.read.json
@@@ -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"
++}
ddiff --git a/manifests/services/network.json b/manifests/services/network.json
iindex 821c5b2f..c6320438 100644
---- a/manifests/services/network.json
++++ b/manifests/services/network.json
@@@ -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",
ddiff --git a/package.json b/package.json
iindex 033a1f82..70b24bce 100644
---- a/package.json
++++ b/package.json
@@@ -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",