openvibers/openvibe.contracts Commits
Contracts 0.179.0: Watch can use project secrets (source credential and webhook secret_ref, project_env) (#139)
Changes
@@@ -4,6 +4,17 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.179.0 — 2026-10-15++++- **Watch uses project secrets** (ADR-056).++ - A source credential (`auth`) may name `secret_ref` instead of `env`: a project secret granted to `watch` for++ `reveal` to the source URL's origin, answered by OpenVibe.Network at fetch time.++ - A webhook action may name `secret_ref` instead of `secret_env`: a project secret granted to `watch` for `sign`, so++ Network signs each delivery and Watch never holds the value. Exactly one of the two is required.++ - `watch.watch-request@1` takes `project_env` (sandbox or production; production by default when the watch names a++ project), and `watch.watch@1` shows it.++- Fixtures: a watch with a project webhook secret, and an invalid webhook action with neither secret.++## 0.178.0 — 2026-10-15- **Actor webhooks name a project secret** (ADR-044 §7, ADR-056). `actor.task-create-request@1` webhooks take@@@ -9,6 +9,7 @@"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." },++ "project_env": { "enum": ["sandbox", "production"], "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one." },"source": { "$ref": "watch.v1.json#/$defs/source" },"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },@@@ -28,6 +28,14 @@],"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"},++ "project_env": {++ "enum": [++ "sandbox",++ "production",++ null++ ],++ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."++ },"owner": {"type": "string","description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."@@@ -121,6 +129,14 @@"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$","description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."},++ "secret_ref": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."++ },"header": {"type": ["string",@@@ -502,8 +518,19 @@"type": "object","required": ["kind",-- "url",-- "secret_env"++ "url"++ ],++ "anyOf": [++ {++ "required": [++ "secret_env"++ ]++ },++ {++ "required": [++ "secret_ref"++ ]++ }],"additionalProperties": false,"properties": {@@@ -518,6 +545,11 @@"secret_env": {"type": "string","pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"++ },++ "secret_ref": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."}}},nnew file mode 100644@@@ -0,0 +1,45 @@++{++ "name": "Tell my server when the release changes",++ "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": "webhook",++ "url": "https://hooks.example.com/watch"++ }++ ],++ "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_01JAB2C3D4E5F6G7H8J9K0MNPR",++ "project_env": "production"++}nnew file mode 100644@@@ -0,0 +1,46 @@++{++ "name": "Tell my server when the release changes",++ "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": "webhook",++ "url": "https://hooks.example.com/watch",++ "secret_ref": "webhook-signing"++ }++ ],++ "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_01JAB2C3D4E5F6G7H8J9K0MNPR",++ "project_env": "production"++}@@@ -47169,6 +47169,14 @@],"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"},++ "project_env": {++ "enum": [++ "sandbox",++ "production",++ null++ ],++ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."++ },"owner": {"type": "string","description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."@@@ -47262,6 +47270,14 @@"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$","description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."},++ "secret_ref": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."++ },"header": {"type": ["string",@@@ -47643,8 +47659,19 @@"type": "object","required": ["kind",-- "url",-- "secret_env"++ "url"++ ],++ "anyOf": [++ {++ "required": [++ "secret_env"++ ]++ },++ {++ "required": [++ "secret_ref"++ ]++ }],"additionalProperties": false,"properties": {@@@ -47659,6 +47686,11 @@"secret_env": {"type": "string","pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"++ },++ "secret_ref": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."}}},@@@ -47878,6 +47910,13 @@"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."},++ "project_env": {++ "enum": [++ "sandbox",++ "production"++ ],++ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."++ },"source": {"$ref": "watch.v1.json#/$defs/source"},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.178.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.179.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"@@@ -344,6 +344,19 @@},"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": "project_env",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "sandbox",++ "production"++ ],++ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."++ },++ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."++ },{"name": "source","in": "query",@@@ -1886,6 +1899,13 @@"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."},++ "project_env": {++ "enum": [++ "sandbox",++ "production"++ ],++ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."++ },"source": {"$ref": "#/components/schemas/watch.watch.v1/$defs/source"},@@@ -2025,6 +2045,14 @@],"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"},++ "project_env": {++ "enum": [++ "sandbox",++ "production",++ null++ ],++ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."++ },"owner": {"type": "string","description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."@@@ -2118,6 +2146,14 @@"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$","description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."},++ "secret_ref": {++ "type": [++ "string",++ "null"++ ],++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."++ },"header": {"type": ["string",@@@ -2499,8 +2535,19 @@"type": "object","required": ["kind",-- "url",-- "secret_env"++ "url"++ ],++ "anyOf": [++ {++ "required": [++ "secret_env"++ ]++ },++ {++ "required": [++ "secret_ref"++ ]++ }],"additionalProperties": false,"properties": {@@@ -2515,6 +2562,11 @@"secret_env": {"type": "string","pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"++ },++ "secret_ref": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,63}$",++ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."}}},@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.178.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.179.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"@@@ -169041,6 +169041,10 @@ export interface TradeWatchlist {export interface Watch {id: string;project_id?: string | null;++ /**++ * The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project.++ */++ project_env?: "sandbox" | "production" | null;/*** The acting person or agent the watch belongs to: usr_…, agt_… or svc:….*/@@@ -169077,6 +169081,10 @@ export interface Watch {* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.*/env?: string | null;++ /**++ * Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it.++ */++ secret_ref?: string | null;header?: string | null;param?: string | null;};@@@ -169165,11 +169173,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169249,11 +169260,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169332,11 +169346,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169417,11 +169434,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169500,11 +169520,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169583,11 +169606,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169668,11 +169694,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169751,11 +169780,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169834,11 +169866,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -169917,11 +169952,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170002,11 +170040,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170085,11 +170126,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170168,11 +170212,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170251,11 +170298,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170334,11 +170384,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170419,11 +170472,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170502,11 +170558,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170585,11 +170644,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170668,11 +170730,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170751,11 +170816,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170834,11 +170902,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -170919,11 +170990,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171002,11 +171076,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171085,11 +171162,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171168,11 +171248,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171251,11 +171334,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171334,11 +171420,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171417,11 +171506,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171502,11 +171594,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171585,11 +171680,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171668,11 +171766,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171751,11 +171852,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171834,11 +171938,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -171917,11 +172024,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172000,11 +172110,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172083,11 +172196,14 @@ export interface Watch {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172184,6 +172300,10 @@ export interface WatchRequest {* 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;++ /**++ * The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one.++ */++ project_env?: "sandbox" | "production";source?:| {kind: "webhook";@@@ -172211,6 +172331,10 @@ export interface WatchRequest {* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.*/env?: string | null;++ /**++ * Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it.++ */++ secret_ref?: string | null;header?: string | null;param?: string | null;};@@@ -172299,11 +172423,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172383,11 +172510,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172466,11 +172596,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172551,11 +172684,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172634,11 +172770,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172717,11 +172856,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172802,11 +172944,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172885,11 +173030,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -172968,11 +173116,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173051,11 +173202,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173136,11 +173290,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173219,11 +173376,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173302,11 +173462,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173385,11 +173548,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173468,11 +173634,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173553,11 +173722,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173636,11 +173808,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173719,11 +173894,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173802,11 +173980,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173885,11 +174066,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -173968,11 +174152,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174053,11 +174240,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174136,11 +174326,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174219,11 +174412,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174302,11 +174498,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174385,11 +174584,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174468,11 +174670,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174551,11 +174756,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174636,11 +174844,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174719,11 +174930,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174802,11 +175016,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174885,11 +175102,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -174968,11 +175188,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -175051,11 +175274,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -175134,11 +175360,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -175217,11 +175446,14 @@ export interface WatchRequest {[k: string]: unknown | undefined;} | null;}-- | {-- kind: "webhook";-- url: string;-- secret_env: string;-- }++ | (++ | {++ [k: string]: unknown | undefined;++ }++ | {++ [k: string]: unknown | undefined;++ }++ )| {kind: "actor-task";brief: string;@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.178.0",++ "version": "0.179.0","description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.","main": "index.js","types": "generated/typescript/index.d.ts",
@@ -4,6 +4,17 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,17 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.179.0 — 2026-10-15
+
+- **Watch uses project secrets** (ADR-056).
+ - A source credential (`auth`) may name `secret_ref` instead of `env`: a project secret granted to `watch` for
+ `reveal` to the source URL's origin, answered by OpenVibe.Network at fetch time.
+ - A webhook action may name `secret_ref` instead of `secret_env`: a project secret granted to `watch` for `sign`, so
+ Network signs each delivery and Watch never holds the value. Exactly one of the two is required.
+ - `watch.watch-request@1` takes `project_env` (sandbox or production; production by default when the watch names a
+ project), and `watch.watch@1` shows it.
+- Fixtures: a watch with a project webhook secret, and an invalid webhook action with neither secret.
+
## 0.178.0 — 2026-10-15
## 0.178.0 — 2026-10-15
- **Actor webhooks name a project secret** (ADR-044 §7, ADR-056). `actor.task-create-request@1` webhooks take
- **Actor webhooks name a project secret** (ADR-044 §7, ADR-056). `actor.task-create-request@1` webhooks take
@@ -9,6 +9,7 @@
@@ -9,6 +9,7 @@
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
"labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 60 } },
"labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 60 } },
"project_id": { "type": ["string", "null"], "pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$", "description": "The project the watch's project work belongs to (its run-job actions are billed to it). The acting person must be an admin or owner of the unarchived project: Watch checks with Network when it is saved (network.project.member.read; 403 project.not_delegated otherwise) and OpenVibe.Run checks again at every job (ADR-003 amendment 2026-10-12). null clears it." },
"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." },
+ "project_env": { "enum": ["sandbox", "production"], "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one." },
"source": { "$ref": "watch.v1.json#/$defs/source" },
"source": { "$ref": "watch.v1.json#/$defs/source" },
"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },
"cadence": { "$ref": "watch.v1.json#/$defs/cadence" },
"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },
"extraction": { "$ref": "watch.v1.json#/$defs/extraction" },
@@ -28,6 +28,14 @@
@@ -28,6 +28,14 @@
],
],
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
},
},
+ "project_env": {
+ "enum": [
+ "sandbox",
+ "production",
+ null
+ ],
+ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."
+ },
"owner": {
"owner": {
"type": "string",
"type": "string",
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
@@ -121,6 +129,14 @@
@@ -121,6 +129,14 @@
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
},
},
+ "secret_ref": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."
+ },
"header": {
"header": {
"type": [
"type": [
"string",
"string",
@@ -502,8 +518,19 @@
@@ -502,8 +518,19 @@
"type": "object",
"type": "object",
"required": [
"required": [
"kind",
"kind",
- "url",
- "secret_env"
+ "url"
+ ],
+ "anyOf": [
+ {
+ "required": [
+ "secret_env"
+ ]
+ },
+ {
+ "required": [
+ "secret_ref"
+ ]
+ }
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
@@ -518,6 +545,11 @@
@@ -518,6 +545,11 @@
"secret_env": {
"secret_env": {
"type": "string",
"type": "string",
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
+ },
+ "secret_ref": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."
}
}
}
}
},
},
new file mode 100644
new file mode 100644
@@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
+{
+ "name": "Tell my server when the release changes",
+ "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": "webhook",
+ "url": "https://hooks.example.com/watch"
+ }
+ ],
+ "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_01JAB2C3D4E5F6G7H8J9K0MNPR",
+ "project_env": "production"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,46 @@
@@ -0,0 +1,46 @@
+{
+ "name": "Tell my server when the release changes",
+ "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": "webhook",
+ "url": "https://hooks.example.com/watch",
+ "secret_ref": "webhook-signing"
+ }
+ ],
+ "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_01JAB2C3D4E5F6G7H8J9K0MNPR",
+ "project_env": "production"
+}
@@ -47169,6 +47169,14 @@
@@ -47169,6 +47169,14 @@
],
],
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
},
},
+ "project_env": {
+ "enum": [
+ "sandbox",
+ "production",
+ null
+ ],
+ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."
+ },
"owner": {
"owner": {
"type": "string",
"type": "string",
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
@@ -47262,6 +47270,14 @@
@@ -47262,6 +47270,14 @@
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
},
},
+ "secret_ref": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."
+ },
"header": {
"header": {
"type": [
"type": [
"string",
"string",
@@ -47643,8 +47659,19 @@
@@ -47643,8 +47659,19 @@
"type": "object",
"type": "object",
"required": [
"required": [
"kind",
"kind",
- "url",
- "secret_env"
+ "url"
+ ],
+ "anyOf": [
+ {
+ "required": [
+ "secret_env"
+ ]
+ },
+ {
+ "required": [
+ "secret_ref"
+ ]
+ }
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
@@ -47659,6 +47686,11 @@
@@ -47659,6 +47686,11 @@
"secret_env": {
"secret_env": {
"type": "string",
"type": "string",
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
+ },
+ "secret_ref": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."
}
}
}
}
},
},
@@ -47878,6 +47910,13 @@
@@ -47878,6 +47910,13 @@
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",
"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."
},
},
+ "project_env": {
+ "enum": [
+ "sandbox",
+ "production"
+ ],
+ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."
+ },
"source": {
"source": {
"$ref": "watch.v1.json#/$defs/source"
"$ref": "watch.v1.json#/$defs/source"
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.178.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -344,6 +344,19 @@
@@ -344,6 +344,19 @@
},
},
"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": "project_env",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "sandbox",
+ "production"
+ ],
+ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."
+ },
+ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."
+ },
{
{
"name": "source",
"name": "source",
"in": "query",
"in": "query",
@@ -1886,6 +1899,13 @@
@@ -1886,6 +1899,13 @@
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$",
"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."
},
},
+ "project_env": {
+ "enum": [
+ "sandbox",
+ "production"
+ ],
+ "description": "The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one."
+ },
"source": {
"source": {
"$ref": "#/components/schemas/watch.watch.v1/$defs/source"
"$ref": "#/components/schemas/watch.watch.v1/$defs/source"
},
},
@@ -2025,6 +2045,14 @@
@@ -2025,6 +2045,14 @@
],
],
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
"pattern": "^prj_[0-9A-HJKMNP-TV-Z]{26}$"
},
},
+ "project_env": {
+ "enum": [
+ "sandbox",
+ "production",
+ null
+ ],
+ "description": "The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project."
+ },
"owner": {
"owner": {
"type": "string",
"type": "string",
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
"description": "The acting person or agent the watch belongs to: usr_…, agt_… or svc:…."
@@ -2118,6 +2146,14 @@
@@ -2118,6 +2146,14 @@
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"pattern": "^WATCH_CRED_[A-Z0-9_]{2,60}$",
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
"description": "The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value."
},
},
+ "secret_ref": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it."
+ },
"header": {
"header": {
"type": [
"type": [
"string",
"string",
@@ -2499,8 +2535,19 @@
@@ -2499,8 +2535,19 @@
"type": "object",
"type": "object",
"required": [
"required": [
"kind",
"kind",
- "url",
- "secret_env"
+ "url"
+ ],
+ "anyOf": [
+ {
+ "required": [
+ "secret_env"
+ ]
+ },
+ {
+ "required": [
+ "secret_ref"
+ ]
+ }
],
],
"additionalProperties": false,
"additionalProperties": false,
"properties": {
"properties": {
@@ -2515,6 +2562,11 @@
@@ -2515,6 +2562,11 @@
"secret_env": {
"secret_env": {
"type": "string",
"type": "string",
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
"pattern": "^WATCH_HOOK_[A-Z0-9_]{2,60}$"
+ },
+ "secret_ref": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$",
+ "description": "Instead of secret_env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for sign. OpenVibe.Network signs each delivery in the same headers; Watch never holds the value."
}
}
}
}
},
},
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.178.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.178.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.179.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.179.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -169041,6 +169041,10 @@ export interface TradeWatchlist {
@@ -169041,6 +169041,10 @@ export interface TradeWatchlist {
export interface Watch {
export interface Watch {
id: string;
id: string;
project_id?: string | null;
project_id?: string | null;
+ /**
+ * The project environment its project secrets (ADR-056, secret_ref) are looked up in; null when the watch names no project.
+ */
+ project_env?: "sandbox" | "production" | null;
/**
/**
* The acting person or agent the watch belongs to: usr_…, agt_… or svc:….
* The acting person or agent the watch belongs to: usr_…, agt_… or svc:….
*/
*/
@@ -169077,6 +169081,10 @@ export interface Watch {
@@ -169077,6 +169081,10 @@ export interface Watch {
* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.
* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.
*/
*/
env?: string | null;
env?: string | null;
+ /**
+ * Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it.
+ */
+ secret_ref?: string | null;
header?: string | null;
header?: string | null;
param?: string | null;
param?: string | null;
};
};
@@ -169165,11 +169173,14 @@ export interface Watch {
@@ -169165,11 +169173,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169249,11 +169260,14 @@ export interface Watch {
@@ -169249,11 +169260,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169332,11 +169346,14 @@ export interface Watch {
@@ -169332,11 +169346,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169417,11 +169434,14 @@ export interface Watch {
@@ -169417,11 +169434,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169500,11 +169520,14 @@ export interface Watch {
@@ -169500,11 +169520,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169583,11 +169606,14 @@ export interface Watch {
@@ -169583,11 +169606,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169668,11 +169694,14 @@ export interface Watch {
@@ -169668,11 +169694,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169751,11 +169780,14 @@ export interface Watch {
@@ -169751,11 +169780,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169834,11 +169866,14 @@ export interface Watch {
@@ -169834,11 +169866,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -169917,11 +169952,14 @@ export interface Watch {
@@ -169917,11 +169952,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170002,11 +170040,14 @@ export interface Watch {
@@ -170002,11 +170040,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170085,11 +170126,14 @@ export interface Watch {
@@ -170085,11 +170126,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170168,11 +170212,14 @@ export interface Watch {
@@ -170168,11 +170212,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170251,11 +170298,14 @@ export interface Watch {
@@ -170251,11 +170298,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170334,11 +170384,14 @@ export interface Watch {
@@ -170334,11 +170384,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170419,11 +170472,14 @@ export interface Watch {
@@ -170419,11 +170472,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170502,11 +170558,14 @@ export interface Watch {
@@ -170502,11 +170558,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170585,11 +170644,14 @@ export interface Watch {
@@ -170585,11 +170644,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170668,11 +170730,14 @@ export interface Watch {
@@ -170668,11 +170730,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170751,11 +170816,14 @@ export interface Watch {
@@ -170751,11 +170816,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170834,11 +170902,14 @@ export interface Watch {
@@ -170834,11 +170902,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -170919,11 +170990,14 @@ export interface Watch {
@@ -170919,11 +170990,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171002,11 +171076,14 @@ export interface Watch {
@@ -171002,11 +171076,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171085,11 +171162,14 @@ export interface Watch {
@@ -171085,11 +171162,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171168,11 +171248,14 @@ export interface Watch {
@@ -171168,11 +171248,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171251,11 +171334,14 @@ export interface Watch {
@@ -171251,11 +171334,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171334,11 +171420,14 @@ export interface Watch {
@@ -171334,11 +171420,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171417,11 +171506,14 @@ export interface Watch {
@@ -171417,11 +171506,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171502,11 +171594,14 @@ export interface Watch {
@@ -171502,11 +171594,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171585,11 +171680,14 @@ export interface Watch {
@@ -171585,11 +171680,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171668,11 +171766,14 @@ export interface Watch {
@@ -171668,11 +171766,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171751,11 +171852,14 @@ export interface Watch {
@@ -171751,11 +171852,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171834,11 +171938,14 @@ export interface Watch {
@@ -171834,11 +171938,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -171917,11 +172024,14 @@ export interface Watch {
@@ -171917,11 +172024,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172000,11 +172110,14 @@ export interface Watch {
@@ -172000,11 +172110,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172083,11 +172196,14 @@ export interface Watch {
@@ -172083,11 +172196,14 @@ export interface Watch {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172184,6 +172300,10 @@ export interface WatchRequest {
@@ -172184,6 +172300,10 @@ export interface WatchRequest {
* 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.
* 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;
project_id?: string | null;
+ /**
+ * The project environment the watch's project secrets (ADR-056: a source credential's or a webhook action's secret_ref) are looked up in. Defaults to production when the watch names a project; meaningless without one.
+ */
+ project_env?: "sandbox" | "production";
source?:
source?:
| {
| {
kind: "webhook";
kind: "webhook";
@@ -172211,6 +172331,10 @@ export interface WatchRequest {
@@ -172211,6 +172331,10 @@ export interface WatchRequest {
* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.
* The name of the environment variable holding the credential; Watch reads it by name at fetch time and never stores the value.
*/
*/
env?: string | null;
env?: string | null;
+ /**
+ * Instead of env: the name of a project secret (ADR-056) in the watch's project and project_env, granted to watch for reveal to the source URL's origin. OpenVibe.Network answers the value at fetch time; Watch never stores it.
+ */
+ secret_ref?: string | null;
header?: string | null;
header?: string | null;
param?: string | null;
param?: string | null;
};
};
@@ -172299,11 +172423,14 @@ export interface WatchRequest {
@@ -172299,11 +172423,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172383,11 +172510,14 @@ export interface WatchRequest {
@@ -172383,11 +172510,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172466,11 +172596,14 @@ export interface WatchRequest {
@@ -172466,11 +172596,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172551,11 +172684,14 @@ export interface WatchRequest {
@@ -172551,11 +172684,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172634,11 +172770,14 @@ export interface WatchRequest {
@@ -172634,11 +172770,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172717,11 +172856,14 @@ export interface WatchRequest {
@@ -172717,11 +172856,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172802,11 +172944,14 @@ export interface WatchRequest {
@@ -172802,11 +172944,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172885,11 +173030,14 @@ export interface WatchRequest {
@@ -172885,11 +173030,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -172968,11 +173116,14 @@ export interface WatchRequest {
@@ -172968,11 +173116,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173051,11 +173202,14 @@ export interface WatchRequest {
@@ -173051,11 +173202,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173136,11 +173290,14 @@ export interface WatchRequest {
@@ -173136,11 +173290,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173219,11 +173376,14 @@ export interface WatchRequest {
@@ -173219,11 +173376,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173302,11 +173462,14 @@ export interface WatchRequest {
@@ -173302,11 +173462,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173385,11 +173548,14 @@ export interface WatchRequest {
@@ -173385,11 +173548,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173468,11 +173634,14 @@ export interface WatchRequest {
@@ -173468,11 +173634,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173553,11 +173722,14 @@ export interface WatchRequest {
@@ -173553,11 +173722,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173636,11 +173808,14 @@ export interface WatchRequest {
@@ -173636,11 +173808,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173719,11 +173894,14 @@ export interface WatchRequest {
@@ -173719,11 +173894,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173802,11 +173980,14 @@ export interface WatchRequest {
@@ -173802,11 +173980,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173885,11 +174066,14 @@ export interface WatchRequest {
@@ -173885,11 +174066,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -173968,11 +174152,14 @@ export interface WatchRequest {
@@ -173968,11 +174152,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174053,11 +174240,14 @@ export interface WatchRequest {
@@ -174053,11 +174240,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174136,11 +174326,14 @@ export interface WatchRequest {
@@ -174136,11 +174326,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174219,11 +174412,14 @@ export interface WatchRequest {
@@ -174219,11 +174412,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174302,11 +174498,14 @@ export interface WatchRequest {
@@ -174302,11 +174498,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174385,11 +174584,14 @@ export interface WatchRequest {
@@ -174385,11 +174584,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174468,11 +174670,14 @@ export interface WatchRequest {
@@ -174468,11 +174670,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174551,11 +174756,14 @@ export interface WatchRequest {
@@ -174551,11 +174756,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174636,11 +174844,14 @@ export interface WatchRequest {
@@ -174636,11 +174844,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174719,11 +174930,14 @@ export interface WatchRequest {
@@ -174719,11 +174930,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174802,11 +175016,14 @@ export interface WatchRequest {
@@ -174802,11 +175016,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174885,11 +175102,14 @@ export interface WatchRequest {
@@ -174885,11 +175102,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -174968,11 +175188,14 @@ export interface WatchRequest {
@@ -174968,11 +175188,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -175051,11 +175274,14 @@ export interface WatchRequest {
@@ -175051,11 +175274,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -175134,11 +175360,14 @@ export interface WatchRequest {
@@ -175134,11 +175360,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -175217,11 +175446,14 @@ export interface WatchRequest {
@@ -175217,11 +175446,14 @@ export interface WatchRequest {
[k: string]: unknown | undefined;
[k: string]: unknown | undefined;
} | null;
} | null;
}
}
- | {
- kind: "webhook";
- url: string;
- secret_env: string;
- }
+ | (
+ | {
+ [k: string]: unknown | undefined;
+ }
+ | {
+ [k: string]: unknown | undefined;
+ }
+ )
| {
| {
kind: "actor-task";
kind: "actor-task";
brief: string;
brief: string;
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.178.0",
+ "version": "0.179.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",