openvibers/openvibe.contracts Commits

actor.agent-manage-request/result@1: quiet hours (quiet_from, quiet_to: no scheduled run starts inside them) (0.214.0) (#213)

OP OpenVibers committed 19 days ago · 34e4aec363 · 8 files, +189 −4

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 58a3006f..89414159 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -6,6 +6,10 @@ the notes were in the tag and commit messages (`git tag -n1`).
## 0.214.0 — 2026-10-26
++- **Quiet hours for personal agents** (consumer plan step 4: "recurring work … with quiet hours and a budget").
++ `actor.agent-manage-request@1` and `-result@1` carry `quiet_from` / `quiet_to` (HH:MM UTC, both or neither; the window
++ may cross midnight): no scheduled run starts inside it, an hourly run waits until it ends, and a run the owner starts
++ still runs. Fixtures for both.
- **A private desk for agents on a person's own machine** (plan track K, consumer plan step 2: Vibe's desk on Node).
`bot.command@1` takes kind `desk` (`action`: start | stop | status; `width`, `height` on start): a display of its own
on the machine (Xvfb, a window manager, its own session and browser profile) where an agent works without touching
ddiff --git a/contracts/actor/agent-manage-request.v1.json b/contracts/actor/agent-manage-request.v1.json
iindex 04b35395..0ab5a9f3 100644
---- a/contracts/actor/agent-manage-request.v1.json
++++ b/contracts/actor/agent-manage-request.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/actor/agent-manage-request.v1.json",
"title": "ActorAgentManageRequest",
-- "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
++ "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, quiet_from?, quiet_to?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
"anyOf": [
{
"type": "object",
@@@ -62,6 +62,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
ddiff --git a/contracts/actor/agent-manage-result.v1.json b/contracts/actor/agent-manage-result.v1.json
iindex 28c3ebde..efd6146b 100644
---- a/contracts/actor/agent-manage-result.v1.json
++++ b/contracts/actor/agent-manage-result.v1.json
@@@ -84,6 +84,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
@@@ -235,6 +251,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
ddiff --git a/fixtures/actor.agent-manage-request/invalid/quiet-hours-bad-time.json b/fixtures/actor.agent-manage-request/invalid/quiet-hours-bad-time.json
nnew file mode 100644
iindex 00000000..b4d08c72
---- /dev/null
++++ b/fixtures/actor.agent-manage-request/invalid/quiet-hours-bad-time.json
@@@ -0,0 +1,6 @@
++{
++ "name": "x",
++ "instructions": "y",
++ "quiet_from": "25:00",
++ "quiet_to": "07:00"
++}
ddiff --git a/fixtures/actor.agent-manage-request/valid/quiet-hours.json b/fixtures/actor.agent-manage-request/valid/quiet-hours.json
nnew file mode 100644
iindex 00000000..de680791
---- /dev/null
++++ b/fixtures/actor.agent-manage-request/valid/quiet-hours.json
@@@ -0,0 +1,7 @@
++{
++ "name": "Hourly checker",
++ "instructions": "Check the status page and tell me what changed.",
++ "schedule": "hourly",
++ "quiet_from": "22:00",
++ "quiet_to": "07:00"
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex f2285b63..228e523b 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -76725,7 +76725,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/actor/agent-manage-request.v1.json",
"title": "ActorAgentManageRequest",
-- "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
++ "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, quiet_from?, quiet_to?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
"anyOf": [
{
"type": "object",
@@@ -76785,6 +76785,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
@@@ -76900,6 +76916,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
@@@ -77051,6 +77083,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex ef122de3..da59fbd1 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -1406,7 +1406,7 @@
},
"actor.agent-manage-request.v1": {
"title": "ActorAgentManageRequest",
-- "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
++ "description": "actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, quiet_from?, quiet_to?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.",
"anyOf": [
{
"type": "object",
@@@ -1466,6 +1466,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
@@@ -1574,6 +1590,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
@@@ -1725,6 +1757,22 @@
"maximum": 6,
"description": "0 is Sunday; for weekly."
},
++ "quiet_from": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither."
++ },
++ "quiet_to": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
++ "description": "HH:MM UTC: quiet hours end."
++ },
"status": {
"enum": [
"active",
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 20dd25de..1d3db024 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -200335,7 +200335,7 @@ export interface ActorTaskCreateRequest {
/** [email protected] (owner: actor) */
/**
-- * actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.
++ * actor.agent-manage-request@1: bodies of actor.agent.manage on OpenVibe.Actor. POST /api/v1/me/agents { name, instructions, mode?, budget_per_run_usd?, daily_runs_max?, schedule?, schedule_at?, schedule_dow?, quiet_from?, quiet_to?, status? } creates a personal agent (10 per person: 429 actor.agent.limit); PATCH /api/v1/me/agents/:id takes any subset. POST /api/v1/me/agents/:id/memory { text } adds a note (1–1000 characters; 50 notes, the oldest agent-written note goes first, a person's note never automatically) and PATCH /api/v1/me/agents/:id/memory/:mem { text } edits one. Unknown fields are 422 actor.agent.invalid; another person's agent is 404 actor.agent.not_found.
*/
export type ActorAgentManageRequest =
| {
@@@ -200356,6 +200356,14 @@ export type ActorAgentManageRequest =
* 0 is Sunday; for weekly.
*/
schedule_dow?: number | null;
++ /**
++ * HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither.
++ */
++ quiet_from?: string | null;
++ /**
++ * HH:MM UTC: quiet hours end.
++ */
++ quiet_to?: string | null;
status?: "active" | "paused";
}
| {
@@@ -200388,6 +200396,14 @@ export type ActorAgentManageResult =
* 0 is Sunday; for weekly.
*/
schedule_dow?: number | null;
++ /**
++ * HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither.
++ */
++ quiet_from?: string | null;
++ /**
++ * HH:MM UTC: quiet hours end.
++ */
++ quiet_to?: string | null;
status: "active" | "paused";
next_run_at?: string | null;
last_run_at?: string | null;
@@@ -200426,6 +200442,14 @@ export type ActorAgentManageResult =
* 0 is Sunday; for weekly.
*/
schedule_dow?: number | null;
++ /**
++ * HH:MM UTC: quiet hours start. No scheduled run starts from quiet_from to quiet_to (the window may cross midnight; an hourly run waits until it ends); a run its owner starts still runs. Both or neither.
++ */
++ quiet_from?: string | null;
++ /**
++ * HH:MM UTC: quiet hours end.
++ */
++ quiet_to?: string | null;
status: "active" | "paused";
next_run_at?: string | null;
last_run_at?: string | null;