NetworkDockState network.dock-state@1

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

Version
1.1.0
Owner
network
Visibility
public
Status
active
Compatibility
backward
Schema
https://openvibe.network/contracts/network/dock-state.v1.json

network.dock-state@1 (the Dock plan 2026-10-30, K-D1): the state of one person's Dock — the little floating surface every OpenVibe site draws. It lives in the Network, not in the browser, because localStorage is per site and the Dock follows the person across every domain. GET /api/v1/me/dock and PUT /api/v1/me/dock on OpenVibe.Network.

Fields

FieldTypeRequiredDescriptionConstraints
openbooleanyesWhether the Dock is open (a sheet on a phone, a floating card on a desktop) or collapsed to its pill.
tabenumyesWhich of the Dock's tabs shows: Vibe (the person's AI, plan L48 V2), the agents, the chats, the activity.
  • one of "vibe", "agent", "chats", "activity"
pinnedbooleanyesKeep the pill on screen even when nothing runs and nothing waits.
agentobject | nullyesThe agent the Agent tab follows, or null when it follows none.
chatstring | nullyesThe conversation the Chats tab has open, or null.
  • minLength 1
  • maxLength 80
vibeone ofThe Vibe conversation selected across sites, and when the person last opened it. An older selection opens the list instead.
agent_filterenumThe last Agents list filter chosen by this person.
  • one of "all", "running", "waiting", "scheduled", "done", "failed"
timerone ofThe person's timer (plan L48 R2): it counts down in the Dock's pill on every site and rings at its end. Absent or null: none. A focus timer of rounds alternates focus and break by itself.
placeobjectyes
  • no other fields
place.phoneobjectyesWhere the Dock sits on a phone.
  • no other fields
place.phone.cornerenumyes
  • one of "bottom-right", "bottom-left", "top-right", "top-left"
place.desktopobjectyesWhere the Dock sits on a desktop, and how big it is (null: the site's own default size).
  • no other fields
place.desktop.cornerenumyes
  • one of "bottom-right", "bottom-left", "top-right", "top-left"
place.desktop.widthinteger | nullyes
  • minimum 320
  • maximum 720
place.desktop.heightinteger | nullyes
  • minimum 360
  • maximum 900
updated_atstringyesWhen the state was last written.
  • format date-time

Examples

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

Valid: both-places
{
  "open": false,
  "tab": "chats",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "top-right"
    },
    "desktop": {
      "corner": "top-right",
      "width": 320,
      "height": 360
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}
Valid: default
{
  "open": false,
  "tab": "activity",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}
Valid: focus-timer
{
  "open": false,
  "tab": "activity",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z",
  "timer": {
    "kind": "focus",
    "label": "Write the post",
    "started_at": "2026-11-01T09:00:00Z",
    "ends_at": "2026-11-01T09:25:00Z",
    "round": 1,
    "rounds": 4,
    "focus_min": 25,
    "break_min": 5
  }
}
Valid: pinned
{
  "open": true,
  "tab": "agent",
  "pinned": true,
  "agent": {
    "service": "actor",
    "id": "tsk_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "chat": "cnv_01JAB2C3D4E5F6G7H8J9K0MNPQ",
  "place": {
    "phone": {
      "corner": "top-left"
    },
    "desktop": {
      "corner": "bottom-left",
      "width": 420,
      "height": 640
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}
Valid: vibe-tab
{
  "open": true,
  "tab": "vibe",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}
Rejected: extra-key
{
  "open": false,
  "tab": "activity",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z",
  "theme": "neon-tokyo"
}
Rejected: timer-kind
{
  "open": false,
  "tab": "activity",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z",
  "timer": {
    "kind": "nap",
    "started_at": "2026-11-01T09:00:00Z",
    "ends_at": "2026-11-01T09:25:00Z"
  }
}
Rejected: unknown-tab
{
  "open": false,
  "tab": "profile",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": null,
      "height": null
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}
Rejected: width-2000
{
  "open": false,
  "tab": "activity",
  "pinned": false,
  "agent": null,
  "chat": null,
  "place": {
    "phone": {
      "corner": "bottom-right"
    },
    "desktop": {
      "corner": "bottom-right",
      "width": 2000,
      "height": 640
    }
  },
  "updated_at": "2026-10-30T12:00:00Z"
}

Validate

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