gitextract_1sirbdjr/ ├── .cargo/ │ └── config.toml ├── .github/ │ ├── GIT.md │ └── workflows/ │ ├── build.yml │ └── release-macos.yml ├── .gitignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── CODE_RULE.md ├── CONTRIBUTING.md ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── SECURITY.md ├── apps/ │ ├── capsule/ │ │ ├── Cargo.toml │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── src/ │ │ │ ├── api/ │ │ │ │ ├── auth.rs │ │ │ │ ├── chat.rs │ │ │ │ ├── key.rs │ │ │ │ ├── mod.rs │ │ │ │ └── routes.rs │ │ │ ├── config.rs │ │ │ ├── crypto/ │ │ │ │ ├── encryption.rs │ │ │ │ ├── keypair.rs │ │ │ │ └── mod.rs │ │ │ ├── error.rs │ │ │ ├── main.rs │ │ │ ├── services/ │ │ │ │ ├── jwt.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── openai.rs │ │ │ │ └── usage.rs │ │ │ └── types/ │ │ │ ├── decrypted.rs │ │ │ ├── encrypted.rs │ │ │ └── mod.rs │ │ └── tests/ │ │ ├── api.test.mjs │ │ ├── crypto.mjs │ │ └── package.json │ ├── client/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── components.json │ │ ├── eslint.config.js │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── app/ │ │ │ │ ├── pageWrapper/ │ │ │ │ │ └── page-wrapper.tsx │ │ │ │ └── providers/ │ │ │ │ └── theme-provider.tsx │ │ │ ├── components/ │ │ │ │ ├── icon/ │ │ │ │ │ └── Logo.tsx │ │ │ │ └── ui/ │ │ │ │ ├── alert-dialog.tsx │ │ │ │ ├── alert.tsx │ │ │ │ ├── avatar.tsx │ │ │ │ ├── badge.tsx │ │ │ │ ├── breadcrumb.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── command.tsx │ │ │ │ ├── context-menu.tsx │ │ │ │ ├── dialog.tsx │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── label.tsx │ │ │ │ ├── navigation-menu.tsx │ │ │ │ ├── popover.tsx │ │ │ │ ├── resizable.tsx │ │ │ │ ├── scroll-area.tsx │ │ │ │ ├── select.tsx │ │ │ │ ├── separator.tsx │ │ │ │ ├── sheet.tsx │ │ │ │ ├── sidebar.tsx │ │ │ │ ├── skeleton.tsx │ │ │ │ ├── sonner.tsx │ │ │ │ ├── switch.tsx │ │ │ │ ├── table.tsx │ │ │ │ ├── tabs.tsx │ │ │ │ ├── textarea.tsx │ │ │ │ └── tooltip.tsx │ │ │ ├── contexts/ │ │ │ │ └── SupabaseAuthContext.tsx │ │ │ ├── entities/ │ │ │ │ ├── configurations/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── codeService.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── custom-nodes/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── presets.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── device/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── device-token/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── dynamic-dashboard/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── interaction.ts │ │ │ │ │ ├── layoutResolve.ts │ │ │ │ │ └── store.ts │ │ │ │ ├── entity/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── file/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── flow/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── ha/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── integrations/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── log/ │ │ │ │ │ ├── api.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── map/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── permission/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── recording/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── role/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── stat/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── tunnel/ │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── store.ts │ │ │ │ │ └── types.ts │ │ │ │ └── user/ │ │ │ │ ├── api.ts │ │ │ │ ├── store.ts │ │ │ │ └── types.ts │ │ │ ├── features/ │ │ │ │ ├── account-switcher/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── auth/ │ │ │ │ │ ├── AuthInterceptor.tsx │ │ │ │ │ ├── DefaultAdminPasswordDialog.tsx │ │ │ │ │ ├── api.ts │ │ │ │ │ ├── hook.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── code/ │ │ │ │ │ ├── CreateItemDialog.tsx │ │ │ │ │ ├── FileEditor.tsx │ │ │ │ │ └── FileTree.tsx │ │ │ │ ├── configurations/ │ │ │ │ │ ├── ConfigurationActionButton.tsx │ │ │ │ │ ├── ConfigurationCreate.tsx │ │ │ │ │ └── ConfigurationCreateButton.tsx │ │ │ │ ├── darkmode/ │ │ │ │ │ └── mode-toggle.tsx │ │ │ │ ├── dashboard-swipe/ │ │ │ │ │ ├── DashboardSwipeHeader.tsx │ │ │ │ │ └── DashboardSwipeLayout.tsx │ │ │ │ ├── device/ │ │ │ │ │ ├── DeviceCreateButton.tsx │ │ │ │ │ ├── DeviceDeleteButton.tsx │ │ │ │ │ ├── DeviceKeyButton.tsx │ │ │ │ │ └── DeviceUpdateButton.tsx │ │ │ │ ├── device-token/ │ │ │ │ │ └── DeviceTokenManager.tsx │ │ │ │ ├── dynamic-dashboard/ │ │ │ │ │ ├── GroupCanvas.tsx │ │ │ │ │ ├── events/ │ │ │ │ │ │ ├── dispatcher.test.ts │ │ │ │ │ │ └── dispatcher.ts │ │ │ │ │ └── panels/ │ │ │ │ │ ├── ButtonPanel.tsx │ │ │ │ │ ├── FlowPanel.tsx │ │ │ │ │ └── MapPanel.tsx │ │ │ │ ├── entity/ │ │ │ │ │ ├── AllEntities.tsx │ │ │ │ │ ├── AnalyzeMenuItem.tsx │ │ │ │ │ ├── Card.tsx │ │ │ │ │ ├── EntityCreateButton.tsx │ │ │ │ │ ├── EntityDeleteButton.tsx │ │ │ │ │ ├── EntityUpdateButton.tsx │ │ │ │ │ ├── SelectPlatforms.tsx │ │ │ │ │ ├── SelectTypes.tsx │ │ │ │ │ ├── StateHistorySheet.tsx │ │ │ │ │ └── useEntitiesData.ts │ │ │ │ ├── error/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── flow/ │ │ │ │ │ ├── AddCustomNode.tsx │ │ │ │ │ ├── Flow.tsx │ │ │ │ │ ├── Graph.tsx │ │ │ │ │ ├── Options.tsx │ │ │ │ │ ├── OptionsVariation.tsx │ │ │ │ │ ├── RunFlow.tsx │ │ │ │ │ ├── SelectedItemActions.tsx │ │ │ │ │ ├── flow-chat/ │ │ │ │ │ │ ├── buildSystemPrompt.ts │ │ │ │ │ │ ├── executeToolCalls.ts │ │ │ │ │ │ ├── flowTools.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── flowNode.ts │ │ │ │ │ ├── flowTypes.ts │ │ │ │ │ ├── flowUtils.ts │ │ │ │ │ └── nodes/ │ │ │ │ │ ├── ButtonNode.tsx │ │ │ │ │ ├── CalcNode.tsx │ │ │ │ │ ├── HttpNode.tsx │ │ │ │ │ ├── IntervalNode.tsx │ │ │ │ │ ├── LogicNode.tsx │ │ │ │ │ ├── LoopNode.tsx │ │ │ │ │ ├── MQTTNode.tsx │ │ │ │ │ ├── NumberNode.tsx │ │ │ │ │ ├── ProcessingNode.tsx │ │ │ │ │ ├── TitleNode.tsx │ │ │ │ │ └── VarNode.tsx │ │ │ │ ├── flow-log/ │ │ │ │ │ └── FlowLog.tsx │ │ │ │ ├── footer/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── gps/ │ │ │ │ │ └── parseGps.ts │ │ │ │ ├── ha/ │ │ │ │ │ ├── HaEntitiesTable.tsx │ │ │ │ │ ├── HaStatBlock.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── integration/ │ │ │ │ │ ├── HA.tsx │ │ │ │ │ ├── Integration.tsx │ │ │ │ │ ├── ROS.tsx │ │ │ │ │ ├── SDR.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── json/ │ │ │ │ │ └── JsonEditor.tsx │ │ │ │ ├── llm-chat/ │ │ │ │ │ ├── ChatInput.tsx │ │ │ │ │ ├── ChatMessage.tsx │ │ │ │ │ ├── ChatMessages.tsx │ │ │ │ │ ├── ChatPanel.tsx │ │ │ │ │ ├── ChatPanelContainer.tsx │ │ │ │ │ ├── ChatPanelMobile.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── store.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useChatKeyboard.ts │ │ │ │ ├── log/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── map/ │ │ │ │ │ ├── CurrentLocationMarker.tsx │ │ │ │ │ ├── MapViewPersistence.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.css │ │ │ │ ├── map-draw/ │ │ │ │ │ ├── FeatureDetailsPanel.tsx │ │ │ │ │ ├── FeatureDrawingPreview.tsx │ │ │ │ │ ├── FeatureEditor.tsx │ │ │ │ │ ├── FeatureRenderer.tsx │ │ │ │ │ ├── LayerDialog.tsx │ │ │ │ │ ├── LayerSidebar.tsx │ │ │ │ │ ├── MapEvents.tsx │ │ │ │ │ └── MapToolbar.tsx │ │ │ │ ├── map-entity/ │ │ │ │ │ ├── EntityDetailsPanel.tsx │ │ │ │ │ ├── render.tsx │ │ │ │ │ └── store.ts │ │ │ │ ├── recording/ │ │ │ │ │ ├── RecordingButton.tsx │ │ │ │ │ ├── RecordingsList.tsx │ │ │ │ │ ├── VideoPlaybackDialog.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AudioWaveformPlayer.tsx │ │ │ │ │ │ ├── FrameTimeline.tsx │ │ │ │ │ │ ├── PlaybackControls.tsx │ │ │ │ │ │ ├── TimeRuler.tsx │ │ │ │ │ │ ├── VideoControlBar.tsx │ │ │ │ │ │ └── WaveformCanvas.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useAudioWaveform.ts │ │ │ │ │ │ ├── useMediaPlayback.ts │ │ │ │ │ │ └── useVideoFrames.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── role/ │ │ │ │ │ ├── RoleDialogs.tsx │ │ │ │ │ └── RoleForm.tsx │ │ │ │ ├── ros2/ │ │ │ │ │ └── Ros2Dashboard.tsx │ │ │ │ ├── rtc/ │ │ │ │ │ ├── AudioLevelBar.tsx │ │ │ │ │ ├── StreamReceiver.tsx │ │ │ │ │ ├── WebRTCProvider.tsx │ │ │ │ │ ├── captureFrame.ts │ │ │ │ │ ├── rtc.ts │ │ │ │ │ └── turnService.ts │ │ │ │ ├── sdr/ │ │ │ │ │ ├── SdrAudioPlayer.tsx │ │ │ │ │ ├── SdrDashboard.tsx │ │ │ │ │ └── api.ts │ │ │ │ ├── search/ │ │ │ │ │ └── search-form.tsx │ │ │ │ ├── server-resource/ │ │ │ │ │ └── resourceUsage.tsx │ │ │ │ ├── setup/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── footer.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── stat/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── topbar/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.css │ │ │ │ ├── user/ │ │ │ │ │ ├── UserRoleAssigner.tsx │ │ │ │ │ ├── userAdd.tsx │ │ │ │ │ ├── userDelete.tsx │ │ │ │ │ ├── userEdit.tsx │ │ │ │ │ └── userForm.tsx │ │ │ │ └── ws/ │ │ │ │ ├── FlowUiEventBridge.tsx │ │ │ │ ├── IsConnected.tsx │ │ │ │ ├── WebSocketProvider.tsx │ │ │ │ ├── flowUiAdapters/ │ │ │ │ │ └── toastFlowUiAdapter.ts │ │ │ │ ├── flowUiEventRouter.test.ts │ │ │ │ ├── flowUiEventRouter.ts │ │ │ │ ├── ws.ts │ │ │ │ └── wsMock.ts │ │ │ ├── font.css │ │ │ ├── hooks/ │ │ │ │ ├── use-mobile.ts │ │ │ │ ├── useDesktopSidecar.ts │ │ │ │ └── usePreventBackNavigation.ts │ │ │ ├── index.css │ │ │ ├── lib/ │ │ │ │ ├── electron.ts │ │ │ │ ├── geometry-precision.ts │ │ │ │ ├── geometry.ts │ │ │ │ ├── jwt.ts │ │ │ │ ├── storage.ts │ │ │ │ ├── string.ts │ │ │ │ ├── supabase.ts │ │ │ │ ├── time.ts │ │ │ │ └── utils.ts │ │ │ ├── main.tsx │ │ │ ├── pages/ │ │ │ │ ├── auth/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── code/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── dashboard/ │ │ │ │ │ ├── DashboardMainPanel.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── desktop-settings/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── devices/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── dynamic-dashboard/ │ │ │ │ │ ├── DynamicDashboardMainPanel.tsx │ │ │ │ │ ├── NewDynamicDashboardPanel.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── flow/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── landing/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── map/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── notfound/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── recordings/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── settings/ │ │ │ │ │ ├── account.tsx │ │ │ │ │ ├── config.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── integration.tsx │ │ │ │ │ ├── log.tsx │ │ │ │ │ ├── networks.tsx │ │ │ │ │ ├── services.tsx │ │ │ │ │ └── users.tsx │ │ │ │ └── setup/ │ │ │ │ └── index.tsx │ │ │ ├── shared/ │ │ │ │ ├── api/ │ │ │ │ │ └── index.ts │ │ │ │ ├── demo.ts │ │ │ │ ├── desktop.ts │ │ │ │ └── mock/ │ │ │ │ ├── mockAdapter.ts │ │ │ │ └── mockData.ts │ │ │ ├── vite-env.d.ts │ │ │ └── widgets/ │ │ │ ├── auth/ │ │ │ │ ├── AuthenticatedLayout.tsx │ │ │ │ └── TopBarWrapper.tsx │ │ │ ├── device-list/ │ │ │ │ └── DeviceList.tsx │ │ │ ├── entity-list/ │ │ │ │ └── EntityList.tsx │ │ │ ├── role-table/ │ │ │ │ └── RoleList.tsx │ │ │ └── user-table/ │ │ │ └── UserList.tsx │ │ ├── tailwind.config.js │ │ ├── tsconfig.app.json │ │ ├── tsconfig.app.tsbuildinfo │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ ├── tsconfig.node.tsbuildinfo │ │ └── vite.config.ts │ ├── desktop/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ └── src-tauri/ │ │ ├── Cargo.toml │ │ ├── build.rs │ │ ├── capabilities/ │ │ │ └── main.json │ │ ├── entitlements.plist │ │ ├── icons/ │ │ │ └── icon.icns │ │ ├── src/ │ │ │ └── main.rs │ │ └── tauri.conf.json │ ├── landing/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── components.json │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ └── glb/ │ │ │ ├── Computers.glb │ │ │ ├── Drone.glb │ │ │ ├── Engineer.glb │ │ │ ├── Robot.glb │ │ │ ├── SecurityCamera.glb │ │ │ └── Trailer.glb │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── components/ │ │ │ │ ├── Footer.tsx │ │ │ │ ├── Navbar.tsx │ │ │ │ ├── UsageCharts.tsx │ │ │ │ ├── sections/ │ │ │ │ │ ├── CapsulePromo.tsx │ │ │ │ │ ├── Faqs.tsx │ │ │ │ │ ├── Features.tsx │ │ │ │ │ ├── FooterCta.tsx │ │ │ │ │ ├── HeroScene/ │ │ │ │ │ │ ├── CameraRig.tsx │ │ │ │ │ │ ├── Computers.tsx │ │ │ │ │ │ ├── HeroScene.tsx │ │ │ │ │ │ └── SpinningBox.tsx │ │ │ │ │ ├── IntegrationImage.tsx │ │ │ │ │ ├── ListCards.tsx │ │ │ │ │ ├── MidCta.tsx │ │ │ │ │ ├── ScrollBox.tsx │ │ │ │ │ ├── ScrollTextReveal.tsx │ │ │ │ │ ├── SecurityCta.tsx │ │ │ │ │ ├── SubheadingSection.tsx │ │ │ │ │ ├── ThreeCards.tsx │ │ │ │ │ ├── Usecase.tsx │ │ │ │ │ ├── UsecaseAI.tsx │ │ │ │ │ └── capsule/ │ │ │ │ │ ├── CapsuleArchitecture.tsx │ │ │ │ │ ├── CapsuleFaq.tsx │ │ │ │ │ ├── CapsuleFeatures.tsx │ │ │ │ │ ├── CapsuleFooterCta.tsx │ │ │ │ │ ├── CapsuleHero.tsx │ │ │ │ │ ├── CapsuleHowItWorks.tsx │ │ │ │ │ ├── CapsuleSecurity.tsx │ │ │ │ │ ├── CapsuleSubheading.tsx │ │ │ │ │ ├── CapsuleUsecases.tsx │ │ │ │ │ └── EncryptionFlowIllustration.tsx │ │ │ │ └── ui/ │ │ │ │ ├── alert-dialog.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── chart.tsx │ │ │ │ ├── navigation-menu.tsx │ │ │ │ └── sonner.tsx │ │ │ ├── contexts/ │ │ │ │ └── AuthContext.tsx │ │ │ ├── hooks/ │ │ │ │ └── useUsageData.ts │ │ │ ├── index.css │ │ │ ├── lib/ │ │ │ │ ├── billing.ts │ │ │ │ ├── supabase.ts │ │ │ │ ├── theatre.ts │ │ │ │ ├── useFadeInOnScroll.ts │ │ │ │ └── utils.ts │ │ │ ├── main.tsx │ │ │ ├── pages/ │ │ │ │ ├── Capsule.tsx │ │ │ │ ├── CheckoutSuccess.tsx │ │ │ │ ├── Contact.tsx │ │ │ │ ├── Dashboard.tsx │ │ │ │ ├── Disclaimer.tsx │ │ │ │ ├── Login.tsx │ │ │ │ ├── Main.tsx │ │ │ │ ├── Pricing.tsx │ │ │ │ ├── Privacy.tsx │ │ │ │ ├── PrivacyPolicy.tsx │ │ │ │ ├── Roadmap.tsx │ │ │ │ ├── Terms.tsx │ │ │ │ └── UseCase.tsx │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ └── server/ │ ├── Cargo.toml │ ├── build.rs │ ├── diesel.toml │ ├── migrations/ │ │ ├── .keep │ │ ├── 2025-08-07-152325_users/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ ├── 2025-08-22-092047_map/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ ├── 2025-09-08-073323_create_rbac_tables/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ ├── 2025-09-11-151252_custom_node/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ ├── 2025-09-19-060609_create_streams/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ ├── 2026-01-12-023507_dyndashboard/ │ │ │ ├── down.sql │ │ │ └── up.sql │ │ └── 2026-01-31-000001_create_recordings/ │ │ ├── down.sql │ │ └── up.sql │ ├── src/ │ │ ├── broker_mqtt.rs │ │ ├── config.rs │ │ ├── db/ │ │ │ ├── conn.rs │ │ │ ├── mod.rs │ │ │ ├── models.rs │ │ │ ├── repository/ │ │ │ │ ├── dashboards.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── rbac.rs │ │ │ │ ├── recordings.rs │ │ │ │ └── streams.rs │ │ │ └── schema.rs │ │ ├── error.rs │ │ ├── flow/ │ │ │ ├── binary_store.rs │ │ │ ├── engine.rs │ │ │ ├── manager_state.rs │ │ │ ├── mod.rs │ │ │ ├── nodes/ │ │ │ │ ├── branch.rs │ │ │ │ ├── calc.rs │ │ │ │ ├── custom_node.rs │ │ │ │ ├── dashboard_event_listener.rs │ │ │ │ ├── decode_h264.rs │ │ │ │ ├── decode_opus.rs │ │ │ │ ├── gst_decoder.rs │ │ │ │ ├── http.rs │ │ │ │ ├── interval.rs │ │ │ │ ├── json_modify.rs │ │ │ │ ├── json_selector.rs │ │ │ │ ├── log_message.rs │ │ │ │ ├── logic_operator.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── mqtt_publish.rs │ │ │ │ ├── mqtt_subscribe.rs │ │ │ │ ├── rtp_stream_in.rs │ │ │ │ ├── set_variable.rs │ │ │ │ ├── set_variable_with_exec.rs │ │ │ │ ├── show_toast.rs │ │ │ │ ├── start.rs │ │ │ │ ├── type_converter.rs │ │ │ │ ├── websocket_on.rs │ │ │ │ ├── websocket_send.rs │ │ │ │ └── yolo_detect.rs │ │ │ └── types.rs │ │ ├── handler/ │ │ │ ├── auth.rs │ │ │ ├── configurations.rs │ │ │ ├── custom_nodes.rs │ │ │ ├── dashboards.rs │ │ │ ├── device_tokens.rs │ │ │ ├── devices.rs │ │ │ ├── entities.rs │ │ │ ├── flows.rs │ │ │ ├── ha.rs │ │ │ ├── integration.rs │ │ │ ├── log.rs │ │ │ ├── map.rs │ │ │ ├── mod.rs │ │ │ ├── permissions.rs │ │ │ ├── recordings.rs │ │ │ ├── roles.rs │ │ │ ├── sdr.rs │ │ │ ├── stat.rs │ │ │ ├── state.rs │ │ │ ├── storage.rs │ │ │ ├── streams.rs │ │ │ ├── tunnel.rs │ │ │ ├── users.rs │ │ │ └── ws/ │ │ │ ├── dashboard_component_event.rs │ │ │ ├── handlers.rs │ │ │ ├── mod.rs │ │ │ └── webrtc.rs │ │ ├── init/ │ │ │ ├── db_record.rs │ │ │ ├── mod.rs │ │ │ └── streams.rs │ │ ├── lib.rs │ │ ├── logo.rs │ │ ├── main.rs │ │ ├── media/ │ │ │ ├── adapter.rs │ │ │ ├── mod.rs │ │ │ ├── rtp_push.rs │ │ │ └── rtsp_pull.rs │ │ ├── recording/ │ │ │ ├── manager.rs │ │ │ ├── mod.rs │ │ │ ├── muxer.rs │ │ │ └── service.rs │ │ ├── routes.rs │ │ ├── state.rs │ │ ├── tunnel_control.rs │ │ └── utils/ │ │ ├── entity_map.rs │ │ ├── hash.rs │ │ ├── mod.rs │ │ ├── stream_checker.rs │ │ └── system_configs.rs │ └── tests/ │ ├── common/ │ │ └── mod.rs │ ├── recording_manager_tests.rs │ ├── recordings_repository_tests.rs │ └── state_tests.rs ├── configs/ │ └── projects.json ├── docs/ │ ├── .vitepress/ │ │ └── config.mts │ ├── concepts.md │ ├── dashboard.md │ ├── features.md │ ├── flow.md │ ├── index.md │ ├── installation.md │ ├── introduction.md │ ├── map.md │ ├── setup.md │ └── troubleshooting.md ├── example/ │ ├── golang/ │ │ ├── .gitignore │ │ ├── audio-file/ │ │ │ ├── audio.go │ │ │ └── audio.sdp │ │ ├── audio-mic/ │ │ │ └── audio.go │ │ ├── go.mod │ │ ├── go.sum │ │ ├── video-sample/ │ │ │ └── video.go │ │ ├── video2-sample/ │ │ │ └── video.go │ │ └── video3-sample/ │ │ └── video.go │ └── js/ │ └── index.js ├── jest.config.js ├── package.json ├── packages/ │ ├── PKG.md │ ├── capsule-client/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── client.ts │ │ │ ├── conversation.ts │ │ │ ├── crypto.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ └── tsconfig.json │ └── custom-node-utils/ │ ├── add_number.py │ ├── random.py │ └── vessel.config.json ├── scripts/ │ └── bundle-macos-deps.sh └── tests/ ├── TEST.md └── api.test.js