joule-ui-a2ui writes any registry as a JSON Schema of the nodes its ingest takes, refuses a registry that declares what no node can state, and holds a catalogue to a registry through the validated ingest. joule-ui-lang writes a library as a file. wai-app calls both on its registry; its two files are committed under widgets/, and tests/exports.rs fails while they differ from it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
247 lines
6.3 KiB
JSON
247 lines
6.3 KiB
JSON
{
|
|
"root": "App",
|
|
"widgets": {
|
|
"App": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "only_of",
|
|
"value": [
|
|
"Room",
|
|
"WatchTogether",
|
|
"Show",
|
|
"Text",
|
|
"Receipts",
|
|
"EnergyMeter"
|
|
]
|
|
},
|
|
"description": "The app: its title and what it holds. An app holds one room (a Room, a WatchTogether or a Show), and text, receipts and an energy meter beside it.",
|
|
"name": "App",
|
|
"positional": [
|
|
"children",
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Chat": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "The room's chat: each message a signed event, verified before it is shown. Those who joined write; those who watch read.",
|
|
"name": "Chat",
|
|
"positional": [
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"EnergyMeter": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "What each action cost in energy, and how the figure was obtained (a page has no meter, so its figures are estimates, labelled so).",
|
|
"name": "EnergyMeter",
|
|
"positional": [
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Participants": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "Who is in the room now, from the room's signed lifecycle.",
|
|
"name": "Participants",
|
|
"positional": [
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Player": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "The room's video: each participant's camera laid out from the room's signed record, every frame checked before it is shown.",
|
|
"name": "Player",
|
|
"positional": [
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Poll": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "A vote in a Show: the lead opens it, each viewer chooses one option, and the room's clock closes it and signs the result. `options` is a list of 2 to 32 texts; `seconds` how long it stays open (5 to 300; 30 when left out).",
|
|
"name": "Poll",
|
|
"positional": [
|
|
"question",
|
|
"options",
|
|
"seconds"
|
|
],
|
|
"props": {
|
|
"options": {
|
|
"required": true,
|
|
"ty": "list"
|
|
},
|
|
"question": {
|
|
"required": true,
|
|
"ty": "text"
|
|
},
|
|
"seconds": {
|
|
"required": false,
|
|
"ty": "number"
|
|
}
|
|
}
|
|
},
|
|
"Receipts": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "This page's receipts: every action a person takes here is sealed into a hash-chained log this page signs and verifies, and the room's objects checked against their receipts are counted.",
|
|
"name": "Receipts",
|
|
"positional": [
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Room": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "only_of",
|
|
"value": [
|
|
"Player",
|
|
"Chat",
|
|
"Participants",
|
|
"Receipts",
|
|
"EnergyMeter",
|
|
"Text"
|
|
]
|
|
},
|
|
"description": "A live room: people join with their camera and microphone, or watch. Every audio and video object is checked against its signed receipt before it is shown. Holds a Player for the room's video and a Chat; those who join can chat, those who watch read it.",
|
|
"name": "Room",
|
|
"positional": [
|
|
"children",
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Show": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "only_of",
|
|
"value": [
|
|
"Player",
|
|
"Chat",
|
|
"Poll",
|
|
"Participants",
|
|
"Receipts",
|
|
"EnergyMeter",
|
|
"Text"
|
|
]
|
|
},
|
|
"description": "A show: hosts on camera, the first of them leading; an audience that watches and votes. Holds a Player for the hosts' video, a Chat for the hosts, and Polls the lead opens and the audience answers. `audience` is how many inputs each viewer may send to one poll (1 to 255; 1 when left out).",
|
|
"name": "Show",
|
|
"positional": [
|
|
"children",
|
|
"title",
|
|
"audience"
|
|
],
|
|
"props": {
|
|
"audience": {
|
|
"required": false,
|
|
"ty": "number"
|
|
},
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Text": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "A paragraph of text.",
|
|
"name": "Text",
|
|
"positional": [
|
|
"text"
|
|
],
|
|
"props": {
|
|
"text": {
|
|
"required": true,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"WatchTogether": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "only_of",
|
|
"value": [
|
|
"Participants",
|
|
"Receipts",
|
|
"EnergyMeter",
|
|
"Text"
|
|
]
|
|
},
|
|
"description": "A watch room: everyone watches one file together, in sync; anyone may play, pause, seek or change the speed for everyone. `source` is the file's name within the app (for example \"film.mp4\"). A watch room carries the shared controls alone: it holds no Chat and no Poll.",
|
|
"name": "WatchTogether",
|
|
"positional": [
|
|
"source",
|
|
"children",
|
|
"title"
|
|
],
|
|
"props": {
|
|
"source": {
|
|
"required": true,
|
|
"ty": "text"
|
|
},
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|