Skip to content

observatory.events

The events of the mesh journal above a cursor, as the Observatory's activity scene draws them: identity, kind, node, logical clock and time, newest first, at most a page. The answer's cursor is the next request's `after`; a cursor this journal never reached is expired, and the reader takes a fresh projection. Without a cursor, the newest page.

The events of the mesh journal above a cursor, as the Observatory's activity scene draws them: identity, kind, node, logical clock and time, newest first, at most a page. The answer's cursor is the next request's `after`; a cursor this journal never reached is expired, and the reader takes a fresh projection. Without a cursor, the newest page.

Exposure

Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.

surfaceas
MCPtool majordomus_observatory_events
HTTPGET /api/v1/observatory/events operationId observatory.events
command line—

Schemas

The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.

input · ObservatoryEventsInput

The input of observatory.events: a cursor and a page size.

use majordomus_cli::capability::builtin::observatory::ObservatoryEventsInput;
let q: ObservatoryEventsInput = serde_json::from_value(serde_json::json!({ "after": 42 })).unwrap();
assert_eq!((q.after, q.limit), (Some(42), None));
assert!(serde_json::from_value::<ObservatoryEventsInput>(serde_json::json!({ "since": 1 })).is_err());
propertytyperequireddescription
after integer | null no The cursor: only events whose logical clock is above it. Absent is the newest page.
limit integer | null no At most this many (default 200, at most 1000).
JSON Schema
{
  "additionalProperties": false,
  "description": "The input of `observatory.events`: a cursor and a page size.\n\n```\nuse majordomus_cli::capability::builtin::observatory::ObservatoryEventsInput;\nlet q: ObservatoryEventsInput = serde_json::from_value(serde_json::json!({ \"after\": 42 })).unwrap();\nassert_eq!((q.after, q.limit), (Some(42), None));\nassert!(serde_json::from_value::<ObservatoryEventsInput>(serde_json::json!({ \"since\": 1 })).is_err());\n```",
  "properties": {
    "after": {
      "description": "The cursor: only events whose logical clock is above it. Absent is the newest page.",
      "format": "uint64",
      "minimum": 0,
      "type": [
        "integer",
        "null"
      ]
    },
    "limit": {
      "description": "At most this many (default 200, at most 1000).",
      "format": "uint64",
      "minimum": 0,
      "type": [
        "integer",
        "null"
      ]
    }
  },
  "title": "ObservatoryEventsInput",
  "type": "object"
}

output · ObservatoryEvents

The Observatory's events above a cursor, as the activity scene draws them.

use majordomus_cli::capability::builtin::observatory::ObservatoryEvents;
let e: ObservatoryEvents = serde_json::from_value(serde_json::json!({
    "active": true, "after": 9, "cursor": 12, "expired": false, "events": [{ "id": "s:3" }],
})).unwrap();
assert!(e.cursor > e.after.unwrap(), "the next request resumes past what was read");
propertytyperequireddescription
active boolean yes Whether a mesh runs in this process; without one there is no journal to follow.
after integer | null no The cursor that was asked, when one was.
cursor integer yes The cursor to ask next: the logical clock of the newest event read, or the journal's newest clock when the cursor had expired.
events array yes The events above the cursor, newest first, as marks: identity, kind, node, logical clock and time, never a body.
expired boolean yes The cursor names a clock this journal never reached (another runtime's journal, or one that restarted): nothing above it can be read, and the reader takes a fresh projection.
JSON Schema
{
  "description": "The Observatory's events above a cursor, as the activity scene draws them.\n\n```\nuse majordomus_cli::capability::builtin::observatory::ObservatoryEvents;\nlet e: ObservatoryEvents = serde_json::from_value(serde_json::json!({\n    \"active\": true, \"after\": 9, \"cursor\": 12, \"expired\": false, \"events\": [{ \"id\": \"s:3\" }],\n})).unwrap();\nassert!(e.cursor > e.after.unwrap(), \"the next request resumes past what was read\");\n```",
  "properties": {
    "active": {
      "description": "Whether a mesh runs in this process; without one there is no journal to follow.",
      "type": "boolean"
    },
    "after": {
      "description": "The cursor that was asked, when one was.",
      "format": "uint64",
      "minimum": 0,
      "type": [
        "integer",
        "null"
      ]
    },
    "cursor": {
      "description": "The cursor to ask next: the logical clock of the newest event read, or the journal's\nnewest clock when the cursor had expired.",
      "format": "uint64",
      "minimum": 0,
      "type": "integer"
    },
    "events": {
      "description": "The events above the cursor, newest first, as marks: identity, kind, node, logical\nclock and time, never a body.",
      "items": true,
      "type": "array"
    },
    "expired": {
      "description": "The cursor names a clock this journal never reached (another runtime's journal, or one\nthat restarted): nothing above it can be read, and the reader takes a fresh projection.",
      "type": "boolean"
    }
  },
  "required": [
    "active",
    "cursor",
    "expired",
    "events"
  ],
  "title": "ObservatoryEvents",
  "type": "object"
}

Policies

benchmark
required — a target on every transport the exposure declares; the cases are the input type's
cache
disabled — every call runs the handler

Benchmark targets

Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.

transportstatecasestargets
directcovered2newest
after a cursor
mcpcovered2newest
after a cursor
httpcovered2newest
after a cursor

Searches the titles and descriptions of every page this site publishes.