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,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The height bootstrap: the one script the desk inserts into a briefing, the
|
|
3
|
+
* string function that inserts it, and the envelope both sides speak.
|
|
4
|
+
*
|
|
5
|
+
* Pure — no React, no DOM. Everything here is either a string or a predicate
|
|
6
|
+
* over a message payload, which is why it carries the cheapest and the most
|
|
7
|
+
* load-bearing tests in this milestone: jsdom does not execute iframe scripts,
|
|
8
|
+
* so the injection point and the envelope validator are the parts of the
|
|
9
|
+
* sizing path a headless suite can actually observe.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** The envelope literal. NOT 'manigent-briefing' — a briefing whose author
|
|
13
|
+
* guessed the longer name must not be able to resize its own frame, and a
|
|
14
|
+
* desk that accepted both would have two contracts. */
|
|
15
|
+
export const BRIEF_MESSAGE_SOURCE = 'manigent-brief'
|
|
16
|
+
export const BRIEF_MESSAGE_VERSION = 1
|
|
17
|
+
|
|
18
|
+
export type BriefMessageType = 'height' | 'ready' | 'error' | 'remeasure'
|
|
19
|
+
|
|
20
|
+
/** child -> parent for 'height' / 'ready' / 'error'; parent -> child for
|
|
21
|
+
* 'remeasure'. One shape both ways so there is one thing to validate. */
|
|
22
|
+
export interface BriefMessage {
|
|
23
|
+
source: typeof BRIEF_MESSAGE_SOURCE
|
|
24
|
+
v: typeof BRIEF_MESSAGE_VERSION
|
|
25
|
+
type: BriefMessageType
|
|
26
|
+
slug: string
|
|
27
|
+
/** integer CSS px; present on 'height' */
|
|
28
|
+
height?: number
|
|
29
|
+
/** present on 'error'; diagnostic only, never rendered as the author's */
|
|
30
|
+
message?: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Height bounds. These are not tidiness: an unbounded height is not a
|
|
34
|
+
* rendering bug, it is a 2,000,000px iframe that hangs the desk. */
|
|
35
|
+
export const MIN_FRAME_PX = 120
|
|
36
|
+
export const MAX_FRAME_PX = 20_000
|
|
37
|
+
|
|
38
|
+
/** What the frame stands at before it has been told anything, and what it
|
|
39
|
+
* keeps if it never is. */
|
|
40
|
+
export const FALLBACK_FRAME_PX = 640
|
|
41
|
+
|
|
42
|
+
/** How long a silent document gets before its frame says so. Long enough that
|
|
43
|
+
* a heavy document pulling a CDN chart library over a slow connection is not
|
|
44
|
+
* accused of failing; short enough that a genuinely dead script does not
|
|
45
|
+
* leave the user staring at a box. */
|
|
46
|
+
export const NO_REPORT_TIMEOUT_MS = 4_000
|
|
47
|
+
|
|
48
|
+
const HEAD_OPEN = /<head(?:\s[^>]*)?>/i
|
|
49
|
+
const HTML_OPEN = /<html(?:\s[^>]*)?>/i
|
|
50
|
+
const DOCTYPE = /<!doctype[^>]*>/i
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The script the shell inserts as the first child of `<head>`. Never stored,
|
|
54
|
+
* so it never counts against the author's 256 KB.
|
|
55
|
+
*
|
|
56
|
+
* REGISTERED SYNCHRONOUSLY, at head-parse time, so all three survive an author
|
|
57
|
+
* script that throws on its first line:
|
|
58
|
+
* - the `error` handler, which reports but deliberately does NOT
|
|
59
|
+
* preventDefault — the author still sees their own error in the console;
|
|
60
|
+
* - the parent-message listener, for 'remeasure';
|
|
61
|
+
* - a readystate hook that attaches the observers once `<body>` exists.
|
|
62
|
+
*
|
|
63
|
+
* The observers cannot attach here. While `<head>` is still parsing
|
|
64
|
+
* `document.body` is null and there is nothing for a ResizeObserver to
|
|
65
|
+
* observe; what head-first actually buys is the REGISTRATION ORDER above, and
|
|
66
|
+
* that is enough for the contract's real purpose — a document whose own script
|
|
67
|
+
* throws still sizes, because a synchronous throw stops neither parsing nor
|
|
68
|
+
* DOMContentLoaded.
|
|
69
|
+
*
|
|
70
|
+
* MEASUREMENT is `body.getBoundingClientRect().bottom` plus the body's own
|
|
71
|
+
* bottom margin, and never `documentElement.scrollHeight`: scrollHeight
|
|
72
|
+
* ratchets to the frame's own viewport and never shrinks below it, so the
|
|
73
|
+
* obvious `Math.max(scrollHeight, …)` pins every 200px briefing at 800px
|
|
74
|
+
* forever. The rectangle is content-driven, shrinks correctly, and needs no
|
|
75
|
+
* CSS injected into the author's document — which is the point. A margin reset
|
|
76
|
+
* to make our measurement easier would be exactly the styling imposition this
|
|
77
|
+
* project exists to remove.
|
|
78
|
+
*
|
|
79
|
+
* COALESCING: every trigger schedules one animation frame, and the frame
|
|
80
|
+
* callback posts only when the integer height actually moved. A MutationObserver
|
|
81
|
+
* on a chatty document otherwise posts hundreds of times a second, and every
|
|
82
|
+
* post is a setState in the parent.
|
|
83
|
+
*
|
|
84
|
+
* The 5s poll is the belt for what the observers miss (an image that finishes
|
|
85
|
+
* decoding without mutating the DOM); the observers are the braces for
|
|
86
|
+
* everything after 5s.
|
|
87
|
+
*/
|
|
88
|
+
export function buildHeightBootstrap(slug: string): string {
|
|
89
|
+
// `<` is escaped so the slug can never close this script element early, and
|
|
90
|
+
// JSON.stringify handles quoting. The server validates slugs to
|
|
91
|
+
// [a-z0-9_-], but this function is also handed the local sample slug and
|
|
92
|
+
// should not depend on a rule enforced in another process.
|
|
93
|
+
const literal = JSON.stringify(slug).replace(/</g, '\\u003c')
|
|
94
|
+
return `(function(){
|
|
95
|
+
var SLUG=${literal},SRC=${JSON.stringify(BRIEF_MESSAGE_SOURCE)},V=${BRIEF_MESSAGE_VERSION};
|
|
96
|
+
var last=-1,pending=0,started=false;
|
|
97
|
+
function post(type,extra){
|
|
98
|
+
var msg={source:SRC,v:V,type:type,slug:SLUG};
|
|
99
|
+
if(extra){for(var k in extra){msg[k]=extra[k];}}
|
|
100
|
+
try{parent.postMessage(msg,'*');}catch(e){}
|
|
101
|
+
}
|
|
102
|
+
function measure(){
|
|
103
|
+
var b=document.body;
|
|
104
|
+
if(!b)return 0;
|
|
105
|
+
var bottom=b.getBoundingClientRect().bottom,mb=0;
|
|
106
|
+
try{mb=parseFloat(getComputedStyle(b).marginBottom)||0;}catch(e){}
|
|
107
|
+
return Math.ceil(bottom+mb);
|
|
108
|
+
}
|
|
109
|
+
function report(){
|
|
110
|
+
pending=0;
|
|
111
|
+
var h=measure();
|
|
112
|
+
if(h>0&&h!==last){last=h;post('height',{height:h});}
|
|
113
|
+
}
|
|
114
|
+
function schedule(){
|
|
115
|
+
if(pending)return;
|
|
116
|
+
pending=window.requestAnimationFrame?requestAnimationFrame(report):setTimeout(report,16);
|
|
117
|
+
}
|
|
118
|
+
window.addEventListener('error',function(e){
|
|
119
|
+
post('error',{message:e&&e.message?String(e.message):'script error'});
|
|
120
|
+
});
|
|
121
|
+
window.addEventListener('message',function(e){
|
|
122
|
+
var d=e.data;
|
|
123
|
+
if(d&&d.source===SRC&&d.type==='remeasure'){last=-1;schedule();}
|
|
124
|
+
});
|
|
125
|
+
function attach(){
|
|
126
|
+
if(started||!document.body)return;
|
|
127
|
+
started=true;
|
|
128
|
+
post('ready');
|
|
129
|
+
schedule();
|
|
130
|
+
try{new ResizeObserver(schedule).observe(document.body);}catch(e){}
|
|
131
|
+
try{new MutationObserver(schedule).observe(document.documentElement,
|
|
132
|
+
{subtree:true,childList:true,attributes:true,characterData:true});}catch(e){}
|
|
133
|
+
window.addEventListener('load',schedule);
|
|
134
|
+
try{if(document.fonts&&document.fonts.ready){document.fonts.ready.then(schedule);}}catch(e){}
|
|
135
|
+
var poll=setInterval(schedule,250);
|
|
136
|
+
setTimeout(function(){clearInterval(poll);},5000);
|
|
137
|
+
}
|
|
138
|
+
if(document.readyState==='loading'){
|
|
139
|
+
document.addEventListener('readystatechange',attach);
|
|
140
|
+
document.addEventListener('DOMContentLoaded',attach);
|
|
141
|
+
}else{attach();}
|
|
142
|
+
})();`
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Return `html` with exactly ONE `<script>` inserted. Insertion point, in
|
|
147
|
+
* order:
|
|
148
|
+
* 1. immediately after the first `<head>` / `<head …>`
|
|
149
|
+
* 2. else immediately after the first `<html>` / `<html …>`
|
|
150
|
+
* 3. else immediately after the doctype
|
|
151
|
+
* 4. else at index 0
|
|
152
|
+
*
|
|
153
|
+
* The `(?:\s[^>]*)?` is load-bearing rather than stylistic. The obvious
|
|
154
|
+
* `<head[^>]*>` also matches the literal string `<header>` — `<head`, then
|
|
155
|
+
* `[^>]*` eats `er`, then `>` — so a document with no `<head>` but a
|
|
156
|
+
* `<header>`, an ordinary shape for a hand-written briefing, would take
|
|
157
|
+
* branch 1 and bury the bootstrap inside the header element, silently.
|
|
158
|
+
*
|
|
159
|
+
* NEVER inserts ahead of `<!doctype html>`: that is quirks mode, which is a
|
|
160
|
+
* styling imposition by another name.
|
|
161
|
+
*
|
|
162
|
+
* It is a string edit, not a parse, and that is a deliberate limit rather than
|
|
163
|
+
* an oversight. A `<head>` that only LOOKS like one — inside a comment, inside
|
|
164
|
+
* a script's string literal — takes the bootstrap with it, no height is ever
|
|
165
|
+
* reported, and the frame lands in its labelled fallback. Contained and
|
|
166
|
+
* visible. An HTML parser to beat that case costs more than the case is worth.
|
|
167
|
+
*
|
|
168
|
+
* Head-first also removes the failure end-of-body insertion had: nothing of
|
|
169
|
+
* the author's precedes the insertion point, so an unterminated `<script>` in
|
|
170
|
+
* the author's document can no longer swallow the bootstrap. It can still
|
|
171
|
+
* swallow everything after it — but that is the author's own document
|
|
172
|
+
* breaking, and it shows up as the fallback rather than as a wrong size.
|
|
173
|
+
*/
|
|
174
|
+
export function injectHeightBootstrap(html: string, slug: string): string {
|
|
175
|
+
const tag = `<script>${buildHeightBootstrap(slug)}</script>`
|
|
176
|
+
for (const pattern of [HEAD_OPEN, HTML_OPEN, DOCTYPE]) {
|
|
177
|
+
const match = pattern.exec(html)
|
|
178
|
+
if (match) {
|
|
179
|
+
const at = match.index + match[0].length
|
|
180
|
+
return html.slice(0, at) + tag + html.slice(at)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return tag + html
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Validate one `MessageEvent.data`. Returns null unless ALL hold: it is a
|
|
188
|
+
* plain object; `source` is our literal; `v` is 1; `slug` is this frame's
|
|
189
|
+
* slug; `type` is one of the four literals; and for 'height',
|
|
190
|
+
* `Number.isFinite(height)` and the integer height is within bounds.
|
|
191
|
+
*
|
|
192
|
+
* `event.origin` is NOT consulted, here or anywhere. For an opaque frame it is
|
|
193
|
+
* the literal string "null" for EVERY such frame, so an origin check here is
|
|
194
|
+
* not a weak check — it is one that looks like a check and validates nothing.
|
|
195
|
+
* The real authentication is `event.source === iframe.contentWindow`, made by
|
|
196
|
+
* the caller, because contentWindow identity is the one thing a message cannot
|
|
197
|
+
* forge.
|
|
198
|
+
*/
|
|
199
|
+
export function parseBriefMessage(data: unknown, slug: string): BriefMessage | null {
|
|
200
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data)) return null
|
|
201
|
+
const d = data as Record<string, unknown>
|
|
202
|
+
if (d.source !== BRIEF_MESSAGE_SOURCE) return null
|
|
203
|
+
if (d.v !== BRIEF_MESSAGE_VERSION) return null
|
|
204
|
+
if (d.slug !== slug) return null
|
|
205
|
+
const type = d.type
|
|
206
|
+
if (type !== 'height' && type !== 'ready' && type !== 'error' && type !== 'remeasure') {
|
|
207
|
+
return null
|
|
208
|
+
}
|
|
209
|
+
const msg: BriefMessage = {
|
|
210
|
+
source: BRIEF_MESSAGE_SOURCE,
|
|
211
|
+
v: BRIEF_MESSAGE_VERSION,
|
|
212
|
+
type,
|
|
213
|
+
slug,
|
|
214
|
+
}
|
|
215
|
+
if (type === 'height') {
|
|
216
|
+
const height = d.height
|
|
217
|
+
if (typeof height !== 'number' || !Number.isFinite(height)) return null
|
|
218
|
+
const rounded = Math.ceil(height)
|
|
219
|
+
if (rounded < MIN_FRAME_PX || rounded > MAX_FRAME_PX) return null
|
|
220
|
+
msg.height = rounded
|
|
221
|
+
}
|
|
222
|
+
if (typeof d.message === 'string') msg.message = d.message
|
|
223
|
+
return msg
|
|
224
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
BRIEF_MESSAGE_SOURCE,
|
|
4
|
+
MAX_FRAME_PX,
|
|
5
|
+
MIN_FRAME_PX,
|
|
6
|
+
parseBriefMessage,
|
|
7
|
+
} from './heightBootstrap'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* THE ENVELOPE VALIDATOR.
|
|
11
|
+
*
|
|
12
|
+
* The frame runs on an opaque origin, so `event.origin` is the literal string
|
|
13
|
+
* "null" for it and for every other opaque frame on the page. An origin check
|
|
14
|
+
* here would not be a weak check — it would be one that LOOKS like a check and
|
|
15
|
+
* validates nothing. Authentication is `event.source === contentWindow`, made
|
|
16
|
+
* by the caller; this function's job is only "what does the payload mean", and
|
|
17
|
+
* these tests pin the cases where a wrong answer is expensive.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const envelope = (over: Record<string, unknown> = {}) => ({
|
|
21
|
+
source: BRIEF_MESSAGE_SOURCE,
|
|
22
|
+
v: 1,
|
|
23
|
+
type: 'height',
|
|
24
|
+
slug: 'wine',
|
|
25
|
+
height: 400,
|
|
26
|
+
...over,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
describe('parseBriefMessage — what is accepted', () => {
|
|
30
|
+
it('accepts a well-formed height envelope', () => {
|
|
31
|
+
expect(parseBriefMessage(envelope(), 'wine')).toEqual({
|
|
32
|
+
source: BRIEF_MESSAGE_SOURCE,
|
|
33
|
+
v: 1,
|
|
34
|
+
type: 'height',
|
|
35
|
+
slug: 'wine',
|
|
36
|
+
height: 400,
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('accepts ready / error / remeasure without a height', () => {
|
|
41
|
+
for (const type of ['ready', 'error', 'remeasure']) {
|
|
42
|
+
const parsed = parseBriefMessage(envelope({ type, height: undefined }), 'wine')
|
|
43
|
+
expect(parsed?.type).toBe(type)
|
|
44
|
+
expect(parsed?.height).toBeUndefined()
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('parseBriefMessage — what is rejected', () => {
|
|
50
|
+
it("rejects source: 'manigent-briefing'", () => {
|
|
51
|
+
// The literal backend first proposed. Accepting both would leave the app
|
|
52
|
+
// with two contracts and this one silently half-working.
|
|
53
|
+
expect(parseBriefMessage(envelope({ source: 'manigent-briefing' }), 'wine')).toBeNull()
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('rejects a wrong version, a wrong slug, and an unknown type', () => {
|
|
57
|
+
expect(parseBriefMessage(envelope({ v: 2 }), 'wine')).toBeNull()
|
|
58
|
+
// A message from the OTHER briefing's frame must not resize this one.
|
|
59
|
+
expect(parseBriefMessage(envelope({ slug: 'cheese' }), 'wine')).toBeNull()
|
|
60
|
+
expect(parseBriefMessage(envelope({ type: 'resize' }), 'wine')).toBeNull()
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('rejects non-finite and out-of-range heights', () => {
|
|
64
|
+
// Not tidiness: a bad height is not a rendering bug, it is a 2,000,000px
|
|
65
|
+
// iframe that hangs the desk.
|
|
66
|
+
for (const height of [NaN, Infinity, -Infinity, -1, 0, MIN_FRAME_PX - 1, 10_000_000]) {
|
|
67
|
+
expect(parseBriefMessage(envelope({ height }), 'wine')).toBeNull()
|
|
68
|
+
}
|
|
69
|
+
expect(parseBriefMessage(envelope({ height: '400' }), 'wine')).toBeNull()
|
|
70
|
+
expect(parseBriefMessage(envelope({ height: undefined }), 'wine')).toBeNull()
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('accepts the bounds themselves', () => {
|
|
74
|
+
expect(parseBriefMessage(envelope({ height: MIN_FRAME_PX }), 'wine')?.height).toBe(MIN_FRAME_PX)
|
|
75
|
+
expect(parseBriefMessage(envelope({ height: MAX_FRAME_PX }), 'wine')?.height).toBe(MAX_FRAME_PX)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('rounds a fractional height up, and rejects one that rounds out of range', () => {
|
|
79
|
+
expect(parseBriefMessage(envelope({ height: 400.2 }), 'wine')?.height).toBe(401)
|
|
80
|
+
expect(parseBriefMessage(envelope({ height: MAX_FRAME_PX + 0.1 }), 'wine')).toBeNull()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('rejects payloads that are not plain objects', () => {
|
|
84
|
+
// Anything on the page can postMessage. A string, a null or an array
|
|
85
|
+
// reaching this function must not become a resize.
|
|
86
|
+
for (const data of ['manigent-brief', null, undefined, 42, [envelope()]]) {
|
|
87
|
+
expect(parseBriefMessage(data, 'wine')).toBeNull()
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
})
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The onboarding sample, as a complete HTML document rather than a React
|
|
3
|
+
* component.
|
|
4
|
+
*
|
|
5
|
+
* AC-1.4 requires the sample to render "like any published one", and under the
|
|
6
|
+
* standalone-HTML model that means going through the same iframe, the same
|
|
7
|
+
* injected bootstrap and the same sizing path as a real briefing — which a JSX
|
|
8
|
+
* subtree cannot do. A constant costs no storage, no seeding, no migration and
|
|
9
|
+
* no route.
|
|
10
|
+
*
|
|
11
|
+
* FULLY SELF-CONTAINED: its own typography, its own inline-SVG chart, no
|
|
12
|
+
* network request of any kind. That matches the worked example in
|
|
13
|
+
* `skills/brief/SKILL.md` (self-contained even though external resources are
|
|
14
|
+
* permitted), and it makes this file the frontend half of the AC-1.2 drift
|
|
15
|
+
* check: if this document and that worked example diverge on what a briefing
|
|
16
|
+
* looks like, it is visible in one diff.
|
|
17
|
+
*
|
|
18
|
+
* TWO THINGS FROM THE OLD `SampleBriefing.tsx` DELIBERATELY DO NOT COME ACROSS:
|
|
19
|
+
* - the copy-to-clipboard button. The Clipboard API is unavailable to an
|
|
20
|
+
* opaque-origin frame not granted `allow="clipboard-write"`, and granting
|
|
21
|
+
* that to EVERY briefing frame is a capability grant to every future
|
|
22
|
+
* briefing author, bought for one button on one sample. The prompt is a
|
|
23
|
+
* selectable <pre> instead.
|
|
24
|
+
* - the PNG screenshot mock. A srcdoc document has no base URL, so a
|
|
25
|
+
* bundler-relative asset path does not resolve. Replaced by inline SVG,
|
|
26
|
+
* which is also what the skill teaches authors to draw charts with.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
export const SAMPLE_BRIEFING_TITLE = 'Sample Briefing'
|
|
30
|
+
|
|
31
|
+
/** The reserved slug's document. A complete `<!doctype html>` page — it must
|
|
32
|
+
* contain a `<head>`, like any published briefing, because that is where the
|
|
33
|
+
* height bootstrap is inserted. */
|
|
34
|
+
export const SAMPLE_BRIEFING_HTML = `<!doctype html>
|
|
35
|
+
<html lang="en">
|
|
36
|
+
<head>
|
|
37
|
+
<meta charset="utf-8">
|
|
38
|
+
<title>Sample briefing</title>
|
|
39
|
+
<style>
|
|
40
|
+
:root { --ink:#1b1b1b; --muted:#6f6a64; --rule:#e6e2dc; --accent:#5b3a8e; }
|
|
41
|
+
body { margin:0; padding:26px 30px 32px; background:#fbfaf8; color:var(--ink);
|
|
42
|
+
font:16px/1.55 "Iowan Old Style","Palatino Linotype",Georgia,serif; }
|
|
43
|
+
h1 { margin:0 0 3px; font-size:26px; letter-spacing:-.01em; }
|
|
44
|
+
.dateline { margin:0 0 22px; font-size:12px; letter-spacing:.09em;
|
|
45
|
+
text-transform:uppercase; color:var(--muted); }
|
|
46
|
+
h2 { margin:26px 0 10px; padding-bottom:6px; font-size:12px;
|
|
47
|
+
letter-spacing:.09em; text-transform:uppercase; color:var(--muted);
|
|
48
|
+
border-bottom:1px solid var(--rule); }
|
|
49
|
+
p { margin:0 0 12px; }
|
|
50
|
+
.panel { border:1px solid var(--rule); border-left:3px solid var(--accent);
|
|
51
|
+
border-radius:8px; background:#f4f0fa; padding:18px 20px 16px; }
|
|
52
|
+
.panel p:last-child { margin-bottom:0; }
|
|
53
|
+
pre { margin:14px 0 0; padding:13px 15px; background:#fff;
|
|
54
|
+
border:1px solid var(--rule); border-radius:6px;
|
|
55
|
+
font:12px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace;
|
|
56
|
+
white-space:pre-wrap; word-break:break-word; color:var(--ink); }
|
|
57
|
+
.hint { font-size:13px; color:var(--muted); }
|
|
58
|
+
table { width:100%; border-collapse:collapse; font-size:15px; }
|
|
59
|
+
th { padding:0 0 6px; font-size:11px; font-weight:600; text-align:left;
|
|
60
|
+
letter-spacing:.07em; text-transform:uppercase; color:var(--muted); }
|
|
61
|
+
td { padding:7px 0; border-top:1px solid var(--rule); }
|
|
62
|
+
td.num { text-align:right; font-variant-numeric:tabular-nums; }
|
|
63
|
+
a { color:var(--accent); }
|
|
64
|
+
footer { margin-top:26px; padding-top:11px; border-top:1px solid var(--rule);
|
|
65
|
+
font-size:13px; color:var(--muted); }
|
|
66
|
+
</style>
|
|
67
|
+
</head>
|
|
68
|
+
<body>
|
|
69
|
+
|
|
70
|
+
<h1>Your briefing goes here</h1>
|
|
71
|
+
<p class="dateline">Sample · nothing below is real data</p>
|
|
72
|
+
|
|
73
|
+
<div class="panel">
|
|
74
|
+
<p><b>A briefing is a dashboard your agents keep up to date on a schedule.</b>
|
|
75
|
+
To create one, tell your assistant what you want to see. For example:</p>
|
|
76
|
+
<pre>please create a project to publish the following to the briefing of my desk,
|
|
77
|
+
save it as an SOP, and schedule it to run everyday at 2am PT.
|
|
78
|
+
- the top 3 most influential product announcements in the AI industry today,
|
|
79
|
+
summarized in 3 sentences each with a reference link
|
|
80
|
+
- a list of emails that need my action today</pre>
|
|
81
|
+
<p class="hint" style="margin-top:12px;">Your assistant scopes the work, runs
|
|
82
|
+
it, and publishes the result here. Saving it as a <b>scheduled SOP</b> keeps
|
|
83
|
+
it fresh automatically.</p>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<h2>What a published one looks like</h2>
|
|
87
|
+
<p class="hint">Everything below is drawn by the briefing itself — its own
|
|
88
|
+
typography, its own chart, its own table. The desk imposes none of it.</p>
|
|
89
|
+
|
|
90
|
+
<!-- Bar chart. Baseline y=140, plot height 120px, scale max 40, so each bar
|
|
91
|
+
is height = value / 40 * 120 and y = 140 - height. -->
|
|
92
|
+
<svg viewBox="0 0 420 172" width="420" height="172" role="img"
|
|
93
|
+
aria-label="Sample weekly volume by channel">
|
|
94
|
+
<g font-size="10" fill="#9b948c" text-anchor="end">
|
|
95
|
+
<text x="30" y="143">0</text>
|
|
96
|
+
<text x="30" y="83">20</text>
|
|
97
|
+
<text x="30" y="23">40</text>
|
|
98
|
+
</g>
|
|
99
|
+
<g stroke="#e6e2dc">
|
|
100
|
+
<line x1="36" y1="140" x2="412" y2="140"/>
|
|
101
|
+
<line x1="36" y1="80" x2="412" y2="80"/>
|
|
102
|
+
<line x1="36" y1="20" x2="412" y2="20"/>
|
|
103
|
+
</g>
|
|
104
|
+
<g fill="#5b3a8e">
|
|
105
|
+
<rect x="44" y="47" width="48" height="93"/>
|
|
106
|
+
<rect x="120" y="68" width="48" height="72"/>
|
|
107
|
+
<rect x="196" y="86" width="48" height="54"/>
|
|
108
|
+
<rect x="272" y="104" width="48" height="36"/>
|
|
109
|
+
<rect x="348" y="119" width="48" height="21"/>
|
|
110
|
+
</g>
|
|
111
|
+
<g font-size="11" fill="#1b1b1b" text-anchor="middle">
|
|
112
|
+
<text x="68" y="41">31</text>
|
|
113
|
+
<text x="144" y="62">24</text>
|
|
114
|
+
<text x="220" y="80">18</text>
|
|
115
|
+
<text x="296" y="98">12</text>
|
|
116
|
+
<text x="372" y="113">7</text>
|
|
117
|
+
</g>
|
|
118
|
+
<g font-size="11" fill="#6f6a64" text-anchor="middle">
|
|
119
|
+
<text x="68" y="157">Mon</text>
|
|
120
|
+
<text x="144" y="157">Tue</text>
|
|
121
|
+
<text x="220" y="157">Wed</text>
|
|
122
|
+
<text x="296" y="157">Thu</text>
|
|
123
|
+
<text x="372" y="157">Fri</text>
|
|
124
|
+
</g>
|
|
125
|
+
</svg>
|
|
126
|
+
|
|
127
|
+
<h2>Needs your attention</h2>
|
|
128
|
+
<table>
|
|
129
|
+
<thead>
|
|
130
|
+
<tr><th>Item</th><th>Owner</th><th class="num">Waiting</th></tr>
|
|
131
|
+
</thead>
|
|
132
|
+
<tbody>
|
|
133
|
+
<tr><td>Sample row — a thing to decide</td><td>you</td>
|
|
134
|
+
<td class="num">2 days</td></tr>
|
|
135
|
+
<tr><td>Sample row — a thing to read</td><td>your assistant</td>
|
|
136
|
+
<td class="num">4 hours</td></tr>
|
|
137
|
+
</tbody>
|
|
138
|
+
</table>
|
|
139
|
+
|
|
140
|
+
<footer>
|
|
141
|
+
A real briefing links its sources, like
|
|
142
|
+
<a href="https://example.com/" target="_blank" rel="noopener noreferrer">this</a>.
|
|
143
|
+
Ask your assistant to publish one and this sample disappears.
|
|
144
|
+
</footer>
|
|
145
|
+
|
|
146
|
+
</body>
|
|
147
|
+
</html>
|
|
148
|
+
`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Globe, Mail, MessageCircle, Network, Phone, Send, Radio } from 'lucide-react'
|
|
2
|
+
import { channelName } from '../../utils/channelThreads'
|
|
3
|
+
|
|
4
|
+
const ICONS: Record<string, typeof Send> = {
|
|
5
|
+
telegram: Send,
|
|
6
|
+
email: Mail,
|
|
7
|
+
line: MessageCircle,
|
|
8
|
+
whatsapp: Phone,
|
|
9
|
+
webchat: Globe,
|
|
10
|
+
hub: Network,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** A channel's icon, named for assistive tech ("Telegram", "Email", "LINE",
|
|
14
|
+
* "WhatsApp", "Web chat"). The name is also the tooltip. `decorative` hides it from
|
|
15
|
+
* assistive tech where the channel's name is already written beside it. */
|
|
16
|
+
export default function ChannelBadge({ channel, size = 12, decorative = false }: {
|
|
17
|
+
channel: string; size?: number; decorative?: boolean
|
|
18
|
+
}) {
|
|
19
|
+
const Icon = ICONS[channel] ?? Radio
|
|
20
|
+
const name = channelName(channel)
|
|
21
|
+
if (decorative) {
|
|
22
|
+
return <Icon className="shrink-0 text-ink-3" style={{ width: size, height: size }} aria-hidden />
|
|
23
|
+
}
|
|
24
|
+
return (
|
|
25
|
+
<span
|
|
26
|
+
role="img"
|
|
27
|
+
aria-label={name}
|
|
28
|
+
title={name}
|
|
29
|
+
data-testid="channel-badge"
|
|
30
|
+
className="shrink-0 inline-flex items-center justify-center text-ink-3"
|
|
31
|
+
>
|
|
32
|
+
<Icon className="shrink-0" style={{ width: size, height: size }} aria-hidden />
|
|
33
|
+
</span>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
|
3
|
+
import { Hand, Undo2 } from 'lucide-react'
|
|
4
|
+
import { ApiError } from '../../api/client'
|
|
5
|
+
import { getChannelThread, setThreadPaused, type ChannelThreadRow } from '../../api/endpoints/channels'
|
|
6
|
+
import { CHANNEL_THREADS_KEY } from '../../hooks/useChannelThreads'
|
|
7
|
+
import { THREAD_COPY, contactLabel } from '../../utils/channelThreads'
|
|
8
|
+
import ChannelBadge from '../channels/ChannelBadge'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Above a channel thread's messages, for its owner: which channel it came from
|
|
12
|
+
* and who the person is, and the per-thread takeover. "Take over" pauses the
|
|
13
|
+
* agent on this one thread (the person's messages still arrive, the agent
|
|
14
|
+
* doesn't answer, what the owner types goes out on the channel); "Hand back to
|
|
15
|
+
* the agent" un-pauses. The state shown is always the server's answer, never
|
|
16
|
+
* a guess: after the PUT the list is updated from the response and refetched.
|
|
17
|
+
*
|
|
18
|
+
* A thread whose connection was removed has nothing to pause: no control.
|
|
19
|
+
*/
|
|
20
|
+
export function ChannelThreadBar({ row }: { row: ChannelThreadRow }) {
|
|
21
|
+
const queryClient = useQueryClient()
|
|
22
|
+
const [error, setError] = useState<string | null>(null)
|
|
23
|
+
const [resumed, setResumed] = useState(false)
|
|
24
|
+
const contact = contactLabel(row.contact_name, row.channel)
|
|
25
|
+
|
|
26
|
+
const pause = useMutation({
|
|
27
|
+
mutationFn: (paused: boolean) => setThreadPaused(row.project_id, paused),
|
|
28
|
+
onMutate: () => setError(null),
|
|
29
|
+
onSuccess: (answer, asked) => {
|
|
30
|
+
queryClient.setQueryData<ChannelThreadRow[]>(CHANNEL_THREADS_KEY, (rows) =>
|
|
31
|
+
rows?.map((r) => (r.project_id === answer.project_id ? { ...r, paused: answer.paused } : r)),
|
|
32
|
+
)
|
|
33
|
+
void queryClient.invalidateQueries({ queryKey: CHANNEL_THREADS_KEY })
|
|
34
|
+
void queryClient.invalidateQueries({ queryKey: ['channel-thread', row.project_id] })
|
|
35
|
+
setResumed(!asked && !answer.paused)
|
|
36
|
+
},
|
|
37
|
+
onError: (e) => {
|
|
38
|
+
setError(
|
|
39
|
+
e instanceof ApiError && e.status === 403 ? THREAD_COPY.forbidden
|
|
40
|
+
: e instanceof ApiError && e.status === 404 ? THREAD_COPY.gone
|
|
41
|
+
: THREAD_COPY.failed,
|
|
42
|
+
)
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<div data-testid="channel-thread-bar" className="flex-shrink-0 border-b border-border px-6 py-2 text-xs space-y-1.5">
|
|
48
|
+
<div className="flex items-center gap-2 min-w-0">
|
|
49
|
+
<ChannelBadge channel={row.channel} size={13} />
|
|
50
|
+
<bdi className="min-w-0 truncate text-gray-600" title={contact} data-testid="channel-thread-via">
|
|
51
|
+
{THREAD_COPY.via(row.channel, contact)}
|
|
52
|
+
</bdi>
|
|
53
|
+
{!row.connection_removed && (
|
|
54
|
+
<>
|
|
55
|
+
<span className="ml-auto shrink-0 text-gray-400" data-testid="channel-pause-state">
|
|
56
|
+
{THREAD_COPY.pauseState(row.paused)}
|
|
57
|
+
</span>
|
|
58
|
+
<button
|
|
59
|
+
type="button"
|
|
60
|
+
disabled={pause.isPending}
|
|
61
|
+
onClick={() => pause.mutate(!row.paused)}
|
|
62
|
+
className="shrink-0 inline-flex items-center gap-1 px-2 py-1 rounded-md border border-border text-gray-700 hover:bg-gray-50 disabled:opacity-50"
|
|
63
|
+
>
|
|
64
|
+
{row.paused ? <Undo2 className="w-3.5 h-3.5" /> : <Hand className="w-3.5 h-3.5" />}
|
|
65
|
+
{row.paused ? THREAD_COPY.resume : THREAD_COPY.pause}
|
|
66
|
+
</button>
|
|
67
|
+
</>
|
|
68
|
+
)}
|
|
69
|
+
</div>
|
|
70
|
+
{!row.connection_removed && !row.paused && (
|
|
71
|
+
<p className="text-gray-400">{THREAD_COPY.pauseNote}</p>
|
|
72
|
+
)}
|
|
73
|
+
{row.paused && (
|
|
74
|
+
<p role="status" data-testid="channel-paused-banner" className="p-2 rounded-md bg-amber-50 border border-amber-200 text-amber-800">
|
|
75
|
+
{THREAD_COPY.pausedBanner(contact, row.channel)}
|
|
76
|
+
</p>
|
|
77
|
+
)}
|
|
78
|
+
{resumed && !row.paused && (
|
|
79
|
+
<p role="status" data-testid="channel-resume-note" className="text-gray-600">
|
|
80
|
+
{THREAD_COPY.resumeNote(contact)}
|
|
81
|
+
</p>
|
|
82
|
+
)}
|
|
83
|
+
{error && (
|
|
84
|
+
<p role="alert" data-testid="channel-pause-error" className="text-red-600">{error}</p>
|
|
85
|
+
)}
|
|
86
|
+
</div>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** What the composer of a channel thread says before the owner sends. */
|
|
91
|
+
export function channelComposer(row: ChannelThreadRow): { sendLabel?: string; placeholder?: string } {
|
|
92
|
+
if (row.connection_removed) return {}
|
|
93
|
+
return {
|
|
94
|
+
sendLabel: THREAD_COPY.sendLabel(row.channel),
|
|
95
|
+
placeholder: THREAD_COPY.placeholder(row.channel, contactLabel(row.contact_name, row.channel)),
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Above the composer: where what the owner types will go, said BEFORE they
|
|
101
|
+
* send. Removed: nowhere. Disabled: it waits for Enable. WhatsApp with the
|
|
102
|
+
* window closed: it won't be delivered until the person writes again.
|
|
103
|
+
* Un-paused: it goes out AND the agent reads it.
|
|
104
|
+
*/
|
|
105
|
+
export function ChannelComposerNote({ row, messageCount }: { row: ChannelThreadRow; messageCount: number }) {
|
|
106
|
+
const { data: status } = useQuery({
|
|
107
|
+
queryKey: ['channel-thread', row.project_id, messageCount],
|
|
108
|
+
queryFn: () => getChannelThread(row.project_id),
|
|
109
|
+
retry: false,
|
|
110
|
+
enabled: row.channel === 'whatsapp' && !row.connection_removed,
|
|
111
|
+
})
|
|
112
|
+
const contact = contactLabel(row.contact_name, row.channel)
|
|
113
|
+
const lines: string[] = []
|
|
114
|
+
if (row.connection_removed) {
|
|
115
|
+
lines.push(THREAD_COPY.removedNote(row.channel))
|
|
116
|
+
} else {
|
|
117
|
+
if (!row.connection_enabled) lines.push(THREAD_COPY.disabledNote(row.channel))
|
|
118
|
+
if (status && status.window_closed_at !== null) lines.push(THREAD_COPY.windowClosed(contact))
|
|
119
|
+
if (!row.paused) lines.push(THREAD_COPY.unpausedNote(row.channel))
|
|
120
|
+
}
|
|
121
|
+
if (lines.length === 0) return null
|
|
122
|
+
return (
|
|
123
|
+
<div data-testid="channel-composer-note" className="px-4 pt-2 text-xs text-gray-600 space-y-0.5">
|
|
124
|
+
{lines.map((line) => <p key={line}>{line}</p>)}
|
|
125
|
+
</div>
|
|
126
|
+
)
|
|
127
|
+
}
|