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.
- query
- behaviorally_verified
- module observatory
- #observatory
- #mesh
- #ui
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_observatory_events |
| HTTP | GET /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
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());| property | type | required | description |
|---|---|---|---|
| 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
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");| property | type | required | description |
|---|---|---|---|
| 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.
| transport | state | cases | targets |
|---|---|---|---|
| direct | covered | 2 | newest after a cursor |
| mcp | covered | 2 | newest after a cursor |
| http | covered | 2 | newest after a cursor |