Evidence directory: /SHiREVault/Backup/OSBackups/SHIRE-LIMBFORGE-MANAGED-ANATOMY-INSPECTION-0009A-20260805T041340Z Application: /home/shire3d/ARMOR/agents/apps/limbforge Data root: /home/shire3d/ARMOR/data/limbforge Service: shire-limbforge-workspace.service Workspace: http://127.0.0.1:8787/agents/limbforge/ === SAFETY DECLARATION === - Inspection only - No graphical ARMOR restart - No service restart - No patient record writes - No project record writes - No session record writes - No measurement record writes - No image creation, cropping or replacement - No managed anatomy library installed in this stage - Design Forge measurement handoff is inspected but not enabled === CURRENT SERVICE STATE === enabled active ExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 /home/shire3d/ARMOR/agents/runtime/shire_specialist_workspace.py ; ignore_errors=no ; start_time=[Wed 2026-08-05 10:13:43 AWST] ; stop_time=[n/a] ; pid=2462810 ; code=(null) ; status=0/0 } WorkingDirectory=/home/shire3d/ARMOR User=ray Group=ray Id=shire-limbforge-workspace.service Description=SHiRE LimbForge Native Workspace LoadState=loaded ActiveState=active SubState=running FragmentPath=/etc/systemd/system/shire-limbforge-workspace.service === SERVICE UNIT === # /etc/systemd/system/shire-limbforge-workspace.service [Unit] Description=SHiRE LimbForge Native Workspace After=network-online.target shire-limbforge-canvas-gateway.service Wants=network-online.target Requires=shire-limbforge-canvas-gateway.service RequiresMountsFor=/SHiREVault [Service] Type=simple User=ray Group=ray WorkingDirectory=/home/shire3d/ARMOR EnvironmentFile=/etc/shire-agents/limbforge-workspace.env ExecStart=/usr/bin/python3 /home/shire3d/ARMOR/agents/runtime/shire_specialist_workspace.py Restart=on-failure RestartSec=3 NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=read-only ReadOnlyPaths=/home/shire3d/ARMOR/agents/apps/limbforge/dist/shire-module RestrictAddressFamilies=AF_UNIX AF_INET LockPersonality=true RestrictRealtime=true SystemCallArchitectures=native [Install] WantedBy=multi-user.target === WORKSPACE READ-ONLY HTTP PROBE === HTTP status: 200 Content type: text/html Redirect: === LIMBFORGE TOP-LEVEL INVENTORY === d /home/shire3d/ARMOR/agents/apps/limbforge/base44 d /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities d /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions d /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/acceptInvitation d /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake d /home/shire3d/ARMOR/agents/apps/limbforge/public d /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides d /home/shire3d/ARMOR/agents/apps/limbforge/scripts d /home/shire3d/ARMOR/agents/apps/limbforge/src d /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters d /home/shire3d/ARMOR/agents/apps/limbforge/src/api d /home/shire3d/ARMOR/agents/apps/limbforge/src/components d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/admin d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/builder d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/components d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/covers d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dashboard d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/manufacturing d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/orders d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/portal d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/projects d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2 d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop d /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d d /home/shire3d/ARMOR/agents/apps/limbforge/src/config d /home/shire3d/ARMOR/agents/apps/limbforge/src/hooks d /home/shire3d/ARMOR/agents/apps/limbforge/src/lib d /home/shire3d/ARMOR/agents/apps/limbforge/src/modes d /home/shire3d/ARMOR/agents/apps/limbforge/src/pages d /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin d /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder d /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal d /home/shire3d/ARMOR/agents/apps/limbforge/src/services d /home/shire3d/ARMOR/agents/apps/limbforge/src/shire d /home/shire3d/ARMOR/agents/apps/limbforge/src/utils f /home/shire3d/ARMOR/agents/apps/limbforge/.gitignore f /home/shire3d/ARMOR/agents/apps/limbforge/.npmrc f /home/shire3d/ARMOR/agents/apps/limbforge/AGENTS.md f /home/shire3d/ARMOR/agents/apps/limbforge/CLAUDE.md f /home/shire3d/ARMOR/agents/apps/limbforge/LEGACY_VIEWPORT_V1_FAILURE_REPORT.md f /home/shire3d/ARMOR/agents/apps/limbforge/README.md f /home/shire3d/ARMOR/agents/apps/limbforge/VIEWPORT_CORE_LOCK.md f /home/shire3d/ARMOR/agents/apps/limbforge/base44/config.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/AccessPoint.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/AssemblyComponent.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/AuditEvent.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CompletedCover.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Component.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ComponentDimension.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ComponentSpec.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CoverProject.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Customer.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/DesignConfiguration.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/EnvelopeStation.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ImplementationReport.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Invitation.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/KeepOutZone.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/LimbProfile.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ManufacturingJob.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementDefinition.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementSession.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementValue.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MovementPosition.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Notification.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Order.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/OssiguardProfile.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ProjectAssignment.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Prosthesis.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Quote.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Shipment.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/User.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/WorkshopAccount.jsonc f /home/shire3d/ARMOR/agents/apps/limbforge/components.json f /home/shire3d/ARMOR/agents/apps/limbforge/eslint.config.js f /home/shire3d/ARMOR/agents/apps/limbforge/index.html f /home/shire3d/ARMOR/agents/apps/limbforge/jsconfig.json f /home/shire3d/ARMOR/agents/apps/limbforge/package-lock.json f /home/shire3d/ARMOR/agents/apps/limbforge/package.json f /home/shire3d/ARMOR/agents/apps/limbforge/postcss.config.js f /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides/measurement-dashboard-approved.png f /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides/residual-limb-length-anatomy.png f /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides/residual-limb-length-approved.png f /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides/residual-limb-mini-person.png f /home/shire3d/ARMOR/agents/apps/limbforge/scripts/viewport-safety.mjs f /home/shire3d/ARMOR/agents/apps/limbforge/shire-index.html f /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44AuthAdapter.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44DatabaseAdapter.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44FileStorageAdapter.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44FunctionAdapter.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/api/base44Client.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/AuthLayout.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/GoogleIcon.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ProtectedRoute.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleGuard.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleRouter.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/UserNotRegisteredError.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ViewportErrorBoundary.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/config/permissions.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/hooks/use-mobile.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/hooks/use-size.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/AccountContext.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/AuthContext.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/PageNotFound.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/app-params.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/query-client.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/utils.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/main.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/modes/customerIntakeConfig.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCovers.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ComponentDimensions.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Components.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CustomerDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Customers.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Dashboard.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ForgotPassword.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/IntakeRequests.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/InvitationAccept.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Login.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Manufacturing.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ManufacturingJobDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MeasurementSession.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Measurements.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MigrationReadiness.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NewCover.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NotImplemented.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OrderDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Orders.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardLibrary.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Projects.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Quotes.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Register.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Reports.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ResetPassword.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Settings.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Shipping.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Validation.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/accountService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/adapterContracts.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/auditService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/authService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/completedCoverService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/componentService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/customerService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dashboardService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dateUtils.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionAnalysis.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionDefinitions.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/exportService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/fileStorageService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/invitationService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/limbProfileService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/manufacturingService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/notificationService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/orderService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/prosthesisService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/quoteService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/reportService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/searchService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/serviceConfig.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/settingsRegistry.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/settingsService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/shipmentService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/validationService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/viewportFeatureFlags.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/services/workshopService.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/shire-main.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx f /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/localBase44Client.js f /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/shire.css f /home/shire3d/ARMOR/agents/apps/limbforge/src/utils/index.ts f /home/shire3d/ARMOR/agents/apps/limbforge/tailwind.config.js f /home/shire3d/ARMOR/agents/apps/limbforge/vite.config.js f /home/shire3d/ARMOR/agents/apps/limbforge/vite.shire.config.js === SOURCE FILE INVENTORY === /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/acceptInvitation/entry.ts /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake/entry.ts /home/shire3d/ARMOR/agents/apps/limbforge/components.json /home/shire3d/ARMOR/agents/apps/limbforge/eslint.config.js /home/shire3d/ARMOR/agents/apps/limbforge/index.html /home/shire3d/ARMOR/agents/apps/limbforge/jsconfig.json /home/shire3d/ARMOR/agents/apps/limbforge/package-lock.json /home/shire3d/ARMOR/agents/apps/limbforge/package.json /home/shire3d/ARMOR/agents/apps/limbforge/postcss.config.js /home/shire3d/ARMOR/agents/apps/limbforge/shire-index.html /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44AuthAdapter.js /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44DatabaseAdapter.js /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44FileStorageAdapter.js /home/shire3d/ARMOR/agents/apps/limbforge/src/adapters/Base44FunctionAdapter.js /home/shire3d/ARMOR/agents/apps/limbforge/src/api/base44Client.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/AuthLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/GoogleIcon.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ProtectedRoute.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleGuard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleRouter.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/UserNotRegisteredError.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ViewportErrorBoundary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/admin/AdminLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/builder/BuilderLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/components/ComponentCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/components/ComponentForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/covers/CompletedCoverCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/CustomerCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/CustomerForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/FormField.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/HistoryPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/LimbForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/ProsthesisForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/customerFields.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dashboard/MetricCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/CustomDesignPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignHierarchy.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignHistory.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignInspector.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignModeBar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignValidation.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/CompletenessPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/ComponentDiagrams.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/DimensionEntryForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/RecordForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/SpecImportForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/StationForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/formConfigs.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/AssemblyPositionTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/CompletenessTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/ConnectionsTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/ControlsAccessTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/ExternalEnvelopeTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/IdentificationTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/KeepOutZonesTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/ManufacturerSpecsTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/MeasurementStationsTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/MovementEnvelopeTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/PhotosScansTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/RevisionHistoryTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/SourcesTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/manufacturing/ManufacturingJobCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementEntry.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/SessionCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/StartWorkflowDialog.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCustomerStep.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardProgress.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/wizardConfig.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/orders/OrderCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardAssignPicker.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardInspector.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardProfileForm.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardValidation.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/portal/PortalLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/projects/ProjectCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/accordion.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/alert-dialog.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/alert.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/aspect-ratio.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/avatar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/badge.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/breadcrumb.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/button.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/card.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/carousel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/chart.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/checkbox.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/collapsible.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/command.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/context-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dialog.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/drawer.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/form.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/hover-card.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/image.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/input-otp.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/input.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/label.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/navigation-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/pagination.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/popover.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/progress.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/radio-group.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/resizable.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/scroll-area.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/select.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/separator.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sheet.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/skeleton.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/slider.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sonner.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/switch.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/table.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/tabs.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/textarea.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/toast.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/toaster.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/toggle-group.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/toggle.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/tooltip.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/use-toast.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/AnatomicalMesh.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/BabylonCameraController.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/BabylonSceneLifecycle.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/BabylonSelectionManager.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/BabylonViewportV2.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/BrandingLayerV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/ConceptualCoverV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/DesignPreviewLayer.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/DomLabelLayerV2.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/HumanReferenceV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/MeasurementStationsV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/OssiguardConnectorLayer.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/ProceduralProsthesisV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/ViewportV2Diagnostics.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/viewportV2Build.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/BoundaryNotice.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/Breadcrumbs.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/EmptyState.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/FieldList.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/HideFictionalToggle.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/LoadingPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/OriginBadge.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/PageHeader.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/StatusPill.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopNav.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSearch.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/navItems.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ComponentModel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ContextInspectorV2.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/CoverShell.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/DimLine.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/DimensionLabels.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/EdgeLines.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/MovementPath.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/NativeOrbitControls.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ProstheticAssembly.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/SafetyBoundary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/SceneComposer.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/SceneFeatureBoundary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ShireLogo.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/StableViewportCore.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/StationRings.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ViewportDiagnostics.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ViewportLabelLayer.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/ZoneMeshes.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/limbGeometry.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/MeasurementInspector.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ProjectTree.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/SafetyBoundary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/StationTable.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/StatusCards.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/TopBar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/VerticalToolStrip.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ViewportToolbar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/useViewportLabels.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/viewportBuild.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/viewportLabelStore.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/workflows/CoverBuilder.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/workflows/MeasurementStudio3D.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/workflows/ProsthesisMapper.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/workflows/SensitiveZoneMapper.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/config/permissions.js /home/shire3d/ARMOR/agents/apps/limbforge/src/hooks/use-mobile.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/hooks/use-size.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/AccountContext.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/AuthContext.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/PageNotFound.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/app-params.js /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/query-client.js /home/shire3d/ARMOR/agents/apps/limbforge/src/lib/utils.js /home/shire3d/ARMOR/agents/apps/limbforge/src/main.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/modes/customerIntakeConfig.js /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCovers.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ComponentDimensions.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Components.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CustomerDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Customers.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Dashboard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ForgotPassword.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/IntakeRequests.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/InvitationAccept.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Login.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Manufacturing.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ManufacturingJobDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MeasurementSession.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Measurements.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MigrationReadiness.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NewCover.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NotImplemented.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OrderDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Orders.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardLibrary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Projects.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Quotes.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Register.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Reports.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ResetPassword.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Settings.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Shipping.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Validation.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminConsole.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminSettings.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminUserDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminUsers.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/Assignments.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/Invitations.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/NewBuilder.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/PermissionMatrix.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/ReleaseReadiness.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderTasks.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderWorkspace.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/CustomerPortal.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalSection.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/services/accountService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/adapterContracts.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/auditService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/authService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/completedCoverService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/componentService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/customerService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dashboardService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dateUtils.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionAnalysis.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionDefinitions.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/exportService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/fileStorageService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/invitationService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/limbProfileService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/manufacturingService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/notificationService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/orderService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/prosthesisService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/quoteService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/reportService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/searchService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/serviceConfig.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/settingsRegistry.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/settingsService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/shipmentService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/validationService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/viewportFeatureFlags.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/workshopService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/shire-main.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/localBase44Client.js /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/shire.css /home/shire3d/ARMOR/agents/apps/limbforge/src/utils/index.ts /home/shire3d/ARMOR/agents/apps/limbforge/tailwind.config.js /home/shire3d/ARMOR/agents/apps/limbforge/vite.config.js /home/shire3d/ARMOR/agents/apps/limbforge/vite.shire.config.js === APPLICATION CONFIGURATION FILES === ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/package.json ================================================================ 1 { 2 "name": "base44-app", 3 "private": true, 4 "version": "0.0.0", 5 "type": "module", 6 "scripts": { 7 "dev": "vite", 8 "build": "vite build", 9 "lint": "eslint . --quiet", 10 "lint:fix": "eslint . --fix", 11 "typecheck": "tsc -p ./jsconfig.json", 12 "preview": "vite preview", 13 "viewport-safety": "node scripts/viewport-safety.mjs" 14 }, 15 "dependencies": { 16 "@babylonjs/core": "9.17.1", 17 "@base44/sdk": "^0.8.40", 18 "@base44/vite-plugin": "^1.0.30", 19 "@hello-pangea/dnd": "^17.0.0", 20 "@hookform/resolvers": "^4.1.2", 21 "@radix-ui/react-accordion": "^1.2.3", 22 "@radix-ui/react-alert-dialog": "^1.1.6", 23 "@radix-ui/react-aspect-ratio": "^1.1.2", 24 "@radix-ui/react-avatar": "^1.1.3", 25 "@radix-ui/react-checkbox": "^1.1.4", 26 "@radix-ui/react-collapsible": "^1.1.3", 27 "@radix-ui/react-context-menu": "^2.2.6", 28 "@radix-ui/react-dialog": "^1.1.6", 29 "@radix-ui/react-dropdown-menu": "^2.1.6", 30 "@radix-ui/react-hover-card": "^1.1.6", 31 "@radix-ui/react-label": "^2.1.2", 32 "@radix-ui/react-menubar": "^1.1.6", 33 "@radix-ui/react-navigation-menu": "^1.2.5", 34 "@radix-ui/react-popover": "^1.1.6", 35 "@radix-ui/react-progress": "^1.1.2", 36 "@radix-ui/react-radio-group": "^1.2.3", 37 "@radix-ui/react-scroll-area": "^1.2.3", 38 "@radix-ui/react-select": "^2.1.6", 39 "@radix-ui/react-separator": "^1.1.2", 40 "@radix-ui/react-slider": "^1.2.3", 41 "@radix-ui/react-slot": "^1.1.2", 42 "@radix-ui/react-switch": "^1.1.3", 43 "@radix-ui/react-tabs": "^1.1.3", 44 "@radix-ui/react-toast": "^1.2.2", 45 "@radix-ui/react-toggle": "^1.1.2", 46 "@radix-ui/react-toggle-group": "^1.1.2", 47 "@radix-ui/react-tooltip": "^1.1.8", 48 "@react-three/drei": "9.122.0", 49 "@react-three/fiber": "8.18.0", 50 "@stripe/react-stripe-js": "^3.0.0", 51 "@stripe/stripe-js": "^5.2.0", 52 "@tanstack/react-query": "^5.84.1", 53 "canvas-confetti": "^1.9.4", 54 "class-variance-authority": "^0.7.1", 55 "clsx": "^2.1.1", 56 "cmdk": "^1.0.0", 57 "date-fns": "^3.6.0", 58 "embla-carousel-react": "^8.5.2", 59 "framer-motion": "^11.16.4", 60 "html2canvas": "^1.4.1", 61 "input-otp": "^1.4.2", 62 "jspdf": "^4.2.1", 63 "lodash": "^4.17.21", 64 "lucide-react": "^0.475.0", 65 "moment": "^2.30.1", 66 "next-themes": "^0.4.4", 67 "react": "18.3.1", 68 "react-day-picker": "^8.10.1", 69 "react-dom": "18.3.1", 70 "react-hook-form": "^7.54.2", 71 "react-hot-toast": "^2.6.0", 72 "react-leaflet": "^4.2.1", 73 "react-markdown": "^9.0.1", 74 "react-quill": "^2.0.0", 75 "react-resizable-panels": "^2.1.7", 76 "react-router-dom": "^6.26.0", 77 "recharts": "^2.15.4", 78 "sonner": "^2.0.1", 79 "tailwind-merge": "^3.0.2", 80 "tailwindcss-animate": "^1.0.7", 81 "three": "0.165.0", 82 "vaul": "^1.1.2", 83 "zod": "^3.24.2" 84 }, 85 "devDependencies": { 86 "@eslint/js": "^9.19.0", 87 "@types/node": "^22.13.5", 88 "@types/react": "^18.2.66", 89 "@types/react-dom": "^18.2.22", 90 "@vitejs/plugin-react": "^4.3.4", 91 "autoprefixer": "^10.4.20", 92 "baseline-browser-mapping": "^2.8.32", 93 "eslint": "^9.19.0", 94 "eslint-plugin-react": "^7.37.4", 95 "eslint-plugin-react-hooks": "^5.0.0", 96 "eslint-plugin-react-refresh": "^0.4.18", 97 "eslint-plugin-unused-imports": "^4.3.0", 98 "globals": "^15.14.0", 99 "postcss": "^8.5.3", 100 "tailwindcss": "^3.4.17", 101 "typescript": "^5.8.2", 102 "vite": "6.4.3" 103 } 104 } ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/package-lock.json ================================================================ 1 { 2 "name": "base44-app", 3 "version": "0.0.0", 4 "lockfileVersion": 3, 5 "requires": true, 6 "packages": { 7 "": { 8 "name": "base44-app", 9 "version": "0.0.0", 10 "dependencies": { 11 "@babylonjs/core": "9.17.1", 12 "@base44/sdk": "^0.8.40", 13 "@base44/vite-plugin": "^1.0.30", 14 "@hello-pangea/dnd": "^17.0.0", 15 "@hookform/resolvers": "^4.1.2", 16 "@radix-ui/react-accordion": "^1.2.3", 17 "@radix-ui/react-alert-dialog": "^1.1.6", 18 "@radix-ui/react-aspect-ratio": "^1.1.2", 19 "@radix-ui/react-avatar": "^1.1.3", 20 "@radix-ui/react-checkbox": "^1.1.4", 21 "@radix-ui/react-collapsible": "^1.1.3", 22 "@radix-ui/react-context-menu": "^2.2.6", 23 "@radix-ui/react-dialog": "^1.1.6", 24 "@radix-ui/react-dropdown-menu": "^2.1.6", 25 "@radix-ui/react-hover-card": "^1.1.6", 26 "@radix-ui/react-label": "^2.1.2", 27 "@radix-ui/react-menubar": "^1.1.6", 28 "@radix-ui/react-navigation-menu": "^1.2.5", 29 "@radix-ui/react-popover": "^1.1.6", 30 "@radix-ui/react-progress": "^1.1.2", 31 "@radix-ui/react-radio-group": "^1.2.3", 32 "@radix-ui/react-scroll-area": "^1.2.3", 33 "@radix-ui/react-select": "^2.1.6", 34 "@radix-ui/react-separator": "^1.1.2", 35 "@radix-ui/react-slider": "^1.2.3", 36 "@radix-ui/react-slot": "^1.1.2", 37 "@radix-ui/react-switch": "^1.1.3", 38 "@radix-ui/react-tabs": "^1.1.3", 39 "@radix-ui/react-toast": "^1.2.2", 40 "@radix-ui/react-toggle": "^1.1.2", 41 "@radix-ui/react-toggle-group": "^1.1.2", 42 "@radix-ui/react-tooltip": "^1.1.8", 43 "@react-three/drei": "9.122.0", 44 "@react-three/fiber": "8.18.0", 45 "@stripe/react-stripe-js": "^3.0.0", 46 "@stripe/stripe-js": "^5.2.0", 47 "@tanstack/react-query": "^5.84.1", 48 "canvas-confetti": "^1.9.4", 49 "class-variance-authority": "^0.7.1", 50 "clsx": "^2.1.1", 51 "cmdk": "^1.0.0", 52 "date-fns": "^3.6.0", 53 "embla-carousel-react": "^8.5.2", 54 "framer-motion": "^11.16.4", 55 "html2canvas": "^1.4.1", 56 "input-otp": "^1.4.2", 57 "jspdf": "^4.2.1", 58 "lodash": "^4.17.21", 59 "lucide-react": "^0.475.0", 60 "moment": "^2.30.1", 61 "next-themes": "^0.4.4", 62 "react": "18.3.1", 63 "react-day-picker": "^8.10.1", 64 "react-dom": "18.3.1", 65 "react-hook-form": "^7.54.2", 66 "react-hot-toast": "^2.6.0", 67 "react-leaflet": "^4.2.1", 68 "react-markdown": "^9.0.1", 69 "react-quill": "^2.0.0", 70 "react-resizable-panels": "^2.1.7", 71 "react-router-dom": "^6.26.0", 72 "recharts": "^2.15.4", 73 "sonner": "^2.0.1", 74 "tailwind-merge": "^3.0.2", 75 "tailwindcss-animate": "^1.0.7", 76 "three": "0.165.0", 77 "vaul": "^1.1.2", 78 "zod": "^3.24.2" 79 }, 80 "devDependencies": { 81 "@eslint/js": "^9.19.0", 82 "@types/node": "^22.13.5", 83 "@types/react": "^18.2.66", 84 "@types/react-dom": "^18.2.22", 85 "@vitejs/plugin-react": "^4.3.4", 86 "autoprefixer": "^10.4.20", 87 "baseline-browser-mapping": "^2.8.32", 88 "eslint": "^9.19.0", 89 "eslint-plugin-react": "^7.37.4", 90 "eslint-plugin-react-hooks": "^5.0.0", 91 "eslint-plugin-react-refresh": "^0.4.18", 92 "eslint-plugin-unused-imports": "^4.3.0", 93 "globals": "^15.14.0", 94 "postcss": "^8.5.3", 95 "tailwindcss": "^3.4.17", 96 "typescript": "^5.8.2", 97 "vite": "6.4.3" 98 } 99 }, 100 "node_modules/@alloc/quick-lru": { 101 "version": "5.2.0", 102 "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 103 "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 104 "license": "MIT", 105 "engines": { 106 "node": ">=10" 107 }, 108 "funding": { 109 "url": "https://github.com/sponsors/sindresorhus" 110 } 111 }, 112 "node_modules/@babel/code-frame": { 113 "version": "7.29.7", 114 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", 115 "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", 116 "license": "MIT", 117 "dependencies": { 118 "@babel/helper-validator-identifier": "^7.29.7", 119 "js-tokens": "^4.0.0", 120 "picocolors": "^1.1.1" 121 }, 122 "engines": { 123 "node": ">=6.9.0" 124 } 125 }, 126 "node_modules/@babel/compat-data": { 127 "version": "7.29.7", 128 "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", 129 "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", 130 "dev": true, 131 "license": "MIT", 132 "engines": { 133 "node": ">=6.9.0" 134 } 135 }, 136 "node_modules/@babel/core": { 137 "version": "7.29.7", 138 "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", 139 "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", 140 "dev": true, 141 "license": "MIT", 142 "dependencies": { 143 "@babel/code-frame": "^7.29.7", 144 "@babel/generator": "^7.29.7", 145 "@babel/helper-compilation-targets": "^7.29.7", 146 "@babel/helper-module-transforms": "^7.29.7", 147 "@babel/helpers": "^7.29.7", 148 "@babel/parser": "^7.29.7", 149 "@babel/template": "^7.29.7", 150 "@babel/traverse": "^7.29.7", 151 "@babel/types": "^7.29.7", 152 "@jridgewell/remapping": "^2.3.5", 153 "convert-source-map": "^2.0.0", 154 "debug": "^4.1.0", 155 "gensync": "^1.0.0-beta.2", 156 "json5": "^2.2.3", 157 "semver": "^6.3.1" 158 }, 159 "engines": { 160 "node": ">=6.9.0" 161 }, 162 "funding": { 163 "type": "opencollective", 164 "url": "https://opencollective.com/babel" 165 } 166 }, 167 "node_modules/@babel/generator": { 168 "version": "7.29.7", 169 "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", 170 "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", 171 "license": "MIT", 172 "dependencies": { 173 "@babel/parser": "^7.29.7", 174 "@babel/types": "^7.29.7", 175 "@jridgewell/gen-mapping": "^0.3.12", 176 "@jridgewell/trace-mapping": "^0.3.28", 177 "jsesc": "^3.0.2" 178 }, 179 "engines": { 180 "node": ">=6.9.0" 181 } 182 }, 183 "node_modules/@babel/helper-compilation-targets": { 184 "version": "7.29.7", 185 "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", 186 "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", 187 "dev": true, 188 "license": "MIT", 189 "dependencies": { 190 "@babel/compat-data": "^7.29.7", 191 "@babel/helper-validator-option": "^7.29.7", 192 "browserslist": "^4.24.0", 193 "lru-cache": "^5.1.1", 194 "semver": "^6.3.1" 195 }, 196 "engines": { 197 "node": ">=6.9.0" 198 } 199 }, 200 "node_modules/@babel/helper-globals": { 201 "version": "7.29.7", 202 "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", 203 "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", 204 "license": "MIT", 205 "engines": { 206 "node": ">=6.9.0" 207 } 208 }, 209 "node_modules/@babel/helper-module-imports": { 210 "version": "7.29.7", 211 "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", 212 "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", 213 "dev": true, 214 "license": "MIT", 215 "dependencies": { 216 "@babel/traverse": "^7.29.7", 217 "@babel/types": "^7.29.7" 218 }, 219 "engines": { 220 "node": ">=6.9.0" 221 } 222 }, 223 "node_modules/@babel/helper-module-transforms": { 224 "version": "7.29.7", 225 "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", 226 "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", 227 "dev": true, 228 "license": "MIT", 229 "dependencies": { 230 "@babel/helper-module-imports": "^7.29.7", 231 "@babel/helper-validator-identifier": "^7.29.7", 232 "@babel/traverse": "^7.29.7" 233 }, 234 "engines": { 235 "node": ">=6.9.0" 236 }, 237 "peerDependencies": { 238 "@babel/core": "^7.0.0" 239 } 240 }, 241 "node_modules/@babel/helper-plugin-utils": { 242 "version": "7.28.6", 243 "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", 244 "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", 245 "dev": true, 246 "license": "MIT", 247 "engines": { 248 "node": ">=6.9.0" 249 } 250 }, 251 "node_modules/@babel/helper-string-parser": { 252 "version": "7.29.7", 253 "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", 254 "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", 255 "license": "MIT", 256 "engines": { 257 "node": ">=6.9.0" 258 } 259 }, 260 "node_modules/@babel/helper-validator-identifier": { 261 "version": "7.29.7", 262 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", 263 "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", 264 "license": "MIT", 265 "engines": { 266 "node": ">=6.9.0" 267 } 268 }, 269 "node_modules/@babel/helper-validator-option": { 270 "version": "7.29.7", 271 "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", 272 "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", 273 "dev": true, 274 "license": "MIT", 275 "engines": { 276 "node": ">=6.9.0" 277 } 278 }, 279 "node_modules/@babel/helpers": { 280 "version": "7.29.7", 281 "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", 282 "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", 283 "dev": true, 284 "license": "MIT", 285 "dependencies": { 286 "@babel/template": "^7.29.7", 287 "@babel/types": "^7.29.7" 288 }, 289 "engines": { 290 "node": ">=6.9.0" 291 } 292 }, 293 "node_modules/@babel/parser": { 294 "version": "7.29.7", 295 "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", 296 "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", 297 "license": "MIT", 298 "dependencies": { 299 "@babel/types": "^7.29.7" 300 }, 301 "bin": { 302 "parser": "bin/babel-parser.js" 303 }, 304 "engines": { 305 "node": ">=6.0.0" 306 } 307 }, 308 "node_modules/@babel/plugin-transform-react-jsx-self": { 309 "version": "7.27.1", 310 "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 311 "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 312 "dev": true, 313 "license": "MIT", 314 "dependencies": { 315 "@babel/helper-plugin-utils": "^7.27.1" 316 }, 317 "engines": { 318 "node": ">=6.9.0" 319 }, 320 "peerDependencies": { 321 "@babel/core": "^7.0.0-0" 322 } 323 }, 324 "node_modules/@babel/plugin-transform-react-jsx-source": { 325 "version": "7.27.1", 326 "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 327 "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 328 "dev": true, 329 "license": "MIT", 330 "dependencies": { 331 "@babel/helper-plugin-utils": "^7.27.1" 332 }, 333 "engines": { 334 "node": ">=6.9.0" 335 }, 336 "peerDependencies": { 337 "@babel/core": "^7.0.0-0" 338 } 339 }, 340 "node_modules/@babel/runtime": { 341 "version": "7.28.6", 342 "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", 343 "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", 344 "license": "MIT", 345 "engines": { 346 "node": ">=6.9.0" 347 } 348 }, 349 "node_modules/@babel/template": { 350 "version": "7.29.7", 351 "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", 352 "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", 353 "license": "MIT", 354 "dependencies": { 355 "@babel/code-frame": "^7.29.7", 356 "@babel/parser": "^7.29.7", 357 "@babel/types": "^7.29.7" 358 }, 359 "engines": { 360 "node": ">=6.9.0" 361 } 362 }, 363 "node_modules/@babel/traverse": { 364 "version": "7.29.7", 365 "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", 366 "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", 367 "license": "MIT", 368 "dependencies": { 369 "@babel/code-frame": "^7.29.7", 370 "@babel/generator": "^7.29.7", 371 "@babel/helper-globals": "^7.29.7", 372 "@babel/parser": "^7.29.7", 373 "@babel/template": "^7.29.7", 374 "@babel/types": "^7.29.7", 375 "debug": "^4.3.1" 376 }, 377 "engines": { 378 "node": ">=6.9.0" 379 } 380 }, 381 "node_modules/@babel/types": { 382 "version": "7.29.7", 383 "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", 384 "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", 385 "license": "MIT", 386 "dependencies": { 387 "@babel/helper-string-parser": "^7.29.7", 388 "@babel/helper-validator-identifier": "^7.29.7" 389 }, 390 "engines": { 391 "node": ">=6.9.0" 392 } 393 }, 394 "node_modules/@babylonjs/core": { 395 "version": "9.17.1", 396 "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-9.17.1.tgz", 397 "integrity": "sha512-BMA+XD1KlcMdI5jorON4jElpZVAStD5b4qzMWxI7p6kxQRJCj8ykTzai1zlEhau/WhiAluov+bMFlZIi0ipNGg==", 398 "license": "Apache-2.0" 399 }, 400 "node_modules/@base44/sdk": { 401 "version": "0.8.40", 402 "resolved": "https://registry.npmjs.org/@base44/sdk/-/sdk-0.8.40.tgz", 403 "integrity": "sha512-eU9M5yo3EEbvbLqZrLo70I1RWC+TkV+zQ9KGXuyXF4pQX2rLiB5IVL5LwUZMnOwiMjr2kga+9UEMc5Kv+6vSzQ==", 404 "license": "MIT", 405 "dependencies": { 406 "axios": "^1.18.1", 407 "socket.io-client": "^4.8.3", 408 "uuid": "^13.0.2" 409 } 410 }, 411 "node_modules/@base44/vite-plugin": { 412 "version": "1.0.30", 413 "resolved": "https://registry.npmjs.org/@base44/vite-plugin/-/vite-plugin-1.0.30.tgz", 414 "integrity": "sha512-KFO+HP3TUf/2vg5cW0LFV7/nHHQyAYqXqPi6jq/hQB64JWhvZBXLlQIwQU0y5mu0JVliFOgLNcwHdwC8J+ekjg==", 415 "license": "MIT", 416 "dependencies": { 417 "@babel/generator": "^7.28.5", 418 "@babel/parser": "^7.28.5", 419 "@babel/traverse": "^7.28.5", 420 "@babel/types": "^7.28.5" [TRUNCATED FOR TERMINAL SAFETY: 10878 total lines; first 420 shown] ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/vite.config.js ================================================================ 1 import base44 from "@base44/vite-plugin" 2 import react from '@vitejs/plugin-react' 3 import { defineConfig } from 'vite' 4 5 // https://vite.dev/config/ 6 export default defineConfig({ 7 plugins: [ 8 base44({ 9 // Support for legacy code that imports the base44 SDK with @/integrations, @/entities, etc. 10 // can be removed if the code has been updated to use the new SDK imports from @base44/sdk 11 legacySDKImports: process.env.BASE44_LEGACY_SDK_IMPORTS === 'true', 12 hmrNotifier: true, 13 navigationNotifier: true, 14 analyticsTracker: true, 15 visualEditAgent: true 16 }), 17 react(), 18 ] 19 }); ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx ================================================================ 1 import { Toaster } from "@/components/ui/toaster" 2 import { QueryClientProvider } from '@tanstack/react-query' 3 import { queryClientInstance } from '@/lib/query-client' 4 import { BrowserRouter as Router, Navigate, Route, Routes } from 'react-router-dom'; 5 import PageNotFound from './lib/PageNotFound'; 6 import { AuthProvider, useAuth } from '@/lib/AuthContext'; 7 import UserNotRegisteredError from '@/components/UserNotRegisteredError'; 8 import ScrollToTop from './components/ScrollToTop'; 9 import ProtectedRoute from '@/components/ProtectedRoute'; 10 import Login from '@/pages/Login'; 11 import Register from '@/pages/Register'; 12 import ForgotPassword from '@/pages/ForgotPassword'; 13 import ResetPassword from '@/pages/ResetPassword'; 14 import WorkshopLayout from '@/components/workshop/WorkshopLayout'; 15 import Dashboard from '@/pages/Dashboard'; 16 import Customers from '@/pages/Customers'; 17 import CustomerDetail from '@/pages/CustomerDetail'; 18 import Projects from '@/pages/Projects'; 19 import Components from '@/pages/Components'; 20 import ComponentDimensions from '@/pages/ComponentDimensions'; 21 import NewCover from '@/pages/NewCover'; 22 import Measurements from '@/pages/Measurements'; 23 import MeasurementSession from '@/pages/MeasurementSession'; 24 import Reports from '@/pages/Reports'; 25 import MigrationReadiness from '@/pages/MigrationReadiness'; 26 import Settings from '@/pages/Settings'; 27 import NotImplemented from '@/pages/NotImplemented'; 28 import ViewportV2Test from '@/pages/ViewportV2Test'; 29 import DesignYourCover from '@/pages/DesignYourCover'; 30 import ProjectDetail from '@/pages/ProjectDetail'; 31 import IntakeRequests from '@/pages/IntakeRequests'; 32 import Quotes from '@/pages/Quotes'; 33 import Orders from '@/pages/Orders'; 34 import OrderDetail from '@/pages/OrderDetail'; 35 import CompletedCovers from '@/pages/CompletedCovers'; 36 import CompletedCoverDetail from '@/pages/CompletedCoverDetail'; 37 import Manufacturing from '@/pages/Manufacturing'; 38 import ManufacturingJobDetail from '@/pages/ManufacturingJobDetail'; 39 import Shipping from '@/pages/Shipping'; 40 import OssiguardLibrary from '@/pages/OssiguardLibrary'; 41 import OssiguardDetail from '@/pages/OssiguardDetail'; 42 import OssiguardWizard from '@/pages/OssiguardWizard'; 43 import DesignForge from '@/pages/DesignForge'; 44 import Validation from '@/pages/Validation'; 45 import { AccountProvider } from '@/lib/AccountContext'; 46 import RoleRouter from '@/components/RoleRouter'; 47 import RoleGuard from '@/components/RoleGuard'; 48 import AdminLayout from '@/components/admin/AdminLayout'; 49 import BuilderLayout from '@/components/builder/BuilderLayout'; 50 import PortalLayout from '@/components/portal/PortalLayout'; 51 import AdminConsole from '@/pages/admin/AdminConsole'; 52 import AdminUsers from '@/pages/admin/AdminUsers'; 53 import AdminUserDetail from '@/pages/admin/AdminUserDetail'; 54 import Invitations from '@/pages/admin/Invitations'; 55 import PermissionMatrix from '@/pages/admin/PermissionMatrix'; 56 import Assignments from '@/pages/admin/Assignments'; 57 import AdminSettings from '@/pages/admin/AdminSettings'; 58 import ReleaseReadiness from '@/pages/admin/ReleaseReadiness'; 59 import NewBuilder from '@/pages/admin/NewBuilder'; 60 import BuilderWorkspace from '@/pages/builder/BuilderWorkspace'; 61 import BuilderProjectDetail from '@/pages/builder/BuilderProjectDetail'; 62 import BuilderTasks from '@/pages/builder/BuilderTasks'; 63 import CustomerPortal from '@/pages/portal/CustomerPortal'; 64 import PortalProject from '@/pages/portal/PortalProject'; 65 import PortalSection from '@/pages/portal/PortalSection'; 66 import PortalDetail from '@/pages/portal/PortalDetail'; 67 import InvitationAccept from '@/pages/InvitationAccept'; 68 69 import TakeMeasurements from '@/pages/TakeMeasurements'; 70 const AuthenticatedApp = () => { 71 const { isLoadingAuth, isLoadingPublicSettings, authError } = useAuth(); 72 73 // Show loading spinner while checking app public settings or auth 74 if (isLoadingPublicSettings || isLoadingAuth) { 75 return ( 76
77
78
79 ); 80 } 81 82 // Registered accounts only; public auth routes remain reachable when signed out. 83 if (authError?.type === 'user_not_registered') return ; 84 85 return ( 86 87 88 } /> 89 } /> 90 } /> 91 } /> 92 } /> 93 } /> 94 } />}> 95 } /> 96 } /> 97 }> 98 }> 99 } /> 100 } /> 101 } /> 102 } /> 103 } /> 104 } /> 105 } /> 106 } /> 107 } /> 108 } /> 109 } /> 110 } /> 111 } /> 112 } /> 113 } /> 114 } /> 115 } /> 116 } /> 117 } /> 118 } /> 119 } /> 120 } /> 121 } /> 122 } /> 123 } /> 124 } /> 125 } /> 126 } /> 127 } /> 128 } /> 129 } /> 130 } /> 131 } /> 132 133 134 }> 135 }> 136 } /> 137 } /> 138 } /> 139 } /> 140 } /> 141 } /> 142 } /> 143 } /> 144 } /> 145 146 147 }> 148 }> 149 } /> 150 } /> 151 } /> 152 153 154 }> 155 }> 156 } /> 157 } /> 158 } /> 159 } /> 160 } /> 161 } /> 162 } /> 163 } /> 164 } /> 165 } /> 166 } /> 167 } /> 168 } /> 169 170 171 172 } /> 173 174 175 ); 176 }; 177 178 179 function App() { 180 181 return ( 182 183 184 185 186 187 188 189 190 191 ) 192 } 193 194 export default App ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/src/main.jsx ================================================================ 1 import React from 'react' 2 import ReactDOM from 'react-dom/client' 3 import App from '@/App.jsx' 4 import '@/index.css' 5 6 ReactDOM.createRoot(document.getElementById('root')).render( 7 8 ) === CURRENT MEASUREMENT GUIDE IMPLEMENTATION === ================================================================ FILE: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx ================================================================ 1 import { 2 Image as ImageIcon, 3 Ruler, 4 ShieldAlert, 5 } from 'lucide-react'; 6 7 import MeasurementGuideLegacy from './MeasurementGuideLegacy'; 8 9 10 const normalise = value => 11 String(value || '') 12 .toLowerCase() 13 .replace(/[_-]+/g, ' ') 14 .replace(/\s+/g, ' ') 15 .trim(); 16 17 18 function isResidualLimbLength(definition) { 19 const text = normalise([ 20 definition?.name, 21 definition?.measurement_name, 22 definition?.guide_type, 23 ].filter(Boolean).join(' ')); 24 25 return ( 26 text.includes('residual limb length') 27 || ( 28 text.includes('residual limb') 29 && text.includes('length') 30 ) 31 ); 32 } 33 34 35 function ApprovedResidualLimbLengthGuide({ 36 definition, 37 workflow, 38 session, 39 }) { 40 const side = 41 session?.side 42 || 'Right'; 43 44 return ( 45
46
47
48
49 50
51 52
53

54 Approved anatomy artwork 55

56 57

58 {definition?.name || 'Residual limb length'} 59

60 61

62 High-resolution local artwork—no WebGL or internet required. 63

64
65 66 67 FINAL GRAPHICS ACTIVE 68 69
70
71 72
73
74 Detailed side view of a below-knee residual limb showing the knee reference point, distal end, straight measurement direction, osseointegration rod and protected no-contact region. 80 81
82 Measure from the marked upper reference point to the 83 distal end in a straight line. Do not follow around the 84 curve of the residual limb. 85
86
87 88
89
90
91
92 93 94

95 Where we are working 96

97
98
99 100 Non-gender-specific person highlighting the lower residual-limb measurement area. 106 107

108 The highlighted area shows the body region used for 109 this measurement. 110

111
112 113
114

115 What to measure 116

117 118

119 Measure in a straight line between the two marked 120 reference points. 121

122
123 124
125

126 Selected anatomy 127

128 129

130 {side} below-knee 131 {' · '} 132 {workflow || 'Osseointegration'} 133

134
135 136
137
138 139 140
141

142 Protected area 143

144 145

146 Do not press tape, rulers or calipers against the 147 stoma or external rod. Preserve cleaning, drainage 148 and visual-inspection access. 149

150
151
152
153 154 160 161 Open full approved guide 162 163
164
165
166 ); 167 } 168 169 170 export default function MeasurementGuide(props) { 171 if (isResidualLimbLength(props.definition)) { 172 return ( 173 176 ); 177 } 178 179 return ( 180 183 ); 184 } === ROUTER, NAVIGATION AND PAGE CANDIDATES === /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/DesignConfiguration.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/src/components/AuthLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ProtectedRoute.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleRouter.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/admin/AdminLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/builder/BuilderLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/CustomDesignPanel.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignHierarchy.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignHistory.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignInspector.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignModeBar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/design/DesignValidation.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/portal/PortalLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/context-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/navigation-menu.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/DesignPreviewLayer.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopLayout.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardLibrary.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js ================================================================ ROUTING AND NAVIGATION REFERENCES PATTERN: react-router|createBrowserRouter|BrowserRouter|Routes|Route|navigate\(|location\.pathname|agents/limbforge|sidebar|navigation|menu ROOT: /home/shire3d/ARMOR/agents/apps/limbforge ================================================================ /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/shire.css:23:#limbforge-sidebar-scroll { /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:3: BrowserRouter, /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:5: Route, /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:6: Routes, /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:7:} from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:41: /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:44: /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:45: }> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:50: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:51: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:52: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:53: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:54: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:55: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:56: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:57: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:58: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:59: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:64: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:69: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:82: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:83: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:88: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:89: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:94: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:99: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:100: /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:101: /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:104: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Components.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Projects.jsx:2:import { useSearchParams } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MeasurementSession.jsx:3:import { Link, useParams, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MeasurementSession.jsx:69: const pause = async () => { await measurementService.pause(session); navigate('/measurements'); }; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ResetPassword.jsx:2:import { Link, useSearchParams } from "react-router-dom"; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:2:import { Link, useParams, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:88: navigate(`/ossiguard/${record.uuid}`); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:17:} from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:492: navigate( /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NotImplemented.jsx:2:import { Link, useSearchParams } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:2:import { Link, useParams, useNavigate, useLocation } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:33: const [section, setSection] = useState(() => window.location.pathname.endsWith('/ossiguard') ? 'ossiguard' : 'customer'); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:88: const newStyleFromFit = act(async () => { const np = await projectService.duplicate(data.project, 'Ray'); await designService.copyToProject(projectId, np.uuid, 'Ray'); navigate(`/projects/${np.uuid}`); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:145:└── Cosmetic Cover`}{assigningOssiguard ? setAssigningOssiguard(false)} /> : ossiguard && navigate(`/ossiguard/${ossiguard.uuid}`)} onAssign={() => setAssigningOssiguard(true)} onRemove={ossiguard ? removeOssiguard : null} onValidate={() => setSection('validation')} />}

Ossiguard Validation

} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NewCover.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/NewBuilder.jsx:2:import { useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminUsers.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminConsole.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminUserDetail.jsx:2:import { useParams, useNavigate, Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:2:import { Link, useParams, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:37: const reorder = run(async () => { const r = await completedCoverService.reorder(cover, 'Ray'); navigate(`/orders/${r.order.uuid}`); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:38: const newDesign = run(async () => { const p = await completedCoverService.newDesignFromFit(cover, project, 'Ray'); navigate(`/projects/${p.uuid}`); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:39: const replace = run(async () => { const order = await completedCoverService.replace(cover, 'Ray'); navigate(`/orders/${order.uuid}`); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:2:import { useParams, Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderWorkspace.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OrderDetail.jsx:2:import { Link, useParams } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Login.jsx:2:import { Link } from "react-router-dom"; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Validation.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardLibrary.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/IntakeRequests.jsx:3:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Shipping.jsx:3:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CustomerDetail.jsx:2:import { Link, useParams } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/InvitationAccept.jsx:2:import { useParams, Link, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ForgotPassword.jsx:2:import { Link } from "react-router-dom"; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ComponentDimensions.jsx:2:import { useParams, Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ManufacturingJobDetail.jsx:2:import { Link, useParams } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/CustomerPortal.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:2:import { useParams, Link, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalSection.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalDetail.jsx:2:import { useParams, Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Register.jsx:2:import { Link } from "react-router-dom"; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:2:import { Link, useParams, useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:98: : `nav-link ${isActive && path !== '/not-implemented' ? 'nav-link-active' : ''}`}>{label})} } /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx:13: aria-label="Close navigation" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx:41: aria-label="Close navigation" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx:58: id="limbforge-sidebar-scroll" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSearch.jsx:2:import { useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSearch.jsx:11: const go = (r) => { setOpen(false); setTerm(''); navigate(r.to); }; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardInspector.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ossiguard/OssiguardAssignPicker.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ProtectedRoute.jsx:2:import { Outlet } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ProtectedRoute.jsx:12:export default function ProtectedRoute({ fallback = , unauthenticatedElement }) { /home/shire3d/ARMOR/agents/apps/limbforge/src/components/projects/ProjectCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/orders/OrderCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/admin/AdminLayout.jsx:1:import { Outlet, Link, useLocation } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx:2:import { useLocation, useNavigationType } from "react-router-dom"; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx:16: const navigationType = useNavigationType(); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx:19: if (navigationType === "POP") return; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ScrollToTop.jsx:30: }, [pathname, hash, navigationType]); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/SessionCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/StartWorkflowDialog.jsx:2:import { useNavigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/StartWorkflowDialog.jsx:18: const start = async () => { const component = components.find(c => c.uuid === sel.component_uuid); const tasks = await dimensionAnalysis.buildWorkflow(component); const session = await dimensionService.createSession('component_envelope', { customer_uuid: sel.customer_uuid, limb_profile_uuid: sel.limb_uuid, component_uuid: sel.component_uuid }, 'Ray'); navigate(`/measurements/${session.uuid}`); }; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx:75: src="/agents/limbforge/measurement-guides/residual-limb-length-anatomy.png" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx:101: src="/agents/limbforge/measurement-guides/residual-limb-mini-person.png" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx:155: href="/agents/limbforge/measurement-guides/residual-limb-length-approved.png" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/builder/BuilderLayout.jsx:1:import { Outlet, Link, useLocation } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleRouter.jsx:1:import { Navigate } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleRouter.jsx:6:export default function RoleRouter() { /home/shire3d/ARMOR/agents/apps/limbforge/src/components/covers/CompletedCoverCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/TopBar.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/CustomerCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/HistoryPanel.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/RoleGuard.jsx:1:import { Navigate, Outlet } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/manufacturing/ManufacturingJobCard.jsx:1:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/portal/PortalLayout.jsx:1:import { Outlet, Link, useLocation } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/components/ComponentCard.jsx:2:import { Link } from 'react-router-dom'; /home/shire3d/ARMOR/agents/apps/limbforge/vite.config.js:13: navigationNotifier: true, /home/shire3d/ARMOR/agents/apps/limbforge/LEGACY_VIEWPORT_V1_FAILURE_REPORT.md:33: event listeners and, under rapid navigation, a second controls instance [TRUNCATED: 359 matches; first 320 shown] === MEASUREMENT WORKFLOW FILE CANDIDATES === /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CoverProject.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/LimbProfile.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementDefinition.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementSession.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementValue.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/ProjectAssignment.jsonc /home/shire3d/ARMOR/agents/apps/limbforge/public/measurement-guides/measurement-dashboard-approved.png /home/shire3d/ARMOR/agents/apps/limbforge/src/components/dimensions/tabs/MeasurementStationsTab.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementEntry.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuide.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/SessionCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/projects/ProjectCard.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/viewportV2/MeasurementStationsV2.js /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/MeasurementInspector.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ProjectTree.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/workflows/MeasurementStudio3D.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MeasurementSession.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Measurements.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Projects.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx /home/shire3d/ARMOR/agents/apps/limbforge/src/services/limbProfileService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementService.js /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js ================================================================ MEASUREMENT DOMAIN TYPES, MODELS AND API CALLS PATTERN: MeasurementDefinition|measurement_definition|measurementDefinitions|measurement_key|measurementKey|required_view|requiredView|body_region|bodyRegion|amputation_level|amputationLevel|interface_type|interfaceType|limb_profile|limbProfile|measurement_session|measurementSession ROOT: /home/shire3d/ARMOR/agents/apps/limbforge ================================================================ /home/shire3d/ARMOR/agents/apps/limbforge/src/services/validationService.js:2:export const validationService = { projectWarnings: (p) => [!p.customer_uuid && 'Customer missing', !p.limb_profile_uuid && 'Limb profile missing', !p.safety_boundary_accepted && 'Safety declaration not accepted'].filter(Boolean) }; /home/shire3d/ARMOR/agents/apps/limbforge/src/services/customerService.js:11: async createLimb(data, actor) { const record = await adapters.database.create('LimbProfile', { ...data, uuid: newUuid('limb'), ...migrationFields(actor) }); await auditService.record('limb_profile_created', 'LimbProfile', record.uuid, `Created ${record.profile_name}`, actor); return record; }, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/limbProfileService.js:2:export const limbProfileService = { list: () => adapters.database.list('LimbProfile'), byCustomer: (customer_uuid) => adapters.database.filter('LimbProfile', { customer_uuid }) }; /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementService.js:6: definitions: (workflow) => adapters.database.filter('MeasurementDefinition', { workflow, active: true }, 'sequence'), /home/shire3d/ARMOR/agents/apps/limbforge/src/services/dimensionService.js:98: limb_profile_uuid: refs.limb_profile_uuid || '', component_uuid: refs.component_uuid || '', /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:10: const interfaceType = /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:11: data.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:12: || limb?.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:21: data.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:22: || limb?.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:26: if (interfaceType === 'Osseointegration') { /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:122: uuid: data.limb_profile_uuid, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:140: limb_profile_uuid: /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:141: data.limb_profile_uuid, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:151: if (limb && limb.interface_type === 'Osseointegration') { /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:179: && project.limb_profile_uuid === limbUuid /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:194: && session.limb_profile_uuid === limbUuid /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:352: item.amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:353: item.interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:53: project.limb_profile_uuid ? adapters.database.filter('LimbProfile', { uuid: project.limb_profile_uuid }, '-updated_date', 1) : Promise.resolve([]), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:113: if (data.limb && data.limb.interface_type === 'Osseointegration') checks.push(['No stoma / implant attachment (osseointegration)', !(ov.issueObjects || []).some((i) => i.level === 'blocked' && i.text.toLowerCase().includes('implant')), 'blocking']); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:24:import { limbProfileService } from '@/services/limbProfileService'; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:141: limbProfileService.list(), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:172: children: activePros.filter(p => p.customer_uuid === c.uuid && p.limb_profile_uuid === l.uuid).map(p => ({ /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:43:

Ossiguard Connector

{SAFETY_BANNER}
{cover.ossiguard_used || ossiguard ? :

This cover was not recorded with an Ossiguard connector.

}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Validation.jsx:21: p.limb_profile_uuid ? adapters.database.filter('LimbProfile', { uuid: p.limb_profile_uuid }, '-updated_date', 1) : Promise.resolve([]), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CustomerDetail.jsx:66: {tab === 'limbs' &&

Limb Profiles ({history.limbs.length})

{history.limbs.length ?
{history.limbs.map((l) =>
{l.profile_name}{l.configuration}
Interface
{l.interface_type}
Manufacturer / model
{l.prosthesis_manufacturer} {l.prosthesis_model}
Fitting date
{l.fitting_date}
Related covers
{history.projects.filter((p) => p.limb_profile_uuid === l.uuid).length}
)}
:

No limb profiles recorded.

}
} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:52: project.limb_profile_uuid ? adapters.database.filter('LimbProfile', { uuid: project.limb_profile_uuid }, '-updated_date', 1) : Promise.resolve([]), /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/StartWorkflowDialog.jsx:18: const start = async () => { const component = components.find(c => c.uuid === sel.component_uuid); const tasks = await dimensionAnalysis.buildWorkflow(component); const session = await dimensionService.createSession('component_envelope', { customer_uuid: sel.customer_uuid, limb_profile_uuid: sel.limb_uuid, component_uuid: sel.component_uuid }, 'Ray'); navigate(`/measurements/${session.uuid}`); }; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:710: session?.limb_profile_uuid /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:715: session.limb_profile_uuid, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:756: session?.limb_profile_uuid, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:773: const interfaceType = /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:774: limb.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:775: || project.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/components/measurements/MeasurementGuideLegacy.jsx:779: clean(interfaceType).includes( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:123:
{l.profile_name || l.configuration}
{l.configuration} · {l.interface_type || 'Socket'}
/home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:141: const limbPros = prostheses.filter(p => p.limb_profile_uuid === l.uuid); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:143: const limbProjects = projects.filter(p => p.limb_profile_uuid === l.uuid); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:152: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:153: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:184: const limb = limbs.find(l => l.uuid === p.limb_profile_uuid); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop3d/panels/ContextPanel.jsx:186: const proProject = projects.find(pr => pr.prosthesis_uuid === p.uuid) || projects.find(pr => pr.customer_uuid === p.customer_uuid && pr.limb_profile_uuid === p.limb_profile_uuid); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/ProsthesisForm.jsx:2:export default function ProsthesisForm({ customerUuid, limbs, onSave, onCancel }) { const [f,setF]=useState({customer_uuid:customerUuid,limb_profile_uuid:limbs[0]?.uuid||'',data_label:'WORKSHOP RECORD'}); const field=(k,l)=>; return
{e.preventDefault();onSave(f)}}>{field('name','Prosthesis name')}{field('configuration','Configuration')}{field('manufacturer','Manufacturer')}{field('model','Model')}{field('serial_number','Serial number (optional)')}{field('notes','Notes')}
} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/customers/LimbForm.jsx:3:export default function LimbForm({ customerUuid, onSave, onCancel }) { const [f,setF]=useState({customer_uuid:customerUuid,configuration:'Right below-knee',interface_type:'Socket',data_label:'WORKSHOP RECORD'}); const field=(k,l)=>; return
{e.preventDefault();onSave(f)}} className="grid gap-4 md:grid-cols-2">{field('profile_name','Profile name')}{field('prosthesis_manufacturer','Prosthesis manufacturer')}{field('prosthesis_model','Prosthesis model')}{field('prosthetist_or_clinic','Prosthetist or clinic')}{field('important_notes','Important notes')}
} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:31: limb.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:37: const amputationLevel = /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:61: interface_type: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:62: limb.interface_type || '', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:64: amputation_level: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:65: amputationLevel || '', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:68: limb.interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:70: amputationLevel, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:140: !data.limb_profile_uuid /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:141: || data.limb_profile_uuid === 'new' /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:148: item.uuid === data.limb_profile_uuid /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:157: }, [data.limb_profile_uuid, limbs]); /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:179: let limbUuid = data.limb_profile_uuid; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:185: interface_type: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:186: data.interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:189: amputation_level: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:190: data.amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:194: `${data.side} ${data.amputation_level.toLowerCase()}`, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:212: limb_profile_uuid: limbUuid, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:231: !!data.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:233: && !!data.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:249: !!data.limb_profile_uuid /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewCoverWizard.jsx:251: data.limb_profile_uuid !== 'new' /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:13: interfaceTypes, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:155: {select('limb_profile_uuid', limbs)} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:162: limb_profile_uuid: 'new', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:171: amputation_level: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:172: data.amputation_level || 'Below-knee', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:173: interface_type: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:174: data.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:181: data.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:192: {data.limb_profile_uuid === 'new' && ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:213: interface_type: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:214: data.interface_type || '', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:217: amputation_level: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:218: data.amputation_level || '', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:225: next.interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:227: next.amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:233: if (data.limb_profile_uuid === 'new') { /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:236: interface_type: next.interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:238: amputation_level: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:239: next.amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:242: next.side && next.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:243: ? `${next.side} ${next.amputation_level.toLowerCase()}` /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:260: name="interface_type" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:262: value={data.interface_type} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:263: options={interfaceTypes} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:264: onChange={interface_type => /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:266: interface_type, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:279: amputation_level: '', /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:285: name="amputation_level" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:287: value={data.amputation_level} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:289: onChange={amputation_level => /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:291: amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:308: {data.interface_type /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:310: && data.amputation_level /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:318: {data.interface_type} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:322: {data.amputation_level} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:480: Limb profile: {data.limb_profile_uuid} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:484: Interface: {data.interface_type || 'Missing'} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/WizardStep.jsx:492: data.amputation_level, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:3: const level = value.amputation_level || 'Below-knee'; /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:22: || key === 'amputation_level' /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:77: value={value.amputation_level || 'Below-knee'} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:79: set('amputation_level', event.target.value) /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:96: value={value.interface_type || 'Osseointegration'} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/NewLimbStep.jsx:98: set('interface_type', event.target.value) /home/shire3d/ARMOR/agents/apps/limbforge/src/components/newcover/wizardConfig.js:14:export const interfaceTypes = [ /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake/entry.ts:94: const limbProfile = await base44.asServiceRole.entities.LimbProfile.create({ /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake/entry.ts:96: configuration: configuration || 'Left Below-knee', side, amputation_level: level, /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake/entry.ts:97: interface_type: prosthesisType === 'Osseointegration' ? 'Osseointegration' : 'Socket', /home/shire3d/ARMOR/agents/apps/limbforge/base44/functions/submitPublicIntake/entry.ts:112: customer_uuid: customer.uuid, limb_profile_uuid: limbProfile.uuid, /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CoverProject.jsonc:28: "limb_profile_uuid": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CoverProject.jsonc:160: "limb_profile_uuid", /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/LimbProfile.jsonc:39: "amputation_level": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/LimbProfile.jsonc:42: "interface_type": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementDefinition.jsonc:2: "name": "MeasurementDefinition", /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CompletedCover.jsonc:20: "limb_profile_uuid": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/CompletedCover.jsonc:136: "cover_interface_type": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/MeasurementSession.jsonc:14: "limb_profile_uuid": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Prosthesis.jsonc:11: "limb_profile_uuid": { /home/shire3d/ARMOR/agents/apps/limbforge/base44/entities/Prosthesis.jsonc:79: "limb_profile_uuid", ================================================================ PATIENT-FIRST RESOLUTION CONTEXT PATTERN: patientId|patient_id|projectId|project_id|sessionId|session_id|selectedPatient|selectedProject|selectedSession|laterality|side|osseointegration|osseo|stoma|no.contact|exclusion.zone ROOT: /home/shire3d/ARMOR/agents/apps/limbforge ================================================================ /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/shire.css:23:#limbforge-sidebar-scroll { /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:55: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/shire/ShireApp.jsx:84: path="/projects/:projectId/design-forge" /home/shire3d/ARMOR/agents/apps/limbforge/src/services/searchService.js:19: projects.forEach((p) => { if (match(p.project_id) || match(p.prosthesis_configuration) || match(p.data_label)) results.push({ type: 'Cover Project', label: p.project_id, sub: `Rev ${p.revision}`, to: `/projects/${p.uuid}`, icon: 'folder' }); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementService.js:8: async save(session, definition, data, actor) { const existing = (await adapters.database.filter('MeasurementValue', { session_uuid: session.uuid, definition_uuid: definition.uuid }, '-updated_date', 1))[0]; const previous = (await adapters.database.filter('MeasurementValue', { definition_uuid: definition.uuid }, '-measured_date', 20)).find(v => v.session_uuid !== session.uuid && v.value_mm); const value_mm = data.entered_unit === 'cm' ? Number(data.value) * 10 : Number(data.value); const warnings = []; if (definition.unit === 'mm' && (value_mm < definition.minimum_value || value_mm > definition.maximum_value)) warnings.push(`Outside expected range ${definition.minimum_value}–${definition.maximum_value} mm.`); if (data.entered_unit === 'mm' && value_mm < definition.minimum_value && value_mm * 10 <= definition.maximum_value) warnings.push('Likely wrong unit: this value may have been entered in centimetres.'); if (previous && Math.abs(value_mm - previous.value_mm) / previous.value_mm > 0.2) warnings.push(`More than 20% different from a previous ${definition.name} record.`); const warning = warnings.length ? `${warnings.join(' ')} Manual review required.` : ''; const payload = { value_mm, entered_unit: data.entered_unit, confidence: data.confidence, measured_by: actor, measured_date: new Date().toISOString().slice(0,10), notes: data.notes, photo_url: data.photo_url || '', storage_destination: data.storage_destination || '', warning, updated_by_name: actor }; const saved = existing ? await adapters.database.update('MeasurementValue', existing.id, payload) : await adapters.database.create('MeasurementValue', { ...payload, uuid: newUuid('measure'), session_uuid: session.uuid, definition_uuid: definition.uuid, project_uuid: session.project_uuid, ...migrationFields(actor) }); await auditService.record('measurement_changed', 'MeasurementValue', saved.uuid, `Saved ${definition.name}`, actor, warning); return saved; }, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/completedCoverService.js:13: async newDesignFromFit(cover, project, actor) { const { id, created_date, updated_date, created_by_id, ...rest } = project; const revisionProject = await adapters.database.create('CoverProject', { ...rest, uuid: newUuid('proj'), project_id: `${project.project_id}-R${(project.revision || 1) + 1}`, revision: (project.revision || 1) + 1, status: 'Ready for design', reason_for_cover: `New design using fit from ${cover.cover_reference}`, data_origin: 'Workshop Created', ...migrationFields(actor) }); await auditService.record('project_revision_created', 'CoverProject', revisionProject.uuid, `New revision ${revisionProject.project_id} from ${cover.cover_reference}`, actor); try { await designService.copyToProject(project.uuid, revisionProject.uuid, actor); } catch (_) { /* design copy is best-effort */ } return revisionProject; }, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js:145: issues.push({ level: 'warning', text: 'Mirror-accent symmetry does not mirror readable text or logos — text remains single-sided' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js:153: // Pattern/panel on the connector side may obstruct access /home/shire3d/ARMOR/agents/apps/limbforge/src/services/designService.js:156: issues.push({ level: 'warning', text: 'Exterior pattern on connector side — verify it does not obstruct Ossiguard insertion/removal path' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:85: project_id: /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:159: `Created cover project ${record.project_id}`, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:174: project_id: undefined, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:178: `Revision of ${project.project_id}`, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:196: `Archived ${record.project_id}`, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/projectService.js:214: `Restored ${record.project_id}`, /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js:35: const sessionIds = sessions.map((s) => s.uuid); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js:38: if (sessionIds.length) { /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js:39: try { stations = await base44.entities.EnvelopeStation.filter({ session_uuid: { $in: sessionIds } }); } catch (_) { stations = []; } /home/shire3d/ARMOR/agents/apps/limbforge/src/services/measurementGeometryService.js:41: for (const sid of sessionIds) { /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:129: if (target.includes('implant')) issues.push({ level: 'blocked', text: 'No implant attachment — Ossiguard must not attach to osseointegration implant' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:131: if (target.includes('stoma')) issues.push({ level: 'blocked', text: 'No stoma attachment' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:152: issues.push({ level: 'pass', text: 'Osseointegration detected — stoma and surrounding area are permanent no-contact, no-cover, no-attachment zones' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:154: if (target.includes('implant') || target.includes('abutment') || target.includes('stoma')) { /home/shire3d/ARMOR/agents/apps/limbforge/src/services/ossiguardService.js:155: issues.push({ level: 'blocked', text: 'Ossiguard must not attach to implant, abutment or stoma for osseointegration projects' }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Projects.jsx:27: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((p) => (p.project_id || '').toLowerCase().includes(t) || (cust(p.customer_uuid)?.full_name || '').toLowerCase().includes(t) || (p.prosthesis_configuration || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:27: limb: 'Leg', side: 'Left', level: 'Below-knee', /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:53: // All record creation, validation and rate-limiting happen server-side; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:135: set({ side: v })} /> /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:144:

Socket: your limb sits inside a socket. Osseointegration: a direct connector through the skin. Unsure is fine — we'll help.

/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignYourCover.jsx:233: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:37: anti_rotation_feature: '', secondary_retention: '', mechanical_stop: '', flexible_insert: false, cover_side_interface: '', /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:42: safety_no_implant: false, safety_no_abutment: false, safety_no_stoma: false, safety_no_skin: false, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:154: return set('compatible_limb_type', v)} /> {}} /> set('cover_side_interface', v)} options={['Two-piece clam shell', 'Front and rear shell', 'Left and right shell', 'Hinged cover', 'Slide-on panel', 'Clip-on panel', 'Replaceable outer panel', 'Modular armour plates']} />; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardWizard.jsx:169: const items = [['safety_no_implant','No implant attachment'],['safety_no_abutment','No abutment attachment'],['safety_no_stoma','No stoma contact'],['safety_no_skin','No skin contact'],['safety_no_alignment','No alignment interference'],['safety_no_release','No release obstruction'],['safety_no_movement','No movement obstruction'],['safety_no_maintenance','No maintenance obstruction']]; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:351: item.side, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:388: title={item.project_id} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/TakeMeasurements.jsx:436: {project?.project_id} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Orders.jsx:31: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((o) => (o.order_number || '').toLowerCase().includes(t) || (cust(o.customer_uuid)?.full_name || '').toLowerCase().includes(t) || (proj(o.project_uuid)?.project_id || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:30: const { projectId } = useParams(); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:49: const project = await projectService.get(projectId); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:56: adapters.database.filter('MeasurementSession', { project_uuid: projectId }), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:57: adapters.database.filter('MeasurementValue', { project_uuid: projectId }), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:58: quoteService.forProject(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:59: orderService.forProject(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:60: manufacturingService.forProject(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:61: completedCoverService.forProject(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:63: designService.getCurrent(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:64: designService.forProject(projectId), /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:70: try { const geo = await loadProjectGeometry(projectId); setGeometry(geo); } catch (_) {} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:73: setData({ project, customer, limb: limb[0], prostheses, components: projectComponents, unknownComponents: componentUuids.length - projectComponents.length, sessions, values, quotes, orders, jobs, covers, design, designRevisions: designRevisions || [], ossiguard, audits: (audits || []).filter((a) => a.record_uuid === projectId).sort((a, b) => (b.created_date || '').localeCompare(a.created_date || '')) }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:74: }, [projectId]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:78: const refreshGeometry = useCallback(async () => { try { const geo = await loadProjectGeometry(projectId); setGeometry(geo); } catch (_) {} }, [projectId]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:83: const prepareQuote = act(() => quoteService.create({ project_uuid: projectId, customer_uuid: data.project.customer_uuid, amount: 0, funding_type: 'Quote-only' }, 'Ray')); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:84: const saveDesign = act(async (form) => { await designService.saveRevision(projectId, { ...form, project_uuid: projectId, customer_uuid: data.project.customer_uuid }, 'Ray'); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:85: const duplicateDesign = act(() => designService.duplicate(projectId, 'Ray')); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:88: const newStyleFromFit = act(async () => { const np = await projectService.duplicate(data.project, 'Ray'); await designService.copyToProject(projectId, np.uuid, 'Ray'); navigate(`/projects/${np.uuid}`); }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:113: if (data.limb && data.limb.interface_type === 'Osseointegration') checks.push(['No stoma / implant attachment (osseointegration)', !(ov.issueObjects || []).some((i) => i.level === 'blocked' && i.text.toLowerCase().includes('implant')), 'blocking']); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:123: return <>Open Design ForgeOpen Customer{sessions[0] && Open Measurements}{orders[0] && View Order}} />
{project.status}{geometry && {geometry.geometryStatus}}{quotes[0] && Quote: {quotes[0].approval_status}}{orders[0] && Order: {orders[0].production_status}}{covers[0] && Cover: {covers[0].cover_reference}}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ProjectDetail.jsx:137:│ ├── Cover Interface${ossiguard?.cover_side_interface ? ` (${ossiguard.cover_side_interface})` : ' — not set'} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/NewCover.jsx:6:export default function NewCover() { const [created,setCreated]=useState(null); return <>{created?

PROJECT CREATED

{created.project_id}

Revision {created.revision} · {created.status}

Open projects
:
} } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Manufacturing.jsx:28: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((j) => (j.job_reference || '').toLowerCase().includes(t) || (proj(j.project_uuid)?.project_id || '').toLowerCase().includes(t) || (ord(j.order_uuid)?.order_number || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/AdminUserDetail.jsx:102:
{p.project_id}
{p.status}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/Assignments.jsx:38: uuid: newUuid('assign'), project_uuid: projectUuid, project_id: project?.project_id, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/Assignments.jsx:69: {projects.map(p => )} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/admin/Assignments.jsx:92:
{a.project_id}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:368: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:471: {/* DOM label overlay — outside the Canvas, projected from the live camera */} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Workshop3D.jsx:508: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:42: return <>Open CustomerOpen Original Project
} />
{cover.preview_image_url ? :
No preview image recorded
}

Identity

Material & Print

Post-processing & Inspection

{cover.inspection_result || 'Pending'}], ['Fit review', {cover.fit_review_result || 'Not reviewed'}]]} />

Approved Custom Design

{design ? <>
{design.custom_text_enabled &&

Custom text

{design.custom_text || '—'}

{design.text_style} · {design.text_placement} · {design.text_size} · {design.text_raised ? 'raised' : 'engraved'}

}{(design.surface_notes || design.inspiration_notes || design.vent_concept) &&
}

Design revision v{design.version} · {design.approved_for_quote ? 'Approved for quote' : 'Not yet approved'} · Conceptual only — not manufacturing CAD.

:

No custom design configuration saved for this project. Open project to add design.

}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCoverDetail.jsx:43:

Ossiguard Connector

{SAFETY_BANNER}
{cover.ossiguard_used || ossiguard ? :

This cover was not recorded with an Ossiguard connector.

}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:19: const { projectId } = useParams(); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:27: const ps = await adapters.database.filter('CoverProject', { uuid: projectId }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:34: results[s.key] = await adapters.database.filter(s.entity, { [s.filter]: projectId }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:39: }, [projectId, account]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderProjectDetail.jsx:59: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderTasks.jsx:26:
{a.project_id}
{a.assignment_type.replace('_', ' ')} · {a.assigned_by_name}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderWorkspace.jsx:50:
{p.project_id}
{p.status}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/builder/BuilderWorkspace.jsx:66:
{a.project_id}{a.assignment_type.replace('_', ' ')}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OrderDetail.jsx:42: return <>Open CustomerOpen Project
} />

Customer & Contact

Project

{project?.project_id}], ['Revision', order.cover_revision || project?.revision], ['Limb', project?.prosthesis_configuration], ['Prosthesis', project?.prosthesis_configuration], ['Due date', order.due_date]]} />

Financial

{order.payment_status || 'Unpaid'}], ['Funding method', order.funding_type], ['Funding approval', order.funding_approval_status], ['Approval reference', order.approval_reference], ['Invoice status', order.invoice_status]]} />

Payment is only shown as paid when a real recorded payment exists. No payment is assumed.

Production Status

{order.production_status}
{order.cancel_reason &&

Cancelled: {order.cancel_reason}

}

Manufacturing Jobs ({jobs.length})

{jobs.length ?
{jobs.map((j) => {j.job_reference}{j.status})}
:

No manufacturing jobs yet.

}

Shipping ({shipments.length})

{shipments.length ? shipments.map((s) =>
) :

No shipments prepared yet.

}

Audit History

{audits.length ?
    {audits.map((a) =>
  1. {a.summary}{a.actor_name}
  2. )}
:

No audit events recorded.

}
{order.record_state === 'archived' ? : }
; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Validation.jsx:44: {r.project.project_id} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Reports.jsx:5:export default function Reports() { const [reports,setReports]=useState(); useEffect(()=>{reportService.implementationReports().then(setReports)},[]); if(!reports)return ; return <>{reports.map(r=>

{r.stage}

Completed {r.completed_date}

Export status: {r.export_status}

Recommended next stage: {r.recommended_next_stage}

)} } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/IntakeRequests.jsx:19: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((p) => (p.project_id || '').toLowerCase().includes(t) || (cust(p.customer_uuid)?.full_name || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/IntakeRequests.jsx:23: return <>
{shown.map((p) =>

{p.project_id} · Rev {p.revision}

{cust(p.customer_uuid)?.full_name || 'Unknown'}

Public Intake

{p.reason_for_cover}

Open project)}
{shown.length === 0 &&

No public intake requests found.

}; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CustomerDetail.jsx:72: {tab === 'projects' &&

Cover Projects ({history.projects.length})

{history.projects.length ?
{history.projects.map((p) =>
{p.project_id}Rev {p.revision}
{p.status})}
:

No cover projects yet.

}
} /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/InvitationAccept.jsx:29: // Role assignment happens entirely server-side; the client sends only the /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ManufacturingJobDetail.jsx:36: return <>Open OrderOpen Project{job.completed_cover_uuid && Open Completed Cover}
} />

Status

{job.status}

Links

{order?.order_number}], ['Project', {project?.project_id}], ['Cover revision', job.cover_revision], ['Completed cover', job.completed_cover_uuid ? Open : 'Not linked']]} />

Files

Open : 'Not uploaded'], ['Print file', job.print_file_url ? Open : 'Not uploaded']]} />

Print Settings

Inspection

Audit History

{audits.length ?
    {audits.map((a) =>
  1. {a.summary}{a.actor_name}
  2. )}
:

No audit events recorded.

}
{job.record_state === 'archived' ? : }
; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:30: const [selectedProjectId, setSelectedProjectId] = useState(''); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:33: const [sessionId, setSessionId] = useState(''); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:48: const loadProject = useCallback(async (projectId) => { /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:49: setSelectedProjectId(projectId); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:50: if (!projectId) { setGeometry(null); setProject(null); setSessions([]); setSessionId(''); return; } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:53: const geo = await loadProjectGeometry(projectId); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:63: project_uuid: projectId, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:81: if (!selectedProjectId) return; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:82: const geo = await loadProjectGeometry(selectedProjectId); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:86: }, [selectedProjectId]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:138: setSessionId(e.target.value)} className="workshop-input !mt-0 !min-h-9 max-w-xs"> /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/ViewportV2Test.jsx:166: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/CompletedCovers.jsx:30: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((c) => (c.cover_reference || '').toLowerCase().includes(t) || (c.design_name || '').toLowerCase().includes(t) || (cust(c.customer_uuid)?.full_name || '').toLowerCase().includes(t) || (proj(c.project_uuid)?.project_id || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/CustomerPortal.jsx:70:
Request {p.project_id}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:12: const { projectId } = useParams(); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:23: const ps = await adapters.database.filter('CoverProject', { uuid: projectId }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:27: setDesigns(await adapters.database.filter('DesignConfiguration', { project_uuid: projectId })); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:29: const qs = await adapters.database.filter('Quote', { project_uuid: projectId }); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:34: }, [projectId, account]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:56: setDesigns(await adapters.database.filter('DesignConfiguration', { project_uuid: projectId })); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:64: setDesigns(await adapters.database.filter('DesignConfiguration', { project_uuid: projectId })); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalProject.jsx:70: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/portal/PortalSection.jsx:10: requests: { title: 'My Cover Requests', entity: 'CoverProject', link: (r) => `/portal/projects/${r.uuid}`, label: (r) => r.project_id, status: (r) => r.status }, /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:20: const { projectId } = useParams(); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:23: const [activeProjectId, setActiveProjectId] = useState(projectId || null); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:37: // Project picker for /design-forge with no projectId /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:39: if (projectId) { setActiveProjectId(projectId); return; } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:44: }, [projectId]); /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:99:
{p.project_id}
{p.status}
/home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:112: /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/DesignForge.jsx:113: Back to project{ossiguard && Ossiguard}
} /> /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Quotes.jsx:28: if (search.trim()) { const t = search.toLowerCase(); list = list.filter((q) => (q.quote_number || '').toLowerCase().includes(t) || (cust(q.customer_uuid)?.full_name || '').toLowerCase().includes(t) || (proj(q.project_uuid)?.project_id || '').toLowerCase().includes(t)); } /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/Quotes.jsx:32: return <>
{shown.map((q) =>

{q.quote_number}

{cust(q.customer_uuid)?.full_name || 'Unknown'}

{proj(q.project_uuid)?.project_id}

{q.approval_status}
Amount
{q.amount != null ? `$${q.amount}` : '—'}
Funding
{q.funding_type || '—'}
Sent
{q.sent_date || '—'}
Expiry
{q.expiry_date || '—'}
Open project)}
{shown.length === 0 &&

No quotes match the current filter.

}; /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardDetail.jsx:94: ['Cover-side interface', profile.cover_side_interface], /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/OssiguardDetail.jsx:95: ['Prosthesis-side interface', profile.prosthesis_side_interface], /home/shire3d/ARMOR/agents/apps/limbforge/src/pages/MigrationReadiness.jsx:6:export default function MigrationReadiness() { return <>
{rows.map(([a,b,t])=>
{a}{b}{t==='green'?'Ready':t==='amber'?'Portable with work':'Not ready'}
)}

Adapter contracts

{Object.entries(adapterContracts).map(([k,v])=>

{k}: {v.join(' · ')}

)}

Logical SHiREVault destinations

{workshopStoragePaths.map(x=>{x})}

Portability warning: these are logical destinations only. No file is claimed as saved to SHiREVault while Base44-hosted.

} /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx:103: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx:121: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx:123: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx:151: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/App.jsx:158: } /> /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:36: --sidebar-background: 225 38% 5%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:37: --sidebar-foreground: 220 20% 80%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:38: --sidebar-primary: 263 87% 57%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:39: --sidebar-primary-foreground: 0 0% 100%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:40: --sidebar-accent: 225 24% 13%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:41: --sidebar-accent-foreground: 220 47% 98%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:42: --sidebar-border: 222 24% 20%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:43: --sidebar-ring: 263 87% 57%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:71: --sidebar-background: 225 38% 5%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:72: --sidebar-foreground: 220 20% 80%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:73: --sidebar-primary: 263 87% 57%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:74: --sidebar-primary-foreground: 0 0% 100%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:75: --sidebar-accent: 225 24% 13%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:76: --sidebar-accent-foreground: 220 47% 98%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:77: --sidebar-border: 222 24% 20%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:78: --sidebar-ring: 263 87% 57%; /home/shire3d/ARMOR/agents/apps/limbforge/src/index.css:119:.light aside, .light header { background-color: rgba(244, 246, 250, .97) !important; } /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/image.jsx:172: * server-side, optionally anchored at a focal point. Other URLs render as a /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx:39: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx:47:const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx:51: sideOffset={sideOffset} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/dropdown-menu.jsx:54: "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:20:const SIDEBAR_COOKIE_NAME = "sidebar_state" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:53: // This is the internal state of the sidebar. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:54: // We use openProp and setOpenProp for control from outside the component. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:65: // This sets the cookie to keep the sidebar state. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:69: // Helper to toggle the sidebar. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:76: // Adds a keyboard shortcut to toggle the sidebar. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:93: // This makes it easier to style the sidebar with Tailwind classes. /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:112: "--sidebar-width": SIDEBAR_WIDTH, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:113: "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:118: "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:133: side = "left", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:134: variant = "sidebar", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:148: "flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:162: data-sidebar="sidebar" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:164: className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:167: "--sidebar-width": SIDEBAR_WIDTH_MOBILE /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:170: side={side}> /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:180: className="group peer hidden text-sidebar-foreground md:block" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:184: data-side={side}> /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:185: {/* This is what handles the sidebar gap on desktop */} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:188: "relative h-svh w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:190: "group-data-[side=right]:rotate-180", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:192: ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:193: : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:197: "fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:198: side === "left" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:199: ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:200: : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:203: ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:204: : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:209: data-sidebar="sidebar" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:210: className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"> /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:225: data-sidebar="trigger" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:254: data-sidebar="rail" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:260: "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:261: "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:262: "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:263: "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:264: "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:265: "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:291: data-sidebar="input" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:293: "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:305: data-sidebar="header" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:316: data-sidebar="footer" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:327: data-sidebar="separator" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:328: className={cn("mx-2 w-auto bg-sidebar-border", className)} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:338: data-sidebar="content" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:352: data-sidebar="group" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:365: data-sidebar="group-label" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:367: "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:382: data-sidebar="group-action" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:384: "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:398: data-sidebar="group-content" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:407: data-sidebar="menu" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:416: data-sidebar="menu-item" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:422:const sidebarMenuButtonVariants = cva( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:423: "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:427: default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:429: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:462: data-sidebar="menu-button" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:465: className={cn(sidebarMenuButtonVariants({ variant, size }), className)} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:483: side="right" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:498: data-sidebar="menu-action" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:500: "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:508: "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:519: data-sidebar="menu-badge" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:521: "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:522: "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:542: data-sidebar="menu-skeleton" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:546: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:550: data-sidebar="menu-skeleton-text" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:564: data-sidebar="menu-sub" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:566: "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:584: data-sidebar="menu-sub-button" /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:588: "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sidebar.jsx:589: "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx:11: showOutsideDays = true, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx:16: showOutsideDays={showOutsideDays} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx:36: "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-r-md", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx:50: day_outside: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/calendar.jsx:51: "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sheet.jsx:32: side: { /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sheet.jsx:42: side: "right", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sheet.jsx:47:const SheetContent = React.forwardRef(({ side = "right", className, children, ...props }, ref) => ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/sheet.jsx:50: /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/tooltip.jsx:14:const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/tooltip.jsx:18: sideOffset={sideOffset} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/tooltip.jsx:20: "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/select.jsx:57: "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/select.jsx:59: "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx:80: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx:88: { className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx:96: sideOffset={sideOffset} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/menubar.jsx:98: "z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/context-menu.jsx:38: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/context-menu.jsx:50: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/hover-card.jsx:12:const HoverCardContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/hover-card.jsx:16: sideOffset={sideOffset} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/hover-card.jsx:18: "z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/popover.jsx:12:const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/popover.jsx:17: sideOffset={sideOffset} /home/shire3d/ARMOR/agents/apps/limbforge/src/components/ui/popover.jsx:19: "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", /home/shire3d/ARMOR/agents/apps/limbforge/src/components/workshop/WorkshopSidebar.jsx:20: