{"name":"shiny-course-based-learning","description":"Preceptor — orchestrates an AWS course from an authored SPEC (Persona→Domain→Job Task→LO).","url":"http://localhost:3000/","version":"1.0.0","capabilities":{"streaming":true},"defaultInputModes":["text"],"defaultOutputModes":["text"],"skills":[{"name":"list_course","description":"Return the course structure: persona + every job task with its ordered Learning Objective (LO) ids and its proficiency assessment. Call this FIRST to know what to teach and in what order."},{"name":"get_lo","description":"Return a Learning Objective's statement and cognitive (Bloom's) level. Use the cognitive level to choose the instructional pattern arc for the LO."},{"name":"get_content","description":"Fetch authored teaching content for a Learning Objective. contentKind is one of: activation, prerequisites, boundaries, overview, deep-dive, scaffold, modality, scenario, exit-criteria. Use `activation`/`prerequisites`/`boundaries` for the pre-lesson, `overview`/`deep-dive`/`scaffold` to teach, `scenario`/`exit-criteria` for the formative check. Teach ONLY from the returned content — never invent facts."},{"name":"get_proficiency_assessment","description":"Return the summative Proficiency Assessment spec for a job task: type, scenario setup, exit criteria, acceptable-vs-optimal, time constraints, and the diagnostic mapping (which LO to revisit on each failure mode). Present this when all LOs are complete."},{"name":"propose_lab_plan","description":"Start a hands-on AWS lab plan for the learner. Provide a natural-language description of the lab to build (service, what they should learn, optional target minutes). Returns a proposed lab plan (title, objective, tasks). Call this when the learner is ready to DO hands-on practice. Then use refine_lab_plan to iterate, or launch_lab once agreed."},{"name":"refine_lab_plan","description":"Refine the current proposed lab plan with a follow-up instruction (e.g. \"add a task on multipart-upload cleanup\", \"make it shorter\"). Requires a plan already proposed via propose_lab_plan. Returns the updated plan."},{"name":"launch_lab","description":"Provision the actual AWS lab environment once the learner accepts the plan. Requires a plan proposed via propose_lab_plan. If a prior active lab conflicts, pass force=true to stop it and start fresh. Returns the launched session + lab tasks. After this, call bootstrap_lab then poll_lab_status."},{"name":"bootstrap_lab","description":"Kick off provisioning of the launched lab (fire-and-forget). Requires launch_lab first. After this, call poll_lab_status until the lab is READY. Takes ~2-5 minutes."},{"name":"poll_lab_status","description":"Check the launched lab provisioning status ONCE. Returns the current status; when READY, includes the consoleUrl to hand to the learner. Call repeatedly (every ~7s) after bootstrap_lab until status is READY or FAILED_LAB_BOOTSTRAPPING."},{"name":"show_content_card","description":"Visual learning card. Call whenever explaining an AWS concept, service, or lesson step. Always call alongside your text response."},{"name":"show_message","description":"Send a structured text message to the learner. Optional — plain text responses are also accepted and stream more naturally. Use show_message when you want explicit control over message rendering."},{"name":"set_layout","description":"Switch the surface layout. \"focused\": Full-screen surface mode — no chat rail. Use when showing deep lesson content the learner should focus on. · \"two-pane\": Chat rail on the left, surface canvas on the right. Use for open conversation while a teaching surface is visible."}]}