manigent-server 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- manigent/_catalog/mcps/chess/README.md +38 -0
- manigent/_catalog/mcps/chess/mcp.json +9 -0
- manigent/_catalog/mcps/registry.json +9 -0
- manigent/_catalog/skills/brief/SKILL.md +339 -0
- manigent/_catalog/skills/broaden-options/SKILL.md +133 -0
- manigent/_catalog/skills/calendar/SKILL.md +44 -0
- manigent/_catalog/skills/calendar/starter_config.jsonc +25 -0
- manigent/_catalog/skills/gmail/SKILL.md +73 -0
- manigent/_catalog/skills/google-calendar/SKILL.md +44 -0
- manigent/_catalog/skills/google-drive/SKILL.md +42 -0
- manigent/_catalog/skills/google-drive-write/SKILL.md +45 -0
- manigent/_catalog/skills/google-drive-write/starter_config.jsonc +45 -0
- manigent/_catalog/skills/grill-me/SKILL.md +173 -0
- manigent/_catalog/skills/homekit/SKILL.md +37 -0
- manigent/_catalog/skills/http-api/SKILL.md +117 -0
- manigent/_catalog/skills/ib/SKILL.md +89 -0
- manigent/_catalog/skills/ib/starter_config.jsonc +35 -0
- manigent/_catalog/skills/mailbox/SKILL.md +47 -0
- manigent/_catalog/skills/mailbox/starter_config.jsonc +38 -0
- manigent/_catalog/skills/media/SKILL.md +93 -0
- manigent/_catalog/skills/media/starter_config.jsonc +63 -0
- manigent/_catalog/skills/osxphotos/SKILL.md +41 -0
- manigent/_catalog/skills/photo-story/SKILL.md +285 -0
- manigent/_catalog/skills/playwright-browser/SKILL.md +291 -0
- manigent/_catalog/skills/playwright-browser/starter_config.jsonc +44 -0
- manigent/_catalog/skills/playwright-save-skill/SKILL.md +149 -0
- manigent/_catalog/skills/registry.json +166 -0
- manigent/_catalog/skills/web-artifacts/SKILL.md +194 -0
- manigent/api/action_executor.py +404 -0
- manigent/api/action_validator.py +531 -0
- manigent/api/actions.py +221 -0
- manigent/api/client.py +558 -0
- manigent/api/control.py +806 -0
- manigent/api/edge_protocol.py +123 -0
- manigent/api/fs_protocol.py +450 -0
- manigent/api/host_protocol.py +298 -0
- manigent/api/managed_job_client.py +124 -0
- manigent/api/responses.py +342 -0
- manigent/api/retry_transport.py +178 -0
- manigent/api/turn_protocol.py +78 -0
- manigent/cli_lifecycle.py +467 -0
- manigent/cli_server.py +978 -0
- manigent/doctor.py +1167 -0
- manigent/hub_protocol/canonical.py +375 -0
- manigent/hub_protocol/codes.py +171 -0
- manigent/hub_protocol/constants.py +71 -0
- manigent/hub_protocol/envelope.py +218 -0
- manigent/hub_protocol/frames.py +788 -0
- manigent/hub_protocol/http.py +260 -0
- manigent/hub_protocol/ids.py +170 -0
- manigent/hub_protocol/keys.py +195 -0
- manigent/hub_protocol/text.py +75 -0
- manigent/llm/base.py +1072 -0
- manigent/llm/prompt_builder.py +2450 -0
- manigent/llm/triggers.py +68 -0
- manigent/models/agent.py +2905 -0
- manigent/models/agent_bundle.py +298 -0
- manigent/models/brief_tab.py +311 -0
- manigent/models/chat_message.py +231 -0
- manigent/models/chatroom.py +1108 -0
- manigent/models/context.py +1159 -0
- manigent/models/desk_label.py +836 -0
- manigent/models/desk_read_state.py +220 -0
- manigent/models/desk_sign_off.py +267 -0
- manigent/models/desk_sop.py +965 -0
- manigent/models/desk_todo.py +1603 -0
- manigent/models/desk_todo_link.py +404 -0
- manigent/models/file_cache.py +75 -0
- manigent/models/host.py +732 -0
- manigent/models/install_token.py +401 -0
- manigent/models/invitation_code.py +162 -0
- manigent/models/knowledge_pack.py +552 -0
- manigent/models/managed_job.py +295 -0
- manigent/models/model_config.py +564 -0
- manigent/models/model_defaults.py +238 -0
- manigent/models/onboarding_plan.py +161 -0
- manigent/models/participant.py +449 -0
- manigent/models/persistable.py +892 -0
- manigent/models/plan_markdown.py +1774 -0
- manigent/models/project.py +1343 -0
- manigent/models/project_plan.py +8104 -0
- manigent/models/project_report.py +145 -0
- manigent/models/provenance.py +261 -0
- manigent/models/provider_agents.py +101 -0
- manigent/models/public_request.py +108 -0
- manigent/models/reflection_schedule.py +191 -0
- manigent/models/scheduled_message.py +285 -0
- manigent/models/share_token.py +190 -0
- manigent/models/skill_version.py +31 -0
- manigent/models/sop_template.py +187 -0
- manigent/models/thinking_partner_plan.py +187 -0
- manigent/models/tunnel_binding.py +129 -0
- manigent/models/user.py +1276 -0
- manigent/models/work_tracker.py +510 -0
- manigent/runner/invocation_registry.py +187 -0
- manigent/server/agent_capabilities.py +119 -0
- manigent/server/agent_visibility.py +119 -0
- manigent/server/announcements.py +119 -0
- manigent/server/app.py +807 -0
- manigent/server/auth.py +355 -0
- manigent/server/batch_timeout.py +94 -0
- manigent/server/channels/access.py +194 -0
- manigent/server/channels/adapter.py +295 -0
- manigent/server/channels/config.py +693 -0
- manigent/server/channels/contacts.py +39 -0
- manigent/server/channels/email_adapter.py +436 -0
- manigent/server/channels/email_address.py +145 -0
- manigent/server/channels/email_form.py +242 -0
- manigent/server/channels/email_format.py +285 -0
- manigent/server/channels/email_mail.py +427 -0
- manigent/server/channels/email_mailgun.py +164 -0
- manigent/server/channels/email_text.py +280 -0
- manigent/server/channels/file_links.py +127 -0
- manigent/server/channels/gateway.py +2998 -0
- manigent/server/channels/hub_delivery.py +211 -0
- manigent/server/channels/hub_store.py +1730 -0
- manigent/server/channels/line.py +645 -0
- manigent/server/channels/line_format.py +589 -0
- manigent/server/channels/log_redaction.py +145 -0
- manigent/server/channels/store.py +3316 -0
- manigent/server/channels/telegram.py +422 -0
- manigent/server/channels/telegram_format.py +312 -0
- manigent/server/channels/webchat.py +261 -0
- manigent/server/channels/webchat_widget.js +1310 -0
- manigent/server/channels/whatsapp.py +707 -0
- manigent/server/channels/whatsapp_format.py +511 -0
- manigent/server/chat_search_index.py +1203 -0
- manigent/server/config.py +61 -0
- manigent/server/context.py +121 -0
- manigent/server/coordinator_rule.py +115 -0
- manigent/server/desk_todo_notify.py +300 -0
- manigent/server/edge_hub.py +577 -0
- manigent/server/email.py +354 -0
- manigent/server/errors.py +83 -0
- manigent/server/home_fs_relay.py +392 -0
- manigent/server/hub/adapter.py +1395 -0
- manigent/server/hub/agent_send_guard.py +196 -0
- manigent/server/hub/avatar.py +342 -0
- manigent/server/hub/browser.py +778 -0
- manigent/server/hub/client.py +859 -0
- manigent/server/hub/demand.py +49 -0
- manigent/server/hub/directory.py +385 -0
- manigent/server/hub/enroll.py +400 -0
- manigent/server/hub/http.py +134 -0
- manigent/server/hub/identity.py +61 -0
- manigent/server/hub/keys.py +588 -0
- manigent/server/hub/mirror.py +802 -0
- manigent/server/hub/operator.py +817 -0
- manigent/server/hub/retain.py +361 -0
- manigent/server/hub/room_bridge.py +741 -0
- manigent/server/hub/runtime.py +691 -0
- manigent/server/hub/trust.py +182 -0
- manigent/server/hub/views.py +316 -0
- manigent/server/idempotency.py +205 -0
- manigent/server/in_flight_restore.py +181 -0
- manigent/server/inspection.py +816 -0
- manigent/server/isolation_gate.py +516 -0
- manigent/server/isolation_notice.py +310 -0
- manigent/server/managed_job_events.py +242 -0
- manigent/server/mcp_registry.py +118 -0
- manigent/server/message_forward.py +78 -0
- manigent/server/message_scheduler.py +176 -0
- manigent/server/notification_assets.py +164 -0
- manigent/server/oauth_login/cli_state.py +120 -0
- manigent/server/oauth_login/config.py +90 -0
- manigent/server/oauth_login/errors.py +78 -0
- manigent/server/oauth_login/flow.py +223 -0
- manigent/server/oauth_login/handoff.py +63 -0
- manigent/server/oauth_login/providers.py +45 -0
- manigent/server/oauth_state.py +81 -0
- manigent/server/owner_isolation.py +466 -0
- manigent/server/participant_liveness.py +82 -0
- manigent/server/public_profile.py +149 -0
- manigent/server/public_requests/candidates.py +116 -0
- manigent/server/public_requests/dispatch.py +121 -0
- manigent/server/public_requests/ranking.py +153 -0
- manigent/server/recent_activity.py +250 -0
- manigent/server/reflection_completion_subscriber.py +151 -0
- manigent/server/reflection_scheduler.py +239 -0
- manigent/server/requester_key_migration.py +261 -0
- manigent/server/room_flow.py +139 -0
- manigent/server/routes/_batch.py +218 -0
- manigent/server/routes/_fd_routing.py +155 -0
- manigent/server/routes/_mentions.py +70 -0
- manigent/server/routes/agent_env.py +188 -0
- manigent/server/routes/agent_fs.py +450 -0
- manigent/server/routes/agents.py +1206 -0
- manigent/server/routes/announcements.py +79 -0
- manigent/server/routes/auth.py +387 -0
- manigent/server/routes/brief_tabs.py +404 -0
- manigent/server/routes/changelog.py +237 -0
- manigent/server/routes/channels.py +993 -0
- manigent/server/routes/chatrooms.py +871 -0
- manigent/server/routes/desk_labels.py +298 -0
- manigent/server/routes/desk_latest_messages.py +116 -0
- manigent/server/routes/desk_read_state.py +110 -0
- manigent/server/routes/desk_sign_off.py +88 -0
- manigent/server/routes/desk_sops.py +216 -0
- manigent/server/routes/desk_todos.py +692 -0
- manigent/server/routes/desk_tour.py +44 -0
- manigent/server/routes/files.py +572 -0
- manigent/server/routes/hosts.py +484 -0
- manigent/server/routes/hub.py +534 -0
- manigent/server/routes/hub_channels.py +234 -0
- manigent/server/routes/inbox.py +581 -0
- manigent/server/routes/install.ps1 +436 -0
- manigent/server/routes/install.py +324 -0
- manigent/server/routes/install.sh +566 -0
- manigent/server/routes/isolation_check.py +145 -0
- manigent/server/routes/knowledge_packs.py +477 -0
- manigent/server/routes/managed_jobs.py +196 -0
- manigent/server/routes/mcps.py +271 -0
- manigent/server/routes/messages.py +1972 -0
- manigent/server/routes/model_defaults.py +279 -0
- manigent/server/routes/oauth.py +237 -0
- manigent/server/routes/oauth_login.py +351 -0
- manigent/server/routes/owner_isolation.py +91 -0
- manigent/server/routes/project_plans.py +1521 -0
- manigent/server/routes/project_reports.py +235 -0
- manigent/server/routes/projects.py +2047 -0
- manigent/server/routes/public_agents.py +151 -0
- manigent/server/routes/public_requests.py +181 -0
- manigent/server/routes/reflection.py +93 -0
- manigent/server/routes/scheduled_messages.py +263 -0
- manigent/server/routes/search.py +94 -0
- manigent/server/routes/sharing.py +156 -0
- manigent/server/routes/skills.py +406 -0
- manigent/server/routes/templates.py +219 -0
- manigent/server/routes/turn_tokens.py +119 -0
- manigent/server/routes/webchat.py +406 -0
- manigent/server/routes/websocket.py +431 -0
- manigent/server/serving_only.py +200 -0
- manigent/server/signup_policy.py +120 -0
- manigent/server/skill_registry.py +164 -0
- manigent/server/socket_events.py +858 -0
- manigent/server/timeout_checker.py +446 -0
- manigent/server/tunnel_subscriber.py +1000 -0
- manigent/server/turn_tokens.py +285 -0
- manigent/server/ws_hub.py +556 -0
- manigent/server_cli.py +31 -0
- manigent/sync/changelog.py +885 -0
- manigent/sync/console_subscriber.py +222 -0
- manigent/sync/runloop.py +619 -0
- manigent/sync/runloop_manager.py +197 -0
- manigent/sync/subscriber.py +98 -0
- manigent/utils/agent_processes.py +276 -0
- manigent/utils/agent_storage.py +125 -0
- manigent/utils/email.py +563 -0
- manigent/utils/env_store.py +174 -0
- manigent/utils/extra_dirs.py +85 -0
- manigent/utils/file_io.py +485 -0
- manigent/utils/invoke_timeout.py +87 -0
- manigent/utils/jsonc.py +78 -0
- manigent/utils/knowledge_index.py +148 -0
- manigent/utils/nofollow_fs.py +279 -0
- manigent/utils/notification_center.py +67 -0
- manigent/utils/version.py +57 -0
- manigent/web/frontend/.design-sync-entry.tsx +74 -0
- manigent/web/frontend/.design-sync-provider.tsx +46 -0
- manigent/web/frontend/.eslintrc.cjs +183 -0
- manigent/web/frontend/.gitignore +6 -0
- manigent/web/frontend/app/page.tsx +39 -0
- manigent/web/frontend/hub-terms.html +192 -0
- manigent/web/frontend/index.html +15 -0
- manigent/web/frontend/landing.html +15 -0
- manigent/web/frontend/package-lock.json +8028 -0
- manigent/web/frontend/package.json +55 -0
- manigent/web/frontend/postcss.config.js +6 -0
- manigent/web/frontend/privacy.html +217 -0
- manigent/web/frontend/private-beta-announcement.html +19 -0
- manigent/web/frontend/public/apple-touch-icon.png +0 -0
- manigent/web/frontend/public/brand-hero-banner.png +0 -0
- manigent/web/frontend/public/brand-hero.png +0 -0
- manigent/web/frontend/public/favicon.png +0 -0
- manigent/web/frontend/public/favicon.svg +8 -0
- manigent/web/frontend/public/icon-transparent-sm.png +0 -0
- manigent/web/frontend/public/icon.png +0 -0
- manigent/web/frontend/public/manigent-mark.svg +7 -0
- manigent/web/frontend/public/vite.svg +5 -0
- manigent/web/frontend/public.html +15 -0
- manigent/web/frontend/src/App.activeAccountRedirect.test.tsx +236 -0
- manigent/web/frontend/src/App.hubHostDm.test.tsx +119 -0
- manigent/web/frontend/src/App.hubHostProject.test.tsx +142 -0
- manigent/web/frontend/src/App.hubRoutes.test.tsx +187 -0
- manigent/web/frontend/src/App.oauthAddCallback.test.tsx +263 -0
- manigent/web/frontend/src/App.tsx +246 -0
- manigent/web/frontend/src/api/attachments.ts +32 -0
- manigent/web/frontend/src/api/batchLoader.test.ts +212 -0
- manigent/web/frontend/src/api/batchLoader.ts +124 -0
- manigent/web/frontend/src/api/chatroomsBatch.test.tsx +392 -0
- manigent/web/frontend/src/api/client.ts +321 -0
- manigent/web/frontend/src/api/crossAccountAuth.test.ts +388 -0
- manigent/web/frontend/src/api/endpoints/agentEnv.ts +24 -0
- manigent/web/frontend/src/api/endpoints/agentFs.ts +125 -0
- manigent/web/frontend/src/api/endpoints/agentSearch.ts +19 -0
- manigent/web/frontend/src/api/endpoints/agents.ts +66 -0
- manigent/web/frontend/src/api/endpoints/announcements.ts +26 -0
- manigent/web/frontend/src/api/endpoints/auth.ts +361 -0
- manigent/web/frontend/src/api/endpoints/authLogin.test.ts +236 -0
- manigent/web/frontend/src/api/endpoints/batch.ts +64 -0
- manigent/web/frontend/src/api/endpoints/briefTabs.ts +81 -0
- manigent/web/frontend/src/api/endpoints/channels.ts +285 -0
- manigent/web/frontend/src/api/endpoints/computers.ts +212 -0
- manigent/web/frontend/src/api/endpoints/deskLabels.ts +151 -0
- manigent/web/frontend/src/api/endpoints/deskLatestMessages.ts +23 -0
- manigent/web/frontend/src/api/endpoints/deskReadState.ts +41 -0
- manigent/web/frontend/src/api/endpoints/deskSignOffs.ts +74 -0
- manigent/web/frontend/src/api/endpoints/deskSops.ts +53 -0
- manigent/web/frontend/src/api/endpoints/deskTodoAttachments.ts +69 -0
- manigent/web/frontend/src/api/endpoints/deskTodoProjects.test.ts +99 -0
- manigent/web/frontend/src/api/endpoints/deskTodoProjects.ts +114 -0
- manigent/web/frontend/src/api/endpoints/deskTodos.ts +164 -0
- manigent/web/frontend/src/api/endpoints/deskTour.ts +16 -0
- manigent/web/frontend/src/api/endpoints/dm.ts +137 -0
- manigent/web/frontend/src/api/endpoints/files.ts +55 -0
- manigent/web/frontend/src/api/endpoints/hub.contract.test.ts +94 -0
- manigent/web/frontend/src/api/endpoints/hub.keys.ts +260 -0
- manigent/web/frontend/src/api/endpoints/hub.test.ts +203 -0
- manigent/web/frontend/src/api/endpoints/hub.ts +654 -0
- manigent/web/frontend/src/api/endpoints/index.ts +15 -0
- manigent/web/frontend/src/api/endpoints/install.ts +74 -0
- manigent/web/frontend/src/api/endpoints/isolationCheck.ts +36 -0
- manigent/web/frontend/src/api/endpoints/knowledgePacks.ts +179 -0
- manigent/web/frontend/src/api/endpoints/mcps.ts +36 -0
- manigent/web/frontend/src/api/endpoints/messages.held.test.ts +43 -0
- manigent/web/frontend/src/api/endpoints/messages.ts +95 -0
- manigent/web/frontend/src/api/endpoints/modelConfigs.ts +232 -0
- manigent/web/frontend/src/api/endpoints/oauthApi.test.ts +110 -0
- manigent/web/frontend/src/api/endpoints/projectPlans.ts +608 -0
- manigent/web/frontend/src/api/endpoints/projectReports.ts +36 -0
- manigent/web/frontend/src/api/endpoints/projects.ts +124 -0
- manigent/web/frontend/src/api/endpoints/publicRequests.ts +75 -0
- manigent/web/frontend/src/api/endpoints/reflection.ts +32 -0
- manigent/web/frontend/src/api/endpoints/roomFlow.ts +14 -0
- manigent/web/frontend/src/api/endpoints/scheduledMessages.ts +60 -0
- manigent/web/frontend/src/api/endpoints/search.ts +27 -0
- manigent/web/frontend/src/api/endpoints/sharing.ts +42 -0
- manigent/web/frontend/src/api/endpoints/skills.ts +67 -0
- manigent/web/frontend/src/api/endpoints/templates.ts +72 -0
- manigent/web/frontend/src/api/loaders.ts +22 -0
- manigent/web/frontend/src/api/singleIssuer.test.ts +148 -0
- manigent/web/frontend/src/api/transientRetry.test.ts +176 -0
- manigent/web/frontend/src/api/transientRetry.ts +140 -0
- manigent/web/frontend/src/api/websocket.resync.test.ts +111 -0
- manigent/web/frontend/src/api/websocket.ts +335 -0
- manigent/web/frontend/src/components/agent/AgentNameLink.tsx +24 -0
- manigent/web/frontend/src/components/agent/AgentViewActions.test.tsx +41 -0
- manigent/web/frontend/src/components/agent/AgentViewActions.tsx +89 -0
- manigent/web/frontend/src/components/agent/CreateAgentPage.tsx +535 -0
- manigent/web/frontend/src/components/agent/JsonConfigEditor.tsx +33 -0
- manigent/web/frontend/src/components/agent/KnowledgePackList.tsx +103 -0
- manigent/web/frontend/src/components/agent/McpCatalog.tsx +261 -0
- manigent/web/frontend/src/components/agent/McpConfigModal.tsx +224 -0
- manigent/web/frontend/src/components/agent/PreConsentModal.tsx +172 -0
- manigent/web/frontend/src/components/agent/SkillCatalog.tsx +364 -0
- manigent/web/frontend/src/components/agent/SkillConfigModal.tsx +221 -0
- manigent/web/frontend/src/components/auth/AddAccountPage.test.tsx +181 -0
- manigent/web/frontend/src/components/auth/AddAccountPage.tsx +201 -0
- manigent/web/frontend/src/components/auth/AuthShell.tsx +462 -0
- manigent/web/frontend/src/components/auth/LoginPage.test.tsx +384 -0
- manigent/web/frontend/src/components/auth/LoginPage.tsx +129 -0
- manigent/web/frontend/src/components/auth/OAuthCallbackPage.test.tsx +185 -0
- manigent/web/frontend/src/components/auth/OAuthCallbackPage.tsx +154 -0
- manigent/web/frontend/src/components/auth/OAuthLinkedBanner.tsx +44 -0
- manigent/web/frontend/src/components/auth/ProviderButtons.tsx +94 -0
- manigent/web/frontend/src/components/auth/SignupPage.tsx +437 -0
- manigent/web/frontend/src/components/auth/StepProgress.tsx +60 -0
- manigent/web/frontend/src/components/auth/VerifyEmailPage.test.tsx +155 -0
- manigent/web/frontend/src/components/auth/VerifyEmailPage.tsx +211 -0
- manigent/web/frontend/src/components/auth/index.ts +3 -0
- manigent/web/frontend/src/components/auth/oauthErrors.test.ts +107 -0
- manigent/web/frontend/src/components/auth/oauthErrors.ts +82 -0
- manigent/web/frontend/src/components/auth/useUsernameCheck.test.tsx +68 -0
- manigent/web/frontend/src/components/auth/useUsernameCheck.ts +86 -0
- manigent/web/frontend/src/components/beta/BetaPage.tsx +21 -0
- manigent/web/frontend/src/components/beta/DayAtMyDesk.tsx +120 -0
- manigent/web/frontend/src/components/beta/Footer.tsx +82 -0
- manigent/web/frontend/src/components/beta/Hero.tsx +224 -0
- manigent/web/frontend/src/components/beta/Nav.tsx +51 -0
- manigent/web/frontend/src/components/beta/Pillars.tsx +172 -0
- manigent/web/frontend/src/components/beta/TwoModels.tsx +146 -0
- manigent/web/frontend/src/components/beta/constants.ts +3 -0
- manigent/web/frontend/src/components/briefing/BriefingFrame.test.tsx +208 -0
- manigent/web/frontend/src/components/briefing/BriefingFrame.tsx +151 -0
- manigent/web/frontend/src/components/briefing/BriefingPage.test.tsx +176 -0
- manigent/web/frontend/src/components/briefing/BriefingPage.tsx +157 -0
- manigent/web/frontend/src/components/briefing/BriefingPage.wsDelete.test.tsx +177 -0
- manigent/web/frontend/src/components/briefing/briefing.css +147 -0
- manigent/web/frontend/src/components/briefing/heightBootstrap.test.ts +121 -0
- manigent/web/frontend/src/components/briefing/heightBootstrap.ts +224 -0
- manigent/web/frontend/src/components/briefing/parseBriefMessage.test.ts +90 -0
- manigent/web/frontend/src/components/briefing/sampleBriefing.ts +148 -0
- manigent/web/frontend/src/components/channels/ChannelBadge.tsx +35 -0
- manigent/web/frontend/src/components/chatroom/ChannelThreadControls.tsx +127 -0
- manigent/web/frontend/src/components/chatroom/ChannelThreadNotice.test.tsx +207 -0
- manigent/web/frontend/src/components/chatroom/ChannelThreadNotice.tsx +80 -0
- manigent/web/frontend/src/components/chatroom/ChatroomView.channel.test.tsx +550 -0
- manigent/web/frontend/src/components/chatroom/ChatroomView.flow.test.tsx +186 -0
- manigent/web/frontend/src/components/chatroom/ChatroomView.isolation.test.tsx +70 -0
- manigent/web/frontend/src/components/chatroom/ChatroomView.tsx +450 -0
- manigent/web/frontend/src/components/chatroom/DelegationRow.test.tsx +170 -0
- manigent/web/frontend/src/components/chatroom/DelegationRow.tsx +217 -0
- manigent/web/frontend/src/components/chatroom/DeliveryStatusLine.test.tsx +33 -0
- manigent/web/frontend/src/components/chatroom/DeliveryStatusLine.tsx +46 -0
- manigent/web/frontend/src/components/chatroom/ForwardModal.test.tsx +109 -0
- manigent/web/frontend/src/components/chatroom/ForwardModal.tsx +304 -0
- manigent/web/frontend/src/components/chatroom/HeldNotice.tsx +77 -0
- manigent/web/frontend/src/components/chatroom/MentionDropdown.tsx +97 -0
- manigent/web/frontend/src/components/chatroom/MessageInput.tsx +408 -0
- manigent/web/frontend/src/components/chatroom/MessageItem.tsx +425 -0
- manigent/web/frontend/src/components/chatroom/MessageList.outside.test.tsx +98 -0
- manigent/web/frontend/src/components/chatroom/MessageList.test.tsx +245 -0
- manigent/web/frontend/src/components/chatroom/MessageList.tsx +406 -0
- manigent/web/frontend/src/components/chatroom/OfflineRemedyNote.test.tsx +211 -0
- manigent/web/frontend/src/components/chatroom/OfflineRemedyNote.tsx +182 -0
- manigent/web/frontend/src/components/chatroom/OutsideBadge.tsx +18 -0
- manigent/web/frontend/src/components/chatroom/RoomFlowControl.tsx +49 -0
- manigent/web/frontend/src/components/chatroom/RoomFlowStrip.test.tsx +47 -0
- manigent/web/frontend/src/components/chatroom/RoomFlowStrip.tsx +25 -0
- manigent/web/frontend/src/components/chatroom/SaveToPackModal.tsx +350 -0
- manigent/web/frontend/src/components/chatroom/StagedAttachments.test.tsx +56 -0
- manigent/web/frontend/src/components/chatroom/StagedAttachments.tsx +160 -0
- manigent/web/frontend/src/components/chatroom/SystemNote.tsx +18 -0
- manigent/web/frontend/src/components/chatroom/contactSender.test.tsx +130 -0
- manigent/web/frontend/src/components/chatroom/index.ts +3 -0
- manigent/web/frontend/src/components/chatroom/recipientStatus.test.ts +344 -0
- manigent/web/frontend/src/components/chatroom/recipientStatus.ts +197 -0
- manigent/web/frontend/src/components/common/AnnouncementBanners.test.tsx +221 -0
- manigent/web/frontend/src/components/common/AnnouncementBanners.tsx +180 -0
- manigent/web/frontend/src/components/common/Avatar.test.tsx +50 -0
- manigent/web/frontend/src/components/common/Avatar.tsx +102 -0
- manigent/web/frontend/src/components/common/Badge.tsx +30 -0
- manigent/web/frontend/src/components/common/BrandName.tsx +16 -0
- manigent/web/frontend/src/components/common/ClearHistoryButton.tsx +74 -0
- manigent/web/frontend/src/components/common/CollapsibleHeader.tsx +64 -0
- manigent/web/frontend/src/components/common/ConnectionStatus.test.tsx +56 -0
- manigent/web/frontend/src/components/common/ConnectionStatus.tsx +28 -0
- manigent/web/frontend/src/components/common/DropOverlay.tsx +27 -0
- manigent/web/frontend/src/components/common/InlineEditableTitle.test.tsx +369 -0
- manigent/web/frontend/src/components/common/InlineEditableTitle.tsx +287 -0
- manigent/web/frontend/src/components/common/IsolationUnavailablePanel.tsx +19 -0
- manigent/web/frontend/src/components/common/Loading.tsx +22 -0
- manigent/web/frontend/src/components/common/ModelSelector.tsx +248 -0
- manigent/web/frontend/src/components/common/Overlay.tsx +15 -0
- manigent/web/frontend/src/components/common/ResizeHandle.tsx +52 -0
- manigent/web/frontend/src/components/common/TagAutocompleteInput.test.tsx +92 -0
- manigent/web/frontend/src/components/common/TagAutocompleteInput.tsx +246 -0
- manigent/web/frontend/src/components/common/TagPillInput.tsx +181 -0
- manigent/web/frontend/src/components/common/TeamAndAgentPicker.tsx +83 -0
- manigent/web/frontend/src/components/common/Timestamp.tsx +61 -0
- manigent/web/frontend/src/components/common/VerifiedBadge.tsx +20 -0
- manigent/web/frontend/src/components/common/index.ts +8 -0
- manigent/web/frontend/src/components/composer/PhPopover.tsx +239 -0
- manigent/web/frontend/src/components/composer/PromptEditor.test.tsx +472 -0
- manigent/web/frontend/src/components/composer/PromptEditor.tsx +540 -0
- manigent/web/frontend/src/components/composer/caret.ts +159 -0
- manigent/web/frontend/src/components/composer/placeholders.test.ts +352 -0
- manigent/web/frontend/src/components/composer/placeholders.ts +354 -0
- manigent/web/frontend/src/components/composer/promptEditor.css +161 -0
- manigent/web/frontend/src/components/computer/ComputerPage.test.tsx +452 -0
- manigent/web/frontend/src/components/computer/ComputerPage.tsx +811 -0
- manigent/web/frontend/src/components/computer/ConnectComputerModal.tsx +135 -0
- manigent/web/frontend/src/components/computer/CopyCommand.tsx +77 -0
- manigent/web/frontend/src/components/computer/DisconnectComputerModal.tsx +121 -0
- manigent/web/frontend/src/components/computer/SoftwareCard.tsx +145 -0
- manigent/web/frontend/src/components/computer/TerminalCard.test.tsx +114 -0
- manigent/web/frontend/src/components/computer/TerminalCard.tsx +131 -0
- manigent/web/frontend/src/components/computer/TerminalPanel.tsx +226 -0
- manigent/web/frontend/src/components/computer/TrustPanel.test.tsx +58 -0
- manigent/web/frontend/src/components/computer/TrustPanel.tsx +143 -0
- manigent/web/frontend/src/components/computer/computerCopy.test.ts +322 -0
- manigent/web/frontend/src/components/computer/computerCopy.ts +413 -0
- manigent/web/frontend/src/components/computer/sections.ts +21 -0
- manigent/web/frontend/src/components/computer/terminalProtocol.test.ts +135 -0
- manigent/web/frontend/src/components/computer/terminalProtocol.ts +170 -0
- manigent/web/frontend/src/components/context/ContextGuide.test.tsx +26 -0
- manigent/web/frontend/src/components/context/ContextGuide.tsx +144 -0
- manigent/web/frontend/src/components/context/ContextLanding.tsx +46 -0
- manigent/web/frontend/src/components/desk/CardBand.a11y.test.tsx +138 -0
- manigent/web/frontend/src/components/desk/CardBand.tsx +132 -0
- manigent/web/frontend/src/components/desk/DashTile.tsx +81 -0
- manigent/web/frontend/src/components/desk/DeskAgentPicker.retained.test.tsx +79 -0
- manigent/web/frontend/src/components/desk/DeskAgentPicker.tsx +151 -0
- manigent/web/frontend/src/components/desk/DeskComposer.detachTodo.test.tsx +233 -0
- manigent/web/frontend/src/components/desk/DeskComposer.dispatch.test.tsx +208 -0
- manigent/web/frontend/src/components/desk/DeskComposer.loadTodoDraft.test.tsx +242 -0
- manigent/web/frontend/src/components/desk/DeskComposer.restage.test.tsx +258 -0
- manigent/web/frontend/src/components/desk/DeskComposer.saveTodo.test.tsx +265 -0
- manigent/web/frontend/src/components/desk/DeskComposer.tsx +828 -0
- manigent/web/frontend/src/components/desk/DeskPage.crossHighlight.test.tsx +427 -0
- manigent/web/frontend/src/components/desk/DeskPage.link.test.tsx +271 -0
- manigent/web/frontend/src/components/desk/DeskPage.tsx +1066 -0
- manigent/web/frontend/src/components/desk/DeskPage.welcomeTour.test.tsx +262 -0
- manigent/web/frontend/src/components/desk/DeskSideRail.tsx +100 -0
- manigent/web/frontend/src/components/desk/DeskWelcomeTour.tsx +513 -0
- manigent/web/frontend/src/components/desk/DeskZeroState.tsx +45 -0
- manigent/web/frontend/src/components/desk/LabelChip.tsx +147 -0
- manigent/web/frontend/src/components/desk/LabelFilter.tsx +474 -0
- manigent/web/frontend/src/components/desk/LabelInput.test.tsx +439 -0
- manigent/web/frontend/src/components/desk/LabelInput.tsx +477 -0
- manigent/web/frontend/src/components/desk/LabelManageSheet.test.tsx +384 -0
- manigent/web/frontend/src/components/desk/LabelManageSheet.tsx +498 -0
- manigent/web/frontend/src/components/desk/PhaseRail.test.tsx +170 -0
- manigent/web/frontend/src/components/desk/PhaseRail.tsx +120 -0
- manigent/web/frontend/src/components/desk/PlanBand.test.tsx +655 -0
- manigent/web/frontend/src/components/desk/PlanBand.tsx +216 -0
- manigent/web/frontend/src/components/desk/SaveTodoModal.tsx +126 -0
- manigent/web/frontend/src/components/desk/SopEditor.tsx +280 -0
- manigent/web/frontend/src/components/desk/SopItem.tsx +171 -0
- manigent/web/frontend/src/components/desk/SopRail.test.tsx +517 -0
- manigent/web/frontend/src/components/desk/SopRail.tsx +250 -0
- manigent/web/frontend/src/components/desk/TicketChip.tsx +51 -0
- manigent/web/frontend/src/components/desk/TodoItem.attachments.test.tsx +96 -0
- manigent/web/frontend/src/components/desk/TodoItem.menu.test.tsx +142 -0
- manigent/web/frontend/src/components/desk/TodoItem.tsx +573 -0
- manigent/web/frontend/src/components/desk/TodoRail.longpress.test.tsx +396 -0
- manigent/web/frontend/src/components/desk/TodoRail.test.tsx +1155 -0
- manigent/web/frontend/src/components/desk/TodoRail.tsx +918 -0
- manigent/web/frontend/src/components/desk/TodoRowMenu.tsx +147 -0
- manigent/web/frontend/src/components/desk/UpdateCard.bands.test.tsx +308 -0
- manigent/web/frontend/src/components/desk/UpdateCard.sendBack.test.tsx +444 -0
- manigent/web/frontend/src/components/desk/UpdateCard.tsx +943 -0
- manigent/web/frontend/src/components/desk/UpdateCard.untrusted.test.tsx +161 -0
- manigent/web/frontend/src/components/desk/desk.css +1921 -0
- manigent/web/frontend/src/components/desk/desk.css.test.ts +582 -0
- manigent/web/frontend/src/components/desk/deskBands.test.ts +389 -0
- manigent/web/frontend/src/components/desk/deskBands.ts +226 -0
- manigent/web/frontend/src/components/desk/m16Surfaces.test.ts +134 -0
- manigent/web/frontend/src/components/desk/sopSyntax.ts +73 -0
- manigent/web/frontend/src/components/discovery/AgentDirectory.tsx +71 -0
- manigent/web/frontend/src/components/discovery/AgentFilterBar.tsx +46 -0
- manigent/web/frontend/src/components/discovery/AgentSearchBar.tsx +56 -0
- manigent/web/frontend/src/components/dm/AgentSummaryCard.tsx +154 -0
- manigent/web/frontend/src/components/dm/ComposeFields.tsx +145 -0
- manigent/web/frontend/src/components/dm/DMChatView.flow.test.tsx +374 -0
- manigent/web/frontend/src/components/dm/DMChatView.tsx +841 -0
- manigent/web/frontend/src/components/dm/DMZeroState.tsx +204 -0
- manigent/web/frontend/src/components/dm/DmComposeModal.tsx +301 -0
- manigent/web/frontend/src/components/dm/PersonalizeModal.tsx +366 -0
- manigent/web/frontend/src/components/dm/index.ts +1 -0
- manigent/web/frontend/src/components/files/FileItem.tsx +138 -0
- manigent/web/frontend/src/components/files/FileList.outside.test.tsx +29 -0
- manigent/web/frontend/src/components/files/FileList.tsx +48 -0
- manigent/web/frontend/src/components/files/FilePreview.test.tsx +75 -0
- manigent/web/frontend/src/components/files/FilePreview.tsx +325 -0
- manigent/web/frontend/src/components/files/FileViewerModal.test.tsx +157 -0
- manigent/web/frontend/src/components/files/FileViewerModal.tsx +261 -0
- manigent/web/frontend/src/components/files/HighlightedCode.tsx +39 -0
- manigent/web/frontend/src/components/files/SaveToAgentPanel.test.tsx +156 -0
- manigent/web/frontend/src/components/files/SaveToAgentPanel.tsx +545 -0
- manigent/web/frontend/src/components/files/index.ts +3 -0
- manigent/web/frontend/src/components/hero/AgentAvatar.tsx +66 -0
- manigent/web/frontend/src/components/hero/Button.tsx +66 -0
- manigent/web/frontend/src/components/hero/Hero.tsx +133 -0
- manigent/web/frontend/src/components/homefs/HomeFolderBrowser.test.tsx +393 -0
- manigent/web/frontend/src/components/homefs/HomeFolderBrowser.tsx +792 -0
- manigent/web/frontend/src/components/hub/BridgeDeliveryLine.test.tsx +40 -0
- manigent/web/frontend/src/components/hub/BridgeDeliveryLine.tsx +36 -0
- manigent/web/frontend/src/components/hub/HubAvatar.test.tsx +93 -0
- manigent/web/frontend/src/components/hub/HubAvatar.tsx +33 -0
- manigent/web/frontend/src/components/hub/HubChatView.test.tsx +695 -0
- manigent/web/frontend/src/components/hub/HubChatView.tsx +504 -0
- manigent/web/frontend/src/components/hub/HubContactLabel.test.tsx +92 -0
- manigent/web/frontend/src/components/hub/HubContactLabel.tsx +47 -0
- manigent/web/frontend/src/components/hub/HubDeliveryLine.tsx +49 -0
- manigent/web/frontend/src/components/hub/HubDisclosure.tsx +49 -0
- manigent/web/frontend/src/components/hub/HubEnrollmentDialog.test.tsx +144 -0
- manigent/web/frontend/src/components/hub/HubEnrollmentDialog.tsx +244 -0
- manigent/web/frontend/src/components/hub/HubMessageBody.test.tsx +26 -0
- manigent/web/frontend/src/components/hub/HubMessageBody.tsx +14 -0
- manigent/web/frontend/src/components/hub/HubOfflineConfirm.tsx +45 -0
- manigent/web/frontend/src/components/hub/HubThreadBanner.tsx +33 -0
- manigent/web/frontend/src/components/hub/HubThreadGuard.tsx +59 -0
- manigent/web/frontend/src/components/hub/RemoteAgentCard.test.tsx +50 -0
- manigent/web/frontend/src/components/hub/RemoteAgentCard.tsx +174 -0
- manigent/web/frontend/src/components/hub/RemoteAgentSection.test.tsx +446 -0
- manigent/web/frontend/src/components/hub/RemoteAgentSection.tsx +219 -0
- manigent/web/frontend/src/components/hub/ReportDialog.test.tsx +96 -0
- manigent/web/frontend/src/components/hub/ReportDialog.tsx +162 -0
- manigent/web/frontend/src/components/hub/RetainButton.test.tsx +103 -0
- manigent/web/frontend/src/components/hub/RetainButton.tsx +114 -0
- manigent/web/frontend/src/components/hub/RetainDialog.test.tsx +68 -0
- manigent/web/frontend/src/components/hub/RetainDialog.tsx +115 -0
- manigent/web/frontend/src/components/hub/RetainedList.test.tsx +94 -0
- manigent/web/frontend/src/components/hub/RetainedList.tsx +32 -0
- manigent/web/frontend/src/components/hub/RetainedRow.tsx +129 -0
- manigent/web/frontend/src/components/hub/StandInChip.test.tsx +37 -0
- manigent/web/frontend/src/components/hub/StandInChip.tsx +43 -0
- manigent/web/frontend/src/components/hub/UnusualNameChip.test.tsx +81 -0
- manigent/web/frontend/src/components/hub/UnusualNameChip.tsx +22 -0
- manigent/web/frontend/src/components/hub/hubLint.test.ts +265 -0
- manigent/web/frontend/src/components/landing/ComparisonSection.tsx +92 -0
- manigent/web/frontend/src/components/landing/ConsoleSection.tsx +402 -0
- manigent/web/frontend/src/components/landing/CrewSection.tsx +224 -0
- manigent/web/frontend/src/components/landing/FAQ.tsx +68 -0
- manigent/web/frontend/src/components/landing/Footer.tsx +58 -0
- manigent/web/frontend/src/components/landing/HowItWorks.tsx +117 -0
- manigent/web/frontend/src/components/landing/KnowledgeSection.tsx +91 -0
- manigent/web/frontend/src/components/landing/LandingPage.test.tsx +134 -0
- manigent/web/frontend/src/components/landing/LearningSection.tsx +486 -0
- manigent/web/frontend/src/components/landing/Nav.tsx +68 -0
- manigent/web/frontend/src/components/landing/Pricing.tsx +263 -0
- manigent/web/frontend/src/components/landing/Section.tsx +98 -0
- manigent/web/frontend/src/components/landing/StaffingSection.tsx +122 -0
- manigent/web/frontend/src/components/landing/WhyNowSection.tsx +92 -0
- manigent/web/frontend/src/components/landing/WhyTeamSection.tsx +73 -0
- manigent/web/frontend/src/components/landing/earlyAccess.ts +23 -0
- manigent/web/frontend/src/components/layout/AppLayout.tsx +77 -0
- manigent/web/frontend/src/components/layout/Sidebar.tsx +172 -0
- manigent/web/frontend/src/components/layout/index.ts +2 -0
- manigent/web/frontend/src/components/project/ActivityFeed.tsx +247 -0
- manigent/web/frontend/src/components/project/CreateProjectPage.tsx +543 -0
- manigent/web/frontend/src/components/project/DeleteProjectButton.tsx +39 -0
- manigent/web/frontend/src/components/project/ProjectPlanTab.phase.test.tsx +107 -0
- manigent/web/frontend/src/components/project/ProjectPlanTab.test.tsx +994 -0
- manigent/web/frontend/src/components/project/ProjectPlanTab.tsx +166 -0
- manigent/web/frontend/src/components/project/ProjectReportTab.tsx +139 -0
- manigent/web/frontend/src/components/project/ProjectView.tsx +390 -0
- manigent/web/frontend/src/components/project/index.ts +2 -0
- manigent/web/frontend/src/components/project/plan/PlanAcceptance.test.tsx +460 -0
- manigent/web/frontend/src/components/project/plan/PlanAcceptance.tsx +111 -0
- manigent/web/frontend/src/components/project/plan/PlanBlockEdit.tsx +111 -0
- manigent/web/frontend/src/components/project/plan/PlanBlockEditing.test.tsx +1132 -0
- manigent/web/frontend/src/components/project/plan/PlanBody.test.tsx +495 -0
- manigent/web/frontend/src/components/project/plan/PlanBody.tsx +992 -0
- manigent/web/frontend/src/components/project/plan/PlanCollide.tsx +254 -0
- manigent/web/frontend/src/components/project/plan/PlanCommentList.test.tsx +420 -0
- manigent/web/frontend/src/components/project/plan/PlanCommentList.tsx +391 -0
- manigent/web/frontend/src/components/project/plan/PlanDecisionNudge.test.tsx +226 -0
- manigent/web/frontend/src/components/project/plan/PlanDecisionNudge.tsx +128 -0
- manigent/web/frontend/src/components/project/plan/PlanDestructiveAccept.test.tsx +209 -0
- manigent/web/frontend/src/components/project/plan/PlanDiff.test.tsx +126 -0
- manigent/web/frontend/src/components/project/plan/PlanDiff.tsx +131 -0
- manigent/web/frontend/src/components/project/plan/PlanDiffSeries.test.tsx +500 -0
- manigent/web/frontend/src/components/project/plan/PlanDiffSeries.tsx +125 -0
- manigent/web/frontend/src/components/project/plan/PlanEditor.mounts.test.tsx +504 -0
- manigent/web/frontend/src/components/project/plan/PlanEditor.tsx +2159 -0
- manigent/web/frontend/src/components/project/plan/PlanHistory.tsx +69 -0
- manigent/web/frontend/src/components/project/plan/PlanInlineNotes.test.tsx +2398 -0
- manigent/web/frontend/src/components/project/plan/PlanNoteBase.test.tsx +215 -0
- manigent/web/frontend/src/components/project/plan/PlanNoteRow.test.tsx +562 -0
- manigent/web/frontend/src/components/project/plan/PlanNoteRow.tsx +908 -0
- manigent/web/frontend/src/components/project/plan/PlanQuotePop.tsx +254 -0
- manigent/web/frontend/src/components/project/plan/PlanStaleReconcile.test.tsx +244 -0
- manigent/web/frontend/src/components/project/plan/PlanSubmitWindow.test.tsx +281 -0
- manigent/web/frontend/src/components/project/plan/PlanTray.tsx +184 -0
- manigent/web/frontend/src/components/project/plan/PlanTrayMirror.test.tsx +242 -0
- manigent/web/frontend/src/components/project/plan/plan.css +1151 -0
- manigent/web/frontend/src/components/project/plan/planAnchor.test.tsx +459 -0
- manigent/web/frontend/src/components/project/plan/planAnchor.tsx +277 -0
- manigent/web/frontend/src/components/project/plan/planBlocks.test.tsx +470 -0
- manigent/web/frontend/src/components/project/plan/planBlocks.ts +242 -0
- manigent/web/frontend/src/components/project/plan/planContrast.test.ts +229 -0
- manigent/web/frontend/src/components/project/plan/planDiffs.test.ts +455 -0
- manigent/web/frontend/src/components/project/plan/planDiffs.ts +358 -0
- manigent/web/frontend/src/components/project/plan/planTestServer.ts +741 -0
- manigent/web/frontend/src/components/project/plan/planTransport.test.ts +160 -0
- manigent/web/frontend/src/components/project/plan/planTrayLogic.test.ts +1201 -0
- manigent/web/frontend/src/components/project/plan/planTrayLogic.ts +1164 -0
- manigent/web/frontend/src/components/publicAgents/PublicAgentsAccount.tsx +162 -0
- manigent/web/frontend/src/components/publicAgents/api.ts +55 -0
- manigent/web/frontend/src/components/publicAgents/parts.tsx +54 -0
- manigent/web/frontend/src/components/publicAgents/publicAgents.css +53 -0
- manigent/web/frontend/src/components/publicAgents/publicAgents.test.tsx +86 -0
- manigent/web/frontend/src/components/publicAgents/widget.test.ts +148 -0
- manigent/web/frontend/src/components/publicAgents/widget.ts +40 -0
- manigent/web/frontend/src/components/publicRequests/AgentDrawer.tsx +101 -0
- manigent/web/frontend/src/components/publicRequests/AgentPanel.tsx +173 -0
- manigent/web/frontend/src/components/publicRequests/AgentRankList.tsx +61 -0
- manigent/web/frontend/src/components/publicRequests/MatchRetainButton.tsx +67 -0
- manigent/web/frontend/src/components/publicRequests/ProgressBoard.tsx +74 -0
- manigent/web/frontend/src/components/publicRequests/PublicRequestsPage.tsx +57 -0
- manigent/web/frontend/src/components/publicRequests/RequestHome.tsx +99 -0
- manigent/web/frontend/src/components/publicRequests/RequestRoom.tsx +126 -0
- manigent/web/frontend/src/components/publicRequests/agentView.ts +65 -0
- manigent/web/frontend/src/components/publicRequests/publicRequests.css +209 -0
- manigent/web/frontend/src/components/publicRequests/publicRequests.test.tsx +172 -0
- manigent/web/frontend/src/components/publicRequests/requestCopy.ts +121 -0
- manigent/web/frontend/src/components/sample-request/SampleIdeaList.test.tsx +190 -0
- manigent/web/frontend/src/components/sample-request/SampleIdeaList.tsx +180 -0
- manigent/web/frontend/src/components/sample-request/SampleRequestBody.tsx +276 -0
- manigent/web/frontend/src/components/sample-request/assistantStarterSamples.ts +62 -0
- manigent/web/frontend/src/components/sample-request/sampleIdeaList.css +106 -0
- manigent/web/frontend/src/components/scheduled/CronPicker.tsx +80 -0
- manigent/web/frontend/src/components/scheduled/ScheduleMessageModal.tsx +341 -0
- manigent/web/frontend/src/components/scheduled/ScheduledMessagesList.tsx +157 -0
- manigent/web/frontend/src/components/settings/AgentSettingsPage.tsx +366 -0
- manigent/web/frontend/src/components/settings/ConnectedAccounts.tsx +277 -0
- manigent/web/frontend/src/components/settings/DefaultModelSection.test.tsx +96 -0
- manigent/web/frontend/src/components/settings/DefaultModelSection.tsx +212 -0
- manigent/web/frontend/src/components/settings/DisconnectConfirmModal.tsx +93 -0
- manigent/web/frontend/src/components/settings/FrontDeskSettingsPage.isolation.test.tsx +66 -0
- manigent/web/frontend/src/components/settings/FrontDeskSettingsPage.tsx +134 -0
- manigent/web/frontend/src/components/settings/InvitableAgentsPicker.tsx +182 -0
- manigent/web/frontend/src/components/settings/KnowledgePacksSection.tsx +867 -0
- manigent/web/frontend/src/components/settings/ModelConfigDialog.catalogDriven.test.tsx +79 -0
- manigent/web/frontend/src/components/settings/ModelConfigDialog.tsx +343 -0
- manigent/web/frontend/src/components/settings/ModelConfigSection.smartRouting.test.tsx +109 -0
- manigent/web/frontend/src/components/settings/ModelConfigSection.tsx +599 -0
- manigent/web/frontend/src/components/settings/ReflectionScheduleSection.tsx +170 -0
- manigent/web/frontend/src/components/settings/UserSettingsPage.tsx +168 -0
- manigent/web/frontend/src/components/settings/agent/AgentStatusStrip.tsx +71 -0
- manigent/web/frontend/src/components/settings/agent/BlockedDeploymentsCard.test.tsx +81 -0
- manigent/web/frontend/src/components/settings/agent/BlockedDeploymentsCard.tsx +62 -0
- manigent/web/frontend/src/components/settings/agent/ChannelIsolationLine.tsx +21 -0
- manigent/web/frontend/src/components/settings/agent/ChannelsSection.test.tsx +879 -0
- manigent/web/frontend/src/components/settings/agent/ChannelsSection.tsx +1124 -0
- manigent/web/frontend/src/components/settings/agent/EnvVarsCard.test.ts +15 -0
- manigent/web/frontend/src/components/settings/agent/EnvVarsCard.tsx +301 -0
- manigent/web/frontend/src/components/settings/agent/ExtraDirsList.tsx +85 -0
- manigent/web/frontend/src/components/settings/agent/GeneralSection.tsx +88 -0
- manigent/web/frontend/src/components/settings/agent/HostDisclaimerSlot.test.tsx +32 -0
- manigent/web/frontend/src/components/settings/agent/HostDisclaimerSlot.tsx +30 -0
- manigent/web/frontend/src/components/settings/agent/HubChannelCard.test.tsx +449 -0
- manigent/web/frontend/src/components/settings/agent/HubChannelCard.tsx +312 -0
- manigent/web/frontend/src/components/settings/agent/HubInvitableAgentsCard.test.tsx +83 -0
- manigent/web/frontend/src/components/settings/agent/HubInvitableAgentsCard.tsx +64 -0
- manigent/web/frontend/src/components/settings/agent/HubSendUsageCard.test.tsx +69 -0
- manigent/web/frontend/src/components/settings/agent/HubSendUsageCard.tsx +42 -0
- manigent/web/frontend/src/components/settings/agent/HubTurnOffDialog.tsx +88 -0
- manigent/web/frontend/src/components/settings/agent/IsolationRecheckButton.test.tsx +26 -0
- manigent/web/frontend/src/components/settings/agent/IsolationRecheckButton.tsx +68 -0
- manigent/web/frontend/src/components/settings/agent/KnowledgeSection.tsx +68 -0
- manigent/web/frontend/src/components/settings/agent/LineChannelCard.test.tsx +428 -0
- manigent/web/frontend/src/components/settings/agent/LineChannelCard.tsx +343 -0
- manigent/web/frontend/src/components/settings/agent/RuntimeSection.test.tsx +164 -0
- manigent/web/frontend/src/components/settings/agent/RuntimeSection.tsx +118 -0
- manigent/web/frontend/src/components/settings/agent/StorageSection.tsx +78 -0
- manigent/web/frontend/src/components/settings/agent/WebChatChannelCard.test.tsx +253 -0
- manigent/web/frontend/src/components/settings/agent/WebChatChannelCard.tsx +401 -0
- manigent/web/frontend/src/components/settings/agent/WhatsAppChannelCard.test.tsx +462 -0
- manigent/web/frontend/src/components/settings/agent/WhatsAppChannelCard.tsx +289 -0
- manigent/web/frontend/src/components/settings/agent/agentSettings.test.tsx +109 -0
- manigent/web/frontend/src/components/settings/agent/channelSetupGuides.test.tsx +162 -0
- manigent/web/frontend/src/components/settings/agent/channelSetupGuides.tsx +119 -0
- manigent/web/frontend/src/components/settings/agent/channelsShared.ts +83 -0
- manigent/web/frontend/src/components/settings/agent/fields.tsx +67 -0
- manigent/web/frontend/src/components/settings/agent/sections.ts +36 -0
- manigent/web/frontend/src/components/settings/agent/useAgentSettingsDraft.ts +129 -0
- manigent/web/frontend/src/components/settings/agent/useInstallSelection.ts +38 -0
- manigent/web/frontend/src/components/settings/primitives.tsx +98 -0
- manigent/web/frontend/src/components/shared/ExpandToggle.tsx +45 -0
- manigent/web/frontend/src/components/shared/MarkdownBody.tsx +218 -0
- manigent/web/frontend/src/components/shared/MarkdownBody.untrusted.test.tsx +97 -0
- manigent/web/frontend/src/components/shared/RenderBody.tsx +90 -0
- manigent/web/frontend/src/components/shared/rehypeHideComments.test.tsx +115 -0
- manigent/web/frontend/src/components/shared/rehypeHideComments.ts +124 -0
- manigent/web/frontend/src/components/sharing/AcceptSharePage.tsx +141 -0
- manigent/web/frontend/src/components/sharing/ShareLandingPage.tsx +89 -0
- manigent/web/frontend/src/components/sidebar/AccountChip.test.tsx +337 -0
- manigent/web/frontend/src/components/sidebar/AccountChip.tsx +407 -0
- manigent/web/frontend/src/components/sidebar/ActiveWorkDot.tsx +9 -0
- manigent/web/frontend/src/components/sidebar/AgentProfile.tsx +44 -0
- manigent/web/frontend/src/components/sidebar/AgentRow.tsx +71 -0
- manigent/web/frontend/src/components/sidebar/AgentsPanel.retained.test.tsx +105 -0
- manigent/web/frontend/src/components/sidebar/AgentsPanel.tsx +231 -0
- manigent/web/frontend/src/components/sidebar/AssistantHero.tsx +48 -0
- manigent/web/frontend/src/components/sidebar/ChatroomItem.tsx +48 -0
- manigent/web/frontend/src/components/sidebar/CommandPalette.channelThreads.test.tsx +76 -0
- manigent/web/frontend/src/components/sidebar/CommandPalette.reopen.test.tsx +206 -0
- manigent/web/frontend/src/components/sidebar/CommandPalette.test.tsx +725 -0
- manigent/web/frontend/src/components/sidebar/CommandPalette.tsx +774 -0
- manigent/web/frontend/src/components/sidebar/ComputersPanel.tsx +144 -0
- manigent/web/frontend/src/components/sidebar/DmIcon.tsx +46 -0
- manigent/web/frontend/src/components/sidebar/DmsPanel.tsx +226 -0
- manigent/web/frontend/src/components/sidebar/FrontDeskPanel.channels.test.tsx +582 -0
- manigent/web/frontend/src/components/sidebar/FrontDeskPanel.test.tsx +151 -0
- manigent/web/frontend/src/components/sidebar/FrontDeskPanel.tsx +454 -0
- manigent/web/frontend/src/components/sidebar/HotkeysHelp.tsx +101 -0
- manigent/web/frontend/src/components/sidebar/MessageHitRow.test.tsx +84 -0
- manigent/web/frontend/src/components/sidebar/MessageHitRow.tsx +57 -0
- manigent/web/frontend/src/components/sidebar/MyDeskRailPanel.crossHighlight.test.tsx +247 -0
- manigent/web/frontend/src/components/sidebar/MyDeskRailPanel.delete.test.tsx +273 -0
- manigent/web/frontend/src/components/sidebar/MyDeskRailPanel.tsx +351 -0
- manigent/web/frontend/src/components/sidebar/PanelShell.tsx +48 -0
- manigent/web/frontend/src/components/sidebar/ProjectItem.tsx +161 -0
- manigent/web/frontend/src/components/sidebar/ProjectRow.tsx +151 -0
- manigent/web/frontend/src/components/sidebar/ProjectsPanel.tsx +80 -0
- manigent/web/frontend/src/components/sidebar/PublicPanel.counterpart.test.tsx +85 -0
- manigent/web/frontend/src/components/sidebar/PublicPanel.hub.test.tsx +147 -0
- manigent/web/frontend/src/components/sidebar/PublicPanel.tsx +271 -0
- manigent/web/frontend/src/components/sidebar/RecencyHeader.tsx +17 -0
- manigent/web/frontend/src/components/sidebar/ScheduledPanel.tsx +58 -0
- manigent/web/frontend/src/components/sidebar/SidebarAvatar.tsx +128 -0
- manigent/web/frontend/src/components/sidebar/SidebarRail.tsx +163 -0
- manigent/web/frontend/src/components/sidebar/TeamGroup.tsx +67 -0
- manigent/web/frontend/src/components/sidebar/dmPrefill.test.ts +69 -0
- manigent/web/frontend/src/components/sidebar/dmPrefill.ts +80 -0
- manigent/web/frontend/src/components/sidebar/index.ts +18 -0
- manigent/web/frontend/src/components/sidebar/railShortcuts.ts +18 -0
- manigent/web/frontend/src/components/today/lib.test.ts +70 -0
- manigent/web/frontend/src/components/today/lib.ts +296 -0
- manigent/web/frontend/src/components/today/today.css +113 -0
- manigent/web/frontend/src/components/welcome/RunnerSetup.css +253 -0
- manigent/web/frontend/src/components/welcome/RunnerSetup.tsx +148 -0
- manigent/web/frontend/src/components/welcome/WelcomePage.css +383 -0
- manigent/web/frontend/src/components/welcome/WelcomePage.tsx +329 -0
- manigent/web/frontend/src/components/welcome/welcomeCopy.test.ts +382 -0
- manigent/web/frontend/src/components/welcome/welcomeCopy.ts +313 -0
- manigent/web/frontend/src/config/llmProviders.test.ts +161 -0
- manigent/web/frontend/src/config/llmProviders.ts +109 -0
- manigent/web/frontend/src/config/providerIds.fixture.json +13 -0
- manigent/web/frontend/src/hooks/accountNavigation.test.tsx +138 -0
- manigent/web/frontend/src/hooks/index.ts +10 -0
- manigent/web/frontend/src/hooks/useActiveWorkBootstrap.ts +86 -0
- manigent/web/frontend/src/hooks/useAgentAccess.test.tsx +30 -0
- manigent/web/frontend/src/hooks/useAgentAccess.ts +204 -0
- manigent/web/frontend/src/hooks/useAgentSampleRequests.ts +27 -0
- manigent/web/frontend/src/hooks/useAgentSearch.ts +10 -0
- manigent/web/frontend/src/hooks/useAgents.ts +46 -0
- manigent/web/frontend/src/hooks/useAnnouncements.test.ts +112 -0
- manigent/web/frontend/src/hooks/useAnnouncements.ts +100 -0
- manigent/web/frontend/src/hooks/useAssistantAgent.ts +24 -0
- manigent/web/frontend/src/hooks/useAutoResizeTextarea.ts +18 -0
- manigent/web/frontend/src/hooks/useBridgeDeliveries.test.tsx +79 -0
- manigent/web/frontend/src/hooks/useBriefTabs.ts +122 -0
- manigent/web/frontend/src/hooks/useChannelThreads.ts +69 -0
- manigent/web/frontend/src/hooks/useComposeForm.ts +80 -0
- manigent/web/frontend/src/hooks/useComputers.ts +123 -0
- manigent/web/frontend/src/hooks/useContextFirstItem.ts +118 -0
- manigent/web/frontend/src/hooks/useCreateProject.ts +78 -0
- manigent/web/frontend/src/hooks/useDebouncedValue.ts +16 -0
- manigent/web/frontend/src/hooks/useDeleteProject.ts +27 -0
- manigent/web/frontend/src/hooks/useDeskDispatch.test.tsx +170 -0
- manigent/web/frontend/src/hooks/useDeskDispatch.ts +135 -0
- manigent/web/frontend/src/hooks/useDeskReadState.test.tsx +85 -0
- manigent/web/frontend/src/hooks/useDeskReadState.ts +150 -0
- manigent/web/frontend/src/hooks/useDeskRecentlyDone.test.tsx +222 -0
- manigent/web/frontend/src/hooks/useDeskRecentlyDone.ts +225 -0
- manigent/web/frontend/src/hooks/useDeskTour.ts +37 -0
- manigent/web/frontend/src/hooks/useDeskUpdates.channelThreads.test.tsx +91 -0
- manigent/web/frontend/src/hooks/useDeskUpdates.hubThreads.test.tsx +93 -0
- manigent/web/frontend/src/hooks/useDeskUpdates.ts +353 -0
- manigent/web/frontend/src/hooks/useDisconnectIntegration.ts +23 -0
- manigent/web/frontend/src/hooks/useDmThreads.ts +99 -0
- manigent/web/frontend/src/hooks/useFileDropzone.ts +93 -0
- manigent/web/frontend/src/hooks/useFileUpload.ts +38 -0
- manigent/web/frontend/src/hooks/useFiles.ts +98 -0
- manigent/web/frontend/src/hooks/useHub.test.tsx +237 -0
- manigent/web/frontend/src/hooks/useHub.ts +502 -0
- manigent/web/frontend/src/hooks/useInstall.ts +82 -0
- manigent/web/frontend/src/hooks/useLabels.test.tsx +294 -0
- manigent/web/frontend/src/hooks/useLabels.ts +287 -0
- manigent/web/frontend/src/hooks/useLogout.ts +49 -0
- manigent/web/frontend/src/hooks/useMentionDetection.ts +90 -0
- manigent/web/frontend/src/hooks/useMessageAttachments.deskLimit.test.ts +264 -0
- manigent/web/frontend/src/hooks/useMessageAttachments.ts +283 -0
- manigent/web/frontend/src/hooks/useMessageDeepLink.test.tsx +70 -0
- manigent/web/frontend/src/hooks/useMessageDeepLink.ts +32 -0
- manigent/web/frontend/src/hooks/useMessageSearch.ts +78 -0
- manigent/web/frontend/src/hooks/useModelConfigs.ts +178 -0
- manigent/web/frontend/src/hooks/useMyAgents.ts +18 -0
- manigent/web/frontend/src/hooks/usePointerReorder.ts +270 -0
- manigent/web/frontend/src/hooks/usePrefersReducedMotion.ts +18 -0
- manigent/web/frontend/src/hooks/useProjectPlan.ts +36 -0
- manigent/web/frontend/src/hooks/useProjectReport.ts +19 -0
- manigent/web/frontend/src/hooks/useProjects.ts +104 -0
- manigent/web/frontend/src/hooks/useProjectsWithChatrooms.ts +97 -0
- manigent/web/frontend/src/hooks/usePublicRequests.ts +89 -0
- manigent/web/frontend/src/hooks/useRecentAgents.ts +38 -0
- manigent/web/frontend/src/hooks/useRenameProject.test.tsx +185 -0
- manigent/web/frontend/src/hooks/useRenameProject.ts +192 -0
- manigent/web/frontend/src/hooks/useRoomTrust.ts +56 -0
- manigent/web/frontend/src/hooks/useSharing.ts +46 -0
- manigent/web/frontend/src/hooks/useSopRecents.ts +55 -0
- manigent/web/frontend/src/hooks/useSopSchedules.ts +25 -0
- manigent/web/frontend/src/hooks/useSops.ts +99 -0
- manigent/web/frontend/src/hooks/useSwitchAccount.ts +41 -0
- manigent/web/frontend/src/hooks/useTeamGroups.ts +48 -0
- manigent/web/frontend/src/hooks/useThreadOutbox.ts +68 -0
- manigent/web/frontend/src/hooks/useTodos.add.test.tsx +89 -0
- manigent/web/frontend/src/hooks/useTodos.linkProject.test.tsx +115 -0
- manigent/web/frontend/src/hooks/useTodos.saveDraft.test.tsx +188 -0
- manigent/web/frontend/src/hooks/useTodos.ts +396 -0
- manigent/web/frontend/src/hooks/useUntrustedBodies.test.tsx +87 -0
- manigent/web/frontend/src/hooks/useUntrustedBodies.ts +51 -0
- manigent/web/frontend/src/hooks/useWebSocket.briefTab.test.tsx +148 -0
- manigent/web/frontend/src/hooks/useWebSocket.channelThreads.test.tsx +82 -0
- manigent/web/frontend/src/hooks/useWebSocket.hostSync.test.tsx +92 -0
- manigent/web/frontend/src/hooks/useWebSocket.hub.test.tsx +114 -0
- manigent/web/frontend/src/hooks/useWebSocket.labelSync.test.tsx +168 -0
- manigent/web/frontend/src/hooks/useWebSocket.plan.test.tsx +168 -0
- manigent/web/frontend/src/hooks/useWebSocket.reconnect.test.tsx +166 -0
- manigent/web/frontend/src/hooks/useWebSocket.runnerVersions.test.tsx +167 -0
- manigent/web/frontend/src/hooks/useWebSocket.ts +495 -0
- manigent/web/frontend/src/hooks/useWindowFileDropGuard.ts +33 -0
- manigent/web/frontend/src/landing.tsx +11 -0
- manigent/web/frontend/src/main.tsx +17 -0
- manigent/web/frontend/src/private-beta.tsx +10 -0
- manigent/web/frontend/src/public.tsx +42 -0
- manigent/web/frontend/src/queryClient.ts +16 -0
- manigent/web/frontend/src/stores/activeWorkStore.ts +88 -0
- manigent/web/frontend/src/stores/announcementStore.test.ts +217 -0
- manigent/web/frontend/src/stores/announcementStore.ts +169 -0
- manigent/web/frontend/src/stores/authStore.multiSession.test.ts +304 -0
- manigent/web/frontend/src/stores/authStore.test.ts +235 -0
- manigent/web/frontend/src/stores/authStore.ts +693 -0
- manigent/web/frontend/src/stores/deskLabelViewStore.test.ts +162 -0
- manigent/web/frontend/src/stores/deskLabelViewStore.ts +234 -0
- manigent/web/frontend/src/stores/deskLinkStore.ts +54 -0
- manigent/web/frontend/src/stores/deskStore.test.ts +53 -0
- manigent/web/frontend/src/stores/deskStore.ts +93 -0
- manigent/web/frontend/src/stores/heldPostsStore.ts +78 -0
- manigent/web/frontend/src/stores/mcpAuthStore.ts +52 -0
- manigent/web/frontend/src/stores/modelSelectionStore.ts +33 -0
- manigent/web/frontend/src/stores/perUserStores.ts +79 -0
- manigent/web/frontend/src/stores/runnerVersionStore.test.ts +81 -0
- manigent/web/frontend/src/stores/runnerVersionStore.ts +60 -0
- manigent/web/frontend/src/stores/skillAuthStore.ts +54 -0
- manigent/web/frontend/src/stores/switchReset.test.ts +236 -0
- manigent/web/frontend/src/stores/tokenExp.ts +32 -0
- manigent/web/frontend/src/stores/uiStore.ts +186 -0
- manigent/web/frontend/src/stores/unreadStore.ts +204 -0
- manigent/web/frontend/src/stores/unsavedGuard.ts +22 -0
- manigent/web/frontend/src/styles/design/fonts/JetBrainsMono-Latin.woff2 +0 -0
- manigent/web/frontend/src/styles/design/fonts/Nunito-Latin.woff2 +0 -0
- manigent/web/frontend/src/styles/design/fonts/Nunito-LatinExt.woff2 +0 -0
- manigent/web/frontend/src/styles/design/tokens.css +160 -0
- manigent/web/frontend/src/styles/homepage.css +242 -0
- manigent/web/frontend/src/styles/index.css +126 -0
- manigent/web/frontend/src/styles/landing.css +52 -0
- manigent/web/frontend/src/test/authFixtures.ts +154 -0
- manigent/web/frontend/src/test/fetchHarness.ts +203 -0
- manigent/web/frontend/src/test/fixtures/channelThreads.smoke.json +42 -0
- manigent/web/frontend/src/test/hubFixtures.ts +212 -0
- manigent/web/frontend/src/test/queryWrapper.tsx +9 -0
- manigent/web/frontend/src/test/suiteHygiene.test.ts +212 -0
- manigent/web/frontend/src/types/channelThreadName.test.ts +16 -0
- manigent/web/frontend/src/types/index.ts +903 -0
- manigent/web/frontend/src/utils/agentAccessCopy.test.ts +53 -0
- manigent/web/frontend/src/utils/agentAccessCopy.ts +231 -0
- manigent/web/frontend/src/utils/agentDisplay.ts +81 -0
- manigent/web/frontend/src/utils/briefSchedule.ts +25 -0
- manigent/web/frontend/src/utils/channelThreads.test.ts +109 -0
- manigent/web/frontend/src/utils/channelThreads.ts +179 -0
- manigent/web/frontend/src/utils/chatroomDisplay.ts +11 -0
- manigent/web/frontend/src/utils/deskLinks.test.ts +155 -0
- manigent/web/frontend/src/utils/deskLinks.ts +115 -0
- manigent/web/frontend/src/utils/deskRecipient.ts +29 -0
- manigent/web/frontend/src/utils/formatDate.ts +102 -0
- manigent/web/frontend/src/utils/frontDesk.ts +65 -0
- manigent/web/frontend/src/utils/hubChannelView.test.ts +178 -0
- manigent/web/frontend/src/utils/hubChannelView.ts +307 -0
- manigent/web/frontend/src/utils/hubDelivery.test.ts +105 -0
- manigent/web/frontend/src/utils/hubDelivery.ts +137 -0
- manigent/web/frontend/src/utils/hubDisplay.test.ts +157 -0
- manigent/web/frontend/src/utils/hubDisplay.ts +221 -0
- manigent/web/frontend/src/utils/hubThread.test.ts +184 -0
- manigent/web/frontend/src/utils/hubThread.ts +247 -0
- manigent/web/frontend/src/utils/labelErrors.test.ts +127 -0
- manigent/web/frontend/src/utils/labelErrors.ts +123 -0
- manigent/web/frontend/src/utils/labelView.test.ts +846 -0
- manigent/web/frontend/src/utils/labelView.ts +760 -0
- manigent/web/frontend/src/utils/legalUrls.ts +11 -0
- manigent/web/frontend/src/utils/messageSender.test.ts +32 -0
- manigent/web/frontend/src/utils/messageSender.ts +29 -0
- manigent/web/frontend/src/utils/oauthScopeCopy.ts +73 -0
- manigent/web/frontend/src/utils/personalize.ts +49 -0
- manigent/web/frontend/src/utils/reachableAgents.test.ts +36 -0
- manigent/web/frontend/src/utils/reachableAgents.ts +24 -0
- manigent/web/frontend/src/utils/recencyBuckets.ts +61 -0
- manigent/web/frontend/src/utils/roomTrust.test.ts +94 -0
- manigent/web/frontend/src/utils/roomTrust.ts +111 -0
- manigent/web/frontend/src/utils/snippetHighlight.test.ts +63 -0
- manigent/web/frontend/src/utils/snippetHighlight.ts +42 -0
- manigent/web/frontend/src/utils/sopRecipient.ts +37 -0
- manigent/web/frontend/src/utils/sopRequest.test.ts +91 -0
- manigent/web/frontend/src/utils/sopRequest.ts +68 -0
- manigent/web/frontend/src/utils/sopSchedule.ts +26 -0
- manigent/web/frontend/src/utils/sopSection.test.ts +148 -0
- manigent/web/frontend/src/utils/sopSection.ts +143 -0
- manigent/web/frontend/src/utils/textSearch.test.ts +60 -0
- manigent/web/frontend/src/utils/textSearch.ts +43 -0
- manigent/web/frontend/src/utils/thoughtPartner.ts +26 -0
- manigent/web/frontend/src/utils/threadName.test.ts +131 -0
- manigent/web/frontend/src/utils/threadName.ts +122 -0
- manigent/web/frontend/src/utils/ticketView.test.ts +296 -0
- manigent/web/frontend/src/utils/ticketView.ts +175 -0
- manigent/web/frontend/src/utils/todoAttachments.desiredState.test.ts +180 -0
- manigent/web/frontend/src/utils/todoAttachments.ts +126 -0
- manigent/web/frontend/src/utils/todoDraft.test.ts +84 -0
- manigent/web/frontend/src/utils/todoDraft.ts +46 -0
- manigent/web/frontend/src/utils/todoSearch.test.ts +82 -0
- manigent/web/frontend/src/utils/todoSearch.ts +43 -0
- manigent/web/frontend/src/utils/versionMatch.test.ts +295 -0
- manigent/web/frontend/src/utils/versionMatch.ts +245 -0
- manigent/web/frontend/src/vite-env.d.ts +1 -0
- manigent/web/frontend/tailwind.config.js +86 -0
- manigent/web/frontend/tos.html +188 -0
- manigent/web/frontend/tsconfig.dts.json +25 -0
- manigent/web/frontend/tsconfig.json +26 -0
- manigent/web/frontend/tsconfig.node.json +11 -0
- manigent/web/frontend/vite.config.ts +41 -0
- manigent/web/frontend/vitest.config.ts +16 -0
- manigent/ws_edge/app.py +514 -0
- manigent/ws_edge/auth.py +104 -0
- manigent/ws_edge/link.py +282 -0
- manigent/ws_edge/registry.py +206 -0
- manigent/ws_edge/terminal_relay.py +269 -0
- manigent_server-0.1.0.dist-info/METADATA +138 -0
- manigent_server-0.1.0.dist-info/RECORD +1004 -0
- manigent_server-0.1.0.dist-info/WHEEL +4 -0
- manigent_server-0.1.0.dist-info/entry_points.txt +2 -0
- manigent_server-0.1.0.dist-info/licenses/LICENSE +68 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react'
|
|
2
|
+
import { useQueryClient } from '@tanstack/react-query'
|
|
3
|
+
import { wsManager } from '../api/websocket'
|
|
4
|
+
import { useAuthStore } from '../stores/authStore'
|
|
5
|
+
import { useActiveWorkStore } from '../stores/activeWorkStore'
|
|
6
|
+
import { useMcpAuthStore } from '../stores/mcpAuthStore'
|
|
7
|
+
import { useSkillAuthStore } from '../stores/skillAuthStore'
|
|
8
|
+
import { useUnreadStore } from '../stores/unreadStore'
|
|
9
|
+
import { useRunnerVersionStore } from '../stores/runnerVersionStore'
|
|
10
|
+
import { useDeskLabelViewStore } from '../stores/deskLabelViewStore'
|
|
11
|
+
import { DESK_LATEST_MESSAGES_KEY, deskRoomKey } from './useDeskUpdates'
|
|
12
|
+
import { PUBLIC_REQUESTS_KEY } from './usePublicRequests'
|
|
13
|
+
import { ControlMessageType } from '../types'
|
|
14
|
+
import type { ActiveWorkChangePayload, AgentCardUpdatePayload, ChangelogUpdatePayload, ControlEnvelope, DeskLabelSyncPayload, DeskReadStateSyncPayload, McpAuthUrlForUserPayload, SkillAuthUrlForUserPayload } from '../types'
|
|
15
|
+
import { CHANNEL_THREADS_KEY } from './useChannelThreads'
|
|
16
|
+
import { mergeDeliveriesInto, replaceHubChannel } from './useHub'
|
|
17
|
+
import { applyRoomFlow, mergeBridgeDeliveryInto } from './useAgentAccess'
|
|
18
|
+
import type {
|
|
19
|
+
ChatroomFlowChangedPayload, HubBridgeDeliveryPayload, HubChannelStatusPayload, HubDeliveryStatePayload,
|
|
20
|
+
} from '../api/endpoints/hub'
|
|
21
|
+
|
|
22
|
+
export function useWebSocketConnection(): boolean {
|
|
23
|
+
const { accessToken, user, isAuthenticated } = useAuthStore()
|
|
24
|
+
const [connected, setConnected] = useState(false)
|
|
25
|
+
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (!isAuthenticated || !accessToken || !user) {
|
|
28
|
+
setConnected(false)
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Connect as user for real-time updates. accessToken is in the dep array,
|
|
33
|
+
// so a silent refresh transparently reconnects with the fresh token.
|
|
34
|
+
wsManager.connectAsUser(user.id, accessToken)
|
|
35
|
+
|
|
36
|
+
// Check connection status periodically
|
|
37
|
+
const checkConnection = () => {
|
|
38
|
+
setConnected(wsManager.isConnected())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Initial check
|
|
42
|
+
checkConnection()
|
|
43
|
+
|
|
44
|
+
// Poll connection status (WebSocket events don't trigger React re-renders)
|
|
45
|
+
const interval = setInterval(checkConnection, 2000)
|
|
46
|
+
|
|
47
|
+
return () => {
|
|
48
|
+
clearInterval(interval)
|
|
49
|
+
wsManager.disconnect()
|
|
50
|
+
setConnected(false)
|
|
51
|
+
}
|
|
52
|
+
}, [isAuthenticated, accessToken, user])
|
|
53
|
+
|
|
54
|
+
return connected
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Passive hook that only monitors connection status without managing the connection.
|
|
59
|
+
* Use this in components that need to read connection state but should NOT
|
|
60
|
+
* own the connect/disconnect lifecycle (to avoid duplicate connections).
|
|
61
|
+
*/
|
|
62
|
+
export function useWebSocketStatus(): boolean {
|
|
63
|
+
const [connected, setConnected] = useState(() => wsManager.isConnected())
|
|
64
|
+
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const interval = setInterval(() => {
|
|
67
|
+
setConnected(wsManager.isConnected())
|
|
68
|
+
}, 2000)
|
|
69
|
+
return () => clearInterval(interval)
|
|
70
|
+
}, [])
|
|
71
|
+
|
|
72
|
+
return connected
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Reconnect catch-up pacing — see handleReconnect in useWebSocketUpdates.
|
|
76
|
+
const RECONNECT_SETTLE_MS = 1_000
|
|
77
|
+
const RECONNECT_TIER_GAP_MS = 1_500
|
|
78
|
+
|
|
79
|
+
export function useWebSocketUpdates() {
|
|
80
|
+
const queryClient = useQueryClient()
|
|
81
|
+
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
const handleMessage = (envelope: ControlEnvelope) => {
|
|
84
|
+
// Handle notification-only protocol messages
|
|
85
|
+
switch (envelope.type) {
|
|
86
|
+
case ControlMessageType.CHANGELOG_UPDATE:
|
|
87
|
+
// Payload is typed: ChangelogUpdatePayload with project_id, project_name, new_version
|
|
88
|
+
const payload = envelope.payload as ChangelogUpdatePayload
|
|
89
|
+
const projectId = payload.project_id
|
|
90
|
+
if (projectId) {
|
|
91
|
+
// Invalidate all chatroom-scoped caches for this project
|
|
92
|
+
// Using partial query key matching: ['messages', projectId] matches ['messages', projectId, chatroomName]
|
|
93
|
+
queryClient.invalidateQueries({
|
|
94
|
+
queryKey: ['messages', projectId],
|
|
95
|
+
})
|
|
96
|
+
// The desk's batched feed spans many projects, so any project's
|
|
97
|
+
// update refreshes it. cancelRefetch: false lets a burst of
|
|
98
|
+
// updates share the request already in flight instead of
|
|
99
|
+
// cancelling and restarting it on every entry.
|
|
100
|
+
queryClient.invalidateQueries(
|
|
101
|
+
{ queryKey: [DESK_LATEST_MESSAGES_KEY] },
|
|
102
|
+
{ cancelRefetch: false },
|
|
103
|
+
)
|
|
104
|
+
// A public request's matches each answer on their own thread, so
|
|
105
|
+
// any thread's update may move a request's status.
|
|
106
|
+
queryClient.invalidateQueries(
|
|
107
|
+
{ queryKey: PUBLIC_REQUESTS_KEY },
|
|
108
|
+
{ cancelRefetch: false },
|
|
109
|
+
)
|
|
110
|
+
queryClient.invalidateQueries({
|
|
111
|
+
queryKey: ['files', projectId],
|
|
112
|
+
})
|
|
113
|
+
queryClient.invalidateQueries({
|
|
114
|
+
queryKey: ['fileContent', projectId],
|
|
115
|
+
})
|
|
116
|
+
// Refresh iframe-rendered blobs (chatroom file previews etc.)
|
|
117
|
+
// on file updates. Re-keying the blob URL forces the iframe to
|
|
118
|
+
// re-mount with the new bytes.
|
|
119
|
+
queryClient.invalidateQueries({
|
|
120
|
+
queryKey: ['fileBlobContent', projectId],
|
|
121
|
+
})
|
|
122
|
+
queryClient.invalidateQueries({
|
|
123
|
+
queryKey: ['chatroom', projectId],
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
// Invalidate project-level caches
|
|
127
|
+
queryClient.invalidateQueries({
|
|
128
|
+
queryKey: ['chatrooms', projectId],
|
|
129
|
+
})
|
|
130
|
+
queryClient.invalidateQueries({
|
|
131
|
+
queryKey: ['project', projectId],
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
// Invalidate project lists (in case room created or project status changed)
|
|
135
|
+
queryClient.invalidateQueries({ queryKey: ['user-projects'] })
|
|
136
|
+
queryClient.invalidateQueries({ queryKey: ['all-projects'] })
|
|
137
|
+
// The Front Desk sidebar's channel threads (a new contact opens a
|
|
138
|
+
// thread) and this thread's delivery status (a reply was queued).
|
|
139
|
+
// Both are cheap; a burst shares the request in flight.
|
|
140
|
+
queryClient.invalidateQueries({ queryKey: CHANNEL_THREADS_KEY }, { cancelRefetch: false })
|
|
141
|
+
queryClient.invalidateQueries({ queryKey: ['channel-outbox', projectId] }, { cancelRefetch: false })
|
|
142
|
+
}
|
|
143
|
+
break
|
|
144
|
+
|
|
145
|
+
case ControlMessageType.AGENT_STATUS_CHANGE:
|
|
146
|
+
// Invalidate agents list to refresh status
|
|
147
|
+
queryClient.invalidateQueries({
|
|
148
|
+
queryKey: ['agents'],
|
|
149
|
+
})
|
|
150
|
+
break
|
|
151
|
+
|
|
152
|
+
case ControlMessageType.PROJECT_DELETED:
|
|
153
|
+
// Invalidate project lists so deleted project disappears
|
|
154
|
+
queryClient.invalidateQueries({ queryKey: ['user-projects'] })
|
|
155
|
+
queryClient.invalidateQueries({ queryKey: ['all-projects'] })
|
|
156
|
+
break
|
|
157
|
+
|
|
158
|
+
case ControlMessageType.ACTIVE_WORK_CHANGE: {
|
|
159
|
+
const p = envelope.payload as ActiveWorkChangePayload
|
|
160
|
+
useActiveWorkStore.getState().setParticipants(
|
|
161
|
+
p.project_id,
|
|
162
|
+
p.chatroom_name,
|
|
163
|
+
p.active_participants,
|
|
164
|
+
)
|
|
165
|
+
break
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
case ControlMessageType.MCP_AUTH_URL_FOR_USER: {
|
|
169
|
+
const p = envelope.payload as McpAuthUrlForUserPayload
|
|
170
|
+
useMcpAuthStore.getState().set(p.agent_id, p.mcp_name, {
|
|
171
|
+
auth_url: p.auth_url,
|
|
172
|
+
state: p.state,
|
|
173
|
+
})
|
|
174
|
+
break
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
case ControlMessageType.SKILL_AUTH_URL_FOR_USER: {
|
|
178
|
+
const p = envelope.payload as SkillAuthUrlForUserPayload
|
|
179
|
+
useSkillAuthStore.getState().set(p.agent_id, p.skill_name, {
|
|
180
|
+
auth_url: p.auth_url,
|
|
181
|
+
state: p.state,
|
|
182
|
+
})
|
|
183
|
+
break
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
case ControlMessageType.AGENT_CARD_UPDATE: {
|
|
187
|
+
const p = envelope.payload as AgentCardUpdatePayload
|
|
188
|
+
// Cursor bump on the agent card (last_reflected_at). Invalidate the single-agent fetch that backs the
|
|
189
|
+
// Agent Settings "Memory & Reflection" panel plus the agents list.
|
|
190
|
+
queryClient.invalidateQueries({ queryKey: ['agent', p.agent_id] })
|
|
191
|
+
queryClient.invalidateQueries({ queryKey: ['agents'] })
|
|
192
|
+
break
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
case ControlMessageType.BRIEF_TAB_SYNC: {
|
|
196
|
+
// One of the user's agents upserted / deleted a brief tab.
|
|
197
|
+
// Invalidate the list query; useBriefTabs refetches and My Desk
|
|
198
|
+
// re-renders the changed briefing in place.
|
|
199
|
+
queryClient.invalidateQueries({ queryKey: ['brief-tabs'] })
|
|
200
|
+
// ...and the DOCUMENT, which lives under its own key now that the
|
|
201
|
+
// list carries metadata only. Without this line a refresh landing on
|
|
202
|
+
// the briefing the user is LOOKING AT updates the list and leaves
|
|
203
|
+
// the open document stale — AC-4.2 failing silently, with the
|
|
204
|
+
// freshness line in the header disagreeing with the content under
|
|
205
|
+
// it. The two keys do not collide: react-query matches element-wise,
|
|
206
|
+
// so ['brief-tab'] never prefix-matches ['brief-tabs'].
|
|
207
|
+
queryClient.invalidateQueries({ queryKey: ['brief-tab'] })
|
|
208
|
+
break
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
case ControlMessageType.DESK_TODO_SYNC: {
|
|
212
|
+
// The user's desk to-do plate changed (self-capture, patch,
|
|
213
|
+
// reorder, delete, or an agent published a to-do). Invalidate the
|
|
214
|
+
// list query; useTodos refetches and the To-do rail re-renders.
|
|
215
|
+
queryClient.invalidateQueries({ queryKey: ['desk-todos'] })
|
|
216
|
+
break
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
case ControlMessageType.DESK_SOP_SYNC: {
|
|
220
|
+
// The owner's SOP library changed — in THIS session or, more to the
|
|
221
|
+
// point, in another one of their tabs/devices. The server fans the
|
|
222
|
+
// envelope out to every live session, so invalidating here is what
|
|
223
|
+
// keeps the SOP rail consistent everywhere without a reload.
|
|
224
|
+
queryClient.invalidateQueries({ queryKey: ['desk-sops'] })
|
|
225
|
+
break
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
case ControlMessageType.DESK_LABEL_SYNC: {
|
|
229
|
+
// The owner's label vocabulary moved — in this session, in another
|
|
230
|
+
// tab, by voice through the assistant, or as a side effect of an
|
|
231
|
+
// agent publishing a to-do with a slug that was not registered yet.
|
|
232
|
+
const p = envelope.payload as DeskLabelSyncPayload
|
|
233
|
+
// A merge has to be FOLLOWED, not just noticed: record what `slug`
|
|
234
|
+
// became so the reconcile can re-point a live filter at the target.
|
|
235
|
+
// Only the envelope carries this for a tab that did not make the
|
|
236
|
+
// call, which is why the field exists.
|
|
237
|
+
if (p.action === 'merge' && p.slug && p.into) {
|
|
238
|
+
useDeskLabelViewStore.getState().noteMerge(p.slug, p.into)
|
|
239
|
+
}
|
|
240
|
+
queryClient.invalidateQueries({ queryKey: ['desk-labels'] })
|
|
241
|
+
// NOT redundant with the DESK_TODO_SYNC case: delete and merge move
|
|
242
|
+
// both documents and broadcast both envelopes, and invalidating the
|
|
243
|
+
// plate here makes the client converge even when only one of the two
|
|
244
|
+
// lands (a dropped frame, a reconnect race). react-query dedupes
|
|
245
|
+
// concurrent invalidations of the same key, so it costs nothing.
|
|
246
|
+
queryClient.invalidateQueries({ queryKey: ['desk-todos'] })
|
|
247
|
+
break
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
case ControlMessageType.DESK_READ_STATE_SYNC: {
|
|
251
|
+
// Another of this owner's sessions signed a desk card off. Merge the
|
|
252
|
+
// watermark (last-writer-wins on updated_at) so this session's desk
|
|
253
|
+
// drops the card live, then invalidate the hydration query so its
|
|
254
|
+
// cache stays coherent. The hub fans this out to every live session of
|
|
255
|
+
// the owner, so it reaches all their connected devices — but it is
|
|
256
|
+
// still best-effort (a device that was asleep or reconnecting never
|
|
257
|
+
// sees it), and the GET hydration on mount/focus is what guarantees
|
|
258
|
+
// convergence.
|
|
259
|
+
const p = envelope.payload as DeskReadStateSyncPayload
|
|
260
|
+
useUnreadStore
|
|
261
|
+
.getState()
|
|
262
|
+
.mergeServerReadState(
|
|
263
|
+
deskRoomKey(p.project_id),
|
|
264
|
+
p.last_seen_message_id,
|
|
265
|
+
p.updated_at,
|
|
266
|
+
)
|
|
267
|
+
queryClient.invalidateQueries({ queryKey: ['desk-read-state'] })
|
|
268
|
+
// Re-order the "Recently done" section live: signing a card off
|
|
269
|
+
// on any session bumps it to the top of this feed. The bare prefix
|
|
270
|
+
// matches every windowed key (['desk-sign-offs', sinceIso]).
|
|
271
|
+
queryClient.invalidateQueries({ queryKey: ['desk-sign-offs'] })
|
|
272
|
+
break
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
case ControlMessageType.PROJECT_REPORT_SYNC: {
|
|
276
|
+
// The coordinator upserted / deleted the project's interactive
|
|
277
|
+
// report. Invalidate the per-project query so ProjectView's
|
|
278
|
+
// Report tab refetches and re-renders in place.
|
|
279
|
+
const p = envelope.payload as { project_id?: string }
|
|
280
|
+
if (p?.project_id) {
|
|
281
|
+
queryClient.invalidateQueries({
|
|
282
|
+
queryKey: ['project-report', p.project_id],
|
|
283
|
+
})
|
|
284
|
+
}
|
|
285
|
+
break
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
case ControlMessageType.PROJECT_PLAN_SYNC: {
|
|
289
|
+
// PLAN.md or its sidecar moved. Invalidate and REFETCH — never patch
|
|
290
|
+
// the local model from this envelope: `sections` is a hint for what
|
|
291
|
+
// to highlight, not a delta to apply, and after the refetch the
|
|
292
|
+
// previous body is gone anyway.
|
|
293
|
+
//
|
|
294
|
+
// The project lists ride along because `PlanSummary` (and with it
|
|
295
|
+
// `open_notes_for_you`, the integer the execution gate reads) hangs
|
|
296
|
+
// on the project record. Leaving them out is how the tab and the desk
|
|
297
|
+
// card come to disagree about one number.
|
|
298
|
+
const p = envelope.payload as { project_id?: string }
|
|
299
|
+
if (p?.project_id) {
|
|
300
|
+
queryClient.invalidateQueries({
|
|
301
|
+
queryKey: ['project-plan', p.project_id],
|
|
302
|
+
})
|
|
303
|
+
queryClient.invalidateQueries({
|
|
304
|
+
queryKey: ['project-plan-versions', p.project_id],
|
|
305
|
+
})
|
|
306
|
+
queryClient.invalidateQueries({ queryKey: ['project', p.project_id] })
|
|
307
|
+
queryClient.invalidateQueries({ queryKey: ['user-projects'] })
|
|
308
|
+
queryClient.invalidateQueries({ queryKey: ['all-projects'] })
|
|
309
|
+
}
|
|
310
|
+
break
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
case ControlMessageType.HUB_DELIVERY_STATE: {
|
|
314
|
+
// One message to another server moved. Merged by state_at, so a
|
|
315
|
+
// frame that arrives after a newer poll changes nothing.
|
|
316
|
+
const p = envelope.payload as HubDeliveryStatePayload
|
|
317
|
+
if (p?.project_id && p.delivery?.message_id) mergeDeliveriesInto(queryClient, p.project_id, [p.delivery])
|
|
318
|
+
break
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
case ControlMessageType.HUB_BRIDGE_DELIVERY: {
|
|
322
|
+
// A workroom's relay to a retained agent moved: merged into that
|
|
323
|
+
// room's delivery lines (a relay only moves forward).
|
|
324
|
+
const p = envelope.payload as HubBridgeDeliveryPayload
|
|
325
|
+
if (p?.project_id && p.chatroom_name && p.delivery?.room_message_id) mergeBridgeDeliveryInto(queryClient, p)
|
|
326
|
+
break
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
case ControlMessageType.CHATROOM_FLOW_CHANGED: {
|
|
330
|
+
// A room's outside messages stopped or reopened: the strip and the
|
|
331
|
+
// control follow from the frame, no refetch.
|
|
332
|
+
const p = envelope.payload as ChatroomFlowChangedPayload
|
|
333
|
+
if (p?.project_id && p.chatroom_name && p.flow) applyRoomFlow(queryClient, p)
|
|
334
|
+
break
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
case ControlMessageType.HUB_CHANNEL_STATUS: {
|
|
338
|
+
// The full, masked Hub channel of one of the user's agents: the
|
|
339
|
+
// card replaces its whole state from it.
|
|
340
|
+
const p = envelope.payload as HubChannelStatusPayload
|
|
341
|
+
if (p?.agent_full_name && p.channel) replaceHubChannel(queryClient, p.agent_full_name, p.channel)
|
|
342
|
+
break
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
case ControlMessageType.HOST_SYNC: {
|
|
346
|
+
// One of the user's computers connected, disconnected, or re-reported
|
|
347
|
+
// what is running on it. Invalidate and refetch — the envelope is a
|
|
348
|
+
// cursor, and the roster it points at is the whole answer.
|
|
349
|
+
//
|
|
350
|
+
// This is what makes "your computer is on, but none of your agents are
|
|
351
|
+
// running" appear WITHOUT a poll: the machine's socket is the signal,
|
|
352
|
+
// and its 30-second self-scan lands here as a fresh roster.
|
|
353
|
+
queryClient.invalidateQueries({ queryKey: ['computers'] })
|
|
354
|
+
break
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
case ControlMessageType.INSTALL_SYNC: {
|
|
358
|
+
// The one-command install on the user's machine reported a step.
|
|
359
|
+
// Refetch rather than apply the payload: the run is defined by the
|
|
360
|
+
// REST route, and a client that assembled its own copy from cursors
|
|
361
|
+
// would be a second definition to keep in step.
|
|
362
|
+
queryClient.invalidateQueries({ queryKey: ['install-progress'] })
|
|
363
|
+
// The install's later steps are exactly the ones that change what the
|
|
364
|
+
// server OBSERVES -- a computer connects, agents come online. Those
|
|
365
|
+
// rows are driven by their own queries, and the welcome page is
|
|
366
|
+
// usually the only thing on screen while this happens, so refresh
|
|
367
|
+
// them here too rather than waiting for a separate envelope.
|
|
368
|
+
queryClient.invalidateQueries({ queryKey: ['computers'] })
|
|
369
|
+
queryClient.invalidateQueries({ queryKey: ['agents'] })
|
|
370
|
+
break
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
case ControlMessageType.RUNNER_VERSIONS: {
|
|
374
|
+
// Hand the RAW payload to the store. apply() owns the "is this a
|
|
375
|
+
// well-formed snapshot?" decision so there is exactly one gate, and
|
|
376
|
+
// the routing test can feed a raw frame end-to-end.
|
|
377
|
+
useRunnerVersionStore.getState().apply(envelope.payload)
|
|
378
|
+
// Re-read the config on every push. This is what preserves "editing
|
|
379
|
+
// announcements.json takes effect with no server restart"; the ETag
|
|
380
|
+
// (§2.2) makes it a 304 in the common case. cancelRefetch: false:
|
|
381
|
+
// a runner restart wave pushes once per runner, and cancelling the
|
|
382
|
+
// in-flight fetch on each one left a trail of aborted requests.
|
|
383
|
+
queryClient.invalidateQueries(
|
|
384
|
+
{ queryKey: ['announcements'] },
|
|
385
|
+
{ cancelRefetch: false },
|
|
386
|
+
)
|
|
387
|
+
break
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// After a reconnect, catch up on everything a push would have touched
|
|
393
|
+
// while disconnected (we don't know which projects changed). Skips the
|
|
394
|
+
// initial connect — mount already fetches fresh.
|
|
395
|
+
//
|
|
396
|
+
// This used to invalidate every key at once, the instant the socket came
|
|
397
|
+
// back. That burst (one request per mounted query — dozens on My Desk)
|
|
398
|
+
// could stall the server long enough for the connection to drop again, and
|
|
399
|
+
// the next reconnect re-sent the same burst: a self-sustaining loop. Now:
|
|
400
|
+
// - the catch-up waits RECONNECT_SETTLE_MS, and a reconnect inside that
|
|
401
|
+
// window restarts the wait, so a flapping socket produces ONE catch-up
|
|
402
|
+
// after it stabilizes, not one per flap;
|
|
403
|
+
// - keys refresh in tiers, most visible first, RECONNECT_TIER_GAP_MS
|
|
404
|
+
// apart, and a tier is skipped if the socket dropped again meanwhile
|
|
405
|
+
// (the next reconnect redoes the whole catch-up);
|
|
406
|
+
// - per-project fan-out lists (['chatrooms'], ['chatroom']) are only
|
|
407
|
+
// marked stale: they refetch when next mounted, and a room created
|
|
408
|
+
// while disconnected still arrives via the next CHANGELOG_UPDATE for
|
|
409
|
+
// that project.
|
|
410
|
+
// ['unread'] is deliberately absent: it was dropped with the sidebar unread
|
|
411
|
+
// badge. Any future ['unread']-shaped feature must re-add itself here
|
|
412
|
+
// rather than assume coverage.
|
|
413
|
+
const reconnectTiers: unknown[][][] = [
|
|
414
|
+
// Tier 0 — what the user is looking at: the desk feed and lists, the
|
|
415
|
+
// open room, and the read watermarks that gate the desk lanes.
|
|
416
|
+
[
|
|
417
|
+
[DESK_LATEST_MESSAGES_KEY],
|
|
418
|
+
['user-projects'],
|
|
419
|
+
['all-projects'],
|
|
420
|
+
['messages'],
|
|
421
|
+
['desk-read-state'],
|
|
422
|
+
['desk-sign-offs'],
|
|
423
|
+
// THE PLATE AND ITS VOCABULARY. A DESK_TODO_SYNC emitted while the
|
|
424
|
+
// socket was down — laptop asleep, network blip, server restart, the
|
|
425
|
+
// reconnect backoff window — is simply gone, and `['desk-todos']` is
|
|
426
|
+
// `staleTime: 0` with nothing to trigger it: on a focused tab
|
|
427
|
+
// react-query will not refetch on its own, so a stale ticket chip
|
|
428
|
+
// ("Working" on a project the user already marked done) survives until
|
|
429
|
+
// some UNRELATED to-do or label sync happens to land.
|
|
430
|
+
['desk-todos'],
|
|
431
|
+
['desk-labels'],
|
|
432
|
+
],
|
|
433
|
+
// Tier 1 — secondary state.
|
|
434
|
+
[
|
|
435
|
+
['project'],
|
|
436
|
+
['agents'],
|
|
437
|
+
// Same argument for the briefings: BRIEF_TAB_SYNC invalidates both the
|
|
438
|
+
// list and the open document, so a reconnect has to cover both or the
|
|
439
|
+
// briefing the user is LOOKING AT stays stale. ['brief-tab'] does not
|
|
440
|
+
// prefix-match ['brief-tabs'] — react-query matches element-wise.
|
|
441
|
+
['brief-tabs'],
|
|
442
|
+
['brief-tab'],
|
|
443
|
+
// Same argument as the plate, and sharper: a HOST_SYNC missed while
|
|
444
|
+
// the socket was down leaves the Computers page asserting that a
|
|
445
|
+
// machine is online when it may have slept hours ago.
|
|
446
|
+
['computers'],
|
|
447
|
+
// A user watching the welcome page through a socket blip would otherwise
|
|
448
|
+
// see the install freeze on whichever step was last reported.
|
|
449
|
+
['install-progress'],
|
|
450
|
+
// Belt-and-braces: the server re-arms the initial RUNNER_VERSIONS push
|
|
451
|
+
// on every socket reconnect, so `runners` resyncs on its own. This
|
|
452
|
+
// covers the config half.
|
|
453
|
+
['announcements'],
|
|
454
|
+
],
|
|
455
|
+
// Tier 2 — file payloads (the heaviest responses).
|
|
456
|
+
[
|
|
457
|
+
['files'],
|
|
458
|
+
['fileContent'],
|
|
459
|
+
['fileBlobContent'],
|
|
460
|
+
],
|
|
461
|
+
]
|
|
462
|
+
const staleOnlyKeys = [['chatrooms'], ['chatroom']]
|
|
463
|
+
|
|
464
|
+
let reconnectTimers: ReturnType<typeof setTimeout>[] = []
|
|
465
|
+
const clearReconnectTimers = () => {
|
|
466
|
+
reconnectTimers.forEach(clearTimeout)
|
|
467
|
+
reconnectTimers = []
|
|
468
|
+
}
|
|
469
|
+
const handleReconnect = (isReconnect: boolean) => {
|
|
470
|
+
if (!isReconnect) return
|
|
471
|
+
clearReconnectTimers()
|
|
472
|
+
reconnectTimers = reconnectTiers.map((keys, tier) =>
|
|
473
|
+
setTimeout(() => {
|
|
474
|
+
if (!wsManager.isConnected()) return
|
|
475
|
+
if (tier === 0) {
|
|
476
|
+
for (const queryKey of staleOnlyKeys) {
|
|
477
|
+
queryClient.invalidateQueries({ queryKey, refetchType: 'none' })
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
for (const queryKey of keys) {
|
|
481
|
+
queryClient.invalidateQueries({ queryKey }, { cancelRefetch: false })
|
|
482
|
+
}
|
|
483
|
+
}, RECONNECT_SETTLE_MS + tier * RECONNECT_TIER_GAP_MS),
|
|
484
|
+
)
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
const unsubscribeMessages = wsManager.onAny(handleMessage)
|
|
488
|
+
const unsubscribeConnect = wsManager.onConnect(handleReconnect)
|
|
489
|
+
return () => {
|
|
490
|
+
clearReconnectTimers()
|
|
491
|
+
unsubscribeMessages()
|
|
492
|
+
unsubscribeConnect()
|
|
493
|
+
}
|
|
494
|
+
}, [queryClient])
|
|
495
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useEffect } from 'react'
|
|
2
|
+
|
|
3
|
+
// A file dropped outside any real drop target makes the browser navigate away
|
|
4
|
+
// from the app to render the file — a jarring, data-losing surprise. This
|
|
5
|
+
// window-level guard cancels the default for file drags that reach `window`,
|
|
6
|
+
// i.e. drops that missed every composer / project drop zone (those stop
|
|
7
|
+
// propagation, so their events never bubble here). Non-file drags (text
|
|
8
|
+
// selection, links) are left untouched.
|
|
9
|
+
function carriesFiles(e: DragEvent): boolean {
|
|
10
|
+
const types = e.dataTransfer?.types
|
|
11
|
+
return !!types && Array.from(types).includes('Files')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function useWindowFileDropGuard(): void {
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const onDragOver = (e: DragEvent) => {
|
|
17
|
+
if (!carriesFiles(e)) return
|
|
18
|
+
// Required so the drop is delivered to (and swallowed by) our handler
|
|
19
|
+
// rather than treated as a navigation by the browser.
|
|
20
|
+
e.preventDefault()
|
|
21
|
+
}
|
|
22
|
+
const onDrop = (e: DragEvent) => {
|
|
23
|
+
if (!carriesFiles(e)) return
|
|
24
|
+
e.preventDefault()
|
|
25
|
+
}
|
|
26
|
+
window.addEventListener('dragover', onDragOver)
|
|
27
|
+
window.addEventListener('drop', onDrop)
|
|
28
|
+
return () => {
|
|
29
|
+
window.removeEventListener('dragover', onDragOver)
|
|
30
|
+
window.removeEventListener('drop', onDrop)
|
|
31
|
+
}
|
|
32
|
+
}, [])
|
|
33
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom/client'
|
|
3
|
+
import Page from '../app/page'
|
|
4
|
+
import './styles/landing.css'
|
|
5
|
+
import './styles/homepage.css'
|
|
6
|
+
|
|
7
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
8
|
+
<React.StrictMode>
|
|
9
|
+
<Page />
|
|
10
|
+
</React.StrictMode>,
|
|
11
|
+
)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom/client'
|
|
3
|
+
import { QueryClientProvider } from '@tanstack/react-query'
|
|
4
|
+
import { BrowserRouter } from 'react-router-dom'
|
|
5
|
+
import App from './App'
|
|
6
|
+
import { queryClient } from './queryClient'
|
|
7
|
+
import './styles/index.css'
|
|
8
|
+
|
|
9
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
10
|
+
<React.StrictMode>
|
|
11
|
+
<QueryClientProvider client={queryClient}>
|
|
12
|
+
<BrowserRouter basename="/app">
|
|
13
|
+
<App />
|
|
14
|
+
</BrowserRouter>
|
|
15
|
+
</QueryClientProvider>
|
|
16
|
+
</React.StrictMode>,
|
|
17
|
+
)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom/client'
|
|
3
|
+
import BetaPage from './components/beta/BetaPage'
|
|
4
|
+
import './styles/landing.css'
|
|
5
|
+
|
|
6
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
7
|
+
<React.StrictMode>
|
|
8
|
+
<BetaPage />
|
|
9
|
+
</React.StrictMode>,
|
|
10
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom/client'
|
|
3
|
+
import PublicAgentsAccount from './components/publicAgents/PublicAgentsAccount'
|
|
4
|
+
import { fetchDirectory } from './components/publicAgents/api'
|
|
5
|
+
import { Unavailable } from './components/publicAgents/parts'
|
|
6
|
+
import { loadWidget } from './components/publicAgents/widget'
|
|
7
|
+
import './styles/design/tokens.css'
|
|
8
|
+
import './components/publicAgents/publicAgents.css'
|
|
9
|
+
|
|
10
|
+
// The public agent pages, served by server/routes/public_agents.py outside the
|
|
11
|
+
// /app SPA: no auth, no router, no app shell.
|
|
12
|
+
// /users/:account/agents/ → the account page (chats in the widget's dock)
|
|
13
|
+
// /users/:account/agents/:agent/chat → the web chat widget, full page
|
|
14
|
+
const match = window.location.pathname.match(/^\/users\/([^/]+)\/agents\/?(?:([^/]+)\/chat\/?)?$/)
|
|
15
|
+
const username = match ? decodeURIComponent(match[1]) : ''
|
|
16
|
+
const agent = match?.[2] ? decodeURIComponent(match[2]) : ''
|
|
17
|
+
|
|
18
|
+
/** The hosted chat: this page only finds the agent's key; the widget draws
|
|
19
|
+
* everything (and sets the title). The page loads the self-hosted fonts. */
|
|
20
|
+
function HostedChat({ username, agent }: { username: string; agent: string }) {
|
|
21
|
+
const [missing, setMissing] = useState(false)
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
fetchDirectory(username)
|
|
24
|
+
.then((dir) => {
|
|
25
|
+
const found = dir.agents.find((a) => a.id === agent)
|
|
26
|
+
if (found) loadWidget('fullpage', found.chat_key)
|
|
27
|
+
else setMissing(true)
|
|
28
|
+
})
|
|
29
|
+
.catch(() => setMissing(true))
|
|
30
|
+
}, [username, agent])
|
|
31
|
+
return missing ? <Unavailable text="This chat is not available." /> : null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
35
|
+
<React.StrictMode>
|
|
36
|
+
{!username
|
|
37
|
+
? <Unavailable text="This page is not available." />
|
|
38
|
+
: agent
|
|
39
|
+
? <HostedChat username={username} agent={agent} />
|
|
40
|
+
: <PublicAgentsAccount username={username} />}
|
|
41
|
+
</React.StrictMode>,
|
|
42
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { QueryClient } from '@tanstack/react-query'
|
|
2
|
+
|
|
3
|
+
export const queryClient = new QueryClient({
|
|
4
|
+
defaultOptions: {
|
|
5
|
+
queries: {
|
|
6
|
+
staleTime: 30000,
|
|
7
|
+
retry: 1,
|
|
8
|
+
// Live data arrives over the WebSocket, and a reconnect runs a paced
|
|
9
|
+
// catch-up (useWebSocketUpdates). Refetching every stale mounted query
|
|
10
|
+
// on each tab switch duplicated that work as an unpaced burst — dozens
|
|
11
|
+
// of requests at once on My Desk. Queries that genuinely need a focus
|
|
12
|
+
// refresh (desk read-state, recently done, announcements) opt back in.
|
|
13
|
+
refetchOnWindowFocus: false,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
})
|