@almadar/cli 0.3.2 → 1.0.3
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/bin/almadar +32 -1
- package/package.json +7 -6
- package/shells/python-shell/.dockerignore +50 -0
- package/shells/python-shell/.env.example +55 -0
- package/shells/python-shell/Dockerfile +56 -0
- package/shells/python-shell/README.md +253 -0
- package/shells/python-shell/cloudbuild.yaml +76 -0
- package/shells/python-shell/docker-compose.yaml +57 -0
- package/shells/python-shell/pyproject.toml +28 -0
- package/shells/python-shell/scripts/deploy.sh +108 -0
- package/shells/python-shell/scripts/setup-secrets.sh +104 -0
- package/shells/python-shell/src/orbital_app/__init__.py +8 -0
- package/shells/python-shell/src/orbital_app/core/__init__.py +40 -0
- package/shells/python-shell/src/orbital_app/core/bindings.py +75 -0
- package/shells/python-shell/src/orbital_app/core/effect_executor.py +196 -0
- package/shells/python-shell/src/orbital_app/core/event_bus.py +119 -0
- package/shells/python-shell/src/orbital_app/core/event_router.py +38 -0
- package/shells/python-shell/src/orbital_app/core/firebase.py +112 -0
- package/shells/python-shell/src/orbital_app/core/repository.py +257 -0
- package/shells/python-shell/src/orbital_app/core/settings.py +74 -0
- package/shells/python-shell/src/orbital_app/core/websocket.py +202 -0
- package/shells/python-shell/src/orbital_app/main.py +108 -0
- package/shells/python-shell/src/orbital_app/middleware/__init__.py +18 -0
- package/shells/python-shell/src/orbital_app/middleware/auth.py +126 -0
- package/shells/python-shell/src/orbital_app/nn/__init__.py +28 -0
- package/shells/python-shell/src/orbital_app/nn/constraints.py +104 -0
- package/shells/python-shell/src/orbital_app/nn/forward.py +34 -0
- package/shells/python-shell/src/orbital_app/nn/training.py +101 -0
- package/shells/python-shell/src/orbital_app/tensor/__init__.py +46 -0
- package/shells/python-shell/src/orbital_app/tensor/contracts.py +112 -0
- package/shells/python-shell/src/orbital_app/tensor/ops.py +196 -0
- package/shells/python-shell/tests/conftest.py +63 -0
- package/shells/python-shell/tests/test_effect_executor.py +197 -0
- package/shells/python-shell/tests/test_event_bus.py +194 -0
- package/shells/python-shell/tests/test_generated_traits.py +268 -0
- package/shells/python-shell/tests/test_integration.py +347 -0
- package/shells/python-shell/tests/test_nn_builder.py +113 -0
- package/shells/python-shell/tests/test_nn_constraints.py +187 -0
- package/shells/python-shell/tests/test_nn_forward.py +98 -0
- package/shells/python-shell/tests/test_nn_training.py +130 -0
- package/shells/python-shell/tests/test_repository.py +151 -0
- package/shells/python-shell/tests/test_tensor_contracts.py +168 -0
- package/shells/python-shell/tests/test_tensor_ops.py +260 -0
- package/shells/typescript-shell/.env.example +30 -0
- package/shells/typescript-shell/.firebaserc.template +14 -0
- package/shells/typescript-shell/.prettierrc +7 -0
- package/shells/typescript-shell/Dockerfile +0 -0
- package/shells/typescript-shell/apphosting.yaml.template +0 -0
- package/shells/typescript-shell/firebase.json.template +0 -0
- package/shells/typescript-shell/firestore.indexes.json +4 -0
- package/shells/typescript-shell/firestore.rules.template +0 -0
- package/shells/typescript-shell/infra/aws/alb.tf +0 -0
- package/shells/typescript-shell/infra/aws/cloudfront.tf +0 -0
- package/shells/typescript-shell/infra/aws/ecs.tf +0 -0
- package/shells/typescript-shell/infra/aws/main.tf +0 -0
- package/shells/typescript-shell/infra/aws/rds.tf +0 -0
- package/shells/typescript-shell/infra/docker/Dockerfile.client +0 -0
- package/shells/typescript-shell/infra/docker/Dockerfile.server +0 -0
- package/shells/typescript-shell/infra/docker/docker-compose.prod.yml +45 -0
- package/shells/typescript-shell/infra/docker/docker-compose.yml +57 -0
- package/shells/typescript-shell/infra/docker/nginx.conf +0 -0
- package/shells/typescript-shell/infra/main.tf +0 -0
- package/shells/typescript-shell/infra/terraform/aws/alb.tf +0 -0
- package/shells/typescript-shell/infra/terraform/aws/cloudfront.tf +0 -0
- package/shells/typescript-shell/infra/terraform/aws/ecs.tf +0 -0
- package/shells/typescript-shell/infra/terraform/aws/main.tf +0 -0
- package/shells/typescript-shell/infra/terraform/aws/rds.tf +0 -0
- package/shells/typescript-shell/infra/terraform/main.tf +0 -0
- package/shells/typescript-shell/infra/terraform/variables.tf +0 -0
- package/shells/typescript-shell/infra/variables.tf +0 -0
- package/shells/typescript-shell/package-lock.json +15210 -0
- package/shells/typescript-shell/package.json +64 -0
- package/shells/typescript-shell/packages/client/.env.example +30 -0
- package/shells/typescript-shell/packages/client/index.html +13 -0
- package/shells/typescript-shell/packages/client/package.json +52 -0
- package/shells/typescript-shell/packages/client/postcss.config.js +6 -0
- package/shells/typescript-shell/packages/client/src/App.tsx +56 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/CreditExpirationAlert.stories.tsx +75 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/CreditExpirationAlert.tsx +157 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/CreditMeter.stories.tsx +155 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/CreditMeter.tsx +370 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/ExerciseVideoLink.stories.tsx +50 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/ExerciseVideoLink.tsx +143 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/ShareableLinkGenerator.stories.tsx +54 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/ShareableLinkGenerator.tsx +210 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/atoms/index.ts +4 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/index.ts +83 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/BodyMeasurementInput.stories.tsx +117 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/BodyMeasurementInput.tsx +343 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/DailyProgressInput.stories.tsx +82 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/DailyProgressInput.tsx +345 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/GroupSessionCard.stories.tsx +155 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/GroupSessionCard.tsx +319 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/LiftTracker.stories.tsx +110 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/LiftTracker.tsx +395 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/MealPlanCard.stories.tsx +132 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/MealPlanCard.tsx +394 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/NutritionSummary.stories.tsx +127 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/NutritionSummary.tsx +360 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/ProgressChart.stories.tsx +119 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/ProgressChart.tsx +377 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/SpecialExerciseCard.stories.tsx +115 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/SpecialExerciseCard.tsx +294 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/TraineeCard.stories.tsx +139 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/TraineeCard.tsx +306 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/WorkoutPlanCard.stories.tsx +140 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/WorkoutPlanCard.tsx +379 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/molecules/index.ts +10 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/AIAnalysisPanel.stories.tsx +171 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/AIAnalysisPanel.tsx +257 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/KinesiologyExamForm.stories.tsx +157 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/KinesiologyExamForm.tsx +383 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/SessionScheduler.stories.tsx +249 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/SessionScheduler.tsx +637 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/TraineeComparison.stories.tsx +221 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/TraineeComparison.tsx +438 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/WeeklyCalendar.stories.tsx +208 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/WeeklyCalendar.tsx +380 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/organisms/index.ts +5 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/CreditsTemplate.stories.tsx +243 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/CreditsTemplate.tsx +496 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/FitnessTemplate.stories.tsx +237 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/FitnessTemplate.tsx +457 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/MealPlanDetailTemplate.stories.tsx +184 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/MealPlanDetailTemplate.tsx +414 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/MealPlansTemplate.stories.tsx +198 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/MealPlansTemplate.tsx +296 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/ProgressTemplate.stories.tsx +242 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/ProgressTemplate.tsx +497 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/ScheduleTemplate.stories.tsx +267 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/ScheduleTemplate.tsx +424 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/SessionDetailTemplate.stories.tsx +214 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/SessionDetailTemplate.tsx +518 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/SessionsTemplate.stories.tsx +207 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/SessionsTemplate.tsx +508 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/TraineeDetailTemplate.stories.tsx +178 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/TraineeDetailTemplate.tsx +396 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/TraineesTemplate.stories.tsx +168 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/TraineesTemplate.tsx +429 -0
- package/shells/typescript-shell/packages/client/src/clients/blaz-kelemnc/templates/index.ts +44 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/atoms/LawReferenceBadge.stories.tsx +78 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/atoms/LawReferenceBadge.tsx +87 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/atoms/PhaseIndicator.stories.tsx +91 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/atoms/PhaseIndicator.tsx +142 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/atoms/index.ts +8 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/index.ts +79 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-001-uvod.json +361 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-001-uvod.ts +361 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-002-podjetje.json +115 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-002-podjetje.ts +115 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-003-udelezenci.json +78 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-003-udelezenci.ts +78 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-004-izbira-podrocja.json +85 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-004-izbira-podrocja.ts +94 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-005-trgovina.json +1056 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-005-trgovina.ts +1056 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-006-ugotovitve.json +128 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-006-ugotovitve.ts +128 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-007-odlocbe.json +136 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-007-odlocbe.ts +136 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-008-pripombe.json +148 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-008-pripombe.ts +148 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-009-zakljucek.json +207 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T-009-zakljucek.ts +207 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T2-1-oznacevanje-cen.json +1265 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/configs/tabs/T2-1-oznacevanje-cen.ts +1265 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/index.ts +137 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/CardSelector.stories.tsx +128 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/CardSelector.tsx +174 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ComplianceSummary.stories.tsx +115 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ComplianceSummary.tsx +263 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ConditionalField.tsx +254 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/DocumentPreview.tsx +249 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/EntitySearch.tsx +290 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/InspectionTimeline.stories.tsx +138 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/InspectionTimeline.tsx +253 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ObjectionRecorder.tsx +213 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ParticipantList.stories.tsx +86 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ParticipantList.tsx +227 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/PhotoAttachment.tsx +276 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ProgressHeader.stories.tsx +89 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/ProgressHeader.tsx +157 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/RepeatableFormSection.tsx +189 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/RuleCheckItem.stories.tsx +118 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/RuleCheckItem.tsx +237 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/molecules/index.ts +18 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/organisms/FloatingActionMenu.stories.tsx +75 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/organisms/FloatingActionMenu.tsx +197 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/organisms/SignatureCapture.stories.tsx +96 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/organisms/SignatureCapture.tsx +278 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/organisms/index.ts +8 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/CompaniesTemplate.stories.tsx +107 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/CompaniesTemplate.tsx +266 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionFormDemoTemplate.stories.tsx +607 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionFormDemoTemplate.tsx +1428 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionProcessTemplate.stories.tsx +713 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionProcessTemplate.tsx +1582 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionWizardTemplate.stories.tsx +174 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionWizardTemplate.tsx +264 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionsTemplate.stories.tsx +129 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectionsTemplate.tsx +287 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectorsTemplate.stories.tsx +94 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/InspectorsTemplate.tsx +255 -0
- package/shells/typescript-shell/packages/client/src/clients/inspection-system/templates/index.ts +47 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/atoms/MindMapConnections.stories.tsx +82 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/atoms/MindMapConnections.tsx +75 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/atoms/index.ts +2 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/index.ts +96 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/ConceptMetaTags.stories.tsx +64 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/ConceptMetaTags.tsx +77 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/GraphLegend.stories.tsx +100 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/GraphLegend.tsx +120 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/LayerNavigator.stories.tsx +109 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/LayerNavigator.tsx +157 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/LearningGoalDisplay.stories.tsx +62 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/LearningGoalDisplay.tsx +138 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/MindMapHeader.tsx +47 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/MindMapNode.stories.tsx +212 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/MindMapNode.tsx +294 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/NoteContent.stories.tsx +98 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/NoteContent.tsx +163 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/NoteListItem.stories.tsx +196 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/NoteListItem.tsx +239 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/QuizBlock.tsx +3 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/StreamingDisplay.stories.tsx +132 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/StreamingDisplay.tsx +232 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/index.ts +28 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ActivationBlock.stories.tsx +71 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ActivationBlock.tsx +127 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/BloomQuizBlock.stories.tsx +154 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/BloomQuizBlock.tsx +232 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ConnectionBlock.stories.tsx +57 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ConnectionBlock.tsx +60 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/QuizBlock.tsx +138 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ReflectionBlock.stories.tsx +90 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/ReflectionBlock.tsx +151 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/learning/index.ts +14 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/markdown/CodeBlock.stories.tsx +188 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/markdown/CodeBlock.tsx +165 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/markdown/MarkdownContent.stories.tsx +160 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/markdown/MarkdownContent.tsx +131 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/molecules/markdown/index.ts +5 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/ConceptCard.stories.tsx +155 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/ConceptCard.tsx +301 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/FlashCard.stories.tsx +105 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/FlashCard.tsx +200 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/FlashCardStack.stories.tsx +97 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/FlashCardStack.tsx +163 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/FlashCardsDisplay.tsx +236 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/ForceDirectedGraph.stories.tsx +230 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/ForceDirectedGraph.tsx +488 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/MindMapCanvas.stories.tsx +256 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/MindMapCanvas.tsx +185 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/NoteList.stories.tsx +178 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/NoteList.tsx +209 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/SegmentRenderer.stories.tsx +238 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/SegmentRenderer.tsx +196 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/organisms/index.ts +18 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/patterns/component-mapping.json +122 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/patterns/event-contracts.json +145 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/patterns/index.ts +46 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/ConceptDetailTemplate.stories.tsx +148 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/ConceptDetailTemplate.tsx +266 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/KnowledgeGraphTemplate.stories.tsx +215 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/KnowledgeGraphTemplate.tsx +302 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/LessonTemplate.stories.tsx +161 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/LessonTemplate.tsx +264 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/templates/index.ts +4 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/types/index.ts +9 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/types/mindMapTypes.ts +13 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/utils/index.ts +6 -0
- package/shells/typescript-shell/packages/client/src/clients/kflow/utils/parseLessonSegments.ts +191 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/atoms/CareIndicator.tsx +113 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/atoms/GrowthMeter.tsx +216 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/atoms/SeasonIndicator.tsx +140 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/atoms/TrustMeter.tsx +221 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/atoms/index.ts +15 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/index.ts +159 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/molecules/HarvestCard.tsx +254 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/molecules/PlantCard.tsx +412 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/molecules/WeatherWidget.tsx +229 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/molecules/index.ts +12 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/organisms/GardenView.tsx +344 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/organisms/index.ts +6 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/AdminDashboardTemplate.tsx +423 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/AssessmentTemplate.tsx +409 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/ConnectionsTemplate.tsx +465 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/GraphIntelligenceTemplate.tsx +388 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/InvitesTemplate.tsx +359 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/ProjectDetailTemplate.tsx +483 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/ProjectsTemplate.tsx +474 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/RelationshipGardenTemplate.tsx +198 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/SeedNetworkTemplate.tsx +410 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/SuggestionsTemplate.tsx +352 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/TeamDetailTemplate.tsx +494 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/TeamMembersTemplate.tsx +427 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/TeamsTemplate.tsx +424 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/TrustIntelligenceTemplate.tsx +312 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/UserProfileTemplate.tsx +308 -0
- package/shells/typescript-shell/packages/client/src/clients/winning-11/templates/UsersTemplate.tsx +303 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Avatar.tsx +226 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Badge.tsx +79 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Box.tsx +262 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Button.tsx +150 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Card.tsx +151 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Center.tsx +67 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Checkbox.tsx +46 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/ConditionalWrapper.tsx +139 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Divider.tsx +102 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Icon.tsx +224 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Input.tsx +192 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Label.tsx +26 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/LawReferenceTooltip.tsx +190 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Overlay.tsx +37 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/ProgressBar.tsx +256 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Radio.tsx +164 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Select.tsx +62 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Spacer.tsx +68 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Spinner.tsx +32 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Stack.tsx +151 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Switch.tsx +91 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/TextHighlight.tsx +111 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Textarea.tsx +32 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/ThemeSelector.tsx +128 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/ThemeToggle.tsx +91 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/Typography.tsx +207 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/game/ControlButton.tsx +118 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/game/HealthBar.tsx +93 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/game/ScoreDisplay.tsx +86 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/game/Sprite.tsx +188 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/game/index.ts +12 -0
- package/shells/typescript-shell/packages/client/src/components/atoms/index.ts +88 -0
- package/shells/typescript-shell/packages/client/src/components/index.ts +4 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Accordion.tsx +223 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Alert.tsx +117 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Breadcrumb.tsx +159 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/ButtonGroup.tsx +226 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Card.tsx +135 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Container.tsx +78 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Drawer.tsx +254 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/EmptyState.tsx +132 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/ErrorState.tsx +48 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/FilterGroup.tsx +529 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Flex.tsx +131 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/FloatingActionButton.tsx +264 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/FormField.tsx +48 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/FormSectionHeader.tsx +139 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Grid.tsx +194 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/InputGroup.tsx +109 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/LoadingState.tsx +39 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Menu.tsx +266 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Modal.tsx +171 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Pagination.tsx +254 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Popover.tsx +201 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/RelationSelect.tsx +328 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/RepeatableFormSection.tsx +236 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/SearchInput.tsx +196 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/SidePanel.tsx +116 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/SimpleGrid.tsx +90 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Tabs.tsx +208 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Toast.tsx +154 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/Tooltip.tsx +172 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/ViolationAlert.tsx +253 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/WizardNavigation.tsx +166 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/WizardProgress.tsx +140 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/game/ActionButtons.tsx +148 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/game/DPad.tsx +98 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/game/StatBadge.tsx +104 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/game/index.ts +11 -0
- package/shells/typescript-shell/packages/client/src/components/molecules/index.ts +36 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/CardGrid.tsx +479 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/ComponentPatterns.tsx +1000 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/ConfirmDialog.tsx +165 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/CustomPattern.tsx +479 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/DataTable.tsx +816 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/DetailPanel.tsx +626 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/DrawerSlot.tsx +86 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Form.tsx +968 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/FormSection.tsx +168 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Header.tsx +263 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/LayoutPatterns.tsx +325 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/List.tsx +838 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/MasterDetail.tsx +85 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/ModalSlot.tsx +81 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Navigation.tsx +157 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/OrbitalVisualization.tsx +480 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/PageHeader.tsx +244 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Section.tsx +131 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Sidebar.tsx +270 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Split.tsx +121 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/StatCard.tsx +360 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/Table.tsx +394 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/ToastSlot.tsx +106 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/UISlotRenderer.tsx +647 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/WizardContainer.tsx +369 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/RuntimeDebugger.css +102 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/RuntimeDebugger.tsx +176 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/hooks/useDebugData.ts +100 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/index.ts +10 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/tabs/EntitiesTab.tsx +130 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/tabs/EventFlowTab.tsx +135 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/tabs/GuardsPanel.tsx +124 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/tabs/TicksTab.tsx +100 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/debug/tabs/TraitsTab.tsx +102 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/CollisionDetector.tsx +195 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/DialogueBox.tsx +279 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GameCanvas.tsx +550 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GameControls.tsx +173 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GameHud.tsx +135 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GameMenu.tsx +188 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GameOverScreen.tsx +241 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/GamePauseOverlay.tsx +158 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/InputListener.tsx +161 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/InventoryPanel.tsx +230 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/LevelSelect.tsx +236 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/TilemapRenderer.tsx +233 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/game/index.ts +28 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/index.ts +83 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/layout/DashboardGrid.tsx +94 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/layout/MasterDetail.tsx +93 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/layout/SplitPane.tsx +136 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/layout/TabbedContainer.tsx +162 -0
- package/shells/typescript-shell/packages/client/src/components/organisms/layout/index.ts +10 -0
- package/shells/typescript-shell/packages/client/src/components/templates/AuthLayout.tsx +125 -0
- package/shells/typescript-shell/packages/client/src/components/templates/CounterTemplate.tsx +224 -0
- package/shells/typescript-shell/packages/client/src/components/templates/CrudTemplate.tsx +511 -0
- package/shells/typescript-shell/packages/client/src/components/templates/DashboardLayout.tsx +295 -0
- package/shells/typescript-shell/packages/client/src/components/templates/FormTemplate.tsx +328 -0
- package/shells/typescript-shell/packages/client/src/components/templates/GameTemplate.tsx +142 -0
- package/shells/typescript-shell/packages/client/src/components/templates/GenericAppTemplate.tsx +79 -0
- package/shells/typescript-shell/packages/client/src/components/templates/ListTemplate.tsx +361 -0
- package/shells/typescript-shell/packages/client/src/components/templates/SettingsTemplate.tsx +459 -0
- package/shells/typescript-shell/packages/client/src/components/templates/index.ts +54 -0
- package/shells/typescript-shell/packages/client/src/config/firebase.ts +58 -0
- package/shells/typescript-shell/packages/client/src/context/DesignThemeContext.tsx +40 -0
- package/shells/typescript-shell/packages/client/src/context/ThemeContext.tsx +321 -0
- package/shells/typescript-shell/packages/client/src/context/UISlotContext.tsx +143 -0
- package/shells/typescript-shell/packages/client/src/context/UserContext.tsx +259 -0
- package/shells/typescript-shell/packages/client/src/context/index.ts +44 -0
- package/shells/typescript-shell/packages/client/src/evaluator/SExpressionEvaluator.ts +715 -0
- package/shells/typescript-shell/packages/client/src/evaluator/context.ts +196 -0
- package/shells/typescript-shell/packages/client/src/evaluator/index.ts +52 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/arithmetic.ts +120 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/collections.ts +177 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/comparison.ts +130 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/control.ts +86 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/effects.ts +285 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/index.ts +69 -0
- package/shells/typescript-shell/packages/client/src/evaluator/operators/logic.ts +66 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/array.ts +657 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/async.ts +210 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/format.ts +224 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/index.ts +206 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/math.ts +219 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/object.ts +435 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/str.ts +372 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/time.ts +594 -0
- package/shells/typescript-shell/packages/client/src/evaluator/std/validate.ts +445 -0
- package/shells/typescript-shell/packages/client/src/evaluator/types/expression.ts +297 -0
- package/shells/typescript-shell/packages/client/src/features/auth/AuthContext.tsx +192 -0
- package/shells/typescript-shell/packages/client/src/features/auth/authService.ts +90 -0
- package/shells/typescript-shell/packages/client/src/features/auth/components/Login.tsx +282 -0
- package/shells/typescript-shell/packages/client/src/features/auth/components/ProtectedRoute.tsx +28 -0
- package/shells/typescript-shell/packages/client/src/features/auth/components/UserProfile.tsx +52 -0
- package/shells/typescript-shell/packages/client/src/features/auth/components/index.ts +3 -0
- package/shells/typescript-shell/packages/client/src/features/auth/index.ts +4 -0
- package/shells/typescript-shell/packages/client/src/features/auth/types.ts +33 -0
- package/shells/typescript-shell/packages/client/src/hooks/event-bus-types.ts +70 -0
- package/shells/typescript-shell/packages/client/src/hooks/index.ts +84 -0
- package/shells/typescript-shell/packages/client/src/hooks/useEntities.ts +118 -0
- package/shells/typescript-shell/packages/client/src/hooks/useEntityData.ts +288 -0
- package/shells/typescript-shell/packages/client/src/hooks/useEntityMutations.ts +258 -0
- package/shells/typescript-shell/packages/client/src/hooks/useEventBus.ts +166 -0
- package/shells/typescript-shell/packages/client/src/hooks/useOrbitalMutations.ts +234 -0
- package/shells/typescript-shell/packages/client/src/hooks/useQuerySingleton.ts +179 -0
- package/shells/typescript-shell/packages/client/src/hooks/useUIEvents.ts +228 -0
- package/shells/typescript-shell/packages/client/src/hooks/useUISlots.ts +320 -0
- package/shells/typescript-shell/packages/client/src/index.css +15 -0
- package/shells/typescript-shell/packages/client/src/lib/api-client.ts +134 -0
- package/shells/typescript-shell/packages/client/src/lib/cn.ts +10 -0
- package/shells/typescript-shell/packages/client/src/lib/debug.ts +114 -0
- package/shells/typescript-shell/packages/client/src/lib/debugRegistry.ts +108 -0
- package/shells/typescript-shell/packages/client/src/lib/debugUtils.ts +62 -0
- package/shells/typescript-shell/packages/client/src/lib/entityDebug.ts +79 -0
- package/shells/typescript-shell/packages/client/src/lib/guardRegistry.ts +79 -0
- package/shells/typescript-shell/packages/client/src/lib/tickRegistry.ts +86 -0
- package/shells/typescript-shell/packages/client/src/lib/traitRegistry.ts +84 -0
- package/shells/typescript-shell/packages/client/src/loaders/AssetLoader.ts +315 -0
- package/shells/typescript-shell/packages/client/src/loaders/index.ts +17 -0
- package/shells/typescript-shell/packages/client/src/main.tsx +24 -0
- package/shells/typescript-shell/packages/client/src/pages/index.ts +2 -0
- package/shells/typescript-shell/packages/client/src/providers/EventBusProvider.tsx +212 -0
- package/shells/typescript-shell/packages/client/src/providers/FetchedDataProvider.tsx +280 -0
- package/shells/typescript-shell/packages/client/src/providers/OrbitalProvider.tsx +136 -0
- package/shells/typescript-shell/packages/client/src/providers/SelectionProvider.tsx +232 -0
- package/shells/typescript-shell/packages/client/src/providers/index.ts +31 -0
- package/shells/typescript-shell/packages/client/src/renderer/client-effect-executor.ts +267 -0
- package/shells/typescript-shell/packages/client/src/renderer/data-resolver.ts +253 -0
- package/shells/typescript-shell/packages/client/src/renderer/index.ts +138 -0
- package/shells/typescript-shell/packages/client/src/renderer/offline-executor.ts +610 -0
- package/shells/typescript-shell/packages/client/src/renderer/pattern-resolver.ts +209 -0
- package/shells/typescript-shell/packages/client/src/renderer/slot-definitions.ts +154 -0
- package/shells/typescript-shell/packages/client/src/renderer/types.ts +214 -0
- package/shells/typescript-shell/packages/client/src/renderer/useClientEffects.ts +236 -0
- package/shells/typescript-shell/packages/client/src/stores/entityStore.ts +233 -0
- package/shells/typescript-shell/packages/client/src/stores/filtering.ts +180 -0
- package/shells/typescript-shell/packages/client/src/stores/index.ts +11 -0
- package/shells/typescript-shell/packages/client/src/test/setup.ts +126 -0
- package/shells/typescript-shell/packages/client/src/themes/almadar.css +196 -0
- package/shells/typescript-shell/packages/client/src/themes/index.css +11 -0
- package/shells/typescript-shell/packages/client/src/themes/minimalist.css +193 -0
- package/shells/typescript-shell/packages/client/src/themes/wireframe.css +188 -0
- package/shells/typescript-shell/packages/client/src/types/__tests__/event-contracts.test.ts +204 -0
- package/shells/typescript-shell/packages/client/src/types/event-contracts.ts +267 -0
- package/shells/typescript-shell/packages/client/tailwind.config.js +55 -0
- package/shells/typescript-shell/packages/client/tsconfig.json +33 -0
- package/shells/typescript-shell/packages/client/tsconfig.node.json +12 -0
- package/shells/typescript-shell/packages/client/vite.config.d.ts +3 -0
- package/shells/typescript-shell/packages/client/vite.config.d.ts.map +1 -0
- package/shells/typescript-shell/packages/client/vite.config.js +43 -0
- package/shells/typescript-shell/packages/client/vite.config.js.map +1 -0
- package/shells/typescript-shell/packages/client/vite.config.ts +48 -0
- package/shells/typescript-shell/packages/server/.env.development +8 -0
- package/shells/typescript-shell/packages/server/.env.example +22 -0
- package/shells/typescript-shell/packages/server/package.json +41 -0
- package/shells/typescript-shell/packages/server/src/__tests__/integration.test.ts +23 -0
- package/shells/typescript-shell/packages/server/src/app.ts +53 -0
- package/shells/typescript-shell/packages/server/src/features/.gitkeep +10 -0
- package/shells/typescript-shell/packages/server/src/index.ts +60 -0
- package/shells/typescript-shell/packages/server/src/integrators/INTEGRATORS.md +357 -0
- package/shells/typescript-shell/packages/server/src/integrators/__tests__/registry.test.ts +419 -0
- package/shells/typescript-shell/packages/server/src/integrators/__tests__/types.test.ts +382 -0
- package/shells/typescript-shell/packages/server/src/integrators/__tests__/youtube.closed-circuit.test.ts +454 -0
- package/shells/typescript-shell/packages/server/src/integrators/__tests__/youtube.test.ts +519 -0
- package/shells/typescript-shell/packages/server/src/integrators/index.ts +67 -0
- package/shells/typescript-shell/packages/server/src/integrators/llm.ts +585 -0
- package/shells/typescript-shell/packages/server/src/integrators/registry.ts +318 -0
- package/shells/typescript-shell/packages/server/src/integrators/types.ts +248 -0
- package/shells/typescript-shell/packages/server/src/integrators/youtube.ts +614 -0
- package/shells/typescript-shell/packages/server/src/lib/db.ts +130 -0
- package/shells/typescript-shell/packages/server/src/lib/env.ts +47 -0
- package/shells/typescript-shell/packages/server/src/lib/eventBus.ts +80 -0
- package/shells/typescript-shell/packages/server/src/lib/index.ts +10 -0
- package/shells/typescript-shell/packages/server/src/lib/logger.ts +48 -0
- package/shells/typescript-shell/packages/server/src/lib/websocket.ts +161 -0
- package/shells/typescript-shell/packages/server/src/middleware/authenticateFirebase.ts +29 -0
- package/shells/typescript-shell/packages/server/src/middleware/errorHandler.ts +135 -0
- package/shells/typescript-shell/packages/server/src/middleware/index.ts +15 -0
- package/shells/typescript-shell/packages/server/src/middleware/validation.ts +77 -0
- package/shells/typescript-shell/packages/server/src/routes/__tests__/orbitals.e2e.test.ts +405 -0
- package/shells/typescript-shell/packages/server/src/routes/features/.gitkeep +0 -0
- package/shells/typescript-shell/packages/server/src/routes/index.ts +11 -0
- package/shells/typescript-shell/packages/server/src/routes/orbitals.ts +138 -0
- package/shells/typescript-shell/packages/server/src/routes/register.ts +19 -0
- package/shells/typescript-shell/packages/server/src/routes.ts +58 -0
- package/shells/typescript-shell/packages/server/src/seedMockData.ts +27 -0
- package/shells/typescript-shell/packages/server/src/services/DataService.ts +402 -0
- package/shells/typescript-shell/packages/server/src/services/MockDataService.ts +347 -0
- package/shells/typescript-shell/packages/server/src/services/index.ts +8 -0
- package/shells/typescript-shell/packages/server/src/types/express.d.ts +13 -0
- package/shells/typescript-shell/packages/server/src/utils/index.ts +9 -0
- package/shells/typescript-shell/packages/server/src/utils/queryFilters.ts +231 -0
- package/shells/typescript-shell/packages/server/tsconfig.json +28 -0
- package/shells/typescript-shell/packages/shared/package.json +22 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/atom-demo.test.ts +61 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/container-demo.test.ts +43 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/content-item.test.ts +55 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/game-state.test.ts +67 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/layout-demo.test.ts +43 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/modal-item.test.ts +49 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/molecule-demo.test.ts +55 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/nav-item.test.ts +55 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/product.test.ts +78 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/project.test.ts +85 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/searchable-item.test.ts +61 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/state-demo.test.ts +43 -0
- package/shells/typescript-shell/packages/shared/src/__tests__/entities/wizard-data.test.ts +61 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/SExpressionEvaluator.ts +715 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/context.ts +196 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/index.ts +52 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/arithmetic.ts +120 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/collections.ts +177 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/comparison.ts +130 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/control.ts +86 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/effects.ts +285 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/index.ts +69 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/operators/logic.ts +66 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/array.ts +657 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/async.ts +210 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/format.ts +224 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/index.ts +206 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/math.ts +219 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/object.ts +435 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/str.ts +372 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/time.ts +594 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/std/validate.ts +445 -0
- package/shells/typescript-shell/packages/shared/src/evaluator/types/expression.ts +297 -0
- package/shells/typescript-shell/packages/shared/src/index.ts +12 -0
- package/shells/typescript-shell/packages/shared/src/schemas/entities.ts +13 -0
- package/shells/typescript-shell/packages/shared/src/types/entities.ts +321 -0
- package/shells/typescript-shell/packages/shared/src/types/events.ts +82 -0
- package/shells/typescript-shell/packages/shared/tsconfig.json +16 -0
- package/shells/typescript-shell/tests/setup.ts +22 -0
- package/shells/typescript-shell/tsconfig.base.json +21 -0
- package/shells/typescript-shell/tsconfig.json +13 -0
- package/shells/typescript-shell/vitest.config.ts +54 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Generated Traits Integration Tests
|
|
3
|
+
|
|
4
|
+
Tests that generated trait routes work correctly:
|
|
5
|
+
- State endpoints return valid states
|
|
6
|
+
- INIT events transition from idle to ready
|
|
7
|
+
- Effects are returned in correct format
|
|
8
|
+
- State transitions happen properly
|
|
9
|
+
|
|
10
|
+
These tests are designed to work with any generated Orbital app.
|
|
11
|
+
"""
|
|
12
|
+
import pytest
|
|
13
|
+
from typing import List, Dict, Any
|
|
14
|
+
from fastapi.testclient import TestClient
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestGeneratedTraitRoutes:
|
|
18
|
+
"""Test that generated trait routes work correctly."""
|
|
19
|
+
|
|
20
|
+
def get_trait_routes(self, client: TestClient) -> List[str]:
|
|
21
|
+
"""Get all trait route prefixes from OpenAPI schema."""
|
|
22
|
+
response = client.get("/openapi.json")
|
|
23
|
+
assert response.status_code == 200
|
|
24
|
+
paths = response.json().get("paths", {})
|
|
25
|
+
|
|
26
|
+
# Find unique trait prefixes (e.g., /api/neural_network_manager)
|
|
27
|
+
prefixes = set()
|
|
28
|
+
for path in paths.keys():
|
|
29
|
+
if path.startswith("/api/") and "/events/" in path:
|
|
30
|
+
# Extract prefix before /events/
|
|
31
|
+
prefix = path.split("/events/")[0]
|
|
32
|
+
prefixes.add(prefix)
|
|
33
|
+
|
|
34
|
+
return list(prefixes)
|
|
35
|
+
|
|
36
|
+
def test_all_traits_have_state_endpoint(self, test_client: TestClient):
|
|
37
|
+
"""All generated traits have a /state endpoint."""
|
|
38
|
+
trait_prefixes = self.get_trait_routes(test_client)
|
|
39
|
+
|
|
40
|
+
for prefix in trait_prefixes:
|
|
41
|
+
response = test_client.get(f"{prefix}/state")
|
|
42
|
+
assert response.status_code == 200, f"State endpoint failed for {prefix}"
|
|
43
|
+
data = response.json()
|
|
44
|
+
assert "state" in data, f"State response missing 'state' field for {prefix}"
|
|
45
|
+
|
|
46
|
+
def test_state_endpoint_returns_valid_state(self, test_client: TestClient):
|
|
47
|
+
"""State endpoints return valid state names."""
|
|
48
|
+
trait_prefixes = self.get_trait_routes(test_client)
|
|
49
|
+
|
|
50
|
+
for prefix in trait_prefixes:
|
|
51
|
+
response = test_client.get(f"{prefix}/state")
|
|
52
|
+
data = response.json()
|
|
53
|
+
# State should be a string
|
|
54
|
+
assert isinstance(data["state"], str), f"State should be string for {prefix}"
|
|
55
|
+
# State should not be empty
|
|
56
|
+
assert len(data["state"]) > 0, f"State should not be empty for {prefix}"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TestINITEvent:
|
|
60
|
+
"""Test INIT event handling for traits that have it."""
|
|
61
|
+
|
|
62
|
+
def get_init_routes(self, client: TestClient) -> List[str]:
|
|
63
|
+
"""Get all trait routes that have INIT event."""
|
|
64
|
+
response = client.get("/openapi.json")
|
|
65
|
+
paths = response.json().get("paths", {})
|
|
66
|
+
return [path for path in paths.keys() if "/events/init" in path]
|
|
67
|
+
|
|
68
|
+
def test_init_event_works(self, test_client: TestClient):
|
|
69
|
+
"""INIT event transitions trait from idle state."""
|
|
70
|
+
init_routes = self.get_init_routes(test_client)
|
|
71
|
+
|
|
72
|
+
for route in init_routes:
|
|
73
|
+
# Extract trait prefix for state check
|
|
74
|
+
prefix = route.split("/events/")[0]
|
|
75
|
+
|
|
76
|
+
# Get initial state
|
|
77
|
+
state_response = test_client.get(f"{prefix}/state")
|
|
78
|
+
initial_state = state_response.json()["state"]
|
|
79
|
+
|
|
80
|
+
# Call INIT
|
|
81
|
+
response = test_client.post(
|
|
82
|
+
route,
|
|
83
|
+
json={"payload": {}, "entity_id": "test-entity-1"},
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
assert response.status_code == 200, f"INIT failed for {route}"
|
|
87
|
+
data = response.json()
|
|
88
|
+
|
|
89
|
+
# Check response format
|
|
90
|
+
assert "success" in data, f"Response missing 'success' for {route}"
|
|
91
|
+
assert "effects" in data, f"Response missing 'effects' for {route}"
|
|
92
|
+
assert "state" in data, f"Response missing 'state' for {route}"
|
|
93
|
+
|
|
94
|
+
def test_init_returns_effects(self, test_client: TestClient):
|
|
95
|
+
"""INIT event returns render-ui effects with action buttons."""
|
|
96
|
+
init_routes = self.get_init_routes(test_client)
|
|
97
|
+
|
|
98
|
+
for route in init_routes:
|
|
99
|
+
response = test_client.post(
|
|
100
|
+
route,
|
|
101
|
+
json={"payload": {}, "entity_id": "test-entity-2"},
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
if response.status_code == 200:
|
|
105
|
+
data = response.json()
|
|
106
|
+
if data.get("success"):
|
|
107
|
+
effects = data.get("effects", [])
|
|
108
|
+
# Check effect format
|
|
109
|
+
for effect in effects:
|
|
110
|
+
assert isinstance(effect, dict), f"Effect should be dict for {route}"
|
|
111
|
+
assert "type" in effect, f"Effect missing 'type' for {route}"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class TestEffectFormat:
|
|
115
|
+
"""Test that effects are in the correct format."""
|
|
116
|
+
|
|
117
|
+
def test_notify_effect_format(self):
|
|
118
|
+
"""Notify effects have correct structure."""
|
|
119
|
+
from orbital_app.generated.effect_helpers import notify
|
|
120
|
+
|
|
121
|
+
effect = notify("Test message", "Info")
|
|
122
|
+
|
|
123
|
+
assert effect["type"] == "notify"
|
|
124
|
+
assert effect["message"] == "Test message"
|
|
125
|
+
assert effect["severity"] == "Info"
|
|
126
|
+
|
|
127
|
+
def test_render_ui_effect_format(self):
|
|
128
|
+
"""Render-ui effects have correct structure."""
|
|
129
|
+
from orbital_app.generated.effect_helpers import render_ui
|
|
130
|
+
|
|
131
|
+
effect = render_ui("main", {"pattern_type": "card"})
|
|
132
|
+
|
|
133
|
+
assert effect["type"] == "render-ui"
|
|
134
|
+
assert effect["slot"] == "main"
|
|
135
|
+
assert effect["data"]["pattern_type"] == "card"
|
|
136
|
+
|
|
137
|
+
def test_navigate_effect_format(self):
|
|
138
|
+
"""Navigate effects have correct structure."""
|
|
139
|
+
from orbital_app.generated.effect_helpers import navigate
|
|
140
|
+
|
|
141
|
+
effect = navigate("/dashboard", {"id": "123"})
|
|
142
|
+
|
|
143
|
+
assert effect["type"] == "navigate"
|
|
144
|
+
assert effect["path"] == "/dashboard"
|
|
145
|
+
assert effect["params"]["id"] == "123"
|
|
146
|
+
|
|
147
|
+
def test_emit_effect_format(self):
|
|
148
|
+
"""Emit effects have correct structure."""
|
|
149
|
+
from orbital_app.generated.effect_helpers import emit
|
|
150
|
+
|
|
151
|
+
effect = emit("user:created", {"userId": "123"})
|
|
152
|
+
|
|
153
|
+
assert effect["type"] == "emit"
|
|
154
|
+
assert effect["event"] == "user:created"
|
|
155
|
+
assert effect["data"]["userId"] == "123"
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class TestEventRequest:
|
|
159
|
+
"""Test event request validation."""
|
|
160
|
+
|
|
161
|
+
def get_any_event_route(self, client: TestClient) -> str:
|
|
162
|
+
"""Get any event route for testing."""
|
|
163
|
+
response = client.get("/openapi.json")
|
|
164
|
+
paths = response.json().get("paths", {})
|
|
165
|
+
for path in paths.keys():
|
|
166
|
+
if "/events/" in path:
|
|
167
|
+
return path
|
|
168
|
+
return None
|
|
169
|
+
|
|
170
|
+
def test_event_requires_entity_id(self, test_client: TestClient):
|
|
171
|
+
"""Event requests require entity_id."""
|
|
172
|
+
route = self.get_any_event_route(test_client)
|
|
173
|
+
if not route:
|
|
174
|
+
pytest.skip("No event routes found")
|
|
175
|
+
|
|
176
|
+
response = test_client.post(
|
|
177
|
+
route,
|
|
178
|
+
json={"payload": {}}, # Missing entity_id
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
# Should fail validation
|
|
182
|
+
assert response.status_code == 422
|
|
183
|
+
|
|
184
|
+
def test_event_accepts_payload(self, test_client: TestClient):
|
|
185
|
+
"""Event requests accept optional payload."""
|
|
186
|
+
route = self.get_any_event_route(test_client)
|
|
187
|
+
if not route:
|
|
188
|
+
pytest.skip("No event routes found")
|
|
189
|
+
|
|
190
|
+
response = test_client.post(
|
|
191
|
+
route,
|
|
192
|
+
json={
|
|
193
|
+
"payload": {"key": "value"},
|
|
194
|
+
"entity_id": "test-entity",
|
|
195
|
+
},
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Should not fail on payload format
|
|
199
|
+
assert response.status_code in (200, 400, 500) # May fail for business logic reasons
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class TestWebSocketBroadcast:
|
|
203
|
+
"""Test WebSocket broadcasting of effects."""
|
|
204
|
+
|
|
205
|
+
def test_websocket_connect(self, test_client: TestClient):
|
|
206
|
+
"""Can connect to global WebSocket."""
|
|
207
|
+
with test_client.websocket_connect("/ws") as ws:
|
|
208
|
+
ws.send_text("ping")
|
|
209
|
+
response = ws.receive_text()
|
|
210
|
+
assert response == "pong"
|
|
211
|
+
|
|
212
|
+
def test_websocket_entity_connect(self, test_client: TestClient):
|
|
213
|
+
"""Can connect to entity-specific WebSocket."""
|
|
214
|
+
with test_client.websocket_connect("/ws/test_trait/test-123") as ws:
|
|
215
|
+
ws.send_text("ping")
|
|
216
|
+
response = ws.receive_text()
|
|
217
|
+
assert response == "pong"
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class TestStateTransitions:
|
|
221
|
+
"""Test state machine transitions."""
|
|
222
|
+
|
|
223
|
+
def get_trait_with_multiple_events(self, client: TestClient) -> Dict[str, Any]:
|
|
224
|
+
"""Find a trait with multiple events to test transitions."""
|
|
225
|
+
response = client.get("/openapi.json")
|
|
226
|
+
paths = response.json().get("paths", {})
|
|
227
|
+
|
|
228
|
+
# Group events by trait
|
|
229
|
+
trait_events: Dict[str, List[str]] = {}
|
|
230
|
+
for path in paths.keys():
|
|
231
|
+
if "/events/" in path:
|
|
232
|
+
parts = path.split("/events/")
|
|
233
|
+
prefix = parts[0]
|
|
234
|
+
event = parts[1]
|
|
235
|
+
if prefix not in trait_events:
|
|
236
|
+
trait_events[prefix] = []
|
|
237
|
+
trait_events[prefix].append(event)
|
|
238
|
+
|
|
239
|
+
# Find trait with multiple events
|
|
240
|
+
for prefix, events in trait_events.items():
|
|
241
|
+
if len(events) > 1:
|
|
242
|
+
return {"prefix": prefix, "events": events}
|
|
243
|
+
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
def test_state_changes_after_event(self, test_client: TestClient):
|
|
247
|
+
"""State changes after processing an event."""
|
|
248
|
+
trait_info = self.get_trait_with_multiple_events(test_client)
|
|
249
|
+
if not trait_info:
|
|
250
|
+
pytest.skip("No trait with multiple events found")
|
|
251
|
+
|
|
252
|
+
prefix = trait_info["prefix"]
|
|
253
|
+
|
|
254
|
+
# Get initial state
|
|
255
|
+
initial = test_client.get(f"{prefix}/state").json()["state"]
|
|
256
|
+
|
|
257
|
+
# If there's an init event, call it
|
|
258
|
+
if "init" in trait_info["events"]:
|
|
259
|
+
response = test_client.post(
|
|
260
|
+
f"{prefix}/events/init",
|
|
261
|
+
json={"payload": {}, "entity_id": "transition-test"},
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
if response.status_code == 200 and response.json().get("success"):
|
|
265
|
+
# Check state changed
|
|
266
|
+
new_state = test_client.get(f"{prefix}/state").json()["state"]
|
|
267
|
+
# State should have changed or stayed same (depending on current state)
|
|
268
|
+
assert isinstance(new_state, str)
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Integration Tests for Orbital Python Shell
|
|
3
|
+
|
|
4
|
+
Tests the full request/response cycle including:
|
|
5
|
+
- HTTP API endpoints
|
|
6
|
+
- WebSocket connections
|
|
7
|
+
- Event processing and effects
|
|
8
|
+
- State management
|
|
9
|
+
"""
|
|
10
|
+
import pytest
|
|
11
|
+
import asyncio
|
|
12
|
+
from typing import List, Any, Dict
|
|
13
|
+
from fastapi.testclient import TestClient
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestHealthCheck:
|
|
17
|
+
"""Test the health check endpoint."""
|
|
18
|
+
|
|
19
|
+
def test_health_check_returns_200(self, test_client: TestClient):
|
|
20
|
+
"""Health endpoint returns 200 status."""
|
|
21
|
+
response = test_client.get("/health")
|
|
22
|
+
assert response.status_code == 200
|
|
23
|
+
|
|
24
|
+
def test_health_check_returns_healthy_status(self, test_client: TestClient):
|
|
25
|
+
"""Health endpoint returns healthy status."""
|
|
26
|
+
response = test_client.get("/health")
|
|
27
|
+
data = response.json()
|
|
28
|
+
assert data["status"] == "healthy"
|
|
29
|
+
assert "version" in data
|
|
30
|
+
assert "environment" in data
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TestEventAPIRoutes:
|
|
34
|
+
"""Test that event API routes are registered."""
|
|
35
|
+
|
|
36
|
+
def test_openapi_schema_available(self, test_client: TestClient):
|
|
37
|
+
"""OpenAPI schema is available."""
|
|
38
|
+
response = test_client.get("/openapi.json")
|
|
39
|
+
assert response.status_code == 200
|
|
40
|
+
data = response.json()
|
|
41
|
+
assert "paths" in data
|
|
42
|
+
|
|
43
|
+
def test_api_routes_registered(self, test_client: TestClient):
|
|
44
|
+
"""API routes are registered in OpenAPI schema."""
|
|
45
|
+
response = test_client.get("/openapi.json")
|
|
46
|
+
data = response.json()
|
|
47
|
+
paths = list(data.get("paths", {}).keys())
|
|
48
|
+
|
|
49
|
+
# Should have at least health and some API routes
|
|
50
|
+
assert "/health" in paths
|
|
51
|
+
# Check for example task routes (from shell template)
|
|
52
|
+
api_routes = [p for p in paths if p.startswith("/api/")]
|
|
53
|
+
assert len(api_routes) > 0, "Should have API routes registered"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TestExampleTaskRoutes:
|
|
57
|
+
"""Test the example task routes from shell template (if present)."""
|
|
58
|
+
|
|
59
|
+
def _has_task_routes(self, client: TestClient) -> bool:
|
|
60
|
+
"""Check if example task routes exist."""
|
|
61
|
+
response = client.get("/openapi.json")
|
|
62
|
+
paths = response.json().get("paths", {})
|
|
63
|
+
return "/api/tasks/create" in paths
|
|
64
|
+
|
|
65
|
+
def test_create_task_requires_auth(self, test_client: TestClient):
|
|
66
|
+
"""Create task endpoint requires authentication."""
|
|
67
|
+
if not self._has_task_routes(test_client):
|
|
68
|
+
pytest.skip("Example task routes not present in this app")
|
|
69
|
+
|
|
70
|
+
response = test_client.post(
|
|
71
|
+
"/api/tasks/create",
|
|
72
|
+
json={"payload": {"name": "Test Task"}},
|
|
73
|
+
)
|
|
74
|
+
assert response.status_code == 401
|
|
75
|
+
|
|
76
|
+
def test_complete_task_not_found(self, test_client: TestClient):
|
|
77
|
+
"""Complete task returns 404 for non-existent task."""
|
|
78
|
+
if not self._has_task_routes(test_client):
|
|
79
|
+
pytest.skip("Example task routes not present in this app")
|
|
80
|
+
|
|
81
|
+
response = test_client.post(
|
|
82
|
+
"/api/tasks/non-existent-id/complete",
|
|
83
|
+
json={"payload": {"timestamp": "2024-01-01T00:00:00Z"}},
|
|
84
|
+
)
|
|
85
|
+
assert response.status_code == 404
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class TestWebSocket:
|
|
89
|
+
"""Test WebSocket connections."""
|
|
90
|
+
|
|
91
|
+
def test_websocket_global_connect(self, test_client: TestClient):
|
|
92
|
+
"""Can connect to global WebSocket endpoint."""
|
|
93
|
+
with test_client.websocket_connect("/ws") as websocket:
|
|
94
|
+
websocket.send_text("ping")
|
|
95
|
+
data = websocket.receive_text()
|
|
96
|
+
assert data == "pong"
|
|
97
|
+
|
|
98
|
+
def test_websocket_entity_connect(self, test_client: TestClient):
|
|
99
|
+
"""Can connect to entity-specific WebSocket endpoint."""
|
|
100
|
+
with test_client.websocket_connect("/ws/tasks/123") as websocket:
|
|
101
|
+
websocket.send_text("ping")
|
|
102
|
+
data = websocket.receive_text()
|
|
103
|
+
assert data == "pong"
|
|
104
|
+
|
|
105
|
+
def test_websocket_multiple_pings(self, test_client: TestClient):
|
|
106
|
+
"""WebSocket handles multiple ping/pong exchanges."""
|
|
107
|
+
with test_client.websocket_connect("/ws") as websocket:
|
|
108
|
+
for _ in range(3):
|
|
109
|
+
websocket.send_text("ping")
|
|
110
|
+
data = websocket.receive_text()
|
|
111
|
+
assert data == "pong"
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class TestConnectionManager:
|
|
115
|
+
"""Test WebSocket connection manager directly."""
|
|
116
|
+
|
|
117
|
+
@pytest.mark.asyncio
|
|
118
|
+
async def test_connection_manager_init(self):
|
|
119
|
+
"""Connection manager initializes correctly."""
|
|
120
|
+
from orbital_app.core.websocket import ConnectionManager
|
|
121
|
+
manager = ConnectionManager()
|
|
122
|
+
assert manager.active_connections == {}
|
|
123
|
+
assert manager.global_connections == []
|
|
124
|
+
|
|
125
|
+
@pytest.mark.asyncio
|
|
126
|
+
async def test_broadcast_without_connections(self):
|
|
127
|
+
"""Broadcast doesn't fail without connections."""
|
|
128
|
+
from orbital_app.core.websocket import ConnectionManager
|
|
129
|
+
manager = ConnectionManager()
|
|
130
|
+
|
|
131
|
+
# Should not raise
|
|
132
|
+
await manager.broadcast_client_effects(
|
|
133
|
+
entity_type="tasks",
|
|
134
|
+
entity_id="123",
|
|
135
|
+
event="complete",
|
|
136
|
+
client_effects=[["notify", {"message": "Test"}]],
|
|
137
|
+
data={"tasks": {"id": "123"}},
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
@pytest.mark.asyncio
|
|
141
|
+
async def test_broadcast_global(self):
|
|
142
|
+
"""Global broadcast doesn't fail."""
|
|
143
|
+
from orbital_app.core.websocket import ConnectionManager
|
|
144
|
+
manager = ConnectionManager()
|
|
145
|
+
|
|
146
|
+
await manager.broadcast_global({"type": "test", "data": {}})
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class TestEventResponse:
|
|
150
|
+
"""Test event response format."""
|
|
151
|
+
|
|
152
|
+
def test_event_response_model(self):
|
|
153
|
+
"""EventResponse model has correct fields."""
|
|
154
|
+
from orbital_app.core.event_router import EventResponse
|
|
155
|
+
|
|
156
|
+
response = EventResponse(
|
|
157
|
+
success=True,
|
|
158
|
+
newState="completed",
|
|
159
|
+
data={"test": "data"},
|
|
160
|
+
clientEffects=[["notify", {"message": "Done"}]],
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
assert response.success is True
|
|
164
|
+
assert response.newState == "completed"
|
|
165
|
+
assert response.data == {"test": "data"}
|
|
166
|
+
assert len(response.clientEffects) == 1
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class TestClientEffectsFormat:
|
|
170
|
+
"""Test that client effects are properly formatted."""
|
|
171
|
+
|
|
172
|
+
def test_client_effects_json_serializable(self):
|
|
173
|
+
"""All client effects must be JSON serializable."""
|
|
174
|
+
import json
|
|
175
|
+
|
|
176
|
+
effects: List[Any] = [
|
|
177
|
+
["render-ui", "main", {"type": "entity-detail", "entity": "Task"}],
|
|
178
|
+
["navigate", "/tasks/123"],
|
|
179
|
+
["notify", {"type": "success", "message": "Done!"}],
|
|
180
|
+
["emit", "task:completed", {"taskId": "123"}],
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
# Should not raise
|
|
184
|
+
serialized = json.dumps(effects)
|
|
185
|
+
deserialized = json.loads(serialized)
|
|
186
|
+
assert deserialized == effects
|
|
187
|
+
|
|
188
|
+
def test_nested_effects_serializable(self):
|
|
189
|
+
"""Nested effect data is JSON serializable."""
|
|
190
|
+
import json
|
|
191
|
+
|
|
192
|
+
effect = [
|
|
193
|
+
"render-ui",
|
|
194
|
+
"main",
|
|
195
|
+
{
|
|
196
|
+
"pattern_type": "stats",
|
|
197
|
+
"config": {
|
|
198
|
+
"items": [
|
|
199
|
+
{"label": "Status", "value": "ready"},
|
|
200
|
+
{"label": "Count", "value": 42},
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
serialized = json.dumps(effect)
|
|
207
|
+
deserialized = json.loads(serialized)
|
|
208
|
+
assert deserialized == effect
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class TestCORSConfiguration:
|
|
212
|
+
"""Test CORS is properly configured."""
|
|
213
|
+
|
|
214
|
+
def test_cors_preflight(self, test_client: TestClient):
|
|
215
|
+
"""CORS preflight request is handled."""
|
|
216
|
+
response = test_client.options(
|
|
217
|
+
"/api/tasks/create",
|
|
218
|
+
headers={
|
|
219
|
+
"Origin": "http://localhost:3000",
|
|
220
|
+
"Access-Control-Request-Method": "POST",
|
|
221
|
+
},
|
|
222
|
+
)
|
|
223
|
+
# Should not be 404 - either 200/204 (allowed) or 405 (method not allowed for OPTIONS)
|
|
224
|
+
assert response.status_code in (200, 204, 405)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class TestEffectExecutor:
|
|
228
|
+
"""Test the effect executor."""
|
|
229
|
+
|
|
230
|
+
@pytest.mark.asyncio
|
|
231
|
+
async def test_effect_executor_init(self):
|
|
232
|
+
"""Effect executor initializes correctly."""
|
|
233
|
+
from orbital_app.core.effect_executor import EffectExecutor
|
|
234
|
+
from orbital_app.core.repository import InMemoryRepository
|
|
235
|
+
|
|
236
|
+
repo = InMemoryRepository()
|
|
237
|
+
executor = EffectExecutor(repo)
|
|
238
|
+
|
|
239
|
+
assert executor.data == {}
|
|
240
|
+
assert executor.client_effects == []
|
|
241
|
+
assert executor.effect_results == []
|
|
242
|
+
|
|
243
|
+
@pytest.mark.asyncio
|
|
244
|
+
async def test_effect_executor_client_effects(self):
|
|
245
|
+
"""Effect executor collects client effects."""
|
|
246
|
+
from orbital_app.core.effect_executor import EffectExecutor
|
|
247
|
+
from orbital_app.core.repository import InMemoryRepository
|
|
248
|
+
|
|
249
|
+
repo = InMemoryRepository()
|
|
250
|
+
executor = EffectExecutor(repo)
|
|
251
|
+
|
|
252
|
+
context = {"entity": {}, "payload": {}}
|
|
253
|
+
|
|
254
|
+
# Execute client-side effects
|
|
255
|
+
await executor.execute(["notify", {"message": "Test"}], context)
|
|
256
|
+
await executor.execute(["render-ui", "main", {"type": "card"}], context)
|
|
257
|
+
await executor.execute(["navigate", "/home"], context)
|
|
258
|
+
|
|
259
|
+
assert len(executor.client_effects) == 3
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class TestRepository:
|
|
263
|
+
"""Test the repository layer."""
|
|
264
|
+
|
|
265
|
+
@pytest.mark.asyncio
|
|
266
|
+
async def test_in_memory_repository_crud(self):
|
|
267
|
+
"""In-memory repository supports CRUD operations."""
|
|
268
|
+
from orbital_app.core.repository import InMemoryRepository
|
|
269
|
+
|
|
270
|
+
repo = InMemoryRepository()
|
|
271
|
+
|
|
272
|
+
# Create
|
|
273
|
+
entity = await repo.create("tasks", {"name": "Test Task", "status": "active"})
|
|
274
|
+
assert "id" in entity
|
|
275
|
+
assert entity["name"] == "Test Task"
|
|
276
|
+
|
|
277
|
+
# Read
|
|
278
|
+
fetched = await repo.get("tasks", entity["id"])
|
|
279
|
+
assert fetched is not None
|
|
280
|
+
assert fetched["name"] == "Test Task"
|
|
281
|
+
|
|
282
|
+
# Update
|
|
283
|
+
updated = await repo.update("tasks", entity["id"], {"status": "completed"})
|
|
284
|
+
assert updated["status"] == "completed"
|
|
285
|
+
|
|
286
|
+
# Delete
|
|
287
|
+
deleted = await repo.delete("tasks", entity["id"])
|
|
288
|
+
assert deleted is True
|
|
289
|
+
|
|
290
|
+
# Verify deleted
|
|
291
|
+
gone = await repo.get("tasks", entity["id"])
|
|
292
|
+
assert gone is None
|
|
293
|
+
|
|
294
|
+
@pytest.mark.asyncio
|
|
295
|
+
async def test_in_memory_repository_list(self):
|
|
296
|
+
"""In-memory repository supports listing entities."""
|
|
297
|
+
from orbital_app.core.repository import InMemoryRepository
|
|
298
|
+
|
|
299
|
+
repo = InMemoryRepository()
|
|
300
|
+
|
|
301
|
+
# Create multiple
|
|
302
|
+
await repo.create("tasks", {"name": "Task 1"})
|
|
303
|
+
await repo.create("tasks", {"name": "Task 2"})
|
|
304
|
+
await repo.create("tasks", {"name": "Task 3"})
|
|
305
|
+
|
|
306
|
+
# List all
|
|
307
|
+
tasks = await repo.list("tasks")
|
|
308
|
+
assert len(tasks) == 3
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
class TestEventBus:
|
|
312
|
+
"""Test the event bus."""
|
|
313
|
+
|
|
314
|
+
@pytest.mark.asyncio
|
|
315
|
+
async def test_event_bus_subscribe_emit(self):
|
|
316
|
+
"""Event bus handles subscribe and emit."""
|
|
317
|
+
from orbital_app.core.event_bus import EventBus
|
|
318
|
+
|
|
319
|
+
bus = EventBus()
|
|
320
|
+
received = []
|
|
321
|
+
|
|
322
|
+
def handler(payload):
|
|
323
|
+
received.append(payload)
|
|
324
|
+
|
|
325
|
+
bus.subscribe("test:event", handler)
|
|
326
|
+
await bus.emit("test:event", {"data": "test"})
|
|
327
|
+
|
|
328
|
+
assert len(received) == 1
|
|
329
|
+
assert received[0]["data"] == "test"
|
|
330
|
+
|
|
331
|
+
@pytest.mark.asyncio
|
|
332
|
+
async def test_event_bus_once(self):
|
|
333
|
+
"""Event bus once subscription only fires once."""
|
|
334
|
+
from orbital_app.core.event_bus import EventBus
|
|
335
|
+
|
|
336
|
+
bus = EventBus()
|
|
337
|
+
received = []
|
|
338
|
+
|
|
339
|
+
def handler(payload):
|
|
340
|
+
received.append(payload)
|
|
341
|
+
|
|
342
|
+
bus.subscribe("test:event", handler, once=True)
|
|
343
|
+
await bus.emit("test:event", {"n": 1})
|
|
344
|
+
await bus.emit("test:event", {"n": 2})
|
|
345
|
+
|
|
346
|
+
assert len(received) == 1
|
|
347
|
+
assert received[0]["n"] == 1
|