{"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_course_overview","description":"Return the ENTIRE course as an overview tree (persona + domains → job tasks → LOs), each LO with its statement and its intent arc (e.g. [\"QO\",\"CD\",\"SC\",\"TB\"]). ONE call — use this to render show_course_overview without calling get_lo per LO."},{"name":"show_course_overview","description":"Render the course map (Full Spec Journey) in the canvas — persona, progress, and the Domain → Job Task → LO accordion. The course tree is built server-side from the spec: do NOT pass the tree. Only pass learner state: passedLoIds (LOs already completed) and currentLoId (the LO to mark current — defaults to the first not-passed LO). Returns the full tree so you know every loId, statement, and arc. Pair with set_layout(\"overview\")."},{"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_session_header","description":"Session chrome: the learning-objective title + the 5 learning-intent stepper (Quick Overview, Concept Deep Dive, Hands-on Sim, Scenario Challenge, Teach Back) with the active step marked. Call it to frame a lesson, and re-call it whenever the active intent changes. Pass steps (abbr+name, e.g. {abbr:\"QO\",name:\"Quick Overview\"}) and currentStepIndex."},{"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. · \"session_shell\": The paced-lesson frame: intent stepper on top, teaching surface in the canvas, composer docked below. Use for the in-lesson experience; emit a session_header surface (→ top) alongside the teaching surface (→ canvas). · \"welcome\": The landing screen: a centered greeting + composer, no canvas. Use as the FIRST layout to greet the learner and ask what they want to work on. Transition to \"overview\" once they name a goal or course. · \"overview\": The course map: the course_overview surface fills the canvas with the conversation in the right rail. Use to show the whole course/journey and let the learner pick an LO (by clicking a card or prompting). Transition to \"session_shell\" to teach a chosen LO."}]}