Commit graph

441 commits

Author SHA1 Message Date
iliya
4946a65a7b feat: cherry-pick upstream CollapsibleOutputSection + TriggerMatcher regex cache
Cherry-picked from upstream:
- 516d0f6b: CollapsibleOutputSection with markdown preview toggle
- e51c1fd1: cache compiled regexes in TriggerMatcher (perf)
2026-03-25 13:58:38 +02:00
iliya
7324b5236d fix(team): update tool references from Task to Agent in provisioning messages
- Changed references in messages to use the **Agent** tool instead of the Task tool for spawning teammates.
- Added warnings for missing team_name to ensure agents are persistent rather than ephemeral.
- Updated documentation within the code to reflect the new requirements for spawning teammates.
2026-03-25 13:38:26 +02:00
iliya
b8aa2d9f14 fix(auth): enrich PTY env and invalidate status cache after login
- Use buildEnrichedEnv() in PtyTerminalService so login terminal gets
  full PATH (Homebrew, nvm, etc.) and USER for Keychain lookup
- Add cliInstaller:invalidateStatus IPC to clear cached auth status
  after successful login, preventing stale "not logged in" responses
- Show "Verifying authentication..." spinner instead of flashing
  the "Not logged in" banner between modal close and status refresh

Ref #27
2026-03-25 13:36:12 +02:00
iliya
60d80cde70 fix(auth): avoid setting CLAUDE_CONFIG_DIR when it matches default path
On macOS, the Claude CLI uses a Keychain namespace derived from the
presence of CLAUDE_CONFIG_DIR env var. Setting it to the default
~/.claude creates a different Keychain key than when the var is absent,
causing "not logged in" errors even after successful `claude auth login`.

Only set CLAUDE_CONFIG_DIR when the user has configured a custom path
that differs from the auto-detected default.

Fixes #27
2026-03-25 12:23:57 +02:00
iliya
896c749e76 fix: add recursive option to fs.rm for directory removal
fs.rm() without { recursive: true } throws ERR_FS_EISDIR on directories,
unlike the deprecated fs.rmdir() which handled empty dirs. Also fix
broken roadmap bullet in README.
2026-03-24 21:43:43 +02:00
iliya
08be8590da fix: electron 28→40 migration fixes
- Replace deprecated fs.rmdir with fs.rm (Node 22+ deprecation)
- Update electron-builder 25.1.8 → 26.8.1 (required for Electron 35+)
- Add macOS minimumSystemVersion 12.0 (Electron 38+ requirement)
- Update React 18 → 19 in README.md tech stack
2026-03-24 21:13:06 +02:00
iliya
3b65dc4e3b fix(lint): resolve import sort errors and update tech stack in CLAUDE.md
- ProjectScanner.ts, cliEnv.ts: fix simple-import-sort/imports order
- CLAUDE.md: update tech stack to Electron 40.x, React 19.x
2026-03-24 18:23:00 +02:00
iliya
94fc564bf5 feat: UI improvements, bug fixes, and protocol noise filtering
- Fix incorrect error message when attaching files to team lead while team is offline
- Kanban columns: color only on headers, body with 30% alpha tint per user preference
- Worktree projects now correctly detected on Dashboard via path-based detection
- Filter raw protocol messages (idle_notification, teammate-message) from lead thoughts
- Consistent text styles in Attachments section (From original message / From comments)
- Secondary sort for teams by lastActivity timestamp with alphabetical fallback
- Remove colored background from team cards, keep only left border
- Dynamic member color in Add Members dialog based on next available palette color
- Stylized @-mentions in task comments with colored MemberBadge
- Refactor CLI env resolution to shared utility
2026-03-24 17:47:15 +02:00
iliya
1718f9cf7c refactor(README): reorganize roadmap items for clarity and update language switcher flag icon
- Rearranged roadmap items in README.md for better organization, moving planning mode and visual workflow editor to the top.
- Updated the flag icon for English in LanguageSwitcher.vue from the US to the GB flag.
- Enhanced user environment setup in CliInstallerService.ts by adding user information retrieval.
- Improved timestamp handling in MemberLogsTab.tsx to better reflect recent activity.
- Adjusted button class names in ProvisioningProgressBlock.tsx for consistency.
2026-03-24 16:52:12 +02:00
Leigh Stillard
8e84961d4a fix(standalone): fix standalone mode to run without Electron
Three issues prevented standalone (non-Electron) mode from working:

1. sentry.ts used a top-level `import * from '@sentry/electron/main'`
   which crashes in plain Node.js. Changed to a try/catch require()
   so the module is safe to import in both environments.

2. vite.standalone.config.ts resolved all paths relative to __dirname
   (docker/) but is invoked from the repo root. Fixed to resolve
   relative to the repo root via a ROOT constant.

3. The electron stub was missing `safeStorage` and `screen` exports
   that newer code imports. Added them, and externalized
   agent-teams-controller (plain CJS with relative requires that
   break when bundled by Vite).
2026-03-24 03:43:26 +00:00
iliya
0bc8bf1fe9 feat(landing): enhance base URL handling and improve image paths
- Introduced baseURL configuration to dynamically set asset paths in the landing components.
- Updated AppLogo and HeroSection components to use baseURL for logo image sources.
- Refactored ScreenshotsSection to utilize a publicPath function for consistent image path handling.
- Improved LanguageSwitcher to synchronize the i18n locale with the store on mount.
- Enhanced TaskCommentInput to handle file uploads more robustly, including validation for empty files and improved error handling.
- Adjusted MessageComposer to conditionally support attachments based on team status.
2026-03-23 17:51:09 +02:00
iliya
5cf9751b41 feat(attachments): update TypeScript configuration and enhance attachment handling
- Upgraded TypeScript target and library to ES2023 for improved language features.
- Enhanced TeamProvisioningService to better handle plain text attachments with UTF-8 validation.
- Improved TaskCommentInput to differentiate between image and non-image file previews, including a new FileIcon for non-image files.
- Refactored attachment handling in useAttachments and useComposerDraft hooks to simplify file processing.
- Added validation for empty files in attachmentUtils to improve user feedback on unsupported uploads.
2026-03-23 17:33:39 +02:00
iliya
b20b69066e feat(attachments): expand file support and enhance attachment handling
- Added support for additional attachment types: PDF and plain text.
- Updated the TeamProvisioningService to handle new attachment types with appropriate content blocks.
- Enhanced AttachmentDisplay and AttachmentPreview components to differentiate between image and non-image files.
- Modified DropZoneOverlay and SendMessageDialog to reflect changes in file handling and messaging.
- Improved user experience by allowing file previews for non-image attachments and updating error messages accordingly.
- Refactored attachment validation logic to categorize unsupported files and handle them gracefully.
2026-03-23 17:24:48 +02:00
iliya
ad1741f05e fix(team): enhance team member resolution and provisioning instructions
- Added logic to merge "lead" alias into "team-lead" to prevent phantom member entries in the inbox.
- Updated provisioning instructions to emphasize the importance of using the exact name for the team lead in messages, avoiding abbreviations.
- Modified default role for 'tom' from 'reviewer' to 'researcher' with updated workflow description.
- Improved UI in MemberDraftRow to indicate workflow status with a visual cue when expanded.
2026-03-23 15:37:23 +02:00
iliya
935128e26b fix(team): dedup duplicate SendMessage entries and show lead online during provisioning
- Add content-based dedup in handleGetData merge: when two directed messages
  have identical from+to+text within a 5-second window, keep only the first.
  Fixes duplicate display caused by both CLI and our persistInboxMessage
  writing to the same inbox file.

- Reorder checks in getMemberDotClass/getPresenceLabel: check leadActivity
  before isTeamProvisioning so the lead shows green dot when its process
  is already running during team setup.
2026-03-23 15:16:09 +02:00
iliya
7b13a4c398 refactor: update README and enhance team UI components
- Changed image format for agent comments screenshot in README.
- Improved table of contents in README for better navigation.
- Refactored imports in IPC config and discovery services for consistency.
- Added shimmer effect for waiting members in CSS.
- Enhanced dashboard view to display active teams with online indicators.
- Updated team provisioning components to support message severity.
- Improved task detail dialog layout for related tasks and dependencies.
- Adjusted team model selector default value and refined member status handling.
- Fixed minor styling issues in messages panel and tab bar.

These changes aim to improve user experience and maintainability across the application.
2026-03-23 12:58:38 +02:00
iliya
2eac440fe2 fix(team): disable teammate DM relay through lead, read user.json directly
Teammates are independent Claude Code processes that read their own inbox
files via fs.watch. Relaying DMs through the lead caused three bugs:
lead responding instead of the teammate, duplicate messages from relay
loops, and teammates not responding to user due to conflicting prompts.

- Disable relayMemberInboxMessages for teammate DMs (teams.ts, index.ts)
- Add SendMessage(to="user") filter in captureSendMessages as safety net
- Generate deterministic messageId for inbox entries lacking one (sha256)
- Wrap notification instructions in agent block, italic task subject
- Style system comments in task view with blue background, hide avatar
- Update CLAUDE.md, research docs, and code comments with architecture
2026-03-23 12:57:16 +02:00
iliya
e005671123 feat: add Sentry error tracking and update docs
- Integrate @sentry/electron and @sentry/react for crash reporting
- Add Sentry Vite plugin for source maps
- Add error tracking to main process, renderer, and IPC layer
- Exclude source maps from packaged builds
- Update README with new screenshots
- Add Sentry opt-out toggle in settings
- Update release workflow with Sentry config
2026-03-22 17:03:15 +02:00
iliya
9e87746b81 fix(team): prohibit broadcast SendMessage to prevent phantom "*" participant
Add explicit constraint in lead prompt forbidding SendMessage with
recipient "*". The broadcast address is not supported by the runtime
and creates a phantom team member named "*" in the UI.
2026-03-22 14:18:46 +02:00
iliya
a9cdf20ca8 feat(updater): add auto-update UI with periodic checks and state guards
- Add green "Update app" / "Restart to update" button in header (TabBarActions)
- Enhance UpdateDialog: larger, dynamic buttons, scrollable release notes,
  version badge, "View on GitHub" link
- Add DashboardUpdateBanner: compact dismissible banner keyed by version
- Add periodic hourly update checks in UpdaterService with unref() timer
- Add dismissed version tracking in updateSlice (localStorage persistence)
- Add state transition guards in store listener: prevent periodic re-checks
  from resetting downloading/downloaded status back to available/checking
- Guard error events from overriding downloaded state (transient check failures)
2026-03-22 14:00:44 +02:00
iliya
be38447c97 fix(backup): detect resurrected teams with reused names
When a team was permanently deleted and a new team created with the
same name, the backup service still treated it as deleted. The old
registry entry blocked periodic backups, FileWatcher-triggered backups,
shutdown backups, and auto-restore on startup.

- discoverActiveTeams: re-activate deleted entries when valid config exists
- doBackupTeam: reset stale deleted manifest, always ensure identity marker
- doBackupTeam guard: allow resurrected teams through with config check
- doBackupTeamSync: reset deleted manifest to prevent status writeback
- reconcileResurrectedTeams: detect post-deletion backup data on init
- reconcileResurrectedTeamsSync: sync reconciliation before shutdown backup
2026-03-22 13:35:18 +02:00
iliya
60cf80f90a fix: resolve CLI binary dynamically for MCP diagnostics and extension installs
Use ClaudeBinaryResolver instead of null binary path in extension services
(McpHealthDiagnosticsService, PluginInstallService, McpInstallService).
Packaged Electron on macOS has minimal PATH — bare `claude` lookup fails
with ENOENT. Now all CLI calls resolve the binary via ClaudeBinaryResolver
which checks PATH, NVM, standard install dirs and login shell env.

- Add buildEnrichedEnv() helper for child process env (PATH, HOME, USERPROFILE)
- Add stale cache re-verification with 30s TTL in ClaudeBinaryResolver
- Guard execCli() against null binaryPath with explicit error
- Replace projectPath.startsWith('/') with path.isAbsolute() for Windows
- Extract CLI_NOT_FOUND_MARKER/MESSAGE constants for consistent error detection
- Show amber info banner instead of red error when CLI not installed
2026-03-22 13:10:11 +02:00
iliya
8616db00a0 refactor: update UI and functionality for team provisioning and progress indicators
- Revised the TeamProvisioningService to change event handling from 'Task' to 'Agent' for improved accuracy.
- Enhanced the StepProgressBar component to include error indicators and animations for better user feedback during provisioning.
- Updated the TeamProvisioningBanner to track and display the last active step in case of errors.
- Improved CSS styles for step indicators, adding new animations and error states.
- Refined the sidebar task item styling based on light/dark themes for better visual consistency.
- Adjusted the README to reflect changes in installation instructions and feature comparisons.
2026-03-21 17:43:29 +02:00
iliya
3fcab46882 refactor: enhance team provisioning progress updates
- Updated the TeamProvisioningService to advance the provisioning state to "assembling" when the first member spawn is detected.
- Improved the clarity of team setup progress tracking by refining the conditions for state transitions.
- Adjusted the README to include a new section on installation and a detailed comparison of features against other multi-agent orchestration tools.
2026-03-21 17:03:28 +02:00
iliya
6d441efa97 refactor: enhance team provisioning process and UI updates
- Updated provisioning states to include 'configuring', 'assembling', and 'finalizing' for better tracking of team setup progress.
- Refactored the provisioning progress block to utilize a new display step system, improving clarity in the UI.
- Adjusted the README to include a comprehensive table of contents and updated comparison metrics for multi-agent orchestration tools.
- Enhanced team management UI to reflect new provisioning states and improve user experience during team setup.
2026-03-21 16:47:20 +02:00
iliya
7bca2e73a6 refactor: update lead member detection and enhance team management UI
- Replaced instances of isLeadAgentType with isLeadMember for improved clarity in team member role checks.
- Updated README to include a new built-in review workflow feature for agent task reviews.
- Enhanced team detail and list views to accurately reflect current team members and their roles.
- Improved CSS for step progress indicators, adding new styles for a circular stepper.
- Refactored provisioning progress block to utilize a new StepProgressBar component for better visual representation of steps.
2026-03-21 16:05:56 +02:00
iliya
7dda73aa74 refactor: update task assignment message formatting and enhance UI elements
- Changed task assignment message to use italic formatting for task subject for better emphasis.
- Updated the task instruction message to utilize a wrapping function for improved readability.
- Enhanced splash screen background with an animated gradient for a more dynamic visual experience.
- Improved team detail view messaging to clarify provisioning status.
- Adjusted member list sorting logic to utilize a new lead member detection function.
2026-03-21 15:07:52 +02:00
iliya
020aaab1c6 feat: enable notification action buttons on Windows (not just macOS)
Electron's 'action' event fires on both macOS and Windows per docs.
Removed isMac guard — now Allow/Deny buttons appear on Windows too.
Linux excluded (libnotify doesn't fire the 'action' event).
2026-03-21 13:44:50 +02:00
iliya
95b282577f fix: notification click uses current window ref, dismiss on settings auto-allow
- Click handler reads this.mainWindowRef instead of captured closure ref,
  so window recreation is handled correctly
- reEvaluatePendingApprovals now calls dismissApprovalNotification when
  auto-allowing via settings change (was missing — stale notification stayed)
2026-03-21 13:40:02 +02:00
iliya
b3cc2f1421 fix: update mainWindowRef on window close/recreate, remove dead code
- Add teamProvisioningService.setMainWindow(null) in window close handler
- Add teamProvisioningService.setMainWindow(mainWindow) in window recreate
  Without this, notification click focused destroyed window instead of new one
- Remove unused dismissAllApprovalNotifications (cleanupRun uses per-requestId dismiss)
2026-03-21 13:37:12 +02:00
iliya
0d74619241 fix: OS notification lifecycle — dismiss on resolve, respect snooze
- Track notifications by requestId (Map instead of Set) so they can
  be dismissed individually when the approval is resolved
- Dismiss OS notification in respondToToolApproval (via UI or action)
- Dismiss OS notification on timeout auto-resolve
- Dismiss all OS notifications on cleanupRun (team stop/exit)
- Respect snoozedUntil — skip notification if user snoozed all
2026-03-21 13:34:03 +02:00
iliya
987ad96f4a feat: OS notification for tool approvals with Allow/Deny actions
When a tool needs approval and the app is not focused, show a native
OS notification with clear description (tool name + file/command).

On macOS: notification includes Allow and Deny action buttons that
respond directly without switching to the app.
On all platforms: clicking the notification focuses the app window.

New setting: notifyOnToolApproval (default: true) in notification
settings with ShieldQuestion icon toggle.
2026-03-21 13:27:39 +02:00
iliya
e837eb7db8 feat: implement draft team handling and metadata storage
- Added functionality to read draft team summaries from team.meta.json when config.json is missing.
- Introduced methods to save team-level metadata to team.meta.json during team creation.
- Updated UI components to handle draft teams, including launch and delete options.
- Enhanced error handling for draft teams in various components.
2026-03-21 12:48:18 +02:00
iliya
73661c80a4 feat: auto-allow all tools toggle + fix team color fallback
- Add autoAllowAll setting: overrides all individual auto-allow rules,
  instantly approves every tool call without user interaction
- Settings panel: "Auto-allow all tools" checkbox at top, individual
  checkboxes greyed out when all-allow is active
- Fix team color badge: use getTeamColorSet(teamName) as fallback
  instead of getMemberColorByName which uses a different palette
  and produced wrong colors (yellow instead of pink)
2026-03-21 12:25:06 +02:00
iliya
ab2c40d358 fix: populate team color/displayName in tool approval from config.json
syntheticRequest for team launch was missing color and displayName
fields — they only existed in TeamCreateRequest (create flow).
Now reads color and name from config.json when building
syntheticRequest, so ToolApprovalRequest always has team color.
2026-03-21 12:15:13 +02:00
iliya
a6fc7f82d3 feat: tool approval improvements — diff preview, error feedback, provisioning fix
- Add diff preview for Write/Edit tools: reads current file via new IPC
  (TEAM_TOOL_APPROVAL_READ_FILE), shows unified diff using existing DiffViewer
- Fix Allow button doing nothing: re-throw errors from store instead of
  silently swallowing, show error message in UI, add 10s safety timeout
- Fix "No active process" during provisioning: use getTrackedRunId() to
  find process in both provisioning and alive maps
- Add 5s stdin.write timeout to prevent hanging when process dies
- Add syntax highlighting for tool input preview (JSON, bash, etc.)
- Add team color/name badge from ToolApprovalRequest (works during provisioning)
- Conditionally show team badge only when user is on a different team page
- Format elapsed time as Xm Ys when over 60 seconds
- Replace native <select> with Radix UI Select in settings panel
2026-03-20 18:41:01 +02:00
iliya
6d066831eb feat: implement deduplication for concurrent server start calls
- Enhanced the HttpServer class to prevent multiple concurrent calls to the start() method by introducing a startingPromise that ensures subsequent calls await the same promise.
- Added a private doStart method to encapsulate the server startup logic.
- Updated documentation to reflect the new behavior of the start method.

- Adjusted the ActivityTimeline component to improve padding in the "No messages" state for better visual alignment.
2026-03-20 16:19:51 +02:00
iliya
38507d7437 fix: handle ENOENT error gracefully in file reading functions
- Updated error handling in both registerUtilityRoutes and handleReadMentionedFile functions to return null for expected ENOENT errors, indicating that the file simply does not exist. This improves robustness in scenarios with stale or misdetected file references.
- Enhanced the isValidFileRef function to require either 3+ segments or a file extension to avoid false positives for npm scoped packages, ensuring more accurate file reference validation.
2026-03-20 14:26:47 +02:00
iliya
57221f4e57 feat: update development partitioning for persistent storage
- Changed the development partitioning strategy to use a fixed name ('persist:dev') instead of a per-PID approach. This allows renderer-side storage (localStorage, IndexedDB) to survive app restarts, improving data stability during development.
2026-03-20 14:20:14 +02:00
iliya
01a1472e4c feat: enhance team provisioning process with pre-creation of configuration
- Updated the TeamProvisioningService to pre-create team configuration and member metadata before spawning the CLI, ensuring persistence even in case of failures.
- Modified return messages to reflect the new provisioning flow, indicating that the team configuration has been pre-created.
- Adjusted the steps in the provisioning process to streamline the creation and provisioning of teams, improving overall user experience.
2026-03-20 14:06:01 +02:00
iliya
f01defc32c feat: require task comment with results before task_complete, add task_get_comment MCP tool
Teammates must now post full results as a task comment (via task_add_comment)
before calling task_complete, then send a brief summary to the lead with
a pointer to the comment (first 8 chars of comment.id). This ensures results
are visible on the task board, not buried in ephemeral direct messages.

- Add task_get_comment MCP tool for fetching a single comment by id/prefix
- Add "save comment.id → use it in SendMessage" flow with concrete examples
- Update all teammate prompts: spawn, reconnect, assignment, briefing, task protocol
- Add task_get_comment to lead's MCP tools list with usage hint
- Optimize resolveTaskRef: fast-path for UUID (skip full dir scan)
2026-03-20 14:04:50 +02:00
iliya
ec547e0662 refactor: enhance task management protocols and UI components
- Updated task management guidelines to emphasize the importance of posting task comments before marking tasks as complete, ensuring visibility of results on the task board.
- Introduced a new notification system for team leads after task completion, summarizing key findings and linking to detailed comments.
- Improved UI components, including a new CLI checking spinner with a delayed hint and enhanced task filters to support unread/read task states.
- Refactored sidebar task item styles to visually indicate unread tasks and adjusted task sorting options to include 'unread' as a criterion.
- Enhanced settings tabs with tooltips for better user guidance and improved layout for advanced settings options.
2026-03-20 13:45:03 +02:00
iliya
1d15f5f4d9 fix: MCP server entrypoint not found in packaged builds
In packaged Electron apps process.cwd() does not point to the app
directory so the mcp-server bundle was never found. Additionally the
mcp-server dist was not included in the package at all.

Changes:
- Bundle mcp-server into a single self-contained ESM file (tsup
  noExternal + createRequire banner for CJS compat)
- Ship mcp-server/dist/index.js and package.json via extraResources
- Resolve entry via process.resourcesPath when app.isPackaged is true
- Build controller + mcp-server in prebuild so dist exists before
  electron-builder runs
- Add mcp-server/dist/index.js to CI verify steps on all platforms
- Improve error message to list checked paths for easier debugging
2026-03-20 13:21:51 +02:00
iliya
4bdfcbcb72 fix: posix PATH segments on Windows CI; sort imports for lint 2026-03-19 22:42:58 +02:00
iliya
731d15b722 fix: packaged app CLI login detection, PATH merge, IPC status cache 2026-03-19 22:41:52 +02:00
iliya
927c8b5c30 refactor: clean up legacy code and improve import statements in ApiKeyService and CliInstallerService
- Removed legacy comments and fields in ApiKeyService to streamline code.
- Updated import statements in CliInstallerService for better organization.
2026-03-19 19:10:32 +02:00
iliya
511abaa0f5 feat: enhance shell environment handling for CLI processes
- Added a pre-warming mechanism for the interactive shell environment at app startup to improve PATH resolution for CLI services.
- Introduced getCachedShellEnv function to retrieve the cached shell environment synchronously, aiding in non-blocking PATH enrichment.
- Updated buildChildEnv function to incorporate enriched PATH from the cached shell environment, ensuring reliable access to user-installed binaries.
- Refactored CLI process environment setup to utilize the binary path for more accurate environment configuration.
2026-03-19 18:51:44 +02:00
iliya
16f3fa51a3 refactor: clean up code and improve readability across multiple files
- Removed unnecessary eslint disable comments related to intentional mutations for clarity.
- Updated import statements for consistency and organization.
- Refactored regex patterns and utility functions in various components to enhance performance and maintainability.
- Improved error handling and notifications for API errors in the teams IPC module.
- Streamlined the handling of DOM mutations in the ChatHistory and other components for better readability.
- Enhanced type definitions and added utility functions to improve code structure and type safety.
2026-03-19 14:07:14 +02:00
iliya
08f22121c6 feat: enhance error handling and notifications for API errors
- Implemented a new mechanism to detect and notify users of API errors within team communications, improving error visibility.
- Updated the ActivityItem and ThoughtBodyContent components to visually indicate API errors with distinct styling.
- Enhanced the TaskDetailDialog and KanbanTaskCard components to improve user experience by providing clearer feedback on task dependencies and statuses.
- Refactored the teams IPC module to include checks for API errors, ensuring timely notifications are sent to users.
2026-03-19 12:47:00 +02:00
iliya
33ba4bdeab feat: include comments in GlobalTask payload to restore notification functionality
- Updated TeamDataService to include lightweight comment metadata in the GlobalTask payload, addressing issues with task comment notifications in the renderer.
- Enhanced TeamProvisioningService with a stall watchdog to monitor CLI process responsiveness and emit warnings for extended periods of inactivity.
- Modified CreateTeamDialog and LaunchTeamDialog to ensure default values for selected model and effort are set correctly, improving user experience during team creation and launch.
2026-03-18 14:59:56 +02:00