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,285 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: photo-story
|
|
3
|
+
description: >
|
|
4
|
+
Build animated, single-file HTML "year story" / "trip story" / "milestone story"
|
|
5
|
+
artifacts from a photo library — Spotify-Wrapped / Apple-Memories style
|
|
6
|
+
scrollytelling, code-driven motion, plays straight from file://. Also covers
|
|
7
|
+
the curator-side funnel for getting from 1k–10k photos down to ~50 keepers
|
|
8
|
+
without melting context. Use when an agent needs to produce a multi-photo
|
|
9
|
+
narrative artifact OR when triaging a large photo library.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Photo Story
|
|
13
|
+
|
|
14
|
+
Two modes in one skill — pick the half you need:
|
|
15
|
+
|
|
16
|
+
- **Curator mode** (volume → keepers): turn a year's worth of photos into a
|
|
17
|
+
small, intentional shortlist. Runs locally; never hands the full library to
|
|
18
|
+
the model.
|
|
19
|
+
- **Bookmaker mode** (keepers → artifact): turn that shortlist into a
|
|
20
|
+
single-file animated HTML story you can text to family or open in a
|
|
21
|
+
browser without any build step.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Curator mode: from a thousand photos to fifty
|
|
26
|
+
|
|
27
|
+
A "best of 2025" album is typically 1k–10k photos. You cannot read them all
|
|
28
|
+
into vision context — token cost is prohibitive and the model can't reason
|
|
29
|
+
over that many at once anyway. **List metadata first, look at images last.**
|
|
30
|
+
|
|
31
|
+
### Step 1 — Discover the source
|
|
32
|
+
|
|
33
|
+
Two photo sources are supported. Pick whichever the user has:
|
|
34
|
+
|
|
35
|
+
**Filesystem folder** (e.g. an iCloud Drive folder mounted at
|
|
36
|
+
`~/Library/Mobile Documents/com~apple~CloudDocs/Photos/2025`): the agent's
|
|
37
|
+
`knowledge_dir` already points at it. Walk the directory and read EXIF.
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
# Run this as a Bash one-liner; faster than reading per-file from Python.
|
|
41
|
+
exiftool -j -r -DateTimeOriginal -GPSLatitude -GPSLongitude -ImageWidth \
|
|
42
|
+
-ImageHeight -FileName "/path/to/folder" > /tmp/exif.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If `exiftool` isn't installed, fall back to `Pillow`:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from PIL import Image, ExifTags
|
|
49
|
+
from pathlib import Path
|
|
50
|
+
import json
|
|
51
|
+
|
|
52
|
+
rows = []
|
|
53
|
+
for p in Path("/path/to/folder").rglob("*"):
|
|
54
|
+
if p.suffix.lower() not in (".jpg", ".jpeg", ".heic", ".png"):
|
|
55
|
+
continue
|
|
56
|
+
try:
|
|
57
|
+
img = Image.open(p)
|
|
58
|
+
exif = {ExifTags.TAGS.get(k, k): v for k, v in (img._getexif() or {}).items()}
|
|
59
|
+
except Exception:
|
|
60
|
+
exif = {}
|
|
61
|
+
rows.append({
|
|
62
|
+
"path": str(p),
|
|
63
|
+
"date": exif.get("DateTimeOriginal"),
|
|
64
|
+
"gps": exif.get("GPSInfo"),
|
|
65
|
+
"size": f"{img.width}x{img.height}" if hasattr(img, "width") else None,
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Apple Photos album** (e.g. an album called "2025" inside Photos.app,
|
|
70
|
+
synced via iCloud Photo Library): use the `photos` MCP. Photos.app's
|
|
71
|
+
`Photos Library.photoslibrary` is an opaque package; the MCP wraps
|
|
72
|
+
`osxphotos` to query it.
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
photos.list_albums() → pick the right album
|
|
76
|
+
photos.list_photos(album="2025", year=2025) → metadata + paths, no bytes
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Step 2 — Cluster into events
|
|
80
|
+
|
|
81
|
+
Don't bucket by calendar week — bucket by what actually happened. Two
|
|
82
|
+
photos within ~2 hours and ~500 m of each other are part of the same event
|
|
83
|
+
(brunch, hike, dinner). A photo with no GPS plus a 6-hour gap from the next
|
|
84
|
+
shot likely starts a new event.
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
def cluster_events(rows):
|
|
88
|
+
rows = sorted(rows, key=lambda r: r["date"])
|
|
89
|
+
events, current = [], []
|
|
90
|
+
for r in rows:
|
|
91
|
+
if not current:
|
|
92
|
+
current = [r]; continue
|
|
93
|
+
gap_hours = (r["dt"] - current[-1]["dt"]).total_seconds() / 3600
|
|
94
|
+
moved = (r.get("gps") and current[-1].get("gps")
|
|
95
|
+
and haversine(r["gps"], current[-1]["gps"]) > 0.5)
|
|
96
|
+
if gap_hours > 2 or moved:
|
|
97
|
+
events.append(current); current = []
|
|
98
|
+
current.append(r)
|
|
99
|
+
if current: events.append(current)
|
|
100
|
+
return events
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Aim for 30–80 events for a typical year. Fewer means under-clustered (a
|
|
104
|
+
trip will swallow surrounding moments); more means over-fragmented.
|
|
105
|
+
|
|
106
|
+
### Step 3 — Sample-vision per event
|
|
107
|
+
|
|
108
|
+
For each event, take **at most 3 candidate photos** (e.g. first, middle,
|
|
109
|
+
favorite by user-tag) and read those via the Read tool. Score them on:
|
|
110
|
+
|
|
111
|
+
- People in frame (faces beat scenery for memory recall)
|
|
112
|
+
- Sharpness (drop the obvious blurs)
|
|
113
|
+
- Specificity (a labeled shopfront beats yet another sunset)
|
|
114
|
+
|
|
115
|
+
Pick the strongest 1–2 per event. Skip events that are visually thin
|
|
116
|
+
(receipts, screenshots, repeated room shots).
|
|
117
|
+
|
|
118
|
+
### Step 4 — Funnel to ~50
|
|
119
|
+
|
|
120
|
+
Total budget: ~50 photos for a year-in-review. If clustering gave 60
|
|
121
|
+
events and you picked ~1 per event, you're done. If it gave 30 events
|
|
122
|
+
because the year was quiet, take 1–2 from each strong event and stop.
|
|
123
|
+
|
|
124
|
+
**Cull mercilessly.** "Best 50 of 2025" is a feature, not a constraint.
|
|
125
|
+
|
|
126
|
+
### Step 5 — Write captions
|
|
127
|
+
|
|
128
|
+
One sentence per photo. Anchor it to the small, forgettable detail (the
|
|
129
|
+
restaurant name, the trail, the inside joke). Match the owner's voice
|
|
130
|
+
from prior writing — terse, warm, dry, sentimental, whatever fits. Read
|
|
131
|
+
each aloud; if it sounds like a greeting card, rewrite it.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Bookmaker mode: animated single-file HTML
|
|
136
|
+
|
|
137
|
+
Output a `.html` file that opens straight from `file://`. No build step,
|
|
138
|
+
no server. Photos embedded as base64 by default for shareability.
|
|
139
|
+
|
|
140
|
+
### Architecture
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<!DOCTYPE html>
|
|
144
|
+
<html lang="en">
|
|
145
|
+
<head>
|
|
146
|
+
<meta charset="UTF-8">
|
|
147
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
148
|
+
<title>2025 — Year Story</title>
|
|
149
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
150
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
|
151
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
|
152
|
+
<style>
|
|
153
|
+
html { scroll-behavior: smooth; scroll-snap-type: y mandatory; }
|
|
154
|
+
section { scroll-snap-align: start; min-height: 100vh; }
|
|
155
|
+
.photo { transition: transform 0.6s ease, opacity 0.6s ease; }
|
|
156
|
+
.photo.in-view { transform: scale(1) translateY(0); opacity: 1; }
|
|
157
|
+
.photo.out-of-view { transform: scale(0.95) translateY(20px); opacity: 0; }
|
|
158
|
+
</style>
|
|
159
|
+
</head>
|
|
160
|
+
<body class="bg-black text-white font-sans antialiased">
|
|
161
|
+
<!-- One <section> per chapter (intro, season, milestone, outro) -->
|
|
162
|
+
<section class="flex flex-col items-center justify-center text-center p-8">
|
|
163
|
+
<h1 class="text-7xl font-bold tracking-tight">2025</h1>
|
|
164
|
+
<p class="text-xl text-gray-400 mt-4">A year, in pictures.</p>
|
|
165
|
+
</section>
|
|
166
|
+
|
|
167
|
+
<section class="grid grid-cols-1 md:grid-cols-2 gap-4 p-8 items-center">
|
|
168
|
+
<img src="data:image/jpeg;base64,..." class="photo rounded-lg shadow-2xl">
|
|
169
|
+
<div>
|
|
170
|
+
<h2 class="text-4xl font-semibold">Spring</h2>
|
|
171
|
+
<p class="text-gray-300 mt-4">Caption here.</p>
|
|
172
|
+
</div>
|
|
173
|
+
</section>
|
|
174
|
+
|
|
175
|
+
<!-- ... -->
|
|
176
|
+
|
|
177
|
+
<script>
|
|
178
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
179
|
+
gsap.utils.toArray("section img.photo, section h2").forEach((el) => {
|
|
180
|
+
gsap.from(el, {
|
|
181
|
+
opacity: 0,
|
|
182
|
+
y: 40,
|
|
183
|
+
duration: 0.8,
|
|
184
|
+
scrollTrigger: { trigger: el, start: "top 80%" },
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
</script>
|
|
188
|
+
</body>
|
|
189
|
+
</html>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### CDN libraries (no install needed)
|
|
193
|
+
|
|
194
|
+
| Library | CDN | Use |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| Tailwind CSS | `cdn.tailwindcss.com` | Layout + typography |
|
|
197
|
+
| GSAP + ScrollTrigger | `cdn.jsdelivr.net/npm/gsap@3.12.5` | Scroll-triggered motion |
|
|
198
|
+
| Lottie | `cdn.jsdelivr.net/npm/lottie-web` | After Effects-style accents (optional) |
|
|
199
|
+
| Three.js | `cdn.jsdelivr.net/npm/three@0.160` | 3D / spatial moments (optional) |
|
|
200
|
+
|
|
201
|
+
You don't need React for this — it's a one-shot, scroll-driven page.
|
|
202
|
+
Keep the JS tiny.
|
|
203
|
+
|
|
204
|
+
### Image embedding: base64 by default
|
|
205
|
+
|
|
206
|
+
Inline photos as base64 data URIs. The HTML is bigger (~33% overhead) but
|
|
207
|
+
it's a single file the user can text, AirDrop, or email.
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
import base64, mimetypes, json
|
|
211
|
+
from pathlib import Path
|
|
212
|
+
|
|
213
|
+
def encode(p: Path) -> str:
|
|
214
|
+
mime, _ = mimetypes.guess_type(p.name)
|
|
215
|
+
b64 = base64.b64encode(p.read_bytes()).decode("ascii")
|
|
216
|
+
return f"data:{mime or 'image/jpeg'};base64,{b64}"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
For 50 photos at ~500 KB each → roughly 25 MB inline. That's fine for
|
|
220
|
+
single-file sharing. Above 100 photos, switch to **linked mode**: keep
|
|
221
|
+
photos in a sibling `assets/` folder and use relative `<img src="assets/...">`.
|
|
222
|
+
Document the mode used with an HTML comment at the top of the file:
|
|
223
|
+
|
|
224
|
+
```html
|
|
225
|
+
<!-- mode: linked (photos in ./assets/, must be sent alongside this file) -->
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Resize before embedding
|
|
229
|
+
|
|
230
|
+
Don't embed 4032×3024 originals — the page will be enormous and most photos
|
|
231
|
+
look better at ~1600 px wide on the longer axis. Use Pillow:
|
|
232
|
+
|
|
233
|
+
```python
|
|
234
|
+
from PIL import Image
|
|
235
|
+
img = Image.open(src_path)
|
|
236
|
+
img.thumbnail((1600, 1600))
|
|
237
|
+
img.save(out_path, "JPEG", quality=85, optimize=True)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Test on phone-screen-width — most year stories will be opened on a phone.
|
|
241
|
+
|
|
242
|
+
### Pacing
|
|
243
|
+
|
|
244
|
+
| Spread | Use for |
|
|
245
|
+
|---|---|
|
|
246
|
+
| Full-bleed hero | Opener, season titles, biggest moments |
|
|
247
|
+
| Two-up | Pairs (before/after, two-angles, person + place) |
|
|
248
|
+
| Three-up grid | Event recap (a wedding, a trip leg) |
|
|
249
|
+
| Text-only | Section breaks, the closing reflection |
|
|
250
|
+
|
|
251
|
+
Vary aggressively — three full-bleeds in a row is monotonous. Open and
|
|
252
|
+
close strong; the first and last sections are what people remember.
|
|
253
|
+
|
|
254
|
+
### Music? Sound? Skip by default.
|
|
255
|
+
|
|
256
|
+
Auto-playing audio in HTML is jail. If the user explicitly asks, use
|
|
257
|
+
`<audio>` with `controls` (no `autoplay`) and let them hit play.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Verification
|
|
262
|
+
|
|
263
|
+
Before emitting the file, sanity-check:
|
|
264
|
+
|
|
265
|
+
1. Open the HTML directly with `file://` in Chrome / Safari. Photos render,
|
|
266
|
+
transitions don't jank.
|
|
267
|
+
2. Total page size under 50 MB. If over, switch to linked mode or shrink
|
|
268
|
+
photos.
|
|
269
|
+
3. Captions don't sound like greeting cards.
|
|
270
|
+
4. Mobile viewport works (375 × 667 in DevTools): no horizontal scroll,
|
|
271
|
+
photos resize, text stays readable.
|
|
272
|
+
|
|
273
|
+
If any of those fail, fix and re-emit before handing off.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## What this skill is NOT
|
|
278
|
+
|
|
279
|
+
- Not a print-PDF generator. If the user asks for "hardcover book ready for
|
|
280
|
+
Shutterfly," reach for the `pdf` skill instead.
|
|
281
|
+
- Not a video editor. Output is HTML + CSS animations, not MP4. If they
|
|
282
|
+
want video, suggest a screen-recording of the HTML scroll-through.
|
|
283
|
+
- Not a face-recognition tool. Person-tagging upstream of this skill is
|
|
284
|
+
the relationship_mapper's job (via the `photos` MCP's `persons` field
|
|
285
|
+
or manual user labels).
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwright-browser
|
|
3
|
+
description: >
|
|
4
|
+
Drive a real Chrome browser via Python playwright when WebFetch can't do the
|
|
5
|
+
job — login required, JavaScript-rendered UI, or multi-step interaction. Each
|
|
6
|
+
subcommand cold-starts Chrome (no daemon) against a persistent profile,
|
|
7
|
+
performs one action, and lets the profile carry state forward. Runs HEADED by
|
|
8
|
+
default and applies a stealth fingerprint, so it survives Cloudflare's
|
|
9
|
+
managed-challenge tier. Vocabulary: `manigent browser {start, stop, auth,
|
|
10
|
+
navigate, snapshot, click, fill, press-key, screenshot, wait-for}`. Optional
|
|
11
|
+
fast path: `manigent browser start` runs one long-lived browser per agent
|
|
12
|
+
(tab per project) to drop the cold start and keep login fully live. Two-tier state:
|
|
13
|
+
agent-level `--storage <name>` (long-lived identity, written by `auth`) +
|
|
14
|
+
project-level `--session <dir>` (a persistent Chrome profile per project
|
|
15
|
+
sandbox; defaults to `$PWD/.playwright-session`). Setup: `manigent bootstrap
|
|
16
|
+
browser` once per runner, then `manigent browser auth --storage <name>` per
|
|
17
|
+
agent identity. Pairs with `playwright-save-skill` to crystallize a successful
|
|
18
|
+
explore.
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# /manigent:playwright-browser
|
|
22
|
+
|
|
23
|
+
Browser automation via the `manigent browser` CLI (Python playwright).
|
|
24
|
+
|
|
25
|
+
## When to NOT use this skill
|
|
26
|
+
|
|
27
|
+
WebFetch is faster for static public HTML. Only reach for the browser when
|
|
28
|
+
**at least one** is true:
|
|
29
|
+
- The site requires login (password, MFA, passkey, SSO).
|
|
30
|
+
- The content is rendered by JavaScript after page load.
|
|
31
|
+
- The task needs interaction (click / fill / multi-step nav).
|
|
32
|
+
- The user explicitly wants this saved as a replayable skill.
|
|
33
|
+
|
|
34
|
+
## Preflight
|
|
35
|
+
|
|
36
|
+
1. **Chromium installed?** `manigent bootstrap browser` writes
|
|
37
|
+
`{data_dir}/.playwright_bootstrapped`. If missing, reply:
|
|
38
|
+
> Browser automation needs Chromium. Run `manigent bootstrap browser` once on this runner, then ask me again.
|
|
39
|
+
|
|
40
|
+
2. **A login exists for this identity?** For login-walled sites you need a
|
|
41
|
+
signed-in identity (`personal` by default; another `--storage <name>` for a
|
|
42
|
+
separate one). A login counts if **either** is true: a daemon is running for
|
|
43
|
+
this agent (see *Fast path*), or the identity has a populated profile /
|
|
44
|
+
`$MANIGENT_AGENT_DIR/skill-hub/state/playwright-browser/storage/personal.json`.
|
|
45
|
+
If there's no login yet, hand off:
|
|
46
|
+
> I need a signed-in browser identity for this agent. On the runner, run:
|
|
47
|
+
> ```
|
|
48
|
+
> manigent browser start --url https://google.com
|
|
49
|
+
> ```
|
|
50
|
+
> A real Chrome window opens and stays live. Sign in to whatever sites you want me to access (Google, the target app, and any SSO providers) — solve any Cloudflare/Turnstile check yourself. Leave the window running; the session stays live (nothing to export). Reply 'done' and I'll continue.
|
|
51
|
+
>
|
|
52
|
+
> (No display on the runner? Use the one-shot login instead: `manigent browser auth --url https://google.com`, sign in, then press Enter in the terminal.)
|
|
53
|
+
|
|
54
|
+
## Explore loop
|
|
55
|
+
|
|
56
|
+
Each subcommand runs ONE action and prints `{url, snapshot}` or similar JSON.
|
|
57
|
+
Cold-start cost is ~1.5–2 s per call — unless a daemon is running (see *Fast
|
|
58
|
+
path* below), where calls are sub-second and routing is automatic. Non-navigate
|
|
59
|
+
subcommands re-load `session.meta.json.last_url` automatically — you don't need
|
|
60
|
+
to pass `--url` again after the first navigate.
|
|
61
|
+
|
|
62
|
+
For a multi-step browser task you MAY enable the fast path first with
|
|
63
|
+
`manigent browser start` (see *Fast path*); it reuses an existing login, and
|
|
64
|
+
every action command below routes to it automatically. For **multi-step form or
|
|
65
|
+
reward/booking flows, or any flow where a click may open a new tab/window**, you
|
|
66
|
+
SHOULD `start` first — only the daemon holds page state and multiple tabs across
|
|
67
|
+
commands (see *Tabs* below); one-shot cannot.
|
|
68
|
+
|
|
69
|
+
`navigate` / `snapshot` / `screenshot` auto-wait for the page to settle (the
|
|
70
|
+
`load` event + network-idle) so JS/SPA content has painted before you read it —
|
|
71
|
+
no blank/splash captures. If you need a *specific* element, `wait-for 'selector'`
|
|
72
|
+
before screenshotting rather than re-navigating and hoping. Tune with
|
|
73
|
+
`--settle-ms <n>` (0 disables) for unusually slow or static pages.
|
|
74
|
+
|
|
75
|
+
Actions run **headed** by default (a Chrome window appears) because that is the
|
|
76
|
+
most Cloudflare-resistant. Force the mode per call with `--headless` / `--headed`
|
|
77
|
+
if you need to; the default also follows the skill config's `headless` value
|
|
78
|
+
(see *Cloudflare & bot detection* below).
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Step 1 — land
|
|
82
|
+
manigent browser navigate https://app.provi.com --storage personal
|
|
83
|
+
|
|
84
|
+
# Step 2 — read the accessibility tree, decide what to do
|
|
85
|
+
# (snapshot is in the JSON output; use playwright selector syntax for actions)
|
|
86
|
+
|
|
87
|
+
# Step 3 — interact
|
|
88
|
+
manigent browser fill 'input[name="q"]' "Sandhi Chardonnay 2022" --storage personal
|
|
89
|
+
manigent browser press-key Enter --storage personal
|
|
90
|
+
|
|
91
|
+
# Step 4 — wait if needed
|
|
92
|
+
manigent browser wait-for 'text=Search results' --storage personal --timeout-ms 8000
|
|
93
|
+
|
|
94
|
+
# Step 5 — snapshot for next decision OR screenshot for the user
|
|
95
|
+
manigent browser screenshot --out results.png --storage personal
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Inside the runner, `--storage` resolves against the injected `$MANIGENT_AGENT_DIR`
|
|
99
|
+
automatically. To run an action command **manually** outside the runner (e.g. to
|
|
100
|
+
debug), pass `--agent <name>` so `--storage` can resolve — same as `auth`.
|
|
101
|
+
|
|
102
|
+
Selector syntax is Playwright's: CSS selectors, `text=`, `role=`, plus
|
|
103
|
+
`get_by_*` patterns wrapped as `internal:role=button[name="Sign in"]` etc.
|
|
104
|
+
Refs from a snapshot in a previous CLI invocation are stale (cold-start);
|
|
105
|
+
re-derive from the current snapshot each time, or use stable selectors.
|
|
106
|
+
|
|
107
|
+
## Tabs (daemon only)
|
|
108
|
+
|
|
109
|
+
A click can open a **new tab/window** (a `target=_blank` link, a `window.open`
|
|
110
|
+
popup, many reward/booking flows). When it does, the click result does NOT
|
|
111
|
+
switch to it — it stays on the current tab and adds:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
"opened_tabs": [{"index": 1, "url": "https://…/reward", "active": false}],
|
|
115
|
+
"note": "new tab(s) opened; active tab unchanged. Use `switch-tab <index>` …"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
You decide what to do with it:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
manigent browser tabs # list this project's tabs (index, url, active)
|
|
122
|
+
manigent browser switch-tab 1 # make tab 1 active; emits its snapshot
|
|
123
|
+
manigent browser close-tab 1 # close a tab you don't need
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
If a snapshot looks unchanged after a click that should have advanced the flow,
|
|
127
|
+
run `tabs` — the new page is probably a tab you haven't switched to. These
|
|
128
|
+
commands need the daemon; one-shot can't carry a tab to the next command.
|
|
129
|
+
|
|
130
|
+
## Fast path (optional): long-lived browser
|
|
131
|
+
|
|
132
|
+
`manigent browser start` launches one persistent Chrome for the agent (a tab
|
|
133
|
+
per project, keyed by sandbox CWD) and serves every subsequent subcommand from
|
|
134
|
+
it over a local socket. While it runs:
|
|
135
|
+
|
|
136
|
+
- **No cold start** — each action returns in well under a second.
|
|
137
|
+
- **Login stays fully live** — cookies (including ephemeral session cookies that
|
|
138
|
+
Chrome never persists to disk), localStorage, and IndexedDB live in memory, so
|
|
139
|
+
there's no export/copy/seed and no re-auth between commands.
|
|
140
|
+
- **Auth is just sign-in** — `start` (or `auth`) opens the live window; sign in
|
|
141
|
+
to whatever you need and leave it running. No separate export step.
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
manigent browser start --storage personal # one live browser (sign in here if first time)
|
|
145
|
+
manigent browser navigate https://app.example.com # routed to the daemon, fast
|
|
146
|
+
manigent browser snapshot # same live tab, sub-second
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The action subcommands auto-route: if a daemon is running they use it, otherwise
|
|
150
|
+
they fall back to the one-shot path below — same commands either way. The browser
|
|
151
|
+
is launched once via patchright and **never** reconnected over CDP, so stealth is
|
|
152
|
+
identical to one-shot.
|
|
153
|
+
|
|
154
|
+
**You may `start`; do not `stop`.** Running `start` at the top of a browser-heavy
|
|
155
|
+
task is fine — it reuses an existing login (only a first-time login needs the
|
|
156
|
+
human to sign in in the live window) and is a no-op if one is already up. But
|
|
157
|
+
`stop` is **user-managed**: stopping drops the in-memory session and the user's
|
|
158
|
+
live window, so never stop a daemon yourself — leave it running for the next task.
|
|
159
|
+
|
|
160
|
+
## Auth flow (first-time login OR refresh on expiry)
|
|
161
|
+
|
|
162
|
+
Storage is per-agent + per-identity (`--storage personal`, `--storage work`,
|
|
163
|
+
etc.). One headed `manigent browser auth` session captures cookies +
|
|
164
|
+
localStorage for every domain visited inside that window — apps + SSO
|
|
165
|
+
providers. On the first action of a new `--session`, the storage's cookies
|
|
166
|
+
seed the session's persistent Chrome profile; from then on the profile itself
|
|
167
|
+
carries the logged-in state (and any `cf_clearance`) forward.
|
|
168
|
+
|
|
169
|
+
The `auth` window is the SAME hardened browser as the actions — real Chrome,
|
|
170
|
+
stealth fingerprint, persistent profile (and patchright when the stealth extra
|
|
171
|
+
is installed). That's what lets you pass Cloudflare/Turnstile during login; the
|
|
172
|
+
human solves any interactive challenge in the window.
|
|
173
|
+
|
|
174
|
+
Never type credentials yourself. Hand off to the user with the CLI:
|
|
175
|
+
|
|
176
|
+
> Run `manigent browser auth --url https://google.com` on the runner.
|
|
177
|
+
> A real Chrome window opens at google.com. Sign in to Google, then visit
|
|
178
|
+
> each app site I'll need (e.g. https://app.provi.com); complete the
|
|
179
|
+
> OAuth bounce all the way back to the app and solve any Cloudflare/Turnstile
|
|
180
|
+
> check. Then return to the terminal and **press Enter** (do NOT close the
|
|
181
|
+
> window yourself). The storage lands at
|
|
182
|
+
> `skill-hub/state/playwright-browser/storage/personal.json`.
|
|
183
|
+
|
|
184
|
+
`auth` defaults to `--storage personal`. Use `--storage <name>` for a
|
|
185
|
+
separate sign-in (e.g. `work`). On subsequent action subcommands
|
|
186
|
+
(`navigate`, `click`, …), `--storage` defaults to empty — pass
|
|
187
|
+
`--storage personal` explicitly, or the browser runs anonymously.
|
|
188
|
+
|
|
189
|
+
## Things to NOT do
|
|
190
|
+
|
|
191
|
+
- Do not type credentials yourself — always hand off (`manigent browser start`,
|
|
192
|
+
or `auth` for the one-shot fallback).
|
|
193
|
+
- Do not log out at the end of a task — that invalidates the storage identity
|
|
194
|
+
for every future explore.
|
|
195
|
+
- Do not `stop` the browser daemon — it's user-managed and holds the live
|
|
196
|
+
session (same spirit as "don't log out"). You may `start` it; never stop it.
|
|
197
|
+
- Do not invoke this skill when WebFetch can do the job.
|
|
198
|
+
- Do not pass refs/selectors across CLI invocations in one-shot mode — cold-start
|
|
199
|
+
invalidates a snapshot's refs; re-derive from the current snapshot.
|
|
200
|
+
- Do not save the explore as a personal skill yourself — that's `playwright-save-skill`'s job.
|
|
201
|
+
|
|
202
|
+
## Cloudflare & bot detection
|
|
203
|
+
|
|
204
|
+
The CLI hardens every action against bot detection automatically — you don't
|
|
205
|
+
configure anything for the common case:
|
|
206
|
+
|
|
207
|
+
- **Headed by default + a stealth fingerprint.** Real Chrome (not bundled
|
|
208
|
+
Chromium), automation flags stripped, a realistic UA / viewport / locale /
|
|
209
|
+
timezone, and a `navigator.webdriver` / WebGL mask. Headless is the single
|
|
210
|
+
biggest bot tell, so prefer the default; only pass `--headless` when you
|
|
211
|
+
accept a higher block rate.
|
|
212
|
+
- **Persistent per-session profile.** The session is a real Chrome profile at
|
|
213
|
+
`<session_dir>/profile/` (not a `state.json` dump). Cloudflare's
|
|
214
|
+
`cf_clearance` cookie and a stable fingerprint persist across the
|
|
215
|
+
cold-started invocations, so once a session clears a challenge it keeps
|
|
216
|
+
passing — re-running is also faster.
|
|
217
|
+
- **Challenge-aware waiting.** On a Cloudflare interstitial ("Just a moment…")
|
|
218
|
+
the command waits up to ~30 s for the challenge to clear before snapshotting.
|
|
219
|
+
If it never clears, the command exits non-zero with a `ChallengeUnresolvedError`.
|
|
220
|
+
When that happens: retry, make sure you passed a valid `--storage` identity,
|
|
221
|
+
and prefer headed mode. A managed challenge may need an interactive `auth`
|
|
222
|
+
pass first (sign in via `manigent browser auth` so cookies seed the profile).
|
|
223
|
+
|
|
224
|
+
**Real Chrome recommended.** The CLI prefers the installed Google Chrome and
|
|
225
|
+
falls back to bundled Chromium only if Chrome is absent — but bundled Chromium
|
|
226
|
+
is easier to fingerprint and less likely to pass tough challenges. Install
|
|
227
|
+
Google Chrome on the runner for best results.
|
|
228
|
+
|
|
229
|
+
**Stubborn sites (airlines, Turnstile, "access denied").** A plain stealthed
|
|
230
|
+
Playwright browser still leaks that it's automated via the CDP `Runtime.enable`
|
|
231
|
+
call — enough for Cloudflare Turnstile to fail the checkbox or for a site to
|
|
232
|
+
deny access after login. The **patchright** stealth runtime closes that leak and
|
|
233
|
+
**ships by default** with manigent (it's a core dependency) — just run:
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
manigent bootstrap browser # fetches real Chrome + reports the active runtime
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
> **Python 3.14 caveat.** patchright has no Python 3.14 build, so on 3.14 it's
|
|
240
|
+
> not installed and the skill falls back to stock Playwright (which Cloudflare
|
|
241
|
+
> Turnstile / airline sites will likely block). Run manigent under Python ≤3.13
|
|
242
|
+
> (e.g. `pyenv install 3.13 && pyenv local 3.13.x`, then reinstall) for the
|
|
243
|
+
> stealth runtime.
|
|
244
|
+
|
|
245
|
+
`manigent bootstrap browser` prints the active runtime and warns loudly if the
|
|
246
|
+
stealth runtime is inactive (e.g. running on Python 3.14). When active, the skill
|
|
247
|
+
uses **patchright** (closes the CDP leak; real Chrome with a clean, override-free
|
|
248
|
+
config) for both `auth`/`start` and the action commands. Every result JSON
|
|
249
|
+
— and the `auth` opening message — reports `"runtime": "patchright"` when active
|
|
250
|
+
(`"playwright"` otherwise). This is the first thing to try for China-Airlines
|
|
251
|
+
Turnstile or post-login "access denied".
|
|
252
|
+
|
|
253
|
+
Note: the fingerprint config keys (`user_agent`, `viewport`, `webgl_*`) apply
|
|
254
|
+
**only** to the stock-Playwright fallback. Under patchright they're intentionally
|
|
255
|
+
ignored — patchright presents a coherent real-Chrome fingerprint, and overriding
|
|
256
|
+
it would re-introduce detectable inconsistencies. `headless` and `proxy_*` apply
|
|
257
|
+
to both.
|
|
258
|
+
|
|
259
|
+
**Proxy (hard IP blocks).** If a site returns an immediate "access denied" /
|
|
260
|
+
error 1020 with no solvable challenge, it's likely blocking the runner's IP
|
|
261
|
+
(datacenter/VPN). Set `proxy_server` (+ optional `proxy_username`/`proxy_password`)
|
|
262
|
+
in the skill config to route through a residential proxy. See `starter_config.jsonc`.
|
|
263
|
+
|
|
264
|
+
**Headless Linux servers (no display).** Headed mode needs a display. Either
|
|
265
|
+
set `"headless": true` in the config, or wrap the command in a virtual display
|
|
266
|
+
(no extra Python dependency):
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
xvfb-run -a manigent browser navigate https://app.example.com --storage personal
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Optional config.** Fingerprint defaults live in the CLI; override any of
|
|
273
|
+
them per agent via `starter_config.jsonc` (Agent Settings → Skills →
|
|
274
|
+
playwright-browser → Configure): `headless`, `user_agent`, `locale`,
|
|
275
|
+
`timezone_id`, `viewport_width/height`, `webgl_vendor/renderer`. Every key is
|
|
276
|
+
optional. Keep UA / locale / timezone mutually consistent.
|
|
277
|
+
|
|
278
|
+
## Concurrency
|
|
279
|
+
|
|
280
|
+
**One-shot mode:** each invocation spawns one Chrome process (against the session
|
|
281
|
+
profile) and tears it down. Parallel explores on the same agent are safe as long
|
|
282
|
+
as they use different `--session` dirs (default `$PWD/.playwright-session` already
|
|
283
|
+
partitions by sandbox CWD). Do **not** run two commands against the *same*
|
|
284
|
+
`--session` concurrently — they share one persistent profile dir and Chrome will
|
|
285
|
+
refuse the second with a "profile in use" error.
|
|
286
|
+
|
|
287
|
+
**Daemon (fast path) mode:** one Chrome with a tab per project. Different
|
|
288
|
+
projects (different `--session`) run on independent tabs and interleave freely;
|
|
289
|
+
commands on the *same* project serialize on a per-tab lock instead of failing —
|
|
290
|
+
so the same-session restriction above does not apply. Different agents always run
|
|
291
|
+
fully separate daemons/Chromes.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
// playwright-browser fingerprint overrides. ENTIRELY OPTIONAL — every key
|
|
3
|
+
// below already has a Cloudflare-resistant default baked into the CLI.
|
|
4
|
+
// Delete any key to accept its default; delete the whole file to accept all
|
|
5
|
+
// defaults. The `manigent browser ... --headed/--headless` flag overrides
|
|
6
|
+
// the `headless` value here.
|
|
7
|
+
//
|
|
8
|
+
// NOTE: the fingerprint keys (user_agent, locale, timezone_id, viewport_*,
|
|
9
|
+
// webgl_*) apply ONLY when running on stock Playwright. When the patchright
|
|
10
|
+
// stealth runtime is active they are intentionally ignored — patchright
|
|
11
|
+
// presents a coherent real-Chrome fingerprint and overriding it hurts. The
|
|
12
|
+
// `headless` and `proxy_*` keys apply to both runtimes.
|
|
13
|
+
|
|
14
|
+
// Run with a visible window (false) or headless (true). Headed is by far the
|
|
15
|
+
// most resistant to Cloudflare / bot detection and is the default. On a
|
|
16
|
+
// Linux server with no display, either set this to true OR run the CLI under
|
|
17
|
+
// `xvfb-run` (see SKILL.md) — no extra Python dependency is needed.
|
|
18
|
+
"headless": false,
|
|
19
|
+
|
|
20
|
+
// Browser identity. Keep these mutually consistent — a macOS user-agent, a
|
|
21
|
+
// US timezone, and an en-US locale all agree with each other. A mismatched
|
|
22
|
+
// trio (e.g. a macOS UA with a Tokyo timezone) is itself a bot signal.
|
|
23
|
+
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
|
|
24
|
+
"locale": "en-US",
|
|
25
|
+
"timezone_id": "America/New_York",
|
|
26
|
+
|
|
27
|
+
// Window size. 1440x900 is a common real-laptop viewport.
|
|
28
|
+
"viewport_width": 1440,
|
|
29
|
+
"viewport_height": 900,
|
|
30
|
+
|
|
31
|
+
// WebGL spoof — makes the GPU fingerprint look like real hardware instead of
|
|
32
|
+
// the headless ANGLE/SwiftShader renderer. The defaults below mimic an
|
|
33
|
+
// Apple-Silicon Mac; change them to match the machine you want to look like.
|
|
34
|
+
"webgl_vendor": "Google Inc. (Apple)",
|
|
35
|
+
"webgl_renderer": "ANGLE (Apple, ANGLE Metal Renderer: Apple M1, Unspecified Version)"
|
|
36
|
+
|
|
37
|
+
// Optional proxy — only needed when a site blocks the runner's IP outright
|
|
38
|
+
// (a hard "access denied" / error 1020 with no solvable challenge), which
|
|
39
|
+
// usually means a datacenter/VPN IP. Point at a residential proxy. Leave the
|
|
40
|
+
// keys absent (as below) for a direct connection.
|
|
41
|
+
// "proxy_server": "http://host:port", // or "socks5://host:port"
|
|
42
|
+
// "proxy_username": "user",
|
|
43
|
+
// "proxy_password": "pass"
|
|
44
|
+
}
|