AgentsInstall agents.install@1

Generated at from openvibe-contracts v0.419.0 and openvibe-sdk v0.161.0.

Version
1.0.0
Owner
actor
Visibility
public
Status
active
Compatibility
backward
Decision
ADR-044
Schema
https://openvibe.network/contracts/agents/install.v1.json

agents.install@1 (agent-blueprints.md, 2026-11-12): a person's own agent made from one blueprint version. AGENT is the agent it made (actor.agent@1's id), BLUEPRINT the version it runs, INPUTS what the person filled in, AGREED the asks the install screen showed and the person accepted (openvibe-sdk/agents/blueprint asks(), by key), PLACES the machines the person chose for the blueprint's places (their own, or shared with them by a grant), UPDATES whether a new version that asks for no more is taken without asking (a version that asks for more always waits for a yes). Keys and grants are the person's own and are never copied into an install.

Fields

FieldTypeRequiredDescriptionConstraints
agentstringyes
  • pattern ^agt_[A-Za-z0-9]{6,40}$
ownerobjectyes
  • no other fields
owner.typeconstyes
  • = "user"
owner.idstringyes
  • pattern ^usr_[A-Za-z0-9]{6,40}$
blueprintstringyes
  • pattern ^bp_[A-Za-z0-9_-]{3,40}@[1-9][0-9]{0,5}$
inputsobject
agreedarray of stringyesThe keys of the asks agreed to (hands:ov:live.chat.post, places:own, when:event:live.stream.started, …).
  • maxItems 120
  • unique items
  • items: pattern ^[a-z]+:[^\s]{1,1900}$
placesobject
  • no other fields
places.ownarray of stringThe person's own Link machines.
  • maxItems 20
  • unique items
  • items: minLength 1
  • items: maxLength 160
places.sharedarray of stringMachines shared with the person; each use still needs that machine's grant.
  • maxItems 20
  • unique items
  • items: minLength 1
  • items: maxLength 160
updatesenumyes
  • one of "ask", "same-or-less"
pendingstring | nullA newer version that waits for the person's yes.
  • pattern ^bp_[A-Za-z0-9_-]{3,40}@[1-9][0-9]{0,5}$
installed_atstringyes
  • format date-time
updated_atstring
  • format date-time

Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

Valid: a-wider-version-waiting
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@2",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "ask",
  "pending": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
Valid: clip-finder-for-a-streamer
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
Rejected: a-blueprint-without-a-version
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z"
}
Rejected: keys-copied-in
{
  "agent": "agt_01JD8C4QJ7Z3K9W2X5V6N1M0PJ",
  "owner": {
    "type": "user",
    "id": "usr_01JD8C4QJ7Z3K9W2X5V6N1M0PK"
  },
  "blueprint": "bp_01JD8C4QJ7Z3K9W2X5V6N1M0PA@3",
  "inputs": {
    "channel": "maticus"
  },
  "agreed": [
    "hands:ov:live.transcript.read",
    "hands:ov:live.chat.read",
    "hands:ov:media.clip.create",
    "hands:ov:live.chat.post",
    "when:event:live.stream.started",
    "memory:person"
  ],
  "places": {
    "own": [],
    "shared": []
  },
  "updates": "same-or-less",
  "pending": null,
  "installed_at": "2026-11-12T21:00:00Z",
  "updated_at": "2026-11-12T21:00:00Z",
  "keys": {
    "gemini": "not-a-real-key"
  }
}

Validate

const contracts = require('openvibe-contracts');
contracts.validate('agents.install@1', value);   // { valid, errors: [{ path, message }] }