@plasius/learning 0.2.21 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -7
- package/dist/index.cjs +279 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +44 -2
- package/dist/index.d.ts +44 -2
- package/dist/index.js +271 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -142,6 +142,20 @@ interface BadgeDefinitionV1 {
|
|
|
142
142
|
tradeable: false;
|
|
143
143
|
tokenConvertible: false;
|
|
144
144
|
}
|
|
145
|
+
/** Immutable package export selected by the catalog without importing it. */
|
|
146
|
+
declare const EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1: "1";
|
|
147
|
+
interface ExternalLearningContentReferenceV1 {
|
|
148
|
+
/** Exact public package name; ranges and aliases are not permitted. */
|
|
149
|
+
packageName: string;
|
|
150
|
+
/** Exact semantic version without a range operator. */
|
|
151
|
+
packageVersion: string;
|
|
152
|
+
/** Named ESM/CJS export containing the immutable content manifest. */
|
|
153
|
+
exportName: string;
|
|
154
|
+
/** Exact schema version declared by the referenced exported manifest. */
|
|
155
|
+
schemaVersion: string;
|
|
156
|
+
/** Lower-case SHA-256 of the canonical exported manifest JSON. */
|
|
157
|
+
sha256: string;
|
|
158
|
+
}
|
|
145
159
|
/** One immutable, independently sellable module version. */
|
|
146
160
|
interface LearningModuleVersionV1 {
|
|
147
161
|
id: string;
|
|
@@ -163,6 +177,8 @@ interface LearningModuleVersionV1 {
|
|
|
163
177
|
assessment: AssessmentRubricV1;
|
|
164
178
|
agents: ModuleAgentDefinitionV1[];
|
|
165
179
|
badges: BadgeDefinitionV1[];
|
|
180
|
+
/** Optional separately released content implementation pinned by digest. */
|
|
181
|
+
externalContent?: ExternalLearningContentReferenceV1;
|
|
166
182
|
}
|
|
167
183
|
/** A versioned path is a recommendation and never a paid prerequisite chain. */
|
|
168
184
|
interface LearningPathVersionV1 {
|
|
@@ -389,7 +405,7 @@ interface MissionAuthoringValidationIssueV1 {
|
|
|
389
405
|
path: string;
|
|
390
406
|
}
|
|
391
407
|
interface LearningValidationIssueV1 {
|
|
392
|
-
code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions";
|
|
408
|
+
code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions" | "invalid-external-content-reference";
|
|
393
409
|
message: string;
|
|
394
410
|
moduleId?: string;
|
|
395
411
|
path: string;
|
|
@@ -426,6 +442,30 @@ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1: LearningPathVersionV1;
|
|
|
426
442
|
* without altering previously published records.
|
|
427
443
|
*/
|
|
428
444
|
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1: LearningPathVersionV1;
|
|
445
|
+
/** Digest-pinned content package for the independently released 54-stage course. */
|
|
446
|
+
declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1: Readonly<{
|
|
447
|
+
packageName: "@plasius/learning-road-hopper-rally";
|
|
448
|
+
packageVersion: "1.0.0";
|
|
449
|
+
exportName: "ROAD_HOPPER_RALLY_COURSE_V2";
|
|
450
|
+
schemaVersion: "2";
|
|
451
|
+
sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0";
|
|
452
|
+
}>;
|
|
453
|
+
/** Road Hopper Rally 2.0 catalog record; course data stays in the referenced package. */
|
|
454
|
+
declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2: LearningModuleVersionV1;
|
|
455
|
+
/** Mixed-version successor: Road Hopper 2.0 plus every other immutable 1.1 module. */
|
|
456
|
+
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2: LearningPathVersionV1;
|
|
457
|
+
/** Digest-pinned Paddle Pulse 2.0 reference-module content. */
|
|
458
|
+
declare const PADDLE_PULSE_EXTERNAL_CONTENT_V1: Readonly<{
|
|
459
|
+
packageName: "@plasius/learning-paddle-pulse";
|
|
460
|
+
packageVersion: "0.1.0";
|
|
461
|
+
exportName: "PADDLE_PULSE_MODULE_V2";
|
|
462
|
+
schemaVersion: "2";
|
|
463
|
+
sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e";
|
|
464
|
+
}>;
|
|
465
|
+
/** Paddle Pulse 2.0 catalog record; executable content stays in its package. */
|
|
466
|
+
declare const JUNIOR_CODER_PADDLE_PULSE_V2: LearningModuleVersionV1;
|
|
467
|
+
/** Mixed-version successor adding Paddle Pulse 2.0 without mutating v1.1. */
|
|
468
|
+
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3: LearningPathVersionV1;
|
|
429
469
|
/** Current pilot catalog for server adapters that intentionally follow releases. */
|
|
430
470
|
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: LearningPathVersionV1;
|
|
431
471
|
|
|
@@ -728,9 +768,11 @@ declare const ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1: MissionAuthoringBu
|
|
|
728
768
|
declare const ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
|
|
729
769
|
declare const ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
|
|
730
770
|
|
|
771
|
+
/** Runtime guard for digest-pinned external learning content references. */
|
|
772
|
+
declare function isExternalLearningContentReferenceV1(value: unknown): value is ExternalLearningContentReferenceV1;
|
|
731
773
|
/** Return every catalog issue without throwing, suitable for authoring tools. */
|
|
732
774
|
declare function validateLearningPath(path: LearningPathVersionV1): LearningValidationIssueV1[];
|
|
733
775
|
/** Fail fast when a path is not safe to publish or consume. */
|
|
734
776
|
declare function assertValidLearningPath(path: LearningPathVersionV1): void;
|
|
735
777
|
|
|
736
|
-
export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
|
|
778
|
+
export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1, type ExternalLearningContentReferenceV1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_PADDLE_PULSE_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_EXTERNAL_CONTENT_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, isExternalLearningContentReferenceV1, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
|
package/dist/index.d.ts
CHANGED
|
@@ -142,6 +142,20 @@ interface BadgeDefinitionV1 {
|
|
|
142
142
|
tradeable: false;
|
|
143
143
|
tokenConvertible: false;
|
|
144
144
|
}
|
|
145
|
+
/** Immutable package export selected by the catalog without importing it. */
|
|
146
|
+
declare const EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1: "1";
|
|
147
|
+
interface ExternalLearningContentReferenceV1 {
|
|
148
|
+
/** Exact public package name; ranges and aliases are not permitted. */
|
|
149
|
+
packageName: string;
|
|
150
|
+
/** Exact semantic version without a range operator. */
|
|
151
|
+
packageVersion: string;
|
|
152
|
+
/** Named ESM/CJS export containing the immutable content manifest. */
|
|
153
|
+
exportName: string;
|
|
154
|
+
/** Exact schema version declared by the referenced exported manifest. */
|
|
155
|
+
schemaVersion: string;
|
|
156
|
+
/** Lower-case SHA-256 of the canonical exported manifest JSON. */
|
|
157
|
+
sha256: string;
|
|
158
|
+
}
|
|
145
159
|
/** One immutable, independently sellable module version. */
|
|
146
160
|
interface LearningModuleVersionV1 {
|
|
147
161
|
id: string;
|
|
@@ -163,6 +177,8 @@ interface LearningModuleVersionV1 {
|
|
|
163
177
|
assessment: AssessmentRubricV1;
|
|
164
178
|
agents: ModuleAgentDefinitionV1[];
|
|
165
179
|
badges: BadgeDefinitionV1[];
|
|
180
|
+
/** Optional separately released content implementation pinned by digest. */
|
|
181
|
+
externalContent?: ExternalLearningContentReferenceV1;
|
|
166
182
|
}
|
|
167
183
|
/** A versioned path is a recommendation and never a paid prerequisite chain. */
|
|
168
184
|
interface LearningPathVersionV1 {
|
|
@@ -389,7 +405,7 @@ interface MissionAuthoringValidationIssueV1 {
|
|
|
389
405
|
path: string;
|
|
390
406
|
}
|
|
391
407
|
interface LearningValidationIssueV1 {
|
|
392
|
-
code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions";
|
|
408
|
+
code: "duplicate-module-id" | "duplicate-module-slug" | "module-not-self-contained" | "paid-prerequisite" | "missing-materials" | "facilitator-material-leak" | "learner-material-leak" | "invalid-token-subunits" | "invalid-reference-price" | "rubric-total" | "rubric-dimension-total" | "duplicate-criterion-id" | "missing-mandatory-safety" | "missing-hardware-items" | "invalid-agent-authority" | "missing-missions" | "invalid-external-content-reference";
|
|
393
409
|
message: string;
|
|
394
410
|
moduleId?: string;
|
|
395
411
|
path: string;
|
|
@@ -426,6 +442,30 @@ declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1: LearningPathVersionV1;
|
|
|
426
442
|
* without altering previously published records.
|
|
427
443
|
*/
|
|
428
444
|
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1: LearningPathVersionV1;
|
|
445
|
+
/** Digest-pinned content package for the independently released 54-stage course. */
|
|
446
|
+
declare const ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1: Readonly<{
|
|
447
|
+
packageName: "@plasius/learning-road-hopper-rally";
|
|
448
|
+
packageVersion: "1.0.0";
|
|
449
|
+
exportName: "ROAD_HOPPER_RALLY_COURSE_V2";
|
|
450
|
+
schemaVersion: "2";
|
|
451
|
+
sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0";
|
|
452
|
+
}>;
|
|
453
|
+
/** Road Hopper Rally 2.0 catalog record; course data stays in the referenced package. */
|
|
454
|
+
declare const JUNIOR_CODER_ROAD_HOPPER_RALLY_V2: LearningModuleVersionV1;
|
|
455
|
+
/** Mixed-version successor: Road Hopper 2.0 plus every other immutable 1.1 module. */
|
|
456
|
+
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2: LearningPathVersionV1;
|
|
457
|
+
/** Digest-pinned Paddle Pulse 2.0 reference-module content. */
|
|
458
|
+
declare const PADDLE_PULSE_EXTERNAL_CONTENT_V1: Readonly<{
|
|
459
|
+
packageName: "@plasius/learning-paddle-pulse";
|
|
460
|
+
packageVersion: "0.1.0";
|
|
461
|
+
exportName: "PADDLE_PULSE_MODULE_V2";
|
|
462
|
+
schemaVersion: "2";
|
|
463
|
+
sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e";
|
|
464
|
+
}>;
|
|
465
|
+
/** Paddle Pulse 2.0 catalog record; executable content stays in its package. */
|
|
466
|
+
declare const JUNIOR_CODER_PADDLE_PULSE_V2: LearningModuleVersionV1;
|
|
467
|
+
/** Mixed-version successor adding Paddle Pulse 2.0 without mutating v1.1. */
|
|
468
|
+
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3: LearningPathVersionV1;
|
|
429
469
|
/** Current pilot catalog for server adapters that intentionally follow releases. */
|
|
430
470
|
declare const JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT: LearningPathVersionV1;
|
|
431
471
|
|
|
@@ -728,9 +768,11 @@ declare const ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1: MissionAuthoringBu
|
|
|
728
768
|
declare const ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
|
|
729
769
|
declare const ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1: MissionAuthoringBundleV1;
|
|
730
770
|
|
|
771
|
+
/** Runtime guard for digest-pinned external learning content references. */
|
|
772
|
+
declare function isExternalLearningContentReferenceV1(value: unknown): value is ExternalLearningContentReferenceV1;
|
|
731
773
|
/** Return every catalog issue without throwing, suitable for authoring tools. */
|
|
732
774
|
declare function validateLearningPath(path: LearningPathVersionV1): LearningValidationIssueV1[];
|
|
733
775
|
/** Fail fast when a path is not safe to publish or consume. */
|
|
734
776
|
declare function assertValidLearningPath(path: LearningPathVersionV1): void;
|
|
735
777
|
|
|
736
|
-
export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
|
|
778
|
+
export { ADVENTURE_MISSION_PLANNER_MISSION_ONE_AUTHORING_V1, type AdventureMissionPlannerSafeRenderV1, type AssessmentCheckResultV1, type AssessmentCriterionV1, type AssessmentDimensionV1, type AssessmentResultV1, type AssessmentRubricV1, type AttemptEvidenceV1, BEACON_BOT_MISSION_ONE_AUTHORING_V1, type BadgeDefinitionV1, CONTEXTUAL_HELP_CONTRACT_VERSION_V1, CONTEXTUAL_HELP_KINDS_V1, CONTEXTUAL_VOICE_INTENTS_V1, CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1, CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1, type CanonicalSpokenHelpDescriptorV1, type CommercialStateV1, type ContextualHelpIdentifierV1, type ContextualHelpKindV1, type ContextualVoiceAnswerV1, type ContextualVoiceIntentV1, type ContextualVoiceQuestionMetadataV1, type ContextualVoiceQuestionResultV1, type ContextualVoiceSuggestedActionV1, type CourseMaterialAudienceV1, type CourseMaterialKindV1, type CourseMaterialV1, type CourseMaterialsManifestV1, type CreatureCareDashboardSafeRenderV1, DANCE_ROVER_MISSION_ONE_AUTHORING_V1, EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1, type ExternalLearningContentReferenceV1, type FacilitatorMissionAuthoringV1, type GuardianAiConsentV1, type GuardianVoiceConsentStateV1, type GuardianVoiceConsentV1, type GuardianVoiceProcessingRouteV1, type HardwareItemV1, type HardwareModeV1, type HardwareRequirementManifestV1, type HardwareVerificationStatusV1, JUNIOR_CODER_MISSION_STAGE_ORDER_V1, JUNIOR_CODER_MODULE_PRICE_V1_1, JUNIOR_CODER_PADDLE_PULSE_V2, JUNIOR_CODER_ROAD_HOPPER_RALLY_V2, JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2, JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3, type LearnerMissionAuthoringV1, type LearningGoalV1, type LearningModuleVersionV1, type LearningPathVersionV1, type LearningValidationIssueV1, METEOR_SHIELD_MISSION_ONE_AUTHORING_V1, MISSION_AUTHORING_CONTRACT_VERSION_V1, type MissionAccessibilityAlternativeV1, type MissionArtifactKindV1, type MissionArtifactReferenceV1, type MissionAuthoringBundleV1, type MissionAuthoringGoalV1, type MissionAuthoringValidationIssueV1, type MissionBoundedSuggestionV1, type MissionEvidenceKindV1, type MissionEvidenceRequirementV1, type MissionEvidenceRetentionV1, type MissionFunctionParameterV1, type MissionFunctionReferenceV1, type MissionHardwareAcquisitionScopeV1, type MissionHardwareComponentDisclosureV1, type MissionHardwareDisclosureV1, type MissionInteractionModeV1, type MissionInteractionRequirementV1, type MissionPhysicalSafeguardsV1, type MissionReadinessCheckV1, type MissionRewardBindingV1, type MissionSideAdventureV1, type MissionStageCardV1, type MissionStageKindV1, type MissionV1, type ModuleAgentDefinitionV1, type ModuleAgentFeedbackV1, type ModuleAgentRoleV1, type ModuleCategoryV1, type ModuleEntitlementV1, type ModulePricingV1, type ModuleReferencePriceV1, OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1, PADDLE_PULSE_EXTERNAL_CONTENT_V1, PADDLE_PULSE_MISSION_ONE_AUTHORING_V1, PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1, type PublishedStaticProjectSnapshotV1, RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1, RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1, ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1, ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1, ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1, ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1, type RobotMissionControlSafeRenderV1, SERVO_CREATURE_MISSION_ONE_AUTHORING_V1, SKYWING_SPRINT_MISSION_ONE_AUTHORING_V1, STAR_DEFENDER_SQUADRON_MISSION_ONE_AUTHORING_V1, STATIC_PROJECT_APPROVAL_STATEMENT_VERSION_V1, STATIC_PROJECT_DEFAULT_LIFETIME_DAYS_V1, STATIC_PROJECT_MAX_SOURCE_CHARACTERS_V1, STATIC_PROJECT_PUBLISHING_CONTRACT_VERSION_V1, STATIC_PROJECT_SAFETY_CHECK_IDS_V1, STATIC_PROJECT_SCANNER_VERSION_V1, type ScoreBandV1, type StaticProjectContractIssueV1, type StaticProjectGuardianApprovalV1, type StaticProjectModuleSlugV1, type StaticProjectPublicationV1, type StaticProjectSafeRenderV1, type StaticProjectSafetyCheckIdV1, type StaticProjectSafetyCheckV1, type StaticProjectSafetyScanV1, type StaticProjectSnapshotV1, VIBE_BUG_DETECTIVE_MISSION_ONE_AUTHORING_V1, VIBE_GAME_REMIX_LAB_MISSION_ONE_AUTHORING_V1, VIBE_IDEA_STUDIO_MISSION_ONE_AUTHORING_V1, type VoiceHelpAvailabilityReasonV1, type VoiceHelpAvailabilityV1, assertValidCanonicalSpokenHelpDescriptor, assertValidContextualHelpIdentifier, assertValidContextualVoiceQuestionMetadata, assertValidContextualVoiceQuestionResult, assertValidGuardianVoiceConsent, assertValidLearningPath, assertValidMissionAuthoringBundle, assertValidStaticProjectGuardianApproval, assertValidStaticProjectPublication, assertValidStaticProjectSnapshot, assertValidVoiceHelpAvailability, calculateAssessment, isExternalLearningContentReferenceV1, validateAssessmentRubric, validateLearningPath, validateMissionAuthoringBundle, validateStaticProjectGuardianApproval, validateStaticProjectPublication, validateStaticProjectSnapshot };
|
package/dist/index.js
CHANGED
|
@@ -566,9 +566,250 @@ var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1 = {
|
|
|
566
566
|
}
|
|
567
567
|
}))
|
|
568
568
|
};
|
|
569
|
-
var
|
|
569
|
+
var ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1 = Object.freeze({
|
|
570
|
+
packageName: "@plasius/learning-road-hopper-rally",
|
|
571
|
+
packageVersion: "1.0.0",
|
|
572
|
+
exportName: "ROAD_HOPPER_RALLY_COURSE_V2",
|
|
573
|
+
schemaVersion: "2",
|
|
574
|
+
sha256: "1a20741beba028004e0be527d05aae2b2881082d3b578e0d62308a59bf1323f0"
|
|
575
|
+
});
|
|
576
|
+
var roadHopperV1_1 = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
577
|
+
(entry) => entry.id === "junior-coder.road-hopper-rally"
|
|
578
|
+
);
|
|
579
|
+
var ROAD_HOPPER_RALLY_V2_MISSIONS = [
|
|
580
|
+
{
|
|
581
|
+
id: "board",
|
|
582
|
+
title: "Build the Rally Board",
|
|
583
|
+
concepts: ["coordinate grids", "arrays", "entity state", "rendering"],
|
|
584
|
+
statement: "Create the road, median, river and five distinct home bays in board.js.",
|
|
585
|
+
sideAdventure: "Design an original high-contrast board palette without changing its mechanics."
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
id: "hopper",
|
|
589
|
+
title: "Move the Hopper",
|
|
590
|
+
concepts: ["events", "bounded movement", "keyboard input", "touch input", "respawning"],
|
|
591
|
+
statement: "Implement four-direction tile movement, bounds, equivalent inputs and respawning in hopper.js.",
|
|
592
|
+
sideAdventure: "Add an accessible movement status phrase for every successful hop."
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
id: "traffic",
|
|
596
|
+
title: "Create Rally Traffic",
|
|
597
|
+
concepts: ["spawning", "fixed-step updates", "wrapping", "collision detection", "difficulty"],
|
|
598
|
+
statement: "Implement five deterministic traffic lanes, collisions, lives and difficulty in traffic.js.",
|
|
599
|
+
sideAdventure: "Invent an original vehicle type while preserving the entity and collision limits."
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
id: "river",
|
|
603
|
+
title: "Cross the Moving River",
|
|
604
|
+
concepts: ["moving platforms", "carrying", "hazards", "state machines", "off-screen bounds"],
|
|
605
|
+
statement: "Implement logs, carrying, water deaths, diving platforms and edge hazards in river.js.",
|
|
606
|
+
sideAdventure: "Create an original visual warning for a platform that is about to dive."
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
id: "rules",
|
|
610
|
+
title: "Add Rally Rules",
|
|
611
|
+
concepts: ["timers", "lives", "scoring", "bonuses", "levels", "game over"],
|
|
612
|
+
statement: "Implement homes, occupied and blocked bays, timer, scoring, bonuses and level progression in rules.js.",
|
|
613
|
+
sideAdventure: "Tune a practice-speed preset that keeps every rule deterministic."
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
id: "game",
|
|
617
|
+
title: "Complete Road Hopper Rally",
|
|
618
|
+
concepts: ["system assembly", "pause and restart", "alternating players", "audio", "accessibility", "testing"],
|
|
619
|
+
statement: "Assemble the systems, accessibility modes and alternating-player finale in game.js, then pass the protected challenge.",
|
|
620
|
+
sideAdventure: "Polish the finished game with original captions, visual cues and reduced-motion feedback."
|
|
621
|
+
}
|
|
622
|
+
];
|
|
623
|
+
var JUNIOR_CODER_ROAD_HOPPER_RALLY_V2 = {
|
|
624
|
+
...roadHopperV1_1,
|
|
625
|
+
version: "2.0.0",
|
|
626
|
+
contentRevision: "2026-08-11.1",
|
|
627
|
+
summary: "Recreate the systems behind a classic road-and-river crossing game using original Road Hopper Rally code, art, audio and presentation.",
|
|
628
|
+
estimatedMinutes: 450,
|
|
629
|
+
tools: [
|
|
630
|
+
"JavaScript",
|
|
631
|
+
"QuickJS sandbox",
|
|
632
|
+
"Deterministic 30 Hz engine",
|
|
633
|
+
"Road Hopper renderer"
|
|
634
|
+
],
|
|
635
|
+
concepts: [
|
|
636
|
+
"coordinates",
|
|
637
|
+
"arrays and entity state",
|
|
638
|
+
"events and input",
|
|
639
|
+
"fixed-step update and render",
|
|
640
|
+
"spawning and movement",
|
|
641
|
+
"collision detection",
|
|
642
|
+
"state machines",
|
|
643
|
+
"timers, lives and scoring",
|
|
644
|
+
"difficulty progression",
|
|
645
|
+
"audio integration",
|
|
646
|
+
"debugging",
|
|
647
|
+
"deterministic testing"
|
|
648
|
+
],
|
|
649
|
+
missions: ROAD_HOPPER_RALLY_V2_MISSIONS.map((missionDefinition, index) => ({
|
|
650
|
+
id: `road-hopper-rally-mission-${index + 1}-${missionDefinition.id}`,
|
|
651
|
+
title: missionDefinition.title,
|
|
652
|
+
estimatedMinutes: 75,
|
|
653
|
+
concepts: [...missionDefinition.concepts],
|
|
654
|
+
goals: [
|
|
655
|
+
{
|
|
656
|
+
id: `road-hopper-rally-v2-${missionDefinition.id}`,
|
|
657
|
+
statement: missionDefinition.statement,
|
|
658
|
+
evidence: "assessment"
|
|
659
|
+
}
|
|
660
|
+
],
|
|
661
|
+
sideAdventure: missionDefinition.sideAdventure
|
|
662
|
+
})),
|
|
663
|
+
assessment: {
|
|
664
|
+
version: "2.0.0",
|
|
665
|
+
completionScore: 80,
|
|
666
|
+
criteria: [
|
|
667
|
+
{ id: "road-hopper-v2-structure", label: "All six bounded JavaScript files compile and assemble.", dimension: "structure", points: 20, mandatory: true, visibility: "visible" },
|
|
668
|
+
{ id: "road-hopper-v2-road", label: "Board, input and traffic behaviours pass deterministic scenarios.", dimension: "behaviour", points: 15, mandatory: true, visibility: "visible" },
|
|
669
|
+
{ id: "road-hopper-v2-river", label: "River platforms, carrying and hazards pass deterministic scenarios.", dimension: "behaviour", points: 15, mandatory: true, visibility: "visible" },
|
|
670
|
+
{ id: "road-hopper-v2-rules", label: "Homes, timer, lives, scoring, bonuses and levels behave correctly.", dimension: "behaviour", points: 20, mandatory: true, visibility: "visible" },
|
|
671
|
+
{ id: "road-hopper-v2-final", label: "The complete game passes the server-only protected final challenge.", dimension: "resilience", points: 20, mandatory: true, visibility: "protected" },
|
|
672
|
+
{ id: "road-hopper-v2-safety", label: "The project stays within the sandbox, resource and privacy boundaries.", dimension: "safety", points: 10, mandatory: true, visibility: "visible" }
|
|
673
|
+
]
|
|
674
|
+
},
|
|
675
|
+
badges: [
|
|
676
|
+
{
|
|
677
|
+
id: "road-hopper-rally-v2-complete",
|
|
678
|
+
title: "Road Hopper Rally Champion",
|
|
679
|
+
evidence: "module-score",
|
|
680
|
+
tradeable: false,
|
|
681
|
+
tokenConvertible: false
|
|
682
|
+
}
|
|
683
|
+
],
|
|
684
|
+
externalContent: ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1
|
|
685
|
+
};
|
|
686
|
+
var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2 = {
|
|
687
|
+
...JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
|
|
688
|
+
version: "1.2.0",
|
|
689
|
+
modules: JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.map((entry) => entry.id === JUNIOR_CODER_ROAD_HOPPER_RALLY_V2.id ? JUNIOR_CODER_ROAD_HOPPER_RALLY_V2 : entry)
|
|
690
|
+
};
|
|
691
|
+
var PADDLE_PULSE_EXTERNAL_CONTENT_V1 = Object.freeze({
|
|
692
|
+
packageName: "@plasius/learning-paddle-pulse",
|
|
693
|
+
packageVersion: "0.1.0",
|
|
694
|
+
exportName: "PADDLE_PULSE_MODULE_V2",
|
|
695
|
+
schemaVersion: "2",
|
|
696
|
+
sha256: "19f3666bdb523a3faf069341b0bc748996b3db282f89171e3c9f0a373a8c8f7e"
|
|
697
|
+
});
|
|
698
|
+
var paddlePulseV1_1 = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1.modules.find(
|
|
699
|
+
(entry) => entry.id === "junior-coder.paddle-pulse"
|
|
700
|
+
);
|
|
701
|
+
var PADDLE_PULSE_V2_MISSIONS = [
|
|
702
|
+
{
|
|
703
|
+
id: "court-coordinates",
|
|
704
|
+
title: "Court & Coordinates",
|
|
705
|
+
concepts: ["coordinates", "canvas primitives", "game loops", "bounds"],
|
|
706
|
+
statement: "Build a responsive 640 \xD7 480 logical court with a bounded paddle and ball.",
|
|
707
|
+
sideAdventure: "Create an original high-contrast court palette without changing its geometry."
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
id: "paddle-controls",
|
|
711
|
+
title: "Paddle Controls",
|
|
712
|
+
concepts: ["input state", "Pointer Events", "keyboard input", "clamping"],
|
|
713
|
+
statement: "Implement equivalent Arrow/A/D and direct horizontal pointer-drag controls.",
|
|
714
|
+
sideAdventure: "Add a semantic movement trace that does not rely on animation."
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
id: "ball-motion",
|
|
718
|
+
title: "Ball Motion & Bounces",
|
|
719
|
+
concepts: ["velocity", "fixed timesteps", "reflection", "contact normals", "paddle angles"],
|
|
720
|
+
statement: "Implement deterministic ball motion plus controlled wall and paddle reflections.",
|
|
721
|
+
sideAdventure: "Design a reduced-motion trajectory inspector for one rally."
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
id: "bricks-collisions",
|
|
725
|
+
title: "Bricks & Collisions",
|
|
726
|
+
concepts: ["arrays", "loops", "brick grids", "AABB collision", "resolution"],
|
|
727
|
+
statement: "Create an original brick grid whose bricks score once and disappear on impact.",
|
|
728
|
+
sideAdventure: "Invent a new visual brick pattern using the same bounded collision rules."
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
id: "score-lives-states",
|
|
732
|
+
title: "Score, Lives & States",
|
|
733
|
+
concepts: ["state machines", "invariants", "scoring", "lives", "HUD state"],
|
|
734
|
+
statement: "Implement serve, pause, life loss, level clear, game over, score and HUD states.",
|
|
735
|
+
sideAdventure: "Add a printable state-transition table for a facilitator or screen-reader user."
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
id: "levels-final-game",
|
|
739
|
+
title: "Levels, Sound & Final Game",
|
|
740
|
+
concepts: ["level data", "difficulty", "responsive rendering", "accessible audio", "testing"],
|
|
741
|
+
statement: "Assemble multiple original levels, optional generated cues and the integrated final game.",
|
|
742
|
+
sideAdventure: "After completion, add an optional original power-up without changing core assessment."
|
|
743
|
+
}
|
|
744
|
+
];
|
|
745
|
+
var JUNIOR_CODER_PADDLE_PULSE_V2 = {
|
|
746
|
+
...paddlePulseV1_1,
|
|
747
|
+
version: "2.0.0",
|
|
748
|
+
contentRevision: "2026-08-11.1",
|
|
749
|
+
summary: "Build an original Plasius brick-breaker while learning rendering, equivalent input, deterministic physics, collisions, score, lives, states, levels, accessible sound and testing.",
|
|
750
|
+
estimatedMinutes: 360,
|
|
751
|
+
tools: [
|
|
752
|
+
"JavaScript",
|
|
753
|
+
"QuickJS sandbox",
|
|
754
|
+
"Deterministic 60 Hz engine",
|
|
755
|
+
"Responsive Paddle Pulse renderer"
|
|
756
|
+
],
|
|
757
|
+
concepts: [
|
|
758
|
+
"coordinates and rendering",
|
|
759
|
+
"game loops and fixed timesteps",
|
|
760
|
+
"keyboard and pointer input",
|
|
761
|
+
"velocity and reflection",
|
|
762
|
+
"collision detection and resolution",
|
|
763
|
+
"arrays and brick grids",
|
|
764
|
+
"scoring, lives and state machines",
|
|
765
|
+
"level data and difficulty",
|
|
766
|
+
"accessible generated audio",
|
|
767
|
+
"debugging and deterministic testing"
|
|
768
|
+
],
|
|
769
|
+
missions: PADDLE_PULSE_V2_MISSIONS.map((missionDefinition, index) => ({
|
|
770
|
+
id: `paddle-pulse-mission-${index + 1}-${missionDefinition.id}`,
|
|
771
|
+
title: missionDefinition.title,
|
|
772
|
+
estimatedMinutes: 60,
|
|
773
|
+
concepts: [...missionDefinition.concepts],
|
|
774
|
+
goals: [{
|
|
775
|
+
id: `paddle-pulse-v2-${missionDefinition.id}`,
|
|
776
|
+
statement: missionDefinition.statement,
|
|
777
|
+
evidence: "assessment"
|
|
778
|
+
}],
|
|
779
|
+
sideAdventure: missionDefinition.sideAdventure
|
|
780
|
+
})),
|
|
781
|
+
assessment: {
|
|
782
|
+
version: "2.0.0",
|
|
783
|
+
completionScore: 80,
|
|
784
|
+
criteria: [
|
|
785
|
+
{ id: "paddle-pulse-v2-court", label: "The logical court, paddle and initial scene are finite, responsive and bounded.", dimension: "structure", points: 20, mandatory: false, visibility: "visible" },
|
|
786
|
+
{ id: "paddle-pulse-v2-controls", label: "Keyboard and pointer paths produce equivalent clamped paddle input.", dimension: "behaviour", points: 15, mandatory: false, visibility: "visible" },
|
|
787
|
+
{ id: "paddle-pulse-v2-motion", label: "Ball motion and wall/paddle reflections pass deterministic trajectories.", dimension: "behaviour", points: 15, mandatory: false, visibility: "visible" },
|
|
788
|
+
{ id: "paddle-pulse-v2-bricks", label: "Brick face, corner and adjacent impacts resolve without double-scoring.", dimension: "behaviour", points: 20, mandatory: false, visibility: "visible" },
|
|
789
|
+
{ id: "paddle-pulse-v2-states", label: "Score, lives, serve, pause, level-clear and game-over transitions preserve invariants.", dimension: "resilience", points: 10, mandatory: false, visibility: "visible" },
|
|
790
|
+
{ id: "paddle-pulse-v2-final", label: "Multiple original levels and the integrated game pass protected deterministic scenarios.", dimension: "resilience", points: 10, mandatory: false, visibility: "protected" },
|
|
791
|
+
{ id: "paddle-pulse-v2-safety", label: "Source, commands, runtime resources and assessment remain inside sandbox limits.", dimension: "safety", points: 10, mandatory: true, visibility: "visible" }
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
badges: [
|
|
795
|
+
{ id: "paddle-pulse-v2-court-builder", title: "Court Builder", evidence: "mission-score", tradeable: false, tokenConvertible: false },
|
|
796
|
+
{ id: "paddle-pulse-v2-paddle-pilot", title: "Paddle Pilot", evidence: "mission-score", tradeable: false, tokenConvertible: false },
|
|
797
|
+
{ id: "paddle-pulse-v2-rally-master", title: "Rally Master", evidence: "mission-score", tradeable: false, tokenConvertible: false },
|
|
798
|
+
{ id: "paddle-pulse-v2-brick-breaker", title: "Brick Breaker", evidence: "mission-score", tradeable: false, tokenConvertible: false },
|
|
799
|
+
{ id: "paddle-pulse-v2-game-keeper", title: "Game Keeper", evidence: "mission-score", tradeable: false, tokenConvertible: false },
|
|
800
|
+
{ id: "paddle-pulse-v2-complete", title: "Paddle Pulse Champion", evidence: "module-score", tradeable: false, tokenConvertible: false }
|
|
801
|
+
],
|
|
802
|
+
externalContent: PADDLE_PULSE_EXTERNAL_CONTENT_V1
|
|
803
|
+
};
|
|
804
|
+
var JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3 = {
|
|
805
|
+
...JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2,
|
|
806
|
+
version: "1.3.0",
|
|
807
|
+
modules: JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2.modules.map((entry) => entry.id === JUNIOR_CODER_PADDLE_PULSE_V2.id ? JUNIOR_CODER_PADDLE_PULSE_V2 : entry)
|
|
808
|
+
};
|
|
809
|
+
var JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT = JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3;
|
|
570
810
|
|
|
571
811
|
// src/contracts.ts
|
|
812
|
+
var EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1 = "1";
|
|
572
813
|
var MISSION_AUTHORING_CONTRACT_VERSION_V1 = "1.0.0";
|
|
573
814
|
|
|
574
815
|
// src/contextual-help.ts
|
|
@@ -6760,6 +7001,16 @@ var ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1 = {
|
|
|
6760
7001
|
|
|
6761
7002
|
// src/validation.ts
|
|
6762
7003
|
var CANONICAL_TOKEN_SUBUNITS = /^(0|[1-9][0-9]*)$/u;
|
|
7004
|
+
var EXACT_PACKAGE_NAME = /^@plasius\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u;
|
|
7005
|
+
var EXACT_SEMVER = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/u;
|
|
7006
|
+
var EXPORT_NAME = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;
|
|
7007
|
+
var CONTENT_SCHEMA_VERSION = /^(0|[1-9][0-9]*)$/u;
|
|
7008
|
+
var SHA256 = /^[a-f0-9]{64}$/u;
|
|
7009
|
+
function isExternalLearningContentReferenceV1(value) {
|
|
7010
|
+
if (typeof value !== "object" || value === null) return false;
|
|
7011
|
+
const candidate = value;
|
|
7012
|
+
return Object.keys(value).length === 5 && typeof candidate.packageName === "string" && EXACT_PACKAGE_NAME.test(candidate.packageName) && typeof candidate.packageVersion === "string" && EXACT_SEMVER.test(candidate.packageVersion) && typeof candidate.exportName === "string" && EXPORT_NAME.test(candidate.exportName) && typeof candidate.schemaVersion === "string" && CONTENT_SCHEMA_VERSION.test(candidate.schemaVersion) && typeof candidate.sha256 === "string" && SHA256.test(candidate.sha256);
|
|
7013
|
+
}
|
|
6763
7014
|
function issue(code, message, path, moduleId) {
|
|
6764
7015
|
return { code, message, path, ...moduleId ? { moduleId } : {} };
|
|
6765
7016
|
}
|
|
@@ -6874,6 +7125,17 @@ function validateModule(module2, moduleIndex) {
|
|
|
6874
7125
|
)
|
|
6875
7126
|
);
|
|
6876
7127
|
}
|
|
7128
|
+
const externalContent = module2.externalContent;
|
|
7129
|
+
if (externalContent && !isExternalLearningContentReferenceV1(externalContent)) {
|
|
7130
|
+
issues.push(
|
|
7131
|
+
issue(
|
|
7132
|
+
"invalid-external-content-reference",
|
|
7133
|
+
"External content must use an exact @plasius package, stable semantic version, named export, schema version and lower-case SHA-256 digest.",
|
|
7134
|
+
`${base}.externalContent`,
|
|
7135
|
+
module2.id
|
|
7136
|
+
)
|
|
7137
|
+
);
|
|
7138
|
+
}
|
|
6877
7139
|
return issues;
|
|
6878
7140
|
}
|
|
6879
7141
|
function validateLearningPath(path) {
|
|
@@ -6923,18 +7185,25 @@ export {
|
|
|
6923
7185
|
CONTEXTUAL_VOICE_SUGGESTED_ACTIONS_V1,
|
|
6924
7186
|
CREATURE_CARE_DASHBOARD_MISSION_ONE_AUTHORING_V1,
|
|
6925
7187
|
DANCE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
7188
|
+
EXTERNAL_LEARNING_CONTENT_REFERENCE_VERSION_V1,
|
|
6926
7189
|
JUNIOR_CODER_MISSION_STAGE_ORDER_V1,
|
|
6927
7190
|
JUNIOR_CODER_MODULE_PRICE_V1_1,
|
|
7191
|
+
JUNIOR_CODER_PADDLE_PULSE_V2,
|
|
7192
|
+
JUNIOR_CODER_ROAD_HOPPER_RALLY_V2,
|
|
6928
7193
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_CURRENT,
|
|
6929
7194
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1,
|
|
6930
7195
|
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_1,
|
|
7196
|
+
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_2,
|
|
7197
|
+
JUNIOR_CODER_ROBOT_RESCUE_PATH_V1_3,
|
|
6931
7198
|
METEOR_SHIELD_MISSION_ONE_AUTHORING_V1,
|
|
6932
7199
|
MISSION_AUTHORING_CONTRACT_VERSION_V1,
|
|
6933
7200
|
OBSTACLE_EXPLORER_MISSION_ONE_AUTHORING_V1,
|
|
7201
|
+
PADDLE_PULSE_EXTERNAL_CONTENT_V1,
|
|
6934
7202
|
PADDLE_PULSE_MISSION_ONE_AUTHORING_V1,
|
|
6935
7203
|
PIXEL_TRAIL_CHALLENGE_MISSION_ONE_AUTHORING_V1,
|
|
6936
7204
|
RAINBOW_RESCUE_ROVER_MISSION_ONE_AUTHORING_V1,
|
|
6937
7205
|
RESCUE_CREW_COMMANDER_MISSION_ONE_AUTHORING_V1,
|
|
7206
|
+
ROAD_HOPPER_RALLY_EXTERNAL_CONTENT_V1,
|
|
6938
7207
|
ROAD_HOPPER_RALLY_MISSION_ONE_AUTHORING_V1,
|
|
6939
7208
|
ROBOT_MAZE_DASH_MISSION_ONE_AUTHORING_V1,
|
|
6940
7209
|
ROBOT_MISSION_CONTROL_MISSION_ONE_AUTHORING_V1,
|
|
@@ -6962,6 +7231,7 @@ export {
|
|
|
6962
7231
|
assertValidStaticProjectSnapshot,
|
|
6963
7232
|
assertValidVoiceHelpAvailability,
|
|
6964
7233
|
calculateAssessment,
|
|
7234
|
+
isExternalLearningContentReferenceV1,
|
|
6965
7235
|
validateAssessmentRubric,
|
|
6966
7236
|
validateLearningPath,
|
|
6967
7237
|
validateMissionAuthoringBundle,
|