Adds 'use client' directive to FormInputFields.tsx and widgets.tsx in the
routing-forms package. These components use React hooks (useLocale, setState)
but were missing the client directive, causing React error 185 (invalid hook
call) in production builds due to Next.js App Router bundling differences.
The error only occurred in production, not local dev, because production
builds optimize and bundle packages differently. The widgets.tsx file uses
the useLocale hook in the Button component, and FormInputFields.tsx passes
state setters to child components.
Fixes the reroute dialog error reported in production.
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* Remove auto adding users to an org
* Update tests
* Fix tests
* fix: Update organization invitation E2E tests to not expect auto-accept before signup
- Changed isMemberShipAccepted expectations from true to false before signup
- Users with emails matching orgAutoAcceptEmail are no longer auto-accepted
- They must explicitly accept the invitation after signup
- Fixed lint warnings for unused parameters
Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
* fix: Update E2E tests to expect pending membership after signup without auto-accept
Since auto-accept functionality was removed, users with emails matching
orgAutoAcceptEmail are no longer automatically accepted into organizations
after signup. They remain in pending state until explicitly accepted.
Updated assertions in:
- 'nonexisting user is invited to Org' test
- 'nonexisting user is invited to a team inside organization' test
Both tests now correctly expect isMemberShipAccepted: false after signup.
Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
* Restore `verify-email` and tests from `main`
* Add `orgAutoJoinOnSignup` to `organizationSettings`
* Update
`OrganizationRepository.findUniqueNonPlatformOrgsByMatchingAutoAcceptEmail`
to find orgs where `orgAutoJoinOnSignup` is true
* `organization.update` lint fix
* `organization.update` to handle `orgAutoJoinOnSignup`
* Create toggle for `orgAutoJoinOnSignup`
* test: Add comprehensive tests for orgAutoJoinOnSignup functionality
- Update existing test to expect null instead of error when multiple orgs match
- Add test for when orgAutoJoinOnSignup is false (should return null)
- Add test for when orgAutoJoinOnSignup is true (should return org)
- Add test for default behavior (orgAutoJoinOnSignup defaults to true)
These tests verify that the new orgAutoJoinOnSignup setting correctly controls
whether users are automatically added to organizations during email verification.
Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
* Type fix
* e2e: invited users should be accepted after signup (address cubic r2511916791)
Reverted post-signup isMemberShipAccepted assertions from false to true for
explicit invite scenarios. When users are explicitly invited to an org/team
and complete signup via invite link, their membership should be accepted.
This is distinct from auto-join by domain (controlled by orgAutoJoinOnSignup),
which only affects users who sign up without an invite but match the org's
email domain.
Backend sets membership.accepted = true on invite completion in:
packages/features/auth/signup/utils/createOrUpdateMemberships.ts:61,67,77,83
Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
* Fix API V2 build
---------
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-11-13 15:13:10 -03:00
Rodrigo EhlersGitHubeunjae@cal.com <hey@eunjae.dev>Eunjae LeeDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* bookings page redesign work in progress
fix: duplicate translation key
chore: use newly supported separator type
remove outdated BookingDetailsSheet
remove dropdown and related code
revert unncessary changes
* fix wrong rebase
* fix type error
* refactor: separate bookings columns into filter and display columns (#24959)
* refactor: separate bookings columns into filter and display columns
- Extract filter-only columns into shared filterColumns.ts
- Extract list display columns into listColumns.tsx
- Create BookingsListContainer for list view with both column sets
- Create BookingsCalendarContainer for calendar view with filter columns only
- Refactor bookings-view.tsx to use dynamic imports for containers
- Remove column/table creation logic from bookings-view.tsx
This ensures calendar view doesn't import list-specific UI components (AvatarGroup, Badge, etc.)
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: return null instead of false for separator rows in filter accessors
The filter accessor functions were returning false for separator rows instead of null,
which would pollute the multi-select filters with bogus 'false' values.
This fix ensures that separator rows return null so they are properly excluded from filters.
Addresses cubic AI reviewer feedback on PR #24959
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* clean up filter column visibility
* feat: integrate booking calendar view with re-designed list (#24973)
* add toggle button
* remove the dateRange filter when switching from calendar to list view
* move "view" to the action dropdown
* add close button the details sheet
* move close button
* fix more button behavior
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix type error
* update the test case
* fix e2e util
* fix actions dropdown
* revert e2e tests
* fix type error on BookingActionsDropdown.tsx
* fix: include today's bookings in flatData for past status
Previously, flatData excluded groupedBookings.today, which caused
past bookings that happened today to not show up when status === 'past'.
This fix includes today's bookings in flatData for all statuses.
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* improve attendee cell
* fix e2e tests
* change max
* fix e2e
* add reschedule requested message
* fix e2e
* update e2e
* remove flaky checks
---------
Co-authored-by: Eunjae Lee <hey@eunjae.dev>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* remove add variable dropdown
* feat: lang support
* fix: type errors
* feat: select voice agent
* refactor: address feedback
* refactor: address feedback
* refactor: missing import
* fix: types
* add getAllWorkflowsFromRoutingForm to WorkflowService
* fix error caused by undefined evt
* fix type error
* fix type error
* fix tests
* feat: add inbound calls
* chore: formatting
* chore
* feat: finish inbound call
* chore: formatting
* fix: update bug
* fix: types
* code clean up
* final fixes and clean up
* remove console.log
* remove template text form from triggers
* add routing form repoditory function
* refactor: Agent Configuration Sheet (#23930)
* refactor: agent configuration sheet
* chore: use default phone numbre
* refactor: improvements
* refactor: improvements
* fix: types
* fix: feedback
* fix bug with key
* chore:
* fix: feedback
* fix: prompt
* add comments
* fix: review
* fix: review
* refactor: class
* refactor: class
* fix test
* allow cal ai action on form triggers
* move any reusable code to scheduleAIPhoneCall
* add missing await
* use predefined FormSubmissionData type
* add .trim() to sms message
* pass contextData instead
* finish base setup
* add missing trigger in update-workflow.input.ts
* allow cal.ai action for form triggers in handler
* chore: add support for form workflows on api v2
* fixup! chore: add support for form workflows on api v2
* ai phone call on form submissions (WIP)
* use existing type for Option array
* pass chosen event type id
* refactor: rename
* Update apps/web/public/static/locales/en/common.json
* Update apps/web/public/static/locales/en/common.json
* add missing imports
* chore: update set value
* fix: remove index
* fix: type error
* fix: update tetss
* use only repository functions in update handler
* move all prisma queries from list.handler
* review suggestions
* fix: use logger
* chore: handle workflows api v2
* chore: handle workflows api v2, split in 2 endpoints
* fix workflow step creation
* remove connect agent and fixes types
* add type to workflow
* chore: use workflow type in apiv2 WorkflowsOutputService
* update worklfow type on update
* chore: use workflow type in apiv2 WorkflowsOutputService
* fix template body for torm trigger
* some UI fixes for email subject/body
* resetting email body when changing form triggers
* use type field to query workflows
* clean up all old active on values
* remove responseId from all funciton calls
* remove undefined from updateTemplate
* refactor: don't use static
* fix: type
* refactor: split routing form and event-type workflows code
* refactor: split routing form and event-type workflows code
* fix template text when adding action
* chore: don't rename WorkflowActivationDto to avoid ci blocking
* refine update schedule to use only allowed actions
* fix type error
* don't allow whatsapp action with form trigger
* fix type error
* return early if activeOn array is empty
* fix: from step type in BaseFormWorkflowStepDto
* fixup! fix: from step type in BaseFormWorkflowStepDto
* api v2 updates
* move all prisma calls to repository (service/workflows.ts)
* use FORM_TRIGGER_WORKFLOW_EVENTS for form queries
* use userRepository
* use FORM_TRIGGER_WORKFLOW_EVENTS in isFormTrigger
* code clean up
* code clean up
* use repository functions in formSubmissionValidation.ts
* fix: schema
* refactor:
* remove action check in update handler
* add event type selection
* event type selector improvements
* adjust update.handler
* set outboundEventTypeId
* add back trpc import
* fix agent repository functions
* clean up
* fix bugs caused by merge
* pass eventTypeId to updateToolsFromAgentId
* add migration for outboundEventTypeId
* add SMS actions to allowed form action constants
* add cal ai to allowed form actions
* pick correct event type for web call
* pass correct routed event type id
* remove unsued import
* fixes for offset api v2
* add missing responseId
* fix failing test
* fix failing test
* improve error message
* remove unused imports
* chore: handle sms step action for form worklfow in dtos
* fix typo
* missing missing newStep
* minor fixes
* remove changes
* add routedEventTypeId
* fix type error
* fix type error
* fix typ error in executAPIPhoneCall.tsx
* add back inboundEventTypeId
* remove console.log
* remove outdated code
* small fixes
* don't throw error for missing phone number
* add back filtered triggerOptions
* fix eventTypeId in testCall handler
* fix type error
* update migration
* fix trigger is not defined
* convert eventTypeId to string
* only use outboundEventTypeId for FORM_SUBMITTED trigger
* show toast when no event type selected
* fix type errors
* add missing translation
* fix type error
* remove callType
* fix tests
* small fixes
* clean up AgentConfigurationSheet
* remove EventTypeSelector file
* code clean up
* clean up
* clean up
* use resusable function for TestPhoneCallDialog and WebCallDialog
* rename result
* fix types for event type id
* use repository runction in workflowReminder.ts
* fix type error
* pass eventTypeIds correctly
* fix typo
* custom variables from form responses
* remove comment
* Update apps/web/public/static/locales/en/common.json
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* use watch instead of getValues
* change to z.record(z.unknown()) instead of any()
* fix type of eventTypeId
* check permissinon for outBoundEventTypeId
* add isNaN check
* improve function name
* add tests
* fixes for custom variables
* improve test
* update tools when outbound agent event type id changes
* handle undefined eventDate in customTemplate
* add info how to use form responses as variables
* rename responses to routingFormResponses
* remove cal ai from allowed steps api v2
* remove old migration file
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Udit Takkar <udit222001@gmail.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
Co-authored-by: cal.com <morgan@cal.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
## What does this PR do?
- Redesigns the organization onboarding flow by merging the brand and details pages
- Improves the organization details page with a scrollable interface and visual previews
- Adds a new organization-specific browser preview component
## Visual Demo (For contributors especially)
#### Image Demo:
- The PR replaces the separate brand page with an integrated details page that includes logo and banner uploads
- The new organization browser view shows a preview of the organization profile with the selected branding
## Mandatory Tasks (DO NOT REMOVE)
- [ ] I have self-reviewed the code.
- [ ] I have updated the developer docs in /docs if this PR makes changes that would require a documentation change. If N/A, write N/A here and check the checkbox.
- [ ] I confirm automated tests are in place that prove my fix is effective or that my feature works.
## How should this be tested?
- Go through the organization onboarding flow
- Test uploading logos and banners
- Verify that the organization browser preview updates in real-time with the form inputs
- Confirm that the form validation works correctly for organization name and slug
- Check that the scrollable interface works properly with fade effects at top and bottom
## Checklist
- I have read the [contributing guide](https://github.com/calcom/cal.com/blob/main/CONTRIBUTING.md)
- My code follows the style guidelines of this project
- I have commented my code, particularly in hard-to-understand areas
- I have checked if my changes generate no new warnings
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Split organization brand from the details step and added live previews for organizations and teams. Revamped org/team invites with reusable components, a dedicated email-invite page, and a CSV upload modal.
- **New Features**
- Separate Brand step with logo, banner, and color; instant org preview via OnboardingOrganizationBrowserView.
- Teams browser preview added; invites include email substep (/onboarding/organization/invite/email, /onboarding/teams/invite/email), CSV upload (template + parsing), and Google Workspace (behind flag).
- Shared components (EmailInviteForm, InviteOptions, RoleSelector) used across org and team invites.
- **Refactors**
- Updated org flow: Details → Brand → Teams → Invites; OnboardingLayout now supports dynamic step counts (org=4, team=3, personal=2).
- UI polish (OnboardingCard header padding) and org-specific previews now replace generic views across details/brand/invites/teams; ensured org welcome modal takes precedence over personal.
<sup>Written for commit d9b55c0b5505aa0d4ca1c4298a513bcd90606915. Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
2025-11-13 10:45:42 +00:00
Eunjae LeeGitHubeunjae@cal.com <hey@eunjae.dev>Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix: enable webhook form submit button when all required fields are filled
The submit button was disabled even when all fields were filled because
the form relied on isDirty state. Since eventTriggers are pre-populated
with default values, the form never became dirty until the user manually
changed the triggers.
This fix adds validation logic that:
- For new webhooks: checks if required fields (URL, triggers) are filled
- For editing webhooks: preserves the existing isDirty behavior
- Handles the conditional time/timeUnit requirement for no-show triggers
Fixes the issue where users had to manually change event triggers to
enable the submit button even though all required information was filled.
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* refactor: extract webhook form validation logic to computed variables
Replaced IIFE in disabled prop with clean computed variables:
- Extracted all watch() calls to the top of the component
- Computed validation logic as clear, named variables
- Reused needsTime for showTimeSection to avoid duplicate watch calls
- Simplified button disabled prop to just !canSubmit
This improves code readability and maintainability while preserving
the same validation behavior.
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: resolve type error by moving canSubmit computation after changeSecret declaration
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: auto-initialize time/timeUnit for webhooks with no-show triggers
When creating a webhook with default event triggers that include no-show
triggers (AFTER_HOSTS_CAL_VIDEO_NO_SHOW or AFTER_GUESTS_CAL_VIDEO_NO_SHOW),
the time and timeUnit fields are now automatically initialized to default
values (5 minutes). This ensures the submit button is enabled when all
required fields are filled, fixing E2E test failures in webhook.e2e.ts.
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-11-13 10:32:17 +00:00
Benny JooGitHubbenny@cal.com <sldisek783@gmail.com>Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* remove billing service factory
* remove index file
* update internal team billing
* update test
* fix unit test
* fix: update internal-team-billing tests to use direct StripeBillingService mocking
- Changed mock path from @calcom/features/ee/billing/stripe-billing-service to ../stripe-billing-service to match actual import
- Used vi.hoisted() to ensure mock functions are available in hoisted mock factory context
- Changed vi.resetAllMocks() to vi.clearAllMocks() and re-apply mock implementation in beforeEach to preserve constructor mock
- Removed obsolete vi.mock("..") for deleted billing singleton module
- Fixed test pollution by creating new instances instead of mutating shared state
- Removed describe-level instance creation that was executed before mocks were set up
- All 12 tests now pass successfully
Co-Authored-By: benny@cal.com <sldisek783@gmail.com>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* chore: Add system wide rate limiting
* Handle and convert HttpError to 429
* Make algo 32-bit to prevent <ES2020 error + fix sms manager unit test
* Change core to common to go from 10 requests per minute to 200
* Remove redundant function
* Fix integration tests
* Make sure we allow all legal POST routes
* Allow tRPC post calls
* Add matcher tests on middleware
* Add matcher tests on middleware
* Fix matcher to not use regex
* Fix missing POST allow rule for /api/auth/callback/credentials
* Missed the api/book/event endpoints
* Add missing pages/api routes
* Remove POST middleware for now, very risky
* Remove tests for POST protection
---------
Co-authored-by: Volnei Munhoz <volnei.munhoz@gmail.com>
2025-11-12 22:01:59 +00:00
Anik Dhabal BabuGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- Add teamId support to HitPay add.ts installation handler
- Update callback.ts to fetch credentials by teamId for team bookings
- Update webhook.ts to fetch credentials by teamId for team bookings
- Update setup page to accept and handle teamId from query params
- Add permission checks using throwIfNotHaveAdminAccessToTeam
- Ensure credentials are created with teamId for team installs, userId for user installs
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-11-12 21:58:17 +05:30
MorganGitHubmorgan@cal.com <morgan@cal.com>morgan@cal.com <morgan@cal.com>Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix: hide duplicate phone field when attendee phone location selected
* Instead of hiding use autofill the value to all other phone fields
* add e2e test
* add not sync test and use changeHandler instead of useEffect
* address cubics comments
* adding the phone check back
* use zod schema instead of this type casting
* use Enum instead of hardcoded string for phone
* Fix e2e test
* Fix e2e tests
* Delete .retracify.html
---------
Co-authored-by: Eunjae Lee <hey@eunjae.dev>
Co-authored-by: Volnei Munhoz <volnei.munhoz@gmail.com>
Co-authored-by: Volnei Munhoz <volnei@cal.com>
## What does this PR do?
<!-- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. -->
- Fixes #XXXX (GitHub issue number)
- Fixes CAL-XXXX (Linear issue number - should be visible at the bottom of the GitHub issue description)
## Visual Demo (For contributors especially)
A visual demonstration is strongly recommended, for both the original and new change **(video / image - any one)**.
#### Video Demo (if applicable):
- Show screen recordings of the issue or feature.
- Demonstrate how to reproduce the issue, the behavior before and after the change.
#### Image Demo (if applicable):
- Add side-by-side screenshots of the original and updated change.
- Highlight any significant change(s).
## Mandatory Tasks (DO NOT REMOVE)
- [ ] I have self-reviewed the code (A decent size PR without self-review might be rejected).
- [ ] I have updated the developer docs in /docs if this PR makes changes that would require a [documentation change](https://cal.com/docs). If N/A, write N/A here and check the checkbox.
- [ ] I confirm automated tests are in place that prove my fix is effective or that my feature works.
## How should this be tested?
<!-- Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration. Write details that help to start the tests -->
- Are there environment variables that should be set?
- What are the minimal test data to have?
- What is expected (happy path) to have (input and output)?
- Any other important info that could help to test that PR
## Checklist
<!-- Remove bullet points below that don't apply to you -->
- I haven't read the [contributing guide](https://github.com/calcom/cal.com/blob/main/CONTRIBUTING.md)
- My code doesn't follow the style guidelines of this project
- I haven't commented my code, particularly in hard-to-understand areas
- I haven't checked if my changes generate no new warnings
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Polished the onboarding experience with a live calendar preview, a team bio field, and improved username handling. Updated i18n strings and added responsive breakpoints for large screens.
- **New Features**
- Added right-column previews: OnboardingBrowserView in org teams and a live weekly OnboardingCalendarBrowserView for personal calendar setup.
- Introduced team bio in onboarding store and UI.
- Expanded i18n: team bio, browser view labels, and CSV invite flow.
- Added Tailwind screens for 3xl and 4xl to improve large-display layouts.
- **Bug Fixes**
- Normalized usernames with slugify on default and change to prevent invalid slugs.
- Unified disabled/readonly handling for premium vs. standard username fields; respects external disabled prop and org membership.
<sup>Written for commit 7804fad66ee516b25e22fc0d9239f3d29249189a. Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
* fix: validate occurrence count from URL params and refactor validation logic
- Initialize occurrence count from URL query parameter on page load
* fix: change query parameter name from occurenceCount to recurringEventCount
* refactor: simplify occurrence count validation logic
* fix: prevent NaN from being set in recurring event count query parameter
* fix: prevent overlay calendar toggle from overwriting query params
* fix: sync occurrence count state with max occurrences limit
* refactor: rename occurenceCount to recurringEventCountQueryParam
* fix: prevent invalid recurring event count from updating state
- Added validation guard to only update state when recurringEventCountQueryParam is valid (not null or NaN)
- Simplified URL update logic by removing unnecessary empty string fallback
* feat: add recurring event count badge for mobile (#24991)
* feat: display recurring event count badge in mobile
* feat: update recurring event translation key for clarity
* feat: add tooltip to Group Options label in attributes form
- Add InfoBadge component to Group Options label with descriptive tooltip
- Add translation keys 'group_options' and 'group_options_description' to common.json
- Update label to use flex layout for proper InfoBadge alignment
- Tooltip explains that group options create logical groupings of regular options
Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>
* fix: wrap AttributeForm tests with TooltipProvider
- Add Tooltip.Provider wrapper from @radix-ui/react-tooltip to test renders
- Fixes failing tests caused by InfoBadge component requiring tooltip context
- All AttributeForm tests now pass locally
Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* move booking actions into a subfolder
* fix logic to render booking actions dropdown
* skip dropdown portal when rendered from detail sheet
* fix type error
* feat: add delegation credential error webhook trigger
- Add DELEGATION_CREDENTIAL_ERROR to WebhookTriggerEvents enum
- Create DelegationCredentialErrorDTO type for webhook payload
- Implement DelegationCredentialErrorWebhookService
- Add translation for delegation_credential_error
- Enable webhook for API v2 organization webhooks
This webhook will send delegation credential error data to configured URLs when errors occur during calendar authentication with delegation credentials.
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* fix: add delegation credential error payload type and type guards
- Add DelegationCredentialErrorPayloadType to sendPayload.ts
- Update WebhookPayloadType union to include new payload type
- Add isDelegationCredentialErrorPayload type guard function
- Update isEventPayload to exclude delegation credential errors
- Update template application logic to handle new payload type
- Add corresponding payload type to dto/types.ts for consistency
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* feat: add delegation credential error handling to WebhookNotificationHandler
- Add DELEGATION_CREDENTIAL_ERROR case to createPayload switch
- Return payload with error, credential, and user data
- Ensures exhaustive type checking passes for new trigger
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* feat: restrict DELEGATION_CREDENTIAL_ERROR to organization webhooks only
- Add validation in UserWebhooksService to reject DELEGATION_CREDENTIAL_ERROR
- Add validation in EventTypeWebhooksService to reject DELEGATION_CREDENTIAL_ERROR
- Ensures trigger is only available for API v2 organization webhooks as requested
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* feat: wire up delegation credential error webhook emission in calendar services
- Add webhook emission calls in CalendarAuth.ts for Google Calendar delegation errors
- Add webhook emission calls in Office365 CalendarService.ts for Azure AD delegation errors
- Implement actual webhook emission using WebhookRepository pattern
- Fix pre-existing lint warnings in Office365 CalendarService.ts (unused catch variables, unsafe optional chaining)
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* test: add e2e tests for DELEGATION_CREDENTIAL_ERROR webhook trigger
- Add comprehensive e2e tests for creating, retrieving, updating, and deleting webhooks with DELEGATION_CREDENTIAL_ERROR trigger
- Test combining DELEGATION_CREDENTIAL_ERROR with other triggers
- Fix import in triggerDelegationCredentialErrorWebhook.ts to use default import for sendPayload
- Tests follow existing patterns in organizations-webhooks.e2e-spec.ts
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* refactor: remove name field from webhook payload and delete unused service
- Remove name field from triggerDelegationCredentialErrorWebhook function signature and payload
- Update all call sites in GoogleCalendar and Office365 calendar services
- Update DelegationCredentialErrorDTO and DelegationCredentialErrorPayloadType to remove name field
- Delete unused DelegationCredentialErrorWebhookService.ts (dead code - not used anywhere)
- The helper function approach is more appropriate for app-store integrations without DI
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* refactor: make fire-and-forget intent explicit for webhook emission
- Add void cast to all triggerDelegationCredentialErrorWebhook calls
- Remove redundant .catch() handlers (helper already handles errors internally)
- This makes it clear that webhook emission is non-blocking by design
- Avoids delaying error propagation while webhook HTTP requests complete
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* feat: await webhook emission and add HTTP timeout for guaranteed delivery
- Change all triggerDelegationCredentialErrorWebhook calls from void to await
- Add 10-second timeout to webhook HTTP requests using AbortController
- Remove name field from DelegationCredentialErrorPayloadType to match payload
- Ensures webhooks are sent before error is thrown (per user requirement)
- Prevents indefinite hangs on unresponsive webhook endpoints
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* fix: make getAuthUrl async and await all call sites
- Make getAuthUrl async to support awaiting webhook emission
- Add await to all 3 getAuthUrl call sites (constructor, getAzureUserId, testDelegationCredentialSetup)
- Remove leftover name field from getAzureUserId webhook call
- Fixes TS1308 error about await in non-async function
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* docs: add JSDoc clarifying error handling guarantees for webhook trigger
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* Revert "docs: add JSDoc clarifying error handling guarantees for webhook trigger"
This reverts commit 3e33090197bfe2f2e3fb890402b32e04c44305e3.
* Revert "fix: make getAuthUrl async and await all call sites"
This reverts commit de28b7337149104412c861fd9b05e76fffc1fed7.
* Revert "feat: await webhook emission and add HTTP timeout for guaranteed delivery"
This reverts commit 9da7241f83a8373b4fadc03ccf34e097c28adf3a.
* Revert "refactor: make fire-and-forget intent explicit for webhook emission"
This reverts commit f4f7fa06b7dfa151bfbea29905b8783261d9f353.
* feat: await webhook emission to match standard pattern
- Updated all webhook call sites to await triggerDelegationCredentialErrorWebhook
- Made getAuthUrl async and updated all 3 call sites to await it
- Removed .catch() wrappers at call sites (error handling is in trigger function)
- Matches standard pattern used in WebhookService.sendPayload with Promise.allSettled
- Ensures webhooks are sent before delegation errors are thrown
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* fix: address PR feedback - add migration, remove 'as any', remove user.name
- Add Prisma migration for DELEGATION_CREDENTIAL_ERROR enum
- Replace 'as any' type casting with safe type-narrowing helper in CalendarAuth.ts
- Remove user.name field from DelegationCredentialErrorPayloadType (email is sufficient)
- Ensure all type definitions are consistent across sendPayload.ts and dto/types.ts
Addresses feedback from alishaz-polymath and morgan@cal.com
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* chore: cleanup type in CalendarAuth
* fix: missing DELEGATION_CREDENTIAL_ERROR in WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP constant
* fix: review
* fit: import webhook dto
* fit: type error
* feat: add delegation credential error webhook handling to Office365 video adapter
- Emit webhook before throwing delegation credential errors in Office365 video
- Added webhook emission in 4 locations:
1. Missing clientId/Secret in fetchNewTokenObject
2. Missing tenantId in getAuthUrl
3. Missing clientId/Secret in getAzureUserId
4. User doesn't exist in Azure AD
- Made getAuthUrl async to support webhook emission
- Follows same pattern as GoogleCalendar and Office365Calendar implementations
Co-Authored-By: morgan@cal.com <morgan@cal.com>
Co-Authored-By: rajiv@cal.com <sahalrajiv6900@gmail.com>
* fixup! Merge branch 'devin/delegation-credential-errors-webhook-1762171203' of https://git-manager.devin.ai/proxy/github.com/calcom/cal.com into devin/delegation-credential-errors-webhook-1762171203
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: cal.com <morgan@cal.com>
* add trigger
* small fixes
* add missing workflow DTOs
* small fixes
* use activeOnWithChildren
* fix active on when switching trigger type
* remove add variable dropdown
* feat: lang support
* fix: type errors
* feat: select voice agent
* refactor: address feedback
* refactor: address feedback
* refactor: missing import
* fix: types
* add getAllWorkflowsFromRoutingForm to WorkflowService
* fix error caused by undefined evt
* fix type error
* fix type error
* fix tests
* feat: add inbound calls
* chore: formatting
* chore
* feat: finish inbound call
* chore: formatting
* fix: update bug
* fix: types
* code clean up
* final fixes and clean up
* remove console.log
* remove template text form from triggers
* add routing form repoditory function
* refactor: Agent Configuration Sheet (#23930)
* refactor: agent configuration sheet
* chore: use default phone numbre
* refactor: improvements
* refactor: improvements
* fix: types
* fix: feedback
* fix bug with key
* chore:
* fix: feedback
* fix: prompt
* add comments
* fix: review
* fix: review
* refactor: class
* refactor: class
* fix test
* allow cal ai action on form triggers
* move any reusable code to scheduleAIPhoneCall
* add missing await
* use predefined FormSubmissionData type
* add .trim() to sms message
* pass contextData instead
* finish base setup
* add missing trigger in update-workflow.input.ts
* allow cal.ai action for form triggers in handler
* chore: add support for form workflows on api v2
* fixup! chore: add support for form workflows on api v2
* ai phone call on form submissions (WIP)
* use existing type for Option array
* pass chosen event type id
* refactor: rename
* Update apps/web/public/static/locales/en/common.json
* Update apps/web/public/static/locales/en/common.json
* add missing imports
* chore: update set value
* fix: remove index
* fix: type error
* fix: update tetss
* use only repository functions in update handler
* move all prisma queries from list.handler
* review suggestions
* fix: use logger
* chore: handle workflows api v2
* chore: handle workflows api v2, split in 2 endpoints
* fix workflow step creation
* remove connect agent and fixes types
* add type to workflow
* chore: use workflow type in apiv2 WorkflowsOutputService
* update worklfow type on update
* chore: use workflow type in apiv2 WorkflowsOutputService
* fix template body for torm trigger
* some UI fixes for email subject/body
* resetting email body when changing form triggers
* use type field to query workflows
* clean up all old active on values
* remove responseId from all funciton calls
* remove undefined from updateTemplate
* refactor: don't use static
* fix: type
* refactor: split routing form and event-type workflows code
* refactor: split routing form and event-type workflows code
* fix template text when adding action
* chore: don't rename WorkflowActivationDto to avoid ci blocking
* refine update schedule to use only allowed actions
* fix type error
* don't allow whatsapp action with form trigger
* fix type error
* return early if activeOn array is empty
* fix: from step type in BaseFormWorkflowStepDto
* fixup! fix: from step type in BaseFormWorkflowStepDto
* api v2 updates
* move all prisma calls to repository (service/workflows.ts)
* use FORM_TRIGGER_WORKFLOW_EVENTS for form queries
* use userRepository
* use FORM_TRIGGER_WORKFLOW_EVENTS in isFormTrigger
* code clean up
* code clean up
* use repository functions in formSubmissionValidation.ts
* fix: schema
* refactor:
* remove action check in update handler
* add event type selection
* event type selector improvements
* adjust update.handler
* set outboundEventTypeId
* add back trpc import
* fix agent repository functions
* clean up
* fix bugs caused by merge
* pass eventTypeId to updateToolsFromAgentId
* add migration for outboundEventTypeId
* add SMS actions to allowed form action constants
* add cal ai to allowed form actions
* pick correct event type for web call
* pass correct routed event type id
* remove unsued import
* fixes for offset api v2
* add missing responseId
* fix failing test
* fix failing test
* improve error message
* remove unused imports
* chore: handle sms step action for form worklfow in dtos
* fix typo
* missing missing newStep
* minor fixes
* remove changes
* add routedEventTypeId
* fix type error
* fix type error
* fix typ error in executAPIPhoneCall.tsx
* add back inboundEventTypeId
* remove console.log
* remove outdated code
* small fixes
* don't throw error for missing phone number
* add back filtered triggerOptions
* fix eventTypeId in testCall handler
* fix type error
* update migration
* fix trigger is not defined
* convert eventTypeId to string
* only use outboundEventTypeId for FORM_SUBMITTED trigger
* show toast when no event type selected
* fix type errors
* add missing translation
* fix type error
* remove callType
* fix tests
* small fixes
* clean up AgentConfigurationSheet
* remove EventTypeSelector file
* code clean up
* clean up
* clean up
* use resusable function for TestPhoneCallDialog and WebCallDialog
* rename result
* fix types for event type id
* use repository runction in workflowReminder.ts
* fix type error
* pass eventTypeIds correctly
* fix typo
* Update apps/web/public/static/locales/en/common.json
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* use watch instead of getValues
* change to z.record(z.unknown()) instead of any()
* fix type of eventTypeId
* check permissinon for outBoundEventTypeId
* add isNaN check
* improve function name
* update tools when outbound agent event type id changes
* pass missing outboundEventTypeId
* update migration
* fix test
* remove cal-ai step from test
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Udit Takkar <udit222001@gmail.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
Co-authored-by: cal.com <morgan@cal.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
2025-11-11 15:24:31 +02:00
MorganGitHubmorgan@cal.com <morgan@cal.com>Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>hbjORbj
* refactor: Split EmailManager into focused service files
- Created separate service files for different email categories:
- auth-email-service.ts: Authentication and verification emails
- organization-email-service.ts: Organization and team emails
- billing-email-service.ts: Payment and credit-related emails
- integration-email-service.ts: Integration and app-related emails
- workflow-email-service.ts: Workflow and custom emails
- recording-email-service.ts: Recording and transcript emails
- Refactored email-manager.ts to keep only core booking lifecycle functions
- Removed unused imports from email-manager.ts
- Updated index.ts to export from all new service files
- Updated all imports across the codebase to use package root (@calcom/emails)
- Fixed lint warnings in handleChildrenEventTypes.ts
This reduces the import cost of EmailManager by allowing consumers to import only the specific email services they need.
Co-Authored-By: morgan@cal.com <morgan@cal.com>
* refactor: Update all imports to use direct service file paths
- Update 49 files to import directly from service files instead of barrel file
- Update packages/emails/index.ts to keep only email-manager and renderEmail exports
- Fix dynamic import in passwordResetRequest.ts
- Update renderEmail imports to use direct path
- Update test file to import from specific service module
- Fix ESLint warnings in modified files (unused variables, unused expressions)
This ensures consumers only import the specific email services they need,
reducing import cost by avoiding the barrel file pattern for service files.
Co-Authored-By: morgan@cal.com <morgan@cal.com>
* fix: Use default import for renderEmail
renderEmail is exported as a default export, not a named export.
Changed from 'import { renderEmail }' to 'import renderEmail'.
Co-Authored-By: morgan@cal.com <morgan@cal.com>
* fix: Update test mocks to use direct service file imports
- Update handleNoShowFee.test.ts to mock @calcom/emails/billing-email-service
- Update credit-service.test.ts to mock @calcom/emails/billing-email-service
- These tests were failing because they were mocking the barrel file @calcom/emails
which no longer exports service functions after the refactoring
Co-Authored-By: morgan@cal.com <morgan@cal.com>
* fix: unit test spy
* fix: unit test mock
* address cubic comments
* fix: type error sendMonthlyDigestEmail
* remove barrel file and sendEmail unused task
* fixup! remove barrel file and sendEmail unused task
* fixup! fixup! remove barrel file and sendEmail unused task
* fix: integration test mock emails
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: hbjORbj <sldisek783@gmail.com>
## What does this PR do?
- Adds a welcome modal for new Cal.com users
- Implements timezone display in the weekly calendar view
- Creates a hook for fetching onboarding calendar events
## Visual Demo (For contributors especially)
#### Image Demo:


## Mandatory Tasks
- [x] I have self-reviewed the code
- [x] I have updated the developer docs in /docs
- [x] I confirm automated tests are in place that prove my fix is effective or that my feature works.
## How should this be tested?
1. **Welcome Modal:**
- Create a new user account
- Verify the welcome modal appears with correct content
- Test the "Continue" button closes the modal
- Check that the modal can be triggered via URL parameter `?welcomeToCalcomModal=true`
2. **Timezone Display:**
- Go to the weekly calendar view
- Verify the timezone is displayed correctly when `showTimezone` is enabled
- Test with different timezones to ensure proper formatting
3. **Onboarding Calendar Events:**
- Test the hook by connecting a calendar during onboarding
- Verify events are fetched and displayed correctly
- Check that events refresh when new calendars are connected
## Checklist
- I have read the [contributing guide](https://github.com/calcom/cal.com/blob/main/CONTRIBUTING.md)
- My code follows the style guidelines of this project
- I have commented my code, particularly in hard-to-understand areas
- I have checked if my changes generate no new warnings
* refactor: create team event type hosts
* refactor: update team event type hosts
* feat: allow switching between collective and round robin
* fix: make schedulingType optional when updating
* fix: e2e tests
* fix: e2e and add more tests
* test: only hosts update
* fix: remove test that makes no sense
* fix: skip email verification for reschedules and added test case
* used getNewBookingHandler helper instead of direct import in test
---------
Co-authored-by: Dhairyashil Shinde <93669429+dhairyashiil@users.noreply.github.com>
* chore: Rate limit top level of public booking pages
* Prefix rateLimit keys
* Adding more rate limits
---------
Co-authored-by: Keith Williams <keithwillcode@gmail.com>
* fix: update profile me ednpoint to include name of user
* fix: update user schema
* pass name for user
* implement PR feedback
* chore: implement PR feedback
---------
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
- Replace all references from github.com/calcom/docker to github.com/calcom/cal.com
- Update Contributing section to clarify Docker setup is officially maintained in main repository
- Update Getting Started instructions to clone main cal.com repository
- Update Advanced Users section to reference Dockerfile and docker-compose.yml in root of main repo
- Clarify that Dockerfile and docker-compose.yml are located in root of calcom/cal.com repository
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* test: Add comprehensive security tests for routing forms vulnerability
Add comprehensive test coverage for the getIncompleteBookingSettings handler
vulnerability and ensure entityPrismaWhereClause changes won't break functionality.
Tests added:
1. getIncompleteBookingSettings.handler.test.ts (15 tests)
- Authorization tests for personal and team forms
- Credential sanitization tests (key field should never be exposed)
- Organization hierarchy tests (parent org credentials)
- App filtering tests (only enabled apps)
- Edge cases (no credentials, form not found, etc.)
2. entityPrismaWhereClause.integration.test.ts (13 tests)
- Verifies formQuery, deleteForm, and forms handlers properly scope queries
- Ensures accepted membership is required for team access
- Validates consistent entityPrismaWhereClause usage across handlers
- Prevents regressions when adding role-based filtering
Expected Test Failures:
The getIncompleteBookingSettings tests currently have 4 expected failures that
document the existing vulnerability:
- 2 authorization tests fail (handler doesn't check user access)
- 2 sanitization tests fail (handler leaks the 'key' field with OAuth tokens)
These failures prove the vulnerability exists and document the secure behavior
that should be implemented.
Test Results:
- All 13 entityPrismaWhereClause integration tests pass
- All 18 existing routing-forms test files pass (156 tests)
- 4 security tests fail as expected (documenting the vulnerability)
The tests ensure that:
1. Fixing the vulnerability by adding entityPrismaWhereClause won't break other handlers
2. The key field is never returned in credentials
3. Only authorized users can access forms
4. Team membership requires accepted: true
5. Organization hierarchy is properly handled
Co-Authored-By: Volnei Munhoz <volnei.munhoz@gmail.com>
* Add suggested fix
* Add suggested fix
* fix: enforce authorization scoping and credential sanitization in routing-forms handler
Co-Authored-By: Volnei Munhoz <volnei.munhoz@gmail.com>
* Fix types
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* fix: resolve flaky org-admin integration tests
- Fixed isAdminGuard Prisma query to use explicit 'is' filter for organizationSettings
- Fixed async describe with top-level awaits in _get.integration-test.ts
- Added global setup in setupVitest.ts to prevent race conditions
- Removed duplicate setup logic from individual test files
Root cause: Tests were running in parallel with independent beforeAll setups,
causing race conditions where organizationSettings weren't created before
tests executed. The async describe with top-level awaits made this worse by
executing queries before beforeAll hooks ran.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: move org-admin setup to integration-only setup file
The global setup in setupVitest.ts was running for ALL test workspaces
(including unit tests), causing ECONNREFUSED errors because unit tests
don't have database access.
Changes:
- Created setupVitest.integration.ts with org-admin seeding logic
- Removed database seeding from setupVitest.ts
- Updated vitest.workspace.ts to use integration-only setup file
- Added DATABASE_URL guard to prevent errors when DB is unavailable
This fixes the unit test failures while preserving the fix for flaky
integration tests.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: use globalSetup instead of setupFiles for org-admin seeding
The previous fix using setupFiles didn't work because setupFiles run
AFTER test modules are evaluated. This meant any top-level Prisma
queries in test files would execute before the org-admin seeding.
Changes:
- Moved org-admin seeding to tests/integration/global-setup.ts
- Updated vitest.workspace.ts to use globalSetup for IntegrationTests
- globalSetup runs BEFORE any test modules are loaded, ensuring org
settings exist before tests execute
- Added teardown function to properly disconnect Prisma after tests
This ensures org-admin state is seeded once before all integration
tests run, eliminating the race condition and ensuring tests have
the correct database state.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* debug: add logging to globalSetup to diagnose why tests are failing
Added console.log statements throughout the globalSetup to verify:
- Whether the globalSetup is running at all
- Whether DATABASE_URL is available
- Whether the org teams are found in the database
- Whether the upserts are executing successfully
This will help diagnose why the integration tests are still failing
with org-admin not being detected.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: use absolute path for globalSetup in vitest.workspace.ts
Changed from relative path 'tests/integration/global-setup.ts' to
absolute path using new URL().pathname to ensure Vitest can properly
locate and load the globalSetup file.
This should fix the issue where the globalSetup wasn't being executed
at all (no logs appearing in CI).
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: add serial execution to IntegrationTests workspace
Added sequence.concurrent: false to IntegrationTests workspace to eliminate
inter-file race conditions while stabilizing org-admin seeding. This ensures
tests run one at a time, preventing parallel execution issues that could
cause flaky test failures.
This is a temporary stabilizer that can be reverted once the globalSetup
seeding is confirmed working.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* refactor: use TeamRepository in globalSetup to follow architectural rule
Refactored globalSetup to use TeamRepository instead of direct Prisma
access, following the 'No prisma outside of repositories' architectural
rule.
Changes:
- Created TeamRepository class with methods for finding organizations
and upserting organization settings
- Updated globalSetup to use TeamRepository.withGlobalPrisma()
- Removed direct Prisma imports from globalSetup
This ensures proper separation of concerns and follows the repository
pattern established in the codebase.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: use relative path import for TeamRepository in globalSetup
Changed from package-scoped import '@calcom/lib/server/repository/team'
to relative path import '../../packages/lib/server/repository/team' to
fix module resolution issue.
Added try/catch with logging around the import to surface any remaining
resolution issues in CI logs. This should allow the globalSetup to
execute properly and seed org-admin state before tests run.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* debug: add membership logging to globalSetup to diagnose test failures
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: ensure owner1-acme membership exists in globalSetup
Root cause: CI database snapshot doesn't include the owner1-acme OWNER membership that exists in the current seed file, because cache-db action's cache key doesn't include scripts/seed.ts.
Solution: Add ensureMembership method to TeamRepository and call it in globalSetup to ensure the owner1-acme user has an accepted OWNER membership in the Acme org before tests run.
This fixes the 5 failing org-admin integration tests that depend on this membership.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: ensure all 10 member{0-9}-acme users exist in globalSetup
Add ensureUser method to TeamRepository to create users if they don't exist.
Update ensureMembership to accept MEMBER role in addition to OWNER and ADMIN.
Ensure all 10 member{0-9}-acme users are created with MEMBER role and accepted: true in the Acme org.
This should fix the remaining 4 failing tests that expect multiple org members to exist.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* fix: use upsert instead of create in ensureUser to avoid unique constraint violations
The ensureUser method was using create which could fail if a user with that email already exists.
Switch to upsert to make the operation idempotent and avoid P2002 unique constraint errors.
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
* refactor: clean up debug code and move test repository to proper location
- Remove all console.log debug statements from global-setup.ts
- Remove serial execution from IntegrationTests workspace (restore parallel execution)
- Move TeamRepository to tests/lib/test-team-repository.ts and rename to TestTeamRepository
- Keep all actual fixes: isAdmin Prisma query fix, ensureUser/ensureMembership methods, globalSetup seeding
Co-Authored-By: anik@cal.com <adhabal2002@gmail.com>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>