mirror of
https://github.com/soconnor0919/hristudio.git
synced 2025-12-11 22:54:45 -05:00
• Fix repository sync implementation in admin API (was TODO placeholder) - Add full fetch/parse logic for repository.json and plugin index - Implement robot matching by name/manufacturer patterns - Handle plugin creation/updates with proper error handling - Add comprehensive TypeScript typing throughout • Fix plugin store installation state detection - Add getStudyPlugins API integration to check installed plugins - Update PluginCard component with isInstalled prop and correct button states - Fix repository name display using metadata.repositoryId mapping - Show "Installed" (disabled) vs "Install" (enabled) based on actual state • Resolve admin access and authentication issues - Add missing administrator role to user system roles table - Fix admin route access for repository management - Enable repository sync functionality in admin dashboard • Add repository metadata integration - Update plugin records with proper repositoryId references - Add metadata field to robots.plugins.list API response - Enable repository name display for all plugins from metadata • Fix TypeScript compliance across plugin system - Replace unsafe 'any' types with proper interfaces - Add type definitions for repository and plugin data structures - Use nullish coalescing operators for safer null handling - Remove unnecessary type assertions • Integrate live repository at https://repo.hristudio.com - Successfully loads 3 robot plugins (TurtleBot3 Burger/Waffle, NAO) - Complete ROS2 action definitions with parameter schemas - Trust level categorization (official, verified, community) - Platform and documentation metadata preservation • Update documentation and development workflow - Document plugin repository system in work_in_progress.md - Update quick-reference.md with repository sync examples - Add plugin installation and management guidance - Remove problematic test script with TypeScript errors BREAKING CHANGE: Plugin store now requires repository sync for robot plugins. Run repository sync in admin dashboard after deployment to populate plugin store. Closes: Plugin store repository integration Resolves: Installation state detection and repository name display Fixes: Admin authentication and TypeScript compliance issues
241 lines
6.8 KiB
JSON
241 lines
6.8 KiB
JSON
{
|
|
"blockSetId": "wizard-actions",
|
|
"name": "Wizard Actions",
|
|
"description": "Actions performed by the human wizard during experiment execution",
|
|
"version": "1.0.0",
|
|
"pluginApiVersion": "1.0",
|
|
"hriStudioVersion": ">=0.1.0",
|
|
"trustLevel": "official",
|
|
"category": "wizard-actions",
|
|
|
|
"author": {
|
|
"name": "HRIStudio Team",
|
|
"email": "support@hristudio.com",
|
|
"organization": "HRIStudio"
|
|
},
|
|
|
|
"documentation": {
|
|
"mainUrl": "https://docs.hristudio.org/blocks/wizard-actions",
|
|
"description": "Wizard action blocks define behaviors that the human experimenter performs during trials. These create prompts and interfaces for the wizard to follow the experimental protocol."
|
|
},
|
|
|
|
"blocks": [
|
|
{
|
|
"id": "wizard_say",
|
|
"name": "say",
|
|
"description": "Wizard speaks to the participant",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "MessageSquare",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "message",
|
|
"name": "Message",
|
|
"type": "text",
|
|
"value": "",
|
|
"placeholder": "What should the wizard say?",
|
|
"description": "Text that the wizard will speak to the participant"
|
|
},
|
|
{
|
|
"id": "tone",
|
|
"name": "Tone",
|
|
"type": "select",
|
|
"value": "neutral",
|
|
"options": ["neutral", "friendly", "encouraging", "instructional", "questioning"],
|
|
"description": "Suggested tone for delivery"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 30000
|
|
}
|
|
},
|
|
{
|
|
"id": "wizard_gesture",
|
|
"name": "gesture",
|
|
"description": "Wizard performs a physical gesture",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "Hand",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "type",
|
|
"name": "Gesture",
|
|
"type": "select",
|
|
"value": "wave",
|
|
"options": ["wave", "point", "nod", "thumbs_up", "beckon", "stop_hand", "applaud"],
|
|
"description": "Type of gesture to perform"
|
|
},
|
|
{
|
|
"id": "direction",
|
|
"name": "Direction",
|
|
"type": "select",
|
|
"value": "forward",
|
|
"options": ["forward", "left", "right", "up", "down", "participant", "robot"],
|
|
"description": "Direction or target of the gesture"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 15000
|
|
}
|
|
},
|
|
{
|
|
"id": "wizard_show_object",
|
|
"name": "show object",
|
|
"description": "Wizard presents or demonstrates an object",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "Package",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "object",
|
|
"name": "Object",
|
|
"type": "text",
|
|
"value": "",
|
|
"placeholder": "Name of object to show",
|
|
"description": "Description of the object to present"
|
|
},
|
|
{
|
|
"id": "action",
|
|
"name": "Action",
|
|
"type": "select",
|
|
"value": "hold_up",
|
|
"options": ["hold_up", "demonstrate", "point_to", "place_on_table", "hand_to_participant"],
|
|
"description": "How to present the object"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 20000
|
|
}
|
|
},
|
|
{
|
|
"id": "wizard_record_note",
|
|
"name": "record note",
|
|
"description": "Wizard records an observation or note",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "PenTool",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "note_type",
|
|
"name": "Note Type",
|
|
"type": "select",
|
|
"value": "observation",
|
|
"options": ["observation", "participant_response", "technical_issue", "protocol_deviation", "other"],
|
|
"description": "Category of note being recorded"
|
|
},
|
|
{
|
|
"id": "prompt",
|
|
"name": "Prompt",
|
|
"type": "text",
|
|
"value": "",
|
|
"placeholder": "What should the wizard note?",
|
|
"description": "Guidance for what to observe or record"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 60000
|
|
}
|
|
},
|
|
{
|
|
"id": "wizard_wait_for_response",
|
|
"name": "wait for response",
|
|
"description": "Wizard waits for participant to respond",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "Clock",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "response_type",
|
|
"name": "Response Type",
|
|
"type": "select",
|
|
"value": "verbal",
|
|
"options": ["verbal", "gesture", "action", "button_press", "any"],
|
|
"description": "Type of response to wait for"
|
|
},
|
|
{
|
|
"id": "timeout",
|
|
"name": "Timeout (s)",
|
|
"type": "number",
|
|
"value": 30,
|
|
"min": 1,
|
|
"max": 300,
|
|
"step": 1,
|
|
"description": "Maximum time to wait for response"
|
|
},
|
|
{
|
|
"id": "prompt_text",
|
|
"name": "Prompt",
|
|
"type": "text",
|
|
"value": "",
|
|
"placeholder": "Optional prompt for participant",
|
|
"description": "Text to display to guide participant response"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 300000
|
|
}
|
|
},
|
|
{
|
|
"id": "wizard_rate_interaction",
|
|
"name": "rate interaction",
|
|
"description": "Wizard provides a subjective rating",
|
|
"category": "wizard",
|
|
"shape": "action",
|
|
"icon": "Star",
|
|
"color": "#a855f7",
|
|
"nestable": false,
|
|
"parameters": [
|
|
{
|
|
"id": "rating_type",
|
|
"name": "Rating Type",
|
|
"type": "select",
|
|
"value": "engagement",
|
|
"options": ["engagement", "comprehension", "comfort", "success", "naturalness", "custom"],
|
|
"description": "Aspect being rated"
|
|
},
|
|
{
|
|
"id": "scale",
|
|
"name": "Scale",
|
|
"type": "select",
|
|
"value": "1-5",
|
|
"options": ["1-5", "1-7", "1-10", "0-100"],
|
|
"description": "Rating scale to use"
|
|
},
|
|
{
|
|
"id": "custom_label",
|
|
"name": "Custom Label",
|
|
"type": "text",
|
|
"value": "",
|
|
"placeholder": "Label for custom rating type",
|
|
"description": "Description for custom rating (if selected)"
|
|
}
|
|
],
|
|
"execution": {
|
|
"type": "wizard_prompt",
|
|
"blocking": true,
|
|
"timeout": 30000
|
|
}
|
|
}
|
|
]
|
|
}
|