From 0bccbb503517638ca13249df98c2bf32cccd5eef Mon Sep 17 00:00:00 2001
From: nitin <142569587+ehconitin@users.noreply.github.com>
Date: Wed, 24 Jun 2026 20:32:34 +0530
Subject: [PATCH] rename twenty meeting bot to call recorder (#22093)
---------
Co-authored-by: martmull
---
.../.env.example | 0
.../.gitignore | 0
.../.nvmrc | 0
.../.oxlintrc.json | 0
.../.yarnrc.yml | 0
.../AGENTS.md | 0
.../CLAUDE.md | 0
.../README.md | 36 +++----
.../package.json | 2 +-
.../public/gallery/call-recorder-cover.png} | Bin
.../public/logo.svg | 0
.../src/__tests__/global-setup.ts | 0
.../src/__tests__/schema.integration-test.ts | 5 +-
.../call-recorder/src/application-config.ts | 96 ++++++++++++++++++
...ording-field-universal-identifiers.test.ts | 0
.../src/constants/app-description.ts | 2 +
.../src/constants/app-display-name.ts | 1 +
.../application-universal-identifier.ts | 0
...ion-logic-function-universal-identifier.ts | 0
...record-page-layout-universal-identifier.ts | 0
...ng-front-component-universal-identifier.ts | 0
...ng-page-layout-tab-universal-identifier.ts | 0
...page-layout-widget-universal-identifier.ts | 0
...conds-app-variable-universal-identifier.ts | 2 +
...ll-recording-field-universal-identifier.ts | 2 +
...nutes-app-variable-universal-identifier.ts | 2 +
...-name-app-variable-universal-identifier.ts | 2 +
...conds-app-variable-universal-identifier.ts | 2 +
.../call-recorder-preference-off-option-id.ts | 2 +
...lendar-event-field-universal-identifier.ts | 2 +
...r-event-view-field-universal-identifier.ts | 2 +
.../call-recorder-preference-on-option-id.ts | 2 +
.../src/constants/call-recorder-preference.ts | 4 +
...conds-app-variable-universal-identifier.ts | 2 +
...ording-audio-field-universal-identifier.ts | 0
...ording-video-field-universal-identifier.ts | 0
.../default-role-universal-identifier.ts | 0
...ook-logic-function-universal-identifier.ts | 0
...ate-logic-function-universal-identifier.ts | 0
.../src/default-role.ts | 2 +-
...-failure-reason-on-call-recording.field.ts | 22 ++++
...rder-preference-on-calendar-event.field.ts | 41 ++++++++
...lendar-event-recording.front-component.tsx | 0
.../components/CalendarEventRecording.tsx | 0
.../components/CalendarEventRecordingBody.tsx | 0
.../CalendarEventRecordingContent.tsx | 0
.../components/RecordingTranscript.tsx | 0
.../components/RecordingVideoPlayer.tsx | 0
.../components/TranscriptEntryList.tsx | 0
.../components/TranscriptEntryListItem.tsx | 0
.../components/TranscriptErrorBox.tsx | 0
.../components/TranscriptSpeakerAvatar.tsx | 6 +-
.../components/TranscriptSpeakerChip.tsx | 0
.../recording-theme-css-variables.ts | 0
.../hooks/use-calendar-event-participants.ts | 4 +-
.../hooks/use-calendar-event-recording.ts | 5 +-
...-event-participant-by-speaker-name.type.ts | 0
...lendar-event-recording-participant.type.ts | 0
.../types/transcript-entry.type.ts | 0
...find-active-transcript-entry-index.test.ts | 0
.../format-transcript-timestamp.test.ts | 0
.../get-speaker-name-match-keys.test.ts | 0
.../parse-transcript-entries.test.ts | 0
...-event-participant-by-speaker-name.util.ts | 0
...find-active-transcript-entry-index.util.ts | 0
.../utils/format-transcript-timestamp.util.ts | 0
.../utils/get-absolute-avatar-url.util.ts | 0
...event-participant-for-speaker-name.util.ts | 0
.../utils/get-speaker-name-match-keys.util.ts | 8 +-
.../utils/get-video-file-extension.util.ts | 0
.../utils/parse-transcript-entries.util.ts | 4 +-
.../__tests__/recall-webhook.test.ts | 0
...ryone-left-timeout-seconds-env-var-name.ts | 2 +
...-recorder-everyone-left-timeout-seconds.ts | 1 +
...ecorder-join-early-minutes-env-var-name.ts | 2 +
.../call-recorder-name-env-var-name.ts | 1 +
...one-joined-timeout-seconds-env-var-name.ts | 2 +
...l-recorder-noone-joined-timeout-seconds.ts | 1 +
...-recording-retention-hours-env-var-name.ts | 2 +
...iting-room-timeout-seconds-env-var-name.ts | 2 +
...l-recorder-waiting-room-timeout-seconds.ts | 1 +
.../call-recording-micro-credits-per-hour.ts | 0
.../call-recording-request-status.ts | 0
.../constants/call-recording-status.ts | 0
...efault-call-recorder-join-early-minutes.ts | 1 +
.../constants/default-call-recorder-name.ts | 1 +
...all-recorder-recording-retention-hours.ts} | 2 +-
.../constants/default-recall-region.ts | 0
.../constants/milliseconds-per-minute.ts | 0
.../non-terminal-call-recording-statuses.ts | 0
.../constants/recall-api-key-env-var-name.ts | 0
.../constants/recall-api-max-attempts.ts | 0
.../constants/recall-api-retry-delay-ms.ts | 0
.../constants/recall-bot-automatic-leave.ts | 12 +--
...veryone-left-min-activate-after-seconds.ts | 0
.../constants/recall-bot-recording-config.ts | 8 +-
.../constants/recall-region-env-var-name.ts | 0
.../recall-webhook-secret-env-var-name.ts | 0
.../constants/restricted-field-placeholder.ts | 0
.../constants/stale-bot-state-cron-pattern.ts | 0
.../constants/twenty-page-size.ts | 0
.../complete-call-recording-ingestion.test.ts | 0
.../data/__tests__/fetch-all-nodes.test.ts | 0
.../get-current-workspace-id.test.ts | 3 +-
.../strip-restricted-field-value.test.ts | 0
.../complete-call-recording-ingestion.util.ts | 0
.../data/create-call-recording.util.ts | 0
.../execute-current-schema-mutation.util.ts | 2 +-
.../data/fetch-all-nodes.util.ts | 0
.../fetch-calendar-events-by-filter.util.ts | 8 +-
.../data/fetch-calendar-events-by-ids.util.ts | 0
...alendar-events-by-starts-at-values.util.ts | 0
...l-recordings-by-calendar-event-ids.util.ts | 0
.../find-call-recordings-by-filter.util.ts | 8 +-
.../data/find-call-recordings-by-ids.util.ts | 0
...ind-open-scheduled-call-recordings.util.ts | 0
.../data/get-current-workspace-id.util.ts | 0
.../data/strip-restricted-field-value.util.ts | 0
.../data/update-call-recording.util.ts | 2 +-
...build-call-recorder-policy-result.test.ts} | 24 ++---
.../compute-call-recording-charge.test.ts | 0
...pute-call-recording-id-for-meeting.test.ts | 0
.../compute-real-meeting-key.test.ts | 0
...-call-recording-ingestion-complete.test.ts | 0
...is-call-recording-status-downgrade.test.ts | 0
...solve-call-recorder-policy-result.test.ts} | 30 +++---
...-complete-call-recording-ingestion.test.ts | 0
...ecorder-policy-results-by-meeting.util.ts} | 16 +--
.../build-call-recorder-policy-result.util.ts | 53 ++++++++++
.../build-failed-transcript-marker.util.ts | 0
.../build-pending-transcript-marker.util.ts | 0
.../domain/build-recall-bot-metadata.util.ts | 0
.../build-transcript-failure-reason.util.ts | 7 ++
.../compute-call-recording-charge.util.ts | 0
...pute-call-recording-id-for-meeting.util.ts | 0
.../domain/compute-real-meeting-key.util.ts | 0
.../domain/compute-recall-bot-join-at.util.ts | 10 +-
...-call-recording-ingestion-complete.util.ts | 0
...is-call-recording-status-downgrade.util.ts | 0
.../is-recall-recording-done-signal.util.ts | 0
...atus-code-to-call-recording-status.util.ts | 0
.../domain/parse-transcript-marker.util.ts | 0
...solve-call-recorder-policy-result.util.ts} | 28 ++---
...-complete-call-recording-ingestion.util.ts | 0
.../charge-completed-call-recording.test.ts | 0
...complete-and-charge-call-recording.test.ts | 0
.../converge-diverged-call-recordings.test.ts | 6 +-
.../__tests__/download-transcript.test.ts | 0
.../__tests__/handle-recall-webhook.test.ts | 4 +-
.../heal-call-recordings-missing-bot.test.ts | 0
.../ingest-call-recording-media.test.ts | 0
.../reap-orphaned-call-recorders.test.ts} | 28 ++---
.../reconcile-call-recorder.test.ts} | 58 +++++------
.../cancel-call-recording-request.util.ts | 2 +-
.../charge-completed-call-recording.util.ts | 2 +-
...complete-and-charge-call-recording.util.ts | 0
...ge-diverged-call-recordings-result.type.ts | 0
.../converge-diverged-call-recordings.util.ts | 16 +--
.../flows/download-transcript.util.ts | 4 +-
.../flows/ensure-call-recorder.util.ts} | 6 +-
.../flows/handle-recall-webhook.util.ts | 25 ++---
.../heal-call-recordings-missing-bot.util.ts | 6 +-
.../flows/ingest-call-recording-media.util.ts | 4 +-
.../persist-call-recording-progress.util.ts | 2 +-
.../reap-orphaned-call-recorders.util.ts} | 18 ++--
.../flows/reconcile-call-recorder.util.ts} | 81 +++++++--------
...cording-transcript-artifact-result.type.ts | 2 +-
...call-recording-transcript-artifact.util.ts | 8 +-
.../reschedule-call-recording-bot.util.ts | 4 +-
.../extract-recall-bot-convergence.test.ts | 0
.../extract-recall-media-urls.test.ts | 0
.../__tests__/recall-bot-api.test.ts | 56 +++++-----
.../verify-recall-webhook-signature.test.ts | 0
.../recall-api/cancel-recall-bot.util.ts | 0
.../create-async-recall-transcript.util.ts | 0
.../recall-api/eject-recall-bot.util.ts | 0
.../extract-recall-bot-convergence.util.ts | 0
.../recall-api/extract-recall-bot-id.util.ts | 0
.../extract-recall-media-urls.util.ts | 0
.../recall-api/get-recall-api-config.util.ts | 10 +-
.../recall-api/get-recall-bot.util.ts | 0
.../recall-api/get-recall-recording.util.ts | 0
.../list-recall-transcripts.util.ts | 0
.../list-scheduled-recall-bots.util.ts | 0
.../normalize-recall-timestamp.util.ts | 0
.../parse-recall-webhook-event.util.ts | 0
.../recall-api/recall-bot-api-request.util.ts | 0
.../recall-transcript-summary.type.ts | 0
.../recall-api/reschedule-recall-bot.util.ts | 4 +-
.../retrieve-recall-transcript.util.ts | 0
.../recall-api/schedule-recall-bot.util.ts | 4 +-
.../verify-recall-webhook-signature.util.ts | 0
.../src/logic-functions/recall-webhook.ts | 4 +-
...reconcile-call-recorder-calendar-event.ts} | 22 ++--
.../reconcile-stale-bot-state.ts | 24 ++---
.../types/calendar-event-record.type.ts | 5 +
...order-policy-calendar-event-input.type.ts} | 4 +-
.../types/call-recorder-policy-input.type.ts | 9 ++
...corder-policy-not-required-reason.type.ts} | 2 +-
...ll-recorder-policy-required-reason.type.ts | 1 +
...r-policy-result-for-calendar-event.type.ts | 9 ++
...ecorder-policy-result-for-meeting.type.ts} | 2 +-
.../types/call-recorder-policy-result.type.ts | 12 +++
...ll-recorder-reconciliation-result.type.ts} | 2 +-
.../types/call-recording-record.type.ts | 2 +-
.../types/files-field-value.type.ts | 0
.../types/meeting-recording.type.ts | 0
.../types/recall-bot-metadata.type.ts | 0
.../types/recall-bot-operation-result.type.ts | 0
.../removed-call-recorder-occurrence.type.ts} | 2 +-
.../types/transcript-marker.type.ts | 0
.../logic-functions/utils/as-record.util.ts | 0
.../get-application-variable-value.util.ts | 0
.../utils/get-record-at-path.util.ts | 0
.../logic-functions/utils/get-string.util.ts | 0
.../utils/get-unique-sorted-ids.util.ts | 0
.../utils/is-non-empty-string.util.ts | 0
.../calendar-event-recording-tab.ts | 0
...reference-on-calendar-event.view-field.ts} | 8 +-
.../tsconfig.json | 0
.../tsconfig.spec.json | 0
.../vitest.config.ts | 0
.../vitest.unit.config.ts | 0
.../yarn.lock | 42 ++++----
.../src/application-config.ts | 96 ------------------
.../src/constants/app-description.ts | 2 -
.../src/constants/app-display-name.ts | 1 -
...conds-app-variable-universal-identifier.ts | 2 -
...ll-recording-field-universal-identifier.ts | 2 -
...nutes-app-variable-universal-identifier.ts | 2 -
...-name-app-variable-universal-identifier.ts | 2 -
...conds-app-variable-universal-identifier.ts | 2 -
.../meeting-bot-preference-off-option-id.ts | 2 -
...lendar-event-field-universal-identifier.ts | 2 -
...r-event-view-field-universal-identifier.ts | 2 -
.../meeting-bot-preference-on-option-id.ts | 2 -
.../src/constants/meeting-bot-preference.ts | 4 -
...conds-app-variable-universal-identifier.ts | 2 -
...-failure-reason-on-call-recording.field.ts | 22 ----
...-bot-preference-on-calendar-event.field.ts | 41 --------
.../default-meeting-bot-join-early-minutes.ts | 1 -
.../constants/default-meeting-bot-name.ts | 1 -
...ryone-left-timeout-seconds-env-var-name.ts | 2 -
...eting-bot-everyone-left-timeout-seconds.ts | 1 -
...ing-bot-join-early-minutes-env-var-name.ts | 2 -
.../meeting-bot-name-env-var-name.ts | 1 -
...one-joined-timeout-seconds-env-var-name.ts | 2 -
...eeting-bot-noone-joined-timeout-seconds.ts | 1 -
...-recording-retention-hours-env-var-name.ts | 2 -
...iting-room-timeout-seconds-env-var-name.ts | 2 -
...eeting-bot-waiting-room-timeout-seconds.ts | 1 -
.../build-meeting-bot-policy-result.util.ts | 53 ----------
.../build-transcript-failure-reason.util.ts | 7 --
.../types/calendar-event-record.type.ts | 5 -
.../types/meeting-bot-policy-input.type.ts | 9 --
...meeting-bot-policy-required-reason.type.ts | 1 -
...t-policy-result-for-calendar-event.type.ts | 8 --
.../types/meeting-bot-policy-result.type.ts | 12 ---
258 files changed, 639 insertions(+), 645 deletions(-)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/.env.example (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/.gitignore (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/.nvmrc (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/.oxlintrc.json (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/.yarnrc.yml (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/AGENTS.md (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/CLAUDE.md (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/README.md (83%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/package.json (96%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/public/gallery/twenty-meeting-bot-cover.png => call-recorder/public/gallery/call-recorder-cover.png} (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/public/logo.svg (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/__tests__/global-setup.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/__tests__/schema.integration-test.ts (96%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/application-config.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts (100%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/app-description.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/app-display-name.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/application-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/calendar-event-record-page-layout-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/calendar-event-recording-front-component-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts (100%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-name-app-variable-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-off-option-id.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-option-id.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/call-recording-audio-field-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/call-recording-video-field-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/default-role-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/recall-webhook-logic-function-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/constants/stale-bot-state-logic-function-universal-identifier.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/default-role.ts (92%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-failure-reason-on-call-recording.field.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-preference-on-calendar-event.field.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/calendar-event-recording.front-component.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/CalendarEventRecording.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/CalendarEventRecordingBody.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/CalendarEventRecordingContent.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/RecordingTranscript.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/RecordingVideoPlayer.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/TranscriptEntryList.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/TranscriptEntryListItem.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/TranscriptErrorBox.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/TranscriptSpeakerAvatar.tsx (96%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/components/TranscriptSpeakerChip.tsx (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/constants/recording-theme-css-variables.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/hooks/use-calendar-event-participants.ts (97%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/hooks/use-calendar-event-recording.ts (97%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/types/calendar-event-recording-participant.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/types/transcript-entry.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/__tests__/parse-transcript-entries.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/find-active-transcript-entry-index.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/format-transcript-timestamp.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/get-absolute-avatar-url.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/get-speaker-name-match-keys.util.ts (90%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/get-video-file-extension.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/front-components/utils/parse-transcript-entries.util.ts (96%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/__tests__/recall-webhook.test.ts (100%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-name-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/call-recording-request-status.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/call-recording-status.ts (100%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-name.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-recording-retention-hours.ts => call-recorder/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts} (68%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/default-recall-region.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/milliseconds-per-minute.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/non-terminal-call-recording-statuses.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-api-key-env-var-name.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-api-max-attempts.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-api-retry-delay-ms.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-bot-automatic-leave.ts (75%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-bot-recording-config.ts (71%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-region-env-var-name.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/restricted-field-placeholder.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/stale-bot-state-cron-pattern.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/constants/twenty-page-size.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts (93%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/complete-call-recording-ingestion.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/create-call-recording.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/execute-current-schema-mutation.util.ts (95%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/fetch-all-nodes.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts (92%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/find-call-recordings-by-filter.util.ts (94%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/find-call-recordings-by-ids.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/get-current-workspace-id.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/strip-restricted-field-value.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/data/update-call-recording.util.ts (96%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/domain/__tests__/build-meeting-bot-policy-result.test.ts => call-recorder/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts} (52%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/domain/__tests__/resolve-meeting-bot-policy-result.test.ts => call-recorder/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts} (77%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/domain/aggregate-meeting-bot-policy-results-by-meeting.util.ts => call-recorder/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts} (59%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-call-recorder-policy-result.util.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/build-failed-transcript-marker.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/build-pending-transcript-marker.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/build-recall-bot-metadata.util.ts (100%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-transcript-failure-reason.util.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/compute-call-recording-charge.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/compute-real-meeting-key.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/compute-recall-bot-join-at.util.ts (69%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/is-recall-recording-done-signal.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/parse-transcript-marker.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/domain/resolve-meeting-bot-policy-result.util.ts => call-recorder/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts} (50%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts (99%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/download-transcript.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts (99%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/flows/__tests__/reap-orphaned-meeting-bots.test.ts => call-recorder/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts} (93%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/flows/__tests__/reconcile-meeting-bot.test.ts => call-recorder/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts} (94%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/cancel-call-recording-request.util.ts (88%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/charge-completed-call-recording.util.ts (84%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/complete-and-charge-call-recording.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/converge-diverged-call-recordings.util.ts (94%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/download-transcript.util.ts (89%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/flows/ensure-meeting-bot.util.ts => call-recorder/src/logic-functions/flows/ensure-call-recorder.util.ts} (87%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/handle-recall-webhook.util.ts (94%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts (92%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/ingest-call-recording-media.util.ts (91%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/persist-call-recording-progress.util.ts (97%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/flows/reap-orphaned-meeting-bots.util.ts => call-recorder/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts} (87%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/flows/reconcile-meeting-bot.util.ts => call-recorder/src/logic-functions/flows/reconcile-call-recorder.util.ts} (84%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts (86%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts (92%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/flows/reschedule-call-recording-bot.util.ts (88%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts (95%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/cancel-recall-bot.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/create-async-recall-transcript.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/eject-recall-bot.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/extract-recall-bot-id.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/extract-recall-media-urls.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/get-recall-api-config.util.ts (79%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/get-recall-bot.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/get-recall-recording.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/list-recall-transcripts.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/recall-bot-api-request.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/recall-transcript-summary.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/reschedule-recall-bot.util.ts (94%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/schedule-recall-bot.util.ts (95%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/recall-webhook.ts (95%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/reconcile-meeting-bot-calendar-event.ts => call-recorder/src/logic-functions/reconcile-call-recorder-calendar-event.ts} (86%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/reconcile-stale-bot-state.ts (84%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/types/calendar-event-record.type.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-calendar-event-input.type.ts => call-recorder/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts} (71%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-input.type.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-not-required-reason.type.ts => call-recorder/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts} (66%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-required-reason.type.ts
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-meeting.type.ts => call-recorder/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts} (71%)
create mode 100644 packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result.type.ts
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/types/meeting-bot-reconciliation-result.type.ts => call-recorder/src/logic-functions/types/call-recorder-reconciliation-result.type.ts} (87%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/call-recording-record.type.ts (92%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/files-field-value.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/meeting-recording.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/recall-bot-metadata.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/recall-bot-operation-result.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/logic-functions/types/removed-meeting-bot-occurrence.type.ts => call-recorder/src/logic-functions/types/removed-call-recorder-occurrence.type.ts} (78%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/types/transcript-marker.type.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/as-record.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/get-application-variable-value.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/get-record-at-path.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/get-string.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/get-unique-sorted-ids.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/logic-functions/utils/is-non-empty-string.util.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/src/page-layouts/calendar-event-recording-tab.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts => call-recorder/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts} (63%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/tsconfig.json (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/tsconfig.spec.json (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/vitest.config.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/vitest.unit.config.ts (100%)
rename packages/twenty-apps/internal/{twenty-meeting-bot => call-recorder}/yarn.lock (99%)
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/application-config.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-description.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-display-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-everyone-left-timeout-seconds-app-variable-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-failure-reason-on-call-recording-field-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-join-early-minutes-app-variable-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-name-app-variable-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-noone-joined-timeout-seconds-app-variable-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-off-option-id.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-option-id.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-waiting-room-timeout-seconds-app-variable-universal-identifier.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-failure-reason-on-call-recording.field.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-preference-on-calendar-event.field.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-join-early-minutes.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-name-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds-env-var-name.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-meeting-bot-policy-result.util.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-transcript-failure-reason.util.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/calendar-event-record.type.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-input.type.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-required-reason.type.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type.ts
delete mode 100644 packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/.env.example b/packages/twenty-apps/internal/call-recorder/.env.example
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/.env.example
rename to packages/twenty-apps/internal/call-recorder/.env.example
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/.gitignore b/packages/twenty-apps/internal/call-recorder/.gitignore
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/.gitignore
rename to packages/twenty-apps/internal/call-recorder/.gitignore
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/.nvmrc b/packages/twenty-apps/internal/call-recorder/.nvmrc
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/.nvmrc
rename to packages/twenty-apps/internal/call-recorder/.nvmrc
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/.oxlintrc.json b/packages/twenty-apps/internal/call-recorder/.oxlintrc.json
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/.oxlintrc.json
rename to packages/twenty-apps/internal/call-recorder/.oxlintrc.json
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/.yarnrc.yml b/packages/twenty-apps/internal/call-recorder/.yarnrc.yml
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/.yarnrc.yml
rename to packages/twenty-apps/internal/call-recorder/.yarnrc.yml
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/AGENTS.md b/packages/twenty-apps/internal/call-recorder/AGENTS.md
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/AGENTS.md
rename to packages/twenty-apps/internal/call-recorder/AGENTS.md
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/CLAUDE.md b/packages/twenty-apps/internal/call-recorder/CLAUDE.md
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/CLAUDE.md
rename to packages/twenty-apps/internal/call-recorder/CLAUDE.md
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/README.md b/packages/twenty-apps/internal/call-recorder/README.md
similarity index 83%
rename from packages/twenty-apps/internal/twenty-meeting-bot/README.md
rename to packages/twenty-apps/internal/call-recorder/README.md
index 1d7ab672eb..e75729bcb7 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/README.md
+++ b/packages/twenty-apps/internal/call-recorder/README.md
@@ -1,8 +1,8 @@
-# Twenty Meeting Bot
+# Call Recorder
-Record your meetings automatically and keep every call inside your CRM. Twenty
-Meeting Bot sends a recording bot to your team's calendar meetings, then stores
-the video, audio, and a speaker-attributed transcript on the meeting's record —
+Record your meetings automatically and keep every call inside your CRM. Call
+Recorder sends a recording bot to your team's calendar meetings, then stores the
+video, audio, and a speaker-attributed transcript on the meeting's record —
searchable, in context, and ready for people, AI agents, and workflows to act
on.
@@ -11,7 +11,7 @@ on.
1. A teammate has an upcoming meeting on a synced calendar with a video
conference link (Zoom, Google Meet, Microsoft Teams — anything Recall.ai
supports).
-2. Because recording is on by default, the app schedules a meeting bot to join
+2. Because recording is on by default, the app schedules a call recorder to join
that event shortly before it starts.
3. The bot joins under the configured display name and records the meeting's
audio and video for its duration.
@@ -34,7 +34,7 @@ on.
**CallRecording**: the mixed audio (MP3) and video (MP4), the transcript, the
call's actual start and end times, and a lifecycle status (`SCHEDULED` →
`JOINING` → `RECORDING` → `PROCESSING` → `COMPLETED`, or `FAILED`), with a
- Meeting Bot Failure Reason when failure details are available.
+ Call Recorder Failure Reason when failure details are available.
- **A default role.** A scoped application role that reads calendar events,
participants, people, and workspace members to decide attendance, and writes
the resulting CallRecording records, uploads recording media, and fills
@@ -71,7 +71,7 @@ the bot never recorded (opted out, canceled, or no one showed) is not charged.
## Installing
1. Open **Settings → Applications** in your Twenty workspace.
-2. Find **Twenty Meeting Bot** and click **Install**.
+2. Find **Call Recorder** and click **Install**.
3. A server admin completes the one-time
[Self-hosting setup](#self-hosting-setup-admin-only) below to wire up the
Recall.ai API key and webhook. On Twenty Cloud these may already be
@@ -108,7 +108,7 @@ What this app intentionally does **not** do in v1:
| Transcript empty, or marked pending/failed | Recall hasn't finished async transcription yet, or transcription failed for that call | Wait for the reconciliation job to ingest the transcript; a persistent failure leaves a marker in the transcript |
| Webhook rejected with `401` (Recall keeps retrying) | `RECALL_WEBHOOK_SECRET` doesn't match the Recall endpoint's signing secret | Re-copy the `whsec_…` secret from the Recall webhook endpoint into the `RECALL_WEBHOOK_SECRET` server variable |
| Webhook rejected with `500` about the secret | `RECALL_WEBHOOK_SECRET` is not set | Admin: set it on the application registration |
-| Bot left almost immediately | No one was admitted before the lobby / no-one-joined timeout, or everyone left | Adjust `MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS` / `MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS` if too aggressive |
+| Bot left almost immediately | No one was admitted before the lobby / no-one-joined timeout, or everyone left | Adjust `CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS` / `CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS` if too aggressive |
| Bot joined a meeting you didn't want recorded | Recording is on by default | Set the event's **Recording Bot** field to Off; the scheduled bot is canceled |
---
@@ -121,13 +121,13 @@ credentials may already be configured.
### Server variables
Set these on the application registration after installing (Settings →
-Applications → Twenty Meeting Bot):
+Applications → Call Recorder):
| Server variable | Required | Purpose |
|---|---|---|
| `RECALL_API_KEY` | Yes | Recall.ai API key for the configured region; used to schedule, update, and cancel bots. |
| `RECALL_REGION` | No | Recall.ai region for API requests. Defaults to `eu-central-1` (Europe / Frankfurt). |
-| `MEETING_BOT_RECORDING_RETENTION_HOURS` | No | How long Recall.ai retains the source media after processing. Defaults to `166` hours (6 days 22 hours), just under Recall's 168-hour free-storage window. Values above `168` may incur Recall storage charges. Twenty's ingested copy is unaffected. |
+| `CALL_RECORDER_RECORDING_RETENTION_HOURS` | No | How long Recall.ai retains the source media after processing. Defaults to `166` hours (6 days 22 hours), just under Recall's 168-hour free-storage window. Values above `168` may incur Recall storage charges. Twenty's ingested copy is unaffected. |
| `RECALL_WEBHOOK_SECRET` | Yes | Svix signing secret (`whsec_…`) used to verify incoming Recall webhooks. |
### Application variables
@@ -136,11 +136,11 @@ A workspace admin can tune bot behavior through application variables:
| Application variable | Default | Purpose |
|---|---|---|
-| `MEETING_BOT_NAME` | `Twenty Meeting Bot` | Display name the bot uses when it joins a call. |
-| `MEETING_BOT_JOIN_EARLY_MINUTES` | `1` | Minutes before the start time the bot joins. Set to `0` to join at the scheduled start. |
-| `MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS` | `1200` | Seconds the bot waits in the lobby before giving up and leaving. |
-| `MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS` | `1200` | Seconds the bot stays in an empty meeting when no one else ever joins. |
-| `MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS` | `2` | Seconds the bot keeps recording after everyone else leaves. |
+| `CALL_RECORDER_NAME` | `Twenty.com` | Display name the bot uses when it joins a call. |
+| `CALL_RECORDER_JOIN_EARLY_MINUTES` | `1` | Minutes before the start time the bot joins. Set to `0` to join at the scheduled start. |
+| `CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS` | `1200` | Seconds the bot waits in the lobby before giving up and leaving. |
+| `CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS` | `1200` | Seconds the bot stays in an empty meeting when no one else ever joins. |
+| `CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS` | `2` | Seconds the bot keeps recording after everyone else leaves. |
### Configuring the Recall webhook
@@ -157,7 +157,7 @@ Use this URL on your deployment, replacing only the host:
https:///webhooks/server/8da4b8b5-5edf-4880-b51f-ab6e679ec617/9215afe6-1497-4149-a49d-e608e239bbaf
```
-The first ID is the **Twenty Meeting Bot application registration**. The second
+The first ID is the **Call Recorder application registration**. The second
ID is the **Recall webhook logic function**.
1. In the Recall.ai dashboard, create a webhook endpoint pointing at your
@@ -168,6 +168,6 @@ ID is the **Recall webhook logic function**.
transcript events trigger media and transcript ingestion. Subscribing to
status changes alone leaves ingestion to the reconciliation backstop.
2. Copy the endpoint's signing secret — it starts with `whsec_`.
-3. Set it as the `RECALL_WEBHOOK_SECRET` server variable on the **Twenty
- Meeting Bot** application registration.
+3. Set it as the `RECALL_WEBHOOK_SECRET` server variable on the
+ **Call Recorder** application registration.
4. Set `RECALL_API_KEY` (and optionally `RECALL_REGION`) the same way.
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/package.json b/packages/twenty-apps/internal/call-recorder/package.json
similarity index 96%
rename from packages/twenty-apps/internal/twenty-meeting-bot/package.json
rename to packages/twenty-apps/internal/call-recorder/package.json
index 8316af39e0..b6f29ffa1a 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/package.json
+++ b/packages/twenty-apps/internal/call-recorder/package.json
@@ -1,5 +1,5 @@
{
- "name": "twenty-meeting-bot",
+ "name": "@twentyhq/call-recorder",
"version": "0.1.4",
"license": "MIT",
"engines": {
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/public/gallery/twenty-meeting-bot-cover.png b/packages/twenty-apps/internal/call-recorder/public/gallery/call-recorder-cover.png
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/public/gallery/twenty-meeting-bot-cover.png
rename to packages/twenty-apps/internal/call-recorder/public/gallery/call-recorder-cover.png
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/public/logo.svg b/packages/twenty-apps/internal/call-recorder/public/logo.svg
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/public/logo.svg
rename to packages/twenty-apps/internal/call-recorder/public/logo.svg
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/__tests__/global-setup.ts b/packages/twenty-apps/internal/call-recorder/src/__tests__/global-setup.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/__tests__/global-setup.ts
rename to packages/twenty-apps/internal/call-recorder/src/__tests__/global-setup.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/__tests__/schema.integration-test.ts b/packages/twenty-apps/internal/call-recorder/src/__tests__/schema.integration-test.ts
similarity index 96%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/__tests__/schema.integration-test.ts
rename to packages/twenty-apps/internal/call-recorder/src/__tests__/schema.integration-test.ts
index b9623320cf..0ed83a6b8d 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/__tests__/schema.integration-test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/__tests__/schema.integration-test.ts
@@ -115,9 +115,8 @@ type GeneratedCoreSchemaRuntime = {
};
const getServerCallRecordingStatuses = async (): Promise => {
- const generatedCoreSchema = (await import(
- 'twenty-client-sdk/core'
- )) as unknown as GeneratedCoreSchemaRuntime;
+ const generatedCoreSchema =
+ (await import('twenty-client-sdk/core')) as unknown as GeneratedCoreSchemaRuntime;
return Object.values(generatedCoreSchema.enumCallRecordingStatusEnum);
};
diff --git a/packages/twenty-apps/internal/call-recorder/src/application-config.ts b/packages/twenty-apps/internal/call-recorder/src/application-config.ts
new file mode 100644
index 0000000000..000771fa47
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/application-config.ts
@@ -0,0 +1,96 @@
+import { defineApplication } from 'twenty-sdk/define';
+
+import { APP_DESCRIPTION } from 'src/constants/app-description';
+import { APP_DISPLAY_NAME } from 'src/constants/app-display-name';
+import { APPLICATION_UNIVERSAL_IDENTIFIER } from 'src/constants/application-universal-identifier';
+import { CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier';
+import { CALL_RECORDER_JOIN_EARLY_MINUTES_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier';
+import { CALL_RECORDER_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-name-app-variable-universal-identifier';
+import { CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier';
+import { CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier';
+import { CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS } from 'src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds';
+import { CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name';
+import { CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name';
+import { CALL_RECORDER_NAME_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-name-env-var-name';
+import { CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS } from 'src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds';
+import { CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name';
+import { CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name';
+import { CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS } from 'src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds';
+import { CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name';
+import { DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES } from 'src/logic-functions/constants/default-call-recorder-join-early-minutes';
+import { DEFAULT_CALL_RECORDER_NAME } from 'src/logic-functions/constants/default-call-recorder-name';
+import { DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS } from 'src/logic-functions/constants/default-call-recorder-recording-retention-hours';
+import { DEFAULT_RECALL_REGION } from 'src/logic-functions/constants/default-recall-region';
+import { RECALL_API_KEY_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-api-key-env-var-name';
+import { RECALL_REGION_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-region-env-var-name';
+import { RECALL_WEBHOOK_SECRET_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-webhook-secret-env-var-name';
+
+export default defineApplication({
+ universalIdentifier: APPLICATION_UNIVERSAL_IDENTIFIER,
+ displayName: APP_DISPLAY_NAME,
+ description: APP_DESCRIPTION,
+ logoUrl: 'public/logo.svg',
+ screenshots: ['public/gallery/call-recorder-cover.png'],
+ applicationVariables: {
+ [CALL_RECORDER_NAME_ENV_VAR_NAME]: {
+ universalIdentifier: CALL_RECORDER_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER,
+ description: 'Display name the call recorder uses when it joins a call.',
+ isSecret: false,
+ value: DEFAULT_CALL_RECORDER_NAME,
+ },
+ [CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME]: {
+ universalIdentifier:
+ CALL_RECORDER_JOIN_EARLY_MINUTES_APP_VARIABLE_UNIVERSAL_IDENTIFIER,
+ description:
+ 'How many minutes before the meeting start time the bot should join. Set to 0 to join at the scheduled start time.',
+ isSecret: false,
+ value: String(DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES),
+ },
+ [CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME]: {
+ universalIdentifier:
+ CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER,
+ description:
+ 'How many seconds the bot waits in a meeting lobby before giving up and leaving.',
+ isSecret: false,
+ value: String(CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS),
+ },
+ [CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME]: {
+ universalIdentifier:
+ CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER,
+ description:
+ 'How many seconds the bot stays in an empty meeting when no one else ever joins.',
+ isSecret: false,
+ value: String(CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS),
+ },
+ [CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME]: {
+ universalIdentifier:
+ CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER,
+ description:
+ 'How many seconds the bot keeps recording after everyone else leaves the meeting.',
+ isSecret: false,
+ value: String(CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS),
+ },
+ },
+ serverVariables: {
+ [RECALL_API_KEY_ENV_VAR_NAME]: {
+ description:
+ 'Recall.ai API key for the configured region. Set by the server admin on this registration after installation; used to create, update, and cancel scheduled recording bots.',
+ isSecret: true,
+ isRequired: true,
+ },
+ [RECALL_REGION_ENV_VAR_NAME]: {
+ description: `Recall.ai region used for API requests. Defaults to ${DEFAULT_RECALL_REGION} when unset. Europe Frankfurt is eu-central-1.`,
+ isSecret: false,
+ },
+ [CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME]: {
+ description: `How many hours Recall.ai retains recording media after processing. Defaults to ${DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS} hours (6 days and 22 hours) to stay below Recall.ai's 7-day free storage window. Values above 168 hours may incur Recall.ai storage charges.`,
+ isSecret: false,
+ },
+ [RECALL_WEBHOOK_SECRET_ENV_VAR_NAME]: {
+ description:
+ 'Recall.ai webhook signing secret (whsec_...). Set by the server admin from the Recall webhook endpoint settings; used to verify the Svix signature of incoming Recall webhook deliveries.',
+ isSecret: true,
+ isRequired: true,
+ },
+ },
+});
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts b/packages/twenty-apps/internal/call-recorder/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/app-description.ts b/packages/twenty-apps/internal/call-recorder/src/constants/app-description.ts
new file mode 100644
index 0000000000..d5ecd0b0b9
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/app-description.ts
@@ -0,0 +1,2 @@
+export const APP_DESCRIPTION =
+ 'Capture every customer conversation automatically. A call recorder joins eligible meetings and records calls for you.';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/app-display-name.ts b/packages/twenty-apps/internal/call-recorder/src/constants/app-display-name.ts
new file mode 100644
index 0000000000..1f08cd7dcd
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/app-display-name.ts
@@ -0,0 +1 @@
+export const APP_DISPLAY_NAME = 'Call Recorder';
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/application-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/application-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/application-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/application-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-record-page-layout-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-record-page-layout-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-record-page-layout-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-record-page-layout-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-front-component-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-front-component-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-front-component-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-front-component-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts
new file mode 100644
index 0000000000..91afdbaf24
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER =
+ 'c866ddd4-fb7b-4cb4-8ad1-5599755e495c';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts
new file mode 100644
index 0000000000..756ac5b8f1
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER =
+ '33a577e4-02f5-48bd-8bed-d365949caa72';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts
new file mode 100644
index 0000000000..7d8c6d1e82
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_JOIN_EARLY_MINUTES_APP_VARIABLE_UNIVERSAL_IDENTIFIER =
+ '0568ebb2-3f64-47de-8c0d-d367dfbb7462';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-name-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-name-app-variable-universal-identifier.ts
new file mode 100644
index 0000000000..7fa1191e9e
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-name-app-variable-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER =
+ 'c54cbacd-ad10-40b4-9056-7aaf23846d64';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts
new file mode 100644
index 0000000000..84353d31b4
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER =
+ '241180e8-d864-4160-ad02-db44a9e8d395';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-off-option-id.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-off-option-id.ts
new file mode 100644
index 0000000000..63fc309fdc
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-off-option-id.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_PREFERENCE_OFF_OPTION_ID =
+ 'cc7de62a-08b6-46c8-aa69-f8117e7dd722';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts
new file mode 100644
index 0000000000..11332c398b
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER =
+ '8ee9444a-2437-4def-8e61-6e493862a4fd';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts
new file mode 100644
index 0000000000..b4007f9ed9
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER =
+ 'e8c7e9c5-2b4f-4a75-ae46-ea331809106c';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-option-id.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-option-id.ts
new file mode 100644
index 0000000000..a9c185e810
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference-on-option-id.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_PREFERENCE_ON_OPTION_ID =
+ '72431216-49c4-47c8-99af-de4c3831b0be';
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference.ts
new file mode 100644
index 0000000000..fc9b14a981
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-preference.ts
@@ -0,0 +1,4 @@
+export enum CallRecorderPreference {
+ ON = 'ON',
+ OFF = 'OFF',
+}
diff --git a/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts
new file mode 100644
index 0000000000..fc87a72412
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER =
+ '12e4e14d-d539-4d07-b477-4773539dd20b';
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/call-recording-audio-field-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recording-audio-field-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/call-recording-audio-field-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/call-recording-audio-field-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/call-recording-video-field-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/call-recording-video-field-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/call-recording-video-field-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/call-recording-video-field-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/default-role-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/default-role-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/default-role-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/default-role-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/recall-webhook-logic-function-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/recall-webhook-logic-function-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/recall-webhook-logic-function-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/recall-webhook-logic-function-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/stale-bot-state-logic-function-universal-identifier.ts b/packages/twenty-apps/internal/call-recorder/src/constants/stale-bot-state-logic-function-universal-identifier.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/constants/stale-bot-state-logic-function-universal-identifier.ts
rename to packages/twenty-apps/internal/call-recorder/src/constants/stale-bot-state-logic-function-universal-identifier.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/default-role.ts b/packages/twenty-apps/internal/call-recorder/src/default-role.ts
similarity index 92%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/default-role.ts
rename to packages/twenty-apps/internal/call-recorder/src/default-role.ts
index 62df301574..08bfdf064c 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/default-role.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/default-role.ts
@@ -11,7 +11,7 @@ export default defineApplicationRole({
universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER,
label: `${APP_DISPLAY_NAME} default role`,
description:
- 'Reads calendar events to decide whether the meeting bot should attend a meeting; writes the resulting CallRecording records, uploads recording media, and fills transcripts.',
+ 'Reads calendar events to decide whether the call recorder should attend a meeting; writes the resulting CallRecording records, uploads recording media, and fills transcripts.',
canReadAllObjectRecords: false,
canUpdateAllObjectRecords: false,
canSoftDeleteAllObjectRecords: false,
diff --git a/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-failure-reason-on-call-recording.field.ts b/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-failure-reason-on-call-recording.field.ts
new file mode 100644
index 0000000000..b7e03ede64
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-failure-reason-on-call-recording.field.ts
@@ -0,0 +1,22 @@
+import {
+ defineField,
+ FieldType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk/define';
+
+import { CALL_RECORDER_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier';
+
+export default defineField({
+ universalIdentifier:
+ CALL_RECORDER_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER,
+ objectUniversalIdentifier:
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.callRecording.universalIdentifier,
+ type: FieldType.TEXT,
+ name: 'callRecorderFailureReason',
+ label: 'Call Recorder Failure Reason',
+ description:
+ 'Provider-specific reason the call recorder could not produce a recording.',
+ icon: 'IconAlertTriangle',
+ isNullable: true,
+ isUIEditable: false,
+});
diff --git a/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-preference-on-calendar-event.field.ts b/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-preference-on-calendar-event.field.ts
new file mode 100644
index 0000000000..fd9c4badbb
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/fields/call-recorder-preference-on-calendar-event.field.ts
@@ -0,0 +1,41 @@
+import {
+ defineField,
+ FieldType,
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
+} from 'twenty-sdk/define';
+
+import { CallRecorderPreference } from 'src/constants/call-recorder-preference';
+import { CALL_RECORDER_PREFERENCE_OFF_OPTION_ID } from 'src/constants/call-recorder-preference-off-option-id';
+import { CALL_RECORDER_PREFERENCE_ON_OPTION_ID } from 'src/constants/call-recorder-preference-on-option-id';
+import { CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier';
+
+export default defineField({
+ universalIdentifier:
+ CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER,
+ objectUniversalIdentifier:
+ STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.calendarEvent.universalIdentifier,
+ type: FieldType.SELECT,
+ name: 'callRecorderPreference',
+ label: 'Recording Bot',
+ description:
+ 'Call recording is on by default when the app is installed. Turn it off for this event when needed.',
+ icon: 'IconRobot',
+ isNullable: false,
+ defaultValue: `'${CallRecorderPreference.ON}'`,
+ options: [
+ {
+ id: CALL_RECORDER_PREFERENCE_ON_OPTION_ID,
+ value: CallRecorderPreference.ON,
+ label: 'On',
+ position: 0,
+ color: 'green',
+ },
+ {
+ id: CALL_RECORDER_PREFERENCE_OFF_OPTION_ID,
+ value: CallRecorderPreference.OFF,
+ label: 'Off',
+ position: 1,
+ color: 'red',
+ },
+ ],
+});
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/calendar-event-recording.front-component.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/calendar-event-recording.front-component.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/calendar-event-recording.front-component.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/calendar-event-recording.front-component.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecording.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecording.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecording.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecording.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecordingBody.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecordingBody.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecordingBody.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecordingBody.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecordingContent.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecordingContent.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/CalendarEventRecordingContent.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/CalendarEventRecordingContent.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/RecordingTranscript.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/RecordingTranscript.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/RecordingTranscript.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/RecordingTranscript.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/RecordingVideoPlayer.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/RecordingVideoPlayer.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/RecordingVideoPlayer.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/RecordingVideoPlayer.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptEntryList.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptEntryList.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptEntryList.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptEntryList.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptEntryListItem.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptEntryListItem.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptEntryListItem.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptEntryListItem.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptErrorBox.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptErrorBox.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptErrorBox.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptErrorBox.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptSpeakerAvatar.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptSpeakerAvatar.tsx
similarity index 96%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptSpeakerAvatar.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptSpeakerAvatar.tsx
index c2695ab2c3..620bf5d32c 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptSpeakerAvatar.tsx
+++ b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptSpeakerAvatar.tsx
@@ -74,9 +74,9 @@ export const TranscriptSpeakerAvatar = ({
avatarUrl,
placeholderColorSeed,
}: TranscriptSpeakerAvatarProps) => {
- const [erroredAvatarUrl, setErroredAvatarUrl] = useState<
- string | undefined
- >(undefined);
+ const [erroredAvatarUrl, setErroredAvatarUrl] = useState(
+ undefined,
+ );
const shouldShowAvatarImage =
isNonEmptyString(avatarUrl) && erroredAvatarUrl !== avatarUrl;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptSpeakerChip.tsx b/packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptSpeakerChip.tsx
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/components/TranscriptSpeakerChip.tsx
rename to packages/twenty-apps/internal/call-recorder/src/front-components/components/TranscriptSpeakerChip.tsx
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/constants/recording-theme-css-variables.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/constants/recording-theme-css-variables.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/constants/recording-theme-css-variables.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/constants/recording-theme-css-variables.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-participants.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-participants.ts
similarity index 97%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-participants.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-participants.ts
index a1eb0ef14a..22b729be8c 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-participants.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-participants.ts
@@ -98,9 +98,7 @@ export const useCalendarEventParticipants = (
setCalendarEventParticipants(
calendarEventParticipantEdges.map((calendarEventParticipantEdge) =>
- mapCalendarEventParticipantNode(
- calendarEventParticipantEdge.node,
- ),
+ mapCalendarEventParticipantNode(calendarEventParticipantEdge.node),
),
);
} catch {
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-recording.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-recording.ts
similarity index 97%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-recording.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-recording.ts
index d1bb8803e4..b6c986fc82 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/hooks/use-calendar-event-recording.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/front-components/hooks/use-calendar-event-recording.ts
@@ -93,9 +93,8 @@ export const useCalendarEventRecording = (
const callRecordingNodes = callRecordingEdges.map(
(callRecordingEdge) => callRecordingEdge.node,
);
- const callRecordingNode = selectCalendarEventRecording(
- callRecordingNodes,
- );
+ const callRecordingNode =
+ selectCalendarEventRecording(callRecordingNodes);
setState({
transcript: callRecordingNode?.transcript ?? undefined,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/calendar-event-recording-participant.type.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/types/calendar-event-recording-participant.type.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/calendar-event-recording-participant.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/types/calendar-event-recording-participant.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/transcript-entry.type.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/types/transcript-entry.type.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/types/transcript-entry.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/types/transcript-entry.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/parse-transcript-entries.test.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/parse-transcript-entries.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/__tests__/parse-transcript-entries.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/__tests__/parse-transcript-entries.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/find-active-transcript-entry-index.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/find-active-transcript-entry-index.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/find-active-transcript-entry-index.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/find-active-transcript-entry-index.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/format-transcript-timestamp.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/format-transcript-timestamp.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/format-transcript-timestamp.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/format-transcript-timestamp.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-absolute-avatar-url.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-absolute-avatar-url.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-absolute-avatar-url.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-absolute-avatar-url.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-speaker-name-match-keys.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-speaker-name-match-keys.util.ts
similarity index 90%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-speaker-name-match-keys.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-speaker-name-match-keys.util.ts
index c570effd71..085f0f0a65 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-speaker-name-match-keys.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-speaker-name-match-keys.util.ts
@@ -6,8 +6,9 @@ export const getSpeakerNameMatchKeys = (speakerName: string): string[] => {
const normalizedSpeakerName = normalizeSpeakerName(speakerName);
const compactSpeakerName = getCompactSpeakerName(normalizedSpeakerName);
const compactSpeakerNameWithoutDigits = compactSpeakerName.replace(/\d/g, '');
- const abbreviatedSpeakerNameMatchKey =
- getAbbreviatedSpeakerNameMatchKey(normalizedSpeakerName);
+ const abbreviatedSpeakerNameMatchKey = getAbbreviatedSpeakerNameMatchKey(
+ normalizedSpeakerName,
+ );
return [
...new Set(
@@ -50,8 +51,7 @@ const getAbbreviatedSpeakerNameMatchKey = (
4,
)}${lastSpeakerNamePart.slice(0, 4)}`;
- return abbreviatedSpeakerNameMatchKey.length >=
- MINIMUM_FUZZY_MATCH_KEY_LENGTH
+ return abbreviatedSpeakerNameMatchKey.length >= MINIMUM_FUZZY_MATCH_KEY_LENGTH
? abbreviatedSpeakerNameMatchKey
: undefined;
};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-video-file-extension.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-video-file-extension.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/get-video-file-extension.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/get-video-file-extension.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/parse-transcript-entries.util.ts b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/parse-transcript-entries.util.ts
similarity index 96%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/parse-transcript-entries.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/front-components/utils/parse-transcript-entries.util.ts
index e35a79b6e5..7d57942b35 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/front-components/utils/parse-transcript-entries.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/front-components/utils/parse-transcript-entries.util.ts
@@ -37,9 +37,7 @@ const readTranscriptWord = (
};
};
-const readSpeakerName = (
- participant: TranscriptRecord | undefined,
-): string => {
+const readSpeakerName = (participant: TranscriptRecord | undefined): string => {
const name = participant?.name;
return isNonEmptyString(name) ? name.trim() : 'Unknown speaker';
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/__tests__/recall-webhook.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/__tests__/recall-webhook.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/__tests__/recall-webhook.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/__tests__/recall-webhook.test.ts
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts
new file mode 100644
index 0000000000..ef8ca98692
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME =
+ 'CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts
new file mode 100644
index 0000000000..6107903852
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts
@@ -0,0 +1 @@
+export const CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS = 2;
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts
new file mode 100644
index 0000000000..a3440152c1
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME =
+ 'CALL_RECORDER_JOIN_EARLY_MINUTES';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-name-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-name-env-var-name.ts
new file mode 100644
index 0000000000..43f295c59d
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-name-env-var-name.ts
@@ -0,0 +1 @@
+export const CALL_RECORDER_NAME_ENV_VAR_NAME = 'CALL_RECORDER_NAME';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts
new file mode 100644
index 0000000000..b62fb33005
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME =
+ 'CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts
new file mode 100644
index 0000000000..265aec9f5c
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts
@@ -0,0 +1 @@
+export const CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS = 20 * 60;
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts
new file mode 100644
index 0000000000..5b83200810
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME =
+ 'CALL_RECORDER_RECORDING_RETENTION_HOURS';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts
new file mode 100644
index 0000000000..3bbf50bc3c
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts
@@ -0,0 +1,2 @@
+export const CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME =
+ 'CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS';
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts
new file mode 100644
index 0000000000..ae4a1a3116
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts
@@ -0,0 +1 @@
+export const CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS = 1200;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-request-status.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-request-status.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-request-status.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-request-status.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-status.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-status.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/call-recording-status.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/call-recording-status.ts
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts
new file mode 100644
index 0000000000..4d088234f1
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts
@@ -0,0 +1 @@
+export const DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES = 1;
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-name.ts
new file mode 100644
index 0000000000..e10b1b8574
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-name.ts
@@ -0,0 +1 @@
+export const DEFAULT_CALL_RECORDER_NAME = 'Twenty.com';
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-recording-retention-hours.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts
similarity index 68%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-recording-retention-hours.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts
index 3ec7807e42..f1a8cbfdf5 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-recording-retention-hours.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts
@@ -1,2 +1,2 @@
// Twenty stores ingested recording artifacts, so Recall.ai media is temporary. Keep the default below Recall.ai's 168-hour free storage window.
-export const DEFAULT_MEETING_BOT_RECORDING_RETENTION_HOURS = 166;
+export const DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS = 166;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-recall-region.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-recall-region.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-recall-region.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/default-recall-region.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/milliseconds-per-minute.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/milliseconds-per-minute.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/milliseconds-per-minute.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/milliseconds-per-minute.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/non-terminal-call-recording-statuses.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/non-terminal-call-recording-statuses.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/non-terminal-call-recording-statuses.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/non-terminal-call-recording-statuses.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-key-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-key-env-var-name.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-key-env-var-name.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-key-env-var-name.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-max-attempts.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-max-attempts.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-max-attempts.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-max-attempts.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-retry-delay-ms.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-retry-delay-ms.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-api-retry-delay-ms.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-api-retry-delay-ms.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-automatic-leave.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-automatic-leave.ts
similarity index 75%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-automatic-leave.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-automatic-leave.ts
index 5eb60dd57d..498805e065 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-automatic-leave.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-automatic-leave.ts
@@ -1,8 +1,8 @@
import { isUndefined } from '@sniptt/guards';
-import { MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds-env-var-name';
-import { MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds-env-var-name';
-import { MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds-env-var-name';
+import { CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name';
+import { CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name';
+import { CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name';
import { RECALL_BOT_EVERYONE_LEFT_MIN_ACTIVATE_AFTER_SECONDS } from 'src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds';
import { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';
import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';
@@ -20,13 +20,13 @@ export const getRecallBotAutomaticLeave = ():
| RecallBotAutomaticLeave
| undefined => {
const waitingRoomTimeoutSeconds = getOptionalPositiveIntegerVariable(
- MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME,
+ CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME,
);
const nooneJoinedTimeoutSeconds = getOptionalPositiveIntegerVariable(
- MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME,
+ CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME,
);
const everyoneLeftTimeoutSeconds = getOptionalPositiveIntegerVariable(
- MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME,
+ CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME,
);
const automaticLeave: RecallBotAutomaticLeave = {};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-recording-config.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-recording-config.ts
similarity index 71%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-recording-config.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-recording-config.ts
index 7c6655b581..8ff9dddd75 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-bot-recording-config.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-bot-recording-config.ts
@@ -1,5 +1,5 @@
-import { DEFAULT_MEETING_BOT_RECORDING_RETENTION_HOURS } from 'src/logic-functions/constants/default-meeting-bot-recording-retention-hours';
-import { MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name';
+import { CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name';
+import { DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS } from 'src/logic-functions/constants/default-call-recorder-recording-retention-hours';
import { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';
import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';
@@ -12,7 +12,7 @@ type RecallBotRecordingConfig = {
// Recall only produces artifacts declared at bot creation; both gate COMPLETED.
export const getRecallBotRecordingConfig = (): RecallBotRecordingConfig => {
const configuredRecordingRetentionHours = getApplicationVariableValue(
- MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME,
+ CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME,
);
const recordingRetentionHours = isNonEmptyString(
@@ -24,7 +24,7 @@ export const getRecallBotRecordingConfig = (): RecallBotRecordingConfig => {
const resolvedRecordingRetentionHours =
Number.isInteger(recordingRetentionHours) && recordingRetentionHours > 0
? recordingRetentionHours
- : DEFAULT_MEETING_BOT_RECORDING_RETENTION_HOURS;
+ : DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS;
return {
video_mixed_mp4: {},
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-region-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-region-env-var-name.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-region-env-var-name.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-region-env-var-name.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/restricted-field-placeholder.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/restricted-field-placeholder.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/restricted-field-placeholder.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/restricted-field-placeholder.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/stale-bot-state-cron-pattern.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/stale-bot-state-cron-pattern.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/stale-bot-state-cron-pattern.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/stale-bot-state-cron-pattern.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/twenty-page-size.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/twenty-page-size.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/twenty-page-size.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/constants/twenty-page-size.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts
similarity index 93%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts
index 4e061d9c29..b27e3a7657 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts
@@ -3,8 +3,7 @@ import { afterEach, describe, expect, it } from 'vitest';
import { getCurrentWorkspaceId } from 'src/logic-functions/data/get-current-workspace-id.util';
const APP_ACCESS_TOKEN_ENV_VAR_NAME = 'TWENTY_APP_ACCESS_TOKEN';
-const ORIGINAL_APP_ACCESS_TOKEN =
- process.env[APP_ACCESS_TOKEN_ENV_VAR_NAME];
+const ORIGINAL_APP_ACCESS_TOKEN = process.env[APP_ACCESS_TOKEN_ENV_VAR_NAME];
const WORKSPACE_ID = '123e4567-e89b-12d3-a456-426614174000';
const restoreOriginalAppAccessToken = () => {
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/complete-call-recording-ingestion.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/complete-call-recording-ingestion.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/complete-call-recording-ingestion.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/complete-call-recording-ingestion.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/create-call-recording.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/create-call-recording.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/create-call-recording.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/create-call-recording.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/execute-current-schema-mutation.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/execute-current-schema-mutation.util.ts
similarity index 95%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/execute-current-schema-mutation.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/execute-current-schema-mutation.util.ts
index 8e5dfcc03b..a9a108f8e9 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/execute-current-schema-mutation.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/execute-current-schema-mutation.util.ts
@@ -41,7 +41,7 @@ type CurrentSchemaMutationResult = {
};
// TODO: Remove this bridge once the released SDK includes the current
-// CallRecording schema with FAILED and meetingBotFailureReason.
+// CallRecording schema with FAILED and callRecorderFailureReason.
export const executeCurrentSchemaMutation = (
client: CoreApiClient,
mutation: CurrentSchemaMutation,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-all-nodes.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-all-nodes.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-all-nodes.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-all-nodes.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts
similarity index 92%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts
index f7d6b7ec8f..8c0ce598d2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts
@@ -18,7 +18,7 @@ type CalendarEventNode = {
endsAt?: string | null;
iCalUid?: string | null;
conferenceLink?: { primaryLinkUrl?: string | null } | null;
- meetingBotPreference?: string | null;
+ callRecorderPreference?: string | null;
};
export const fetchCalendarEventsByFilter = async (
@@ -49,7 +49,7 @@ export const fetchCalendarEventsByFilter = async (
conferenceLink: {
primaryLinkUrl: true,
},
- meetingBotPreference: true,
+ callRecorderPreference: true,
},
},
},
@@ -73,8 +73,8 @@ export const fetchCalendarEventsByFilter = async (
)
? calendarEvent.conferenceLink.primaryLinkUrl
: undefined,
- meetingBotPreference: isString(calendarEvent.meetingBotPreference)
- ? calendarEvent.meetingBotPreference
+ callRecorderPreference: isString(calendarEvent.callRecorderPreference)
+ ? calendarEvent.callRecorderPreference
: undefined,
}));
};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-filter.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-filter.util.ts
similarity index 94%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-filter.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-filter.util.ts
index fd2de1ab96..b4444772bd 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-filter.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-filter.util.ts
@@ -20,7 +20,7 @@ type CallRecordingNode = {
calendarEventId?: string | null;
externalBotId?: string | null;
externalRecordingId?: string | null;
- meetingBotFailureReason?: string | null;
+ callRecorderFailureReason?: string | null;
};
export const findCallRecordingsByFilter = async (
@@ -51,7 +51,7 @@ export const findCallRecordingsByFilter = async (
calendarEventId: true,
externalBotId: true,
externalRecordingId: true,
- meetingBotFailureReason: true,
+ callRecorderFailureReason: true,
},
},
},
@@ -77,8 +77,8 @@ export const findCallRecordingsByFilter = async (
externalRecordingId: normalizeOptionalString(
callRecording.externalRecordingId,
),
- meetingBotFailureReason: normalizeOptionalString(
- callRecording.meetingBotFailureReason,
+ callRecorderFailureReason: normalizeOptionalString(
+ callRecording.callRecorderFailureReason,
),
}));
};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-ids.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-ids.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-call-recordings-by-ids.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-call-recordings-by-ids.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/get-current-workspace-id.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/get-current-workspace-id.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/get-current-workspace-id.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/get-current-workspace-id.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/strip-restricted-field-value.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/strip-restricted-field-value.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/strip-restricted-field-value.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/strip-restricted-field-value.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/update-call-recording.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/update-call-recording.util.ts
similarity index 96%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/update-call-recording.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/data/update-call-recording.util.ts
index 251e325702..174775a5b7 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/data/update-call-recording.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/data/update-call-recording.util.ts
@@ -18,7 +18,7 @@ export type CallRecordingUpdateFields = Partial<{
// null clears stale app-owned state on cancel/eject or reschedule.
externalBotId: string | null;
externalRecordingId: string;
- meetingBotFailureReason: string | null;
+ callRecorderFailureReason: string | null;
transcript: Record;
audio: { fileId: string; label: string }[];
video: { fileId: string; label: string }[];
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/build-meeting-bot-policy-result.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts
similarity index 52%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/build-meeting-bot-policy-result.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts
index 919b8d7948..c6bcc54214 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/build-meeting-bot-policy-result.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts
@@ -1,46 +1,46 @@
import { describe, expect, it } from 'vitest';
-import { buildMeetingBotPolicyResult } from 'src/logic-functions/domain/build-meeting-bot-policy-result.util';
-import { type MeetingBotPolicyCalendarEventInput } from 'src/logic-functions/types/meeting-bot-policy-calendar-event-input.type';
+import { buildCallRecorderPolicyResult } from 'src/logic-functions/domain/build-call-recorder-policy-result.util';
+import { type CallRecorderPolicyCalendarEventInput } from 'src/logic-functions/types/call-recorder-policy-calendar-event-input.type';
const NOW = new Date('2026-01-01T12:00:00.000Z');
const buildCalendarEventInput = (
- overrides: Partial,
-): MeetingBotPolicyCalendarEventInput => ({
+ overrides: Partial,
+): CallRecorderPolicyCalendarEventInput => ({
id: 'calendar-event-1',
isCanceled: false,
startsAt: '2026-01-01T13:00:00.000Z',
endsAt: '2026-01-01T14:00:00.000Z',
iCalUid: 'ical-uid-1',
conferenceLinkUrl: 'https://meet.example.com/customer-sync',
- meetingBotPreference: undefined,
+ callRecorderPreference: undefined,
...overrides,
});
-describe('buildMeetingBotPolicyResult', () => {
+describe('buildCallRecorderPolicyResult', () => {
it('requests a bot for the ON wire value', () => {
- const policyResult = buildMeetingBotPolicyResult(
+ const policyResult = buildCallRecorderPolicyResult(
buildCalendarEventInput({
- meetingBotPreference: 'ON',
+ callRecorderPreference: 'ON',
}),
NOW,
);
- expect(policyResult.meetingBotPreference).toBe('ON');
+ expect(policyResult.callRecorderPreference).toBe('ON');
expect(policyResult.shouldRequestBot).toBe(true);
expect(policyResult.reason).toBe('RECORDING_ENABLED');
});
it('does not request a bot for the OFF wire value', () => {
- const policyResult = buildMeetingBotPolicyResult(
+ const policyResult = buildCallRecorderPolicyResult(
buildCalendarEventInput({
- meetingBotPreference: 'OFF',
+ callRecorderPreference: 'OFF',
}),
NOW,
);
- expect(policyResult.meetingBotPreference).toBe('OFF');
+ expect(policyResult.callRecorderPreference).toBe('OFF');
expect(policyResult.shouldRequestBot).toBe(false);
expect(policyResult.reason).toBe('PREFERENCE_OFF');
});
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/resolve-meeting-bot-policy-result.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts
similarity index 77%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/resolve-meeting-bot-policy-result.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts
index 4ed5739e37..3fc2679cf8 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/resolve-meeting-bot-policy-result.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest';
-import { MeetingBotPreference } from 'src/constants/meeting-bot-preference';
-import { resolveMeetingBotPolicyResult } from 'src/logic-functions/domain/resolve-meeting-bot-policy-result.util';
+import { CallRecorderPreference } from 'src/constants/call-recorder-preference';
+import { resolveCallRecorderPolicyResult } from 'src/logic-functions/domain/resolve-call-recorder-policy-result.util';
const NOW = new Date('2026-01-01T12:00:00.000Z');
const FUTURE_STARTS_AT = '2026-01-01T13:00:00.000Z';
@@ -9,12 +9,12 @@ const FUTURE_ENDS_AT = '2026-01-01T14:00:00.000Z';
const PAST_STARTS_AT = '2026-01-01T09:00:00.000Z';
const PAST_ENDS_AT = '2026-01-01T10:00:00.000Z';
-describe('resolveMeetingBotPolicyResult', () => {
+describe('resolveCallRecorderPolicyResult', () => {
it('requires a bot when preference is ON and the event is upcoming', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: MeetingBotPreference.ON,
+ callRecorderPreference: CallRecorderPreference.ON,
isCanceled: false,
startsAt: FUTURE_STARTS_AT,
endsAt: FUTURE_ENDS_AT,
@@ -30,9 +30,9 @@ describe('resolveMeetingBotPolicyResult', () => {
it('does not request a bot for ON when the meeting has no conference link', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: MeetingBotPreference.ON,
+ callRecorderPreference: CallRecorderPreference.ON,
isCanceled: false,
startsAt: FUTURE_STARTS_AT,
endsAt: FUTURE_ENDS_AT,
@@ -48,9 +48,9 @@ describe('resolveMeetingBotPolicyResult', () => {
it('requires a bot without an event preference override', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: undefined,
+ callRecorderPreference: undefined,
isCanceled: false,
startsAt: FUTURE_STARTS_AT,
endsAt: FUTURE_ENDS_AT,
@@ -66,9 +66,9 @@ describe('resolveMeetingBotPolicyResult', () => {
it('lets an OFF event preference opt out of workspace auto-recording', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: MeetingBotPreference.OFF,
+ callRecorderPreference: CallRecorderPreference.OFF,
isCanceled: false,
startsAt: FUTURE_STARTS_AT,
endsAt: FUTURE_ENDS_AT,
@@ -84,9 +84,9 @@ describe('resolveMeetingBotPolicyResult', () => {
it('does not request a bot for a meeting that already ended', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: undefined,
+ callRecorderPreference: undefined,
isCanceled: false,
startsAt: PAST_STARTS_AT,
endsAt: PAST_ENDS_AT,
@@ -102,9 +102,9 @@ describe('resolveMeetingBotPolicyResult', () => {
it('does not request a bot for a canceled meeting', () => {
expect(
- resolveMeetingBotPolicyResult({
+ resolveCallRecorderPolicyResult({
input: {
- meetingBotPreference: undefined,
+ callRecorderPreference: undefined,
isCanceled: true,
startsAt: FUTURE_STARTS_AT,
endsAt: FUTURE_ENDS_AT,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/aggregate-meeting-bot-policy-results-by-meeting.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts
similarity index 59%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/aggregate-meeting-bot-policy-results-by-meeting.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts
index 07c7975b8c..9eac855fdf 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/aggregate-meeting-bot-policy-results-by-meeting.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts
@@ -1,17 +1,17 @@
-import { type MeetingBotPolicyResultForCalendarEvent } from 'src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type';
-import { type MeetingBotPolicyResultForMeeting } from 'src/logic-functions/types/meeting-bot-policy-result-for-meeting.type';
+import { type CallRecorderPolicyResultForCalendarEvent } from 'src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type';
+import { type CallRecorderPolicyResultForMeeting } from 'src/logic-functions/types/call-recorder-policy-result-for-meeting.type';
-type MeetingBotPolicyResultForMeetingInput = Pick<
- MeetingBotPolicyResultForCalendarEvent,
+type CallRecorderPolicyResultForMeetingInput = Pick<
+ CallRecorderPolicyResultForCalendarEvent,
'calendarEventId' | 'realMeetingKey' | 'shouldRequestBot'
>;
-export const aggregateMeetingBotPolicyResultsByMeeting = (
- perCalendarEventPolicyResults: MeetingBotPolicyResultForMeetingInput[],
-): MeetingBotPolicyResultForMeeting[] => {
+export const aggregateCallRecorderPolicyResultsByMeeting = (
+ perCalendarEventPolicyResults: CallRecorderPolicyResultForMeetingInput[],
+): CallRecorderPolicyResultForMeeting[] => {
const meetingPolicyResultsByMeetingKey = new Map<
string,
- MeetingBotPolicyResultForMeeting
+ CallRecorderPolicyResultForMeeting
>();
for (const {
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-call-recorder-policy-result.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-call-recorder-policy-result.util.ts
new file mode 100644
index 0000000000..55b6a663d6
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-call-recorder-policy-result.util.ts
@@ -0,0 +1,53 @@
+import { CallRecorderPreference } from 'src/constants/call-recorder-preference';
+import { type CallRecorderPolicyCalendarEventInput } from 'src/logic-functions/types/call-recorder-policy-calendar-event-input.type';
+import { type CallRecorderPolicyResultForCalendarEvent } from 'src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type';
+import { computeRealMeetingKey } from 'src/logic-functions/domain/compute-real-meeting-key.util';
+import { resolveCallRecorderPolicyResult } from 'src/logic-functions/domain/resolve-call-recorder-policy-result.util';
+
+export const buildCallRecorderPolicyResult = (
+ calendarEvent: CallRecorderPolicyCalendarEventInput,
+ now: Date,
+): CallRecorderPolicyResultForCalendarEvent => {
+ const realMeetingKey = computeRealMeetingKey({
+ calendarEventId: calendarEvent.id,
+ conferenceLinkUrl: calendarEvent.conferenceLinkUrl,
+ iCalUid: calendarEvent.iCalUid,
+ startsAt: calendarEvent.startsAt,
+ });
+
+ const callRecorderPreference = normalizeCallRecorderPreference(
+ calendarEvent.callRecorderPreference,
+ );
+
+ const policyResult = resolveCallRecorderPolicyResult({
+ input: {
+ callRecorderPreference,
+ isCanceled: calendarEvent.isCanceled,
+ startsAt: calendarEvent.startsAt,
+ endsAt: calendarEvent.endsAt,
+ conferenceLinkUrl: calendarEvent.conferenceLinkUrl,
+ },
+ now,
+ });
+
+ return {
+ calendarEventId: calendarEvent.id,
+ callRecorderPreference,
+ realMeetingKey,
+ ...policyResult,
+ };
+};
+
+const normalizeCallRecorderPreference = (
+ callRecorderPreference: string | undefined,
+): CallRecorderPreference | undefined =>
+ isCallRecorderPreference(callRecorderPreference)
+ ? callRecorderPreference
+ : undefined;
+
+const isCallRecorderPreference = (
+ callRecorderPreference: string | undefined,
+): callRecorderPreference is CallRecorderPreference =>
+ Object.values(CallRecorderPreference).some(
+ (preference) => preference === callRecorderPreference,
+ );
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-failed-transcript-marker.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-failed-transcript-marker.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-failed-transcript-marker.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-failed-transcript-marker.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-pending-transcript-marker.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-pending-transcript-marker.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-pending-transcript-marker.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-pending-transcript-marker.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-recall-bot-metadata.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-recall-bot-metadata.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-recall-bot-metadata.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-recall-bot-metadata.util.ts
diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-transcript-failure-reason.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-transcript-failure-reason.util.ts
new file mode 100644
index 0000000000..56fcf08d9e
--- /dev/null
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/build-transcript-failure-reason.util.ts
@@ -0,0 +1,7 @@
+import { isNull } from '@sniptt/guards';
+
+export const buildTranscriptFailureReason = (
+ subCode: string | null,
+): string => {
+ return isNull(subCode) ? 'transcript_failed' : `transcript_failed:${subCode}`;
+};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-call-recording-charge.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-call-recording-charge.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-call-recording-charge.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-call-recording-charge.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-real-meeting-key.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-real-meeting-key.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-real-meeting-key.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-real-meeting-key.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-recall-bot-join-at.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-recall-bot-join-at.util.ts
similarity index 69%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-recall-bot-join-at.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-recall-bot-join-at.util.ts
index cfef069543..3d10070177 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/compute-recall-bot-join-at.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/compute-recall-bot-join-at.util.ts
@@ -1,6 +1,6 @@
-import { DEFAULT_MEETING_BOT_JOIN_EARLY_MINUTES } from 'src/logic-functions/constants/default-meeting-bot-join-early-minutes';
+import { DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES } from 'src/logic-functions/constants/default-call-recorder-join-early-minutes';
import { MILLISECONDS_PER_MINUTE } from 'src/logic-functions/constants/milliseconds-per-minute';
-import { MEETING_BOT_JOIN_EARLY_MINUTES_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name';
+import { CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name';
import { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';
import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';
@@ -19,16 +19,16 @@ export const computeRecallBotJoinAt = (meetingStartsAt: string): string => {
const getRecallBotJoinEarlyMinutes = (): number => {
const rawValue = getApplicationVariableValue(
- MEETING_BOT_JOIN_EARLY_MINUTES_ENV_VAR_NAME,
+ CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME,
);
if (!isNonEmptyString(rawValue)) {
- return DEFAULT_MEETING_BOT_JOIN_EARLY_MINUTES;
+ return DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES;
}
const joinEarlyMinutes = Number(rawValue.trim());
return Number.isInteger(joinEarlyMinutes) && joinEarlyMinutes >= 0
? joinEarlyMinutes
- : DEFAULT_MEETING_BOT_JOIN_EARLY_MINUTES;
+ : DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES;
};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-recall-recording-done-signal.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-recall-recording-done-signal.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/is-recall-recording-done-signal.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/is-recall-recording-done-signal.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/parse-transcript-marker.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/parse-transcript-marker.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/parse-transcript-marker.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/parse-transcript-marker.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/resolve-meeting-bot-policy-result.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts
similarity index 50%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/resolve-meeting-bot-policy-result.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts
index d90cc1906f..46ca58b5d2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/resolve-meeting-bot-policy-result.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts
@@ -1,24 +1,24 @@
-import { MeetingBotPreference } from 'src/constants/meeting-bot-preference';
-import { type MeetingBotPolicyInput } from 'src/logic-functions/types/meeting-bot-policy-input.type';
+import { CallRecorderPreference } from 'src/constants/call-recorder-preference';
+import { type CallRecorderPolicyInput } from 'src/logic-functions/types/call-recorder-policy-input.type';
import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';
-import { type MeetingBotPolicyNotRequiredReason } from 'src/logic-functions/types/meeting-bot-policy-not-required-reason.type';
-import { type MeetingBotPolicyRequiredReason } from 'src/logic-functions/types/meeting-bot-policy-required-reason.type';
-import { type MeetingBotPolicyResult } from 'src/logic-functions/types/meeting-bot-policy-result.type';
+import { type CallRecorderPolicyNotRequiredReason } from 'src/logic-functions/types/call-recorder-policy-not-required-reason.type';
+import { type CallRecorderPolicyRequiredReason } from 'src/logic-functions/types/call-recorder-policy-required-reason.type';
+import { type CallRecorderPolicyResult } from 'src/logic-functions/types/call-recorder-policy-result.type';
-type ResolveMeetingBotPolicyResultArgs = {
- input: MeetingBotPolicyInput;
+type ResolveCallRecorderPolicyResultArgs = {
+ input: CallRecorderPolicyInput;
now: Date;
};
-export const resolveMeetingBotPolicyResult = ({
+export const resolveCallRecorderPolicyResult = ({
input,
now,
-}: ResolveMeetingBotPolicyResultArgs): MeetingBotPolicyResult => {
+}: ResolveCallRecorderPolicyResultArgs): CallRecorderPolicyResult => {
if (input.isCanceled) {
return botNotRequired('EVENT_CANCELED');
}
- if (input.meetingBotPreference === MeetingBotPreference.OFF) {
+ if (input.callRecorderPreference === CallRecorderPreference.OFF) {
return botNotRequired('PREFERENCE_OFF');
}
@@ -64,9 +64,9 @@ const isCalendarEventInFuture = ({
};
const botRequired = (
- reason: MeetingBotPolicyRequiredReason,
-): MeetingBotPolicyResult => ({ shouldRequestBot: true, reason });
+ reason: CallRecorderPolicyRequiredReason,
+): CallRecorderPolicyResult => ({ shouldRequestBot: true, reason });
const botNotRequired = (
- reason: MeetingBotPolicyNotRequiredReason,
-): MeetingBotPolicyResult => ({ shouldRequestBot: false, reason });
+ reason: CallRecorderPolicyNotRequiredReason,
+): CallRecorderPolicyResult => ({ shouldRequestBot: false, reason });
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts
similarity index 99%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts
index 7981d02a5b..308581ebe0 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts
@@ -208,7 +208,7 @@ describe('convergeDivergedCallRecordings', () => {
id: 'call-recording-1',
data: {
status: 'FAILED',
- meetingBotFailureReason: 'recording_artifacts_unavailable',
+ callRecorderFailureReason: 'recording_artifacts_unavailable',
},
},
]);
@@ -357,7 +357,7 @@ describe('convergeDivergedCallRecordings', () => {
id: 'call-recording-1',
data: {
status: 'FAILED',
- meetingBotFailureReason: 'recall_bot_not_found',
+ callRecorderFailureReason: 'recall_bot_not_found',
},
},
]);
@@ -698,7 +698,7 @@ describe('convergeDivergedCallRecordings', () => {
status: 'FAILED',
subCode: 'audio_missing',
},
- meetingBotFailureReason: 'transcript_failed:audio_missing',
+ callRecorderFailureReason: 'transcript_failed:audio_missing',
},
},
]);
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/download-transcript.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/download-transcript.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/download-transcript.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/download-transcript.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts
similarity index 99%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts
index ae2e85b9aa..451b22b49d 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts
@@ -1013,7 +1013,7 @@ describe('handleRecallWebhook', () => {
data: {
status: 'FAILED',
externalBotId: 'recall-bot-1',
- meetingBotFailureReason: 'recording_artifacts_unavailable',
+ callRecorderFailureReason: 'recording_artifacts_unavailable',
},
},
]);
@@ -1237,7 +1237,7 @@ describe('handleRecallWebhook', () => {
status: 'FAILED',
subCode: 'transcription_failed',
},
- meetingBotFailureReason: 'transcript_failed:transcription_failed',
+ callRecorderFailureReason: 'transcript_failed:transcription_failed',
status: 'FAILED',
},
},
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reap-orphaned-meeting-bots.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts
similarity index 93%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reap-orphaned-meeting-bots.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts
index e99d6d66a5..c46d7f47c3 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reap-orphaned-meeting-bots.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts
@@ -1,7 +1,7 @@
import { type CoreApiClient } from 'twenty-client-sdk/core';
import { beforeEach, describe, expect, it, vi } from 'vitest';
-import { reapOrphanedMeetingBots } from 'src/logic-functions/flows/reap-orphaned-meeting-bots.util';
+import { reapOrphanedCallRecorders } from 'src/logic-functions/flows/reap-orphaned-call-recorders.util';
const listScheduledRecallBotsMock = vi.hoisted(() => vi.fn());
const cancelRecallBotMock = vi.hoisted(() => vi.fn());
@@ -89,7 +89,7 @@ const buildCurrentWorkspaceBot = ({
twentyWorkspaceId: CURRENT_WORKSPACE_ID,
});
-describe('reapOrphanedMeetingBots', () => {
+describe('reapOrphanedCallRecorders', () => {
beforeEach(() => {
vi.spyOn(console, 'warn').mockImplementation(() => {});
getCurrentWorkspaceIdMock.mockReset();
@@ -112,7 +112,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([
{
id: 'call-recording-1',
@@ -142,7 +142,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([
{
id: 'call-recording-1',
@@ -178,7 +178,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([
{
id: 'call-recording-1',
@@ -211,7 +211,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -234,7 +234,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([
{
id: 'call-recording-1',
@@ -259,7 +259,7 @@ describe('reapOrphanedMeetingBots', () => {
bots: [buildBot({ id: 'unrelated-bot' })],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -283,7 +283,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -308,7 +308,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -332,7 +332,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -363,7 +363,7 @@ describe('reapOrphanedMeetingBots', () => {
errorMessage: 'Recall API responded with HTTP 409',
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -385,7 +385,7 @@ describe('reapOrphanedMeetingBots', () => {
errorMessage: 'Recall API responded with HTTP 500',
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
@@ -410,7 +410,7 @@ describe('reapOrphanedMeetingBots', () => {
],
});
- const result = await reapOrphanedMeetingBots({
+ const result = await reapOrphanedCallRecorders({
client: buildClient([]),
joinAtAfter: JOIN_AT_AFTER,
joinAtBefore: JOIN_AT_BEFORE,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reconcile-meeting-bot.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts
similarity index 94%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reconcile-meeting-bot.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts
index 6729dcd74f..bb8ba52c7b 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/__tests__/reconcile-meeting-bot.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts
@@ -2,7 +2,7 @@ import { type CoreApiClient } from 'twenty-client-sdk/core';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { computeCallRecordingIdForMeeting } from 'src/logic-functions/domain/compute-call-recording-id-for-meeting.util';
-import { reconcileMeetingBotForCalendarEventIds } from 'src/logic-functions/flows/reconcile-meeting-bot.util';
+import { reconcileCallRecorderForCalendarEventIds } from 'src/logic-functions/flows/reconcile-call-recorder.util';
const scheduleRecallBotMock = vi.hoisted(() => vi.fn());
const rescheduleRecallBotMock = vi.hoisted(() => vi.fn());
@@ -46,7 +46,7 @@ type CalendarEventNode = {
endsAt?: string | null;
iCalUid?: string | null;
conferenceLink?: { primaryLinkUrl?: string | null } | null;
- meetingBotPreference?: string | null;
+ callRecorderPreference?: string | null;
};
type CallRecordingNode = {
@@ -201,7 +201,7 @@ const buildCalendarEvent = (
conferenceLink: {
primaryLinkUrl: 'https://meet.example.com/customer-sync',
},
- meetingBotPreference: 'ON',
+ callRecorderPreference: 'ON',
...overrides,
});
@@ -209,7 +209,7 @@ const buildFakeCoreApiClient = (
fixture: FakeCoreApiClientFixture,
): FakeCoreApiClient => new FakeCoreApiClient(fixture);
-describe('reconcileMeetingBotForCalendarEventIds', () => {
+describe('reconcileCallRecorderForCalendarEventIds', () => {
beforeEach(() => {
vi.spyOn(console, 'warn').mockImplementation(() => {});
vi.spyOn(console, 'error').mockImplementation(() => {});
@@ -237,7 +237,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
calendarEvents: [buildCalendarEvent()],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -274,10 +274,10 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
it('creates a scheduled call recording for the default ON preference', async () => {
const client = buildFakeCoreApiClient({
- calendarEvents: [buildCalendarEvent({ meetingBotPreference: null })],
+ calendarEvents: [buildCalendarEvent({ callRecorderPreference: null })],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -296,14 +296,14 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
const client = buildFakeCoreApiClient({
calendarEvents: [
buildCalendarEvent({
- meetingBotPreference: null,
+ callRecorderPreference: null,
startsAt: '2026-01-01T11:30:00.000Z',
endsAt: '2026-01-01T13:00:00.000Z',
}),
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -324,7 +324,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
const client = buildFakeCoreApiClient({
calendarEvents: [
buildCalendarEvent({
- meetingBotPreference: null,
+ callRecorderPreference: null,
title: 'Updated Customer Sync',
startsAt: '2026-01-01T11:30:00.000Z',
endsAt: '2026-01-01T13:00:00.000Z',
@@ -342,7 +342,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -385,7 +385,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -427,7 +427,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
const client = buildFakeCoreApiClient({
calendarEvents: [
buildCalendarEvent({
- meetingBotPreference: 'OFF',
+ callRecorderPreference: 'OFF',
}),
],
callRecordings: [
@@ -444,7 +444,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -478,7 +478,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
const client = buildFakeCoreApiClient({
calendarEvents: [
buildCalendarEvent({
- meetingBotPreference: 'OFF',
+ callRecorderPreference: 'OFF',
}),
],
callRecordings: [
@@ -495,7 +495,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -537,7 +537,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -569,7 +569,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -601,7 +601,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -635,7 +635,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: [],
removedOccurrences: [
@@ -691,7 +691,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
removedOccurrences: [
@@ -740,7 +740,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
const client = buildFakeCoreApiClient({
calendarEvents: [
buildCalendarEvent({
- meetingBotPreference: 'OFF',
+ callRecorderPreference: 'OFF',
}),
buildCalendarEvent({
id: 'calendar-event-2',
@@ -764,7 +764,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1', 'calendar-event-2'],
now: NOW,
@@ -812,7 +812,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -856,7 +856,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -911,7 +911,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
calendarEvents: [buildCalendarEvent()],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -945,7 +945,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
calendarEvents: [buildCalendarEvent()],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -967,7 +967,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
await Promise.all(
Array.from({ length: 4 }, () =>
- reconcileMeetingBotForCalendarEventIds({
+ reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
@@ -1001,7 +1001,7 @@ describe('reconcileMeetingBotForCalendarEventIds', () => {
calendarEvents: [buildCalendarEvent()],
});
- const result = await reconcileMeetingBotForCalendarEventIds({
+ const result = await reconcileCallRecorderForCalendarEventIds({
client: client as unknown as CoreApiClient,
calendarEventIds: ['calendar-event-1'],
now: NOW,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/cancel-call-recording-request.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/cancel-call-recording-request.util.ts
similarity index 88%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/cancel-call-recording-request.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/cancel-call-recording-request.util.ts
index 8184955a53..a3f9e1676e 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/cancel-call-recording-request.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/cancel-call-recording-request.util.ts
@@ -31,7 +31,7 @@ export const cancelCallRecordingRequest = async ({
if (!cancelResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to cancel Recall bot for callRecording ${callRecording.id}, leaving it for the stale-state cron: ${cancelResult.errorMessage}`,
+ `[call-recorder] failed to cancel Recall bot for callRecording ${callRecording.id}, leaving it for the stale-state cron: ${cancelResult.errorMessage}`,
);
return;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/charge-completed-call-recording.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/charge-completed-call-recording.util.ts
similarity index 84%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/charge-completed-call-recording.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/charge-completed-call-recording.util.ts
index dd1a02be0f..b24020db27 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/charge-completed-call-recording.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/charge-completed-call-recording.util.ts
@@ -16,7 +16,7 @@ export const chargeCompletedCallRecording = async ({
if (isUndefined(charge)) {
console.warn(
- `[twenty-meeting-bot] call recording ${callRecordingId} completed without usable recording timestamps; it will not be billed`,
+ `[call-recorder] call recording ${callRecordingId} completed without usable recording timestamps; it will not be billed`,
);
return;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/complete-and-charge-call-recording.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/complete-and-charge-call-recording.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/complete-and-charge-call-recording.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/complete-and-charge-call-recording.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/converge-diverged-call-recordings.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/converge-diverged-call-recordings.util.ts
similarity index 94%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/converge-diverged-call-recordings.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/converge-diverged-call-recordings.util.ts
index 0e27173f4e..ed712296b3 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/converge-diverged-call-recordings.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/converge-diverged-call-recordings.util.ts
@@ -83,7 +83,7 @@ export const convergeDivergedCallRecordings = async ({
for (const candidate of candidates) {
if (isOutsideConvergenceBound(candidate, convergenceLowerBound)) {
console.warn(
- `[twenty-meeting-bot] call recording ${candidate.id} diverged but its meeting ended more than ${CONVERGENCE_LOOKBACK_DAYS} days ago; it will not converge automatically`,
+ `[call-recorder] call recording ${candidate.id} diverged but its meeting ended more than ${CONVERGENCE_LOOKBACK_DAYS} days ago; it will not converge automatically`,
);
result.unconvergeableCallRecordingIds.push(candidate.id);
continue;
@@ -91,7 +91,7 @@ export const convergeDivergedCallRecordings = async ({
if (isUndefined(candidate.externalBotId)) {
console.warn(
- `[twenty-meeting-bot] call recording ${candidate.id} diverged but has no Recall bot id; it will not converge automatically`,
+ `[call-recorder] call recording ${candidate.id} diverged but has no Recall bot id; it will not converge automatically`,
);
result.unconvergeableCallRecordingIds.push(candidate.id);
continue;
@@ -241,7 +241,7 @@ const convergeCallRecording = async ({
}
console.warn(
- `[twenty-meeting-bot] failed to fetch Recall bot ${externalBotId} for call recording ${candidate.id}: ${botResult.errorMessage}`,
+ `[call-recorder] failed to fetch Recall bot ${externalBotId} for call recording ${candidate.id}: ${botResult.errorMessage}`,
);
return;
@@ -331,7 +331,7 @@ const buildConvergenceFieldUpdates = ({
updateData.status = convergence.status;
if (convergence.status === CallRecordingStatus.FAILED) {
- updateData.meetingBotFailureReason =
+ updateData.callRecorderFailureReason =
convergence.failureReason ?? 'recall_bot_failed';
}
}
@@ -356,7 +356,7 @@ const buildConvergenceFieldUpdates = ({
type TerminalArtifactGateFailureUpdate = {
status: CallRecordingStatus.FAILED;
- meetingBotFailureReason: string;
+ callRecorderFailureReason: string;
};
const buildTerminalArtifactGateFailureUpdate = ({
@@ -382,7 +382,7 @@ const buildTerminalArtifactGateFailureUpdate = ({
return {
status: CallRecordingStatus.FAILED,
- meetingBotFailureReason:
+ callRecorderFailureReason:
convergence.failureReason ?? 'recording_artifacts_unavailable',
};
};
@@ -424,7 +424,7 @@ const markCallRecordingFailedAfterBotLoss = async ({
}): Promise => {
// externalBotId is kept for audit even though the bot is gone at Recall.
console.warn(
- `[twenty-meeting-bot] Recall bot ${externalBotId} for call recording ${candidate.id} no longer exists; it will not converge automatically`,
+ `[call-recorder] Recall bot ${externalBotId} for call recording ${candidate.id} no longer exists; it will not converge automatically`,
);
if (
@@ -442,7 +442,7 @@ const markCallRecordingFailedAfterBotLoss = async ({
id: candidate.id,
data: {
status: CallRecordingStatus.FAILED,
- meetingBotFailureReason: 'recall_bot_not_found',
+ callRecorderFailureReason: 'recall_bot_not_found',
},
});
result.markedFailedCallRecordingIds.push(candidate.id);
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/download-transcript.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/download-transcript.util.ts
similarity index 89%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/download-transcript.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/download-transcript.util.ts
index f4a69ea813..4ae5bc12d2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/download-transcript.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/download-transcript.util.ts
@@ -44,7 +44,7 @@ const downloadTranscriptContent = async (
if (!response.ok) {
console.warn(
- `[twenty-meeting-bot] transcript download responded with HTTP ${response.status}`,
+ `[call-recorder] transcript download responded with HTTP ${response.status}`,
);
return {
@@ -56,7 +56,7 @@ const downloadTranscriptContent = async (
return { outcome: 'filled', content: await response.json() };
} catch (error) {
console.warn(
- `[twenty-meeting-bot] transcript download failed: ${error instanceof Error ? error.message : String(error)}`,
+ `[call-recorder] transcript download failed: ${error instanceof Error ? error.message : String(error)}`,
);
return {
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ensure-meeting-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ensure-call-recorder.util.ts
similarity index 87%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ensure-meeting-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ensure-call-recorder.util.ts
index 165e9a88ae..2fe38ab658 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ensure-meeting-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ensure-call-recorder.util.ts
@@ -11,7 +11,7 @@ import { scheduleRecallBot } from 'src/logic-functions/recall-api/schedule-recal
import { updateCallRecording } from 'src/logic-functions/data/update-call-recording.util';
// The sole place a Recall bot is created. Only the deterministic-create winner and the stale-state cron call it, so one writer per meeting POSTs exactly one bot.
-export const ensureMeetingBot = async (
+export const ensureCallRecorder = async (
client: CoreApiClient,
{ callRecording, calendarEvent }: MeetingRecording,
): Promise => {
@@ -41,7 +41,7 @@ export const ensureMeetingBot = async (
if (isUndefined(workspaceId)) {
console.error(
- `[twenty-meeting-bot] cannot schedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable, the shared webhook could not be routed back`,
+ `[call-recorder] cannot schedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable, the shared webhook could not be routed back`,
);
return false;
@@ -59,7 +59,7 @@ export const ensureMeetingBot = async (
if (!scheduleResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to schedule Recall bot for callRecording ${callRecording.id}: ${scheduleResult.errorMessage}`,
+ `[call-recorder] failed to schedule Recall bot for callRecording ${callRecording.id}: ${scheduleResult.errorMessage}`,
);
return false;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/handle-recall-webhook.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/handle-recall-webhook.util.ts
similarity index 94%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/handle-recall-webhook.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/handle-recall-webhook.util.ts
index 3ef4ed12af..d4f764e3f2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/handle-recall-webhook.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/handle-recall-webhook.util.ts
@@ -331,12 +331,12 @@ type CallRecordingStatusUpdate =
}
| {
status: CallRecordingStatus.FAILED;
- meetingBotFailureReason: string;
+ callRecorderFailureReason: string;
};
type TerminalArtifactGateFailureUpdate = {
status: CallRecordingStatus.FAILED;
- meetingBotFailureReason: string;
+ callRecorderFailureReason: string;
};
const buildCallRecordingStatusUpdate = ({
@@ -347,7 +347,7 @@ const buildCallRecordingStatusUpdate = ({
status: CallRecordingStatus;
}): CallRecordingStatusUpdate => {
if (status === CallRecordingStatus.FAILED) {
- return { status, meetingBotFailureReason: reason };
+ return { status, callRecorderFailureReason: reason };
}
return { status };
@@ -365,10 +365,11 @@ const buildTerminalArtifactGateFailureUpdate = ({
webhookEvent: RecallWebhookEvent;
}): TerminalArtifactGateFailureUpdate | undefined => {
if (updateData.status === CallRecordingStatus.FAILED) {
- return isUndefined(updateData.meetingBotFailureReason)
+ return isUndefined(updateData.callRecorderFailureReason)
? {
status: CallRecordingStatus.FAILED,
- meetingBotFailureReason: getRecallWebhookFailureReason(webhookEvent),
+ callRecorderFailureReason:
+ getRecallWebhookFailureReason(webhookEvent),
}
: undefined;
}
@@ -382,7 +383,7 @@ const buildTerminalArtifactGateFailureUpdate = ({
return {
status: CallRecordingStatus.FAILED,
- meetingBotFailureReason: 'recording_artifacts_unavailable',
+ callRecorderFailureReason: 'recording_artifacts_unavailable',
};
};
@@ -437,7 +438,7 @@ const buildMediaIngestionUpdate = async ({
if (isUndefined(externalRecordingId)) {
console.warn(
- `[twenty-meeting-bot] cannot ingest media for call recording ${callRecording.id}: no Recall recording id available`,
+ `[call-recorder] cannot ingest media for call recording ${callRecording.id}: no Recall recording id available`,
);
return {};
@@ -460,7 +461,7 @@ const buildTranscriptArtifactUpdate = async ({
}): Promise => {
if (isUndefined(externalRecordingId)) {
console.warn(
- `[twenty-meeting-bot] cannot reconcile transcript for call recording ${callRecording.id}: no Recall recording id available`,
+ `[call-recorder] cannot reconcile transcript for call recording ${callRecording.id}: no Recall recording id available`,
);
return {};
@@ -511,7 +512,7 @@ const fetchExternalRecordingIdFromRecallBot = async (
if (!botResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to fetch Recall bot ${externalBotId} while resolving a recording id: ${botResult.errorMessage}`,
+ `[call-recorder] failed to fetch Recall bot ${externalBotId} while resolving a recording id: ${botResult.errorMessage}`,
);
return { externalRecordingId: undefined, providerLookupFailed: true };
@@ -607,7 +608,7 @@ const handleRecallTranscriptEvent = async ({
: downloadResult.errorMessage;
console.warn(
- `[twenty-meeting-bot] could not fill transcript for call recording ${callRecording.id}: ${reason}`,
+ `[call-recorder] could not fill transcript for call recording ${callRecording.id}: ${reason}`,
);
return {
@@ -643,7 +644,7 @@ const applyTranscriptFailure = async ({
}
console.warn(
- `[twenty-meeting-bot] transcript failed for call recording ${callRecording.id}${isNull(subCode) ? '' : ` (${subCode})`}`,
+ `[call-recorder] transcript failed for call recording ${callRecording.id}${isNull(subCode) ? '' : ` (${subCode})`}`,
);
await updateCallRecording(client, {
@@ -654,7 +655,7 @@ const applyTranscriptFailure = async ({
transcriptId ?? existingMarker?.recallTranscriptId ?? null,
subCode,
}),
- meetingBotFailureReason: buildTranscriptFailureReason(subCode),
+ callRecorderFailureReason: buildTranscriptFailureReason(subCode),
...(isCallRecordingStatusDowngrade({
fromStatus: callRecording.status,
toStatus: CallRecordingStatus.FAILED,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts
similarity index 92%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts
index a445a00a2a..b550619da2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts
@@ -2,7 +2,7 @@ import { isUndefined } from '@sniptt/guards';
import { type CoreApiClient } from 'twenty-client-sdk/core';
import { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';
-import { ensureMeetingBot } from 'src/logic-functions/flows/ensure-meeting-bot.util';
+import { ensureCallRecorder } from 'src/logic-functions/flows/ensure-call-recorder.util';
import { fetchCalendarEventsByIds } from 'src/logic-functions/data/fetch-calendar-events-by-ids.util';
import { findOpenScheduledCallRecordings } from 'src/logic-functions/data/find-open-scheduled-call-recordings.util';
import { getUniqueSortedIds } from 'src/logic-functions/utils/get-unique-sorted-ids.util';
@@ -50,12 +50,12 @@ export const healCallRecordingsMissingBot = async ({
continue;
}
- const didScheduleMeetingBot = await ensureMeetingBot(client, {
+ const didScheduleCallRecorder = await ensureCallRecorder(client, {
callRecording,
calendarEvent,
});
- if (didScheduleMeetingBot) {
+ if (didScheduleCallRecorder) {
scheduledCallRecordingIds.push(callRecording.id);
}
}
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ingest-call-recording-media.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ingest-call-recording-media.util.ts
similarity index 91%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ingest-call-recording-media.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ingest-call-recording-media.util.ts
index 79259d9ce2..f7e28399a7 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/ingest-call-recording-media.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/ingest-call-recording-media.util.ts
@@ -33,7 +33,7 @@ export const ingestCallRecordingMedia = async ({
if (!recordingResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to fetch Recall recording ${externalRecordingId} while ingesting media for call recording ${callRecordingId}: ${recordingResult.errorMessage}`,
+ `[call-recorder] failed to fetch Recall recording ${externalRecordingId} while ingesting media for call recording ${callRecordingId}: ${recordingResult.errorMessage}`,
);
return {};
@@ -101,7 +101,7 @@ const ingestMediaArtifact = async ({
return [{ fileId: uploadedFile.id, label: fileName }];
} catch (error) {
console.warn(
- `[twenty-meeting-bot] failed to ingest ${fileName} for call recording ${callRecordingId}: ${error instanceof Error ? error.message : String(error)}`,
+ `[call-recorder] failed to ingest ${fileName} for call recording ${callRecordingId}: ${error instanceof Error ? error.message : String(error)}`,
);
return undefined;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/persist-call-recording-progress.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/persist-call-recording-progress.util.ts
similarity index 97%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/persist-call-recording-progress.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/persist-call-recording-progress.util.ts
index d72f9c402c..5024ec3a22 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/persist-call-recording-progress.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/persist-call-recording-progress.util.ts
@@ -44,7 +44,7 @@ export const persistCallRecordingProgress = async (
const nonStatusUpdate: CallRecordingUpdateFields = { ...updateData };
delete nonStatusUpdate.status;
- delete nonStatusUpdate.meetingBotFailureReason;
+ delete nonStatusUpdate.callRecorderFailureReason;
if (Object.keys(nonStatusUpdate).length > 0) {
await updateCallRecording(client, { id, data: nonStatusUpdate });
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reap-orphaned-meeting-bots.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts
similarity index 87%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reap-orphaned-meeting-bots.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts
index f7c8a35cbb..42445a3aa7 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reap-orphaned-meeting-bots.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts
@@ -14,13 +14,13 @@ import {
type RecallScheduledBot,
} from 'src/logic-functions/recall-api/list-scheduled-recall-bots.util';
-export type ReapOrphanedMeetingBotsResult = {
+export type ReapOrphanedCallRecordersResult = {
scannedBotCount: number;
canceledExternalBotIds: string[];
};
// Bots no open CallRecording request claims would still join; cancel them on Recall.
-export const reapOrphanedMeetingBots = async ({
+export const reapOrphanedCallRecorders = async ({
client,
joinAtAfter,
joinAtBefore,
@@ -28,7 +28,7 @@ export const reapOrphanedMeetingBots = async ({
client: CoreApiClient;
joinAtAfter: string;
joinAtBefore: string;
-}): Promise => {
+}): Promise => {
const listResult = await listScheduledRecallBots({
joinAtAfter,
joinAtBefore,
@@ -36,7 +36,7 @@ export const reapOrphanedMeetingBots = async ({
if (!listResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to list Recall bots for orphan reaping: ${listResult.errorMessage}`,
+ `[call-recorder] failed to list Recall bots for orphan reaping: ${listResult.errorMessage}`,
);
return { scannedBotCount: 0, canceledExternalBotIds: [] };
@@ -46,7 +46,7 @@ export const reapOrphanedMeetingBots = async ({
if (isUndefined(currentWorkspaceId)) {
console.warn(
- '[twenty-meeting-bot] cannot reap orphaned Recall bots: workspace id unavailable',
+ '[call-recorder] cannot reap orphaned Recall bots: workspace id unavailable',
);
return {
@@ -88,7 +88,7 @@ export const reapOrphanedMeetingBots = async ({
}
console.warn(
- `[twenty-meeting-bot] canceling orphaned Recall bot ${bot.id} (claimed callRecording: ${claimedCallRecordingId})`,
+ `[call-recorder] canceling orphaned Recall bot ${bot.id} (claimed callRecording: ${claimedCallRecordingId})`,
);
if (await cancelOrEjectRecallBot(bot.id)) {
@@ -110,9 +110,7 @@ const getClaimedCallRecordingId = (
return normalizeOptionalString(claimedCallRecordingId);
};
-const getClaimedWorkspaceId = (
- bot: RecallScheduledBot,
-): string | undefined => {
+const getClaimedWorkspaceId = (bot: RecallScheduledBot): string | undefined => {
const claimedWorkspaceId = bot.metadata.twentyWorkspaceId;
return normalizeOptionalString(claimedWorkspaceId);
@@ -175,7 +173,7 @@ const cancelOrEjectRecallBot = async (
}
console.warn(
- `[twenty-meeting-bot] failed to cancel orphaned Recall bot ${externalBotId}: ${cancelResult.errorMessage}`,
+ `[call-recorder] failed to cancel orphaned Recall bot ${externalBotId}: ${cancelResult.errorMessage}`,
);
return false;
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-meeting-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recorder.util.ts
similarity index 84%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-meeting-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recorder.util.ts
index 052e3b9629..33cdf49225 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-meeting-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recorder.util.ts
@@ -5,18 +5,18 @@ import { CallRecordingRequestStatus } from 'src/logic-functions/constants/call-r
import { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';
import { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';
import { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';
-import { type MeetingBotPolicyResultForMeeting } from 'src/logic-functions/types/meeting-bot-policy-result-for-meeting.type';
-import { type MeetingBotReconciliationResult } from 'src/logic-functions/types/meeting-bot-reconciliation-result.type';
-import { type RemovedMeetingBotOccurrence } from 'src/logic-functions/types/removed-meeting-bot-occurrence.type';
-import { aggregateMeetingBotPolicyResultsByMeeting } from 'src/logic-functions/domain/aggregate-meeting-bot-policy-results-by-meeting.util';
-import { buildMeetingBotPolicyResult } from 'src/logic-functions/domain/build-meeting-bot-policy-result.util';
+import { type CallRecorderPolicyResultForMeeting } from 'src/logic-functions/types/call-recorder-policy-result-for-meeting.type';
+import { type CallRecorderReconciliationResult } from 'src/logic-functions/types/call-recorder-reconciliation-result.type';
+import { type RemovedCallRecorderOccurrence } from 'src/logic-functions/types/removed-call-recorder-occurrence.type';
+import { aggregateCallRecorderPolicyResultsByMeeting } from 'src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util';
+import { buildCallRecorderPolicyResult } from 'src/logic-functions/domain/build-call-recorder-policy-result.util';
import { cancelCallRecordingRequest } from 'src/logic-functions/flows/cancel-call-recording-request.util';
import { computeCallRecordingIdForMeeting } from 'src/logic-functions/domain/compute-call-recording-id-for-meeting.util';
import {
createCallRecording,
type ScheduledCallRecordingFields,
} from 'src/logic-functions/data/create-call-recording.util';
-import { ensureMeetingBot } from 'src/logic-functions/flows/ensure-meeting-bot.util';
+import { ensureCallRecorder } from 'src/logic-functions/flows/ensure-call-recorder.util';
import { fetchCalendarEventsByIds } from 'src/logic-functions/data/fetch-calendar-events-by-ids.util';
import { fetchCalendarEventsByStartsAtValues } from 'src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util';
import { findCallRecordingsByCalendarEventIds } from 'src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util';
@@ -28,7 +28,7 @@ import {
type CallRecordingUpdateFields,
} from 'src/logic-functions/data/update-call-recording.util';
-export const reconcileMeetingBotForCalendarEventIds = async ({
+export const reconcileCallRecorderForCalendarEventIds = async ({
client,
calendarEventIds,
removedOccurrences = [],
@@ -36,24 +36,25 @@ export const reconcileMeetingBotForCalendarEventIds = async ({
}: {
client: CoreApiClient;
calendarEventIds: string[];
- removedOccurrences?: RemovedMeetingBotOccurrence[];
+ removedOccurrences?: RemovedCallRecorderOccurrence[];
now?: Date;
-}): Promise => {
- const meetingPolicyResults = await resolveMeetingBotPolicyResultsForMeetings({
- client,
- calendarEventIds,
- removedOccurrences,
- now,
- });
+}): Promise => {
+ const meetingPolicyResults =
+ await resolveCallRecorderPolicyResultsForMeetings({
+ client,
+ calendarEventIds,
+ removedOccurrences,
+ now,
+ });
- return reconcileMeetingBotForMeetingOccurrences({
+ return reconcileCallRecorderForMeetingOccurrences({
client,
meetingPolicyResults,
removedOccurrences,
});
};
-const resolveMeetingBotPolicyResultsForMeetings = async ({
+const resolveCallRecorderPolicyResultsForMeetings = async ({
client,
calendarEventIds,
removedOccurrences = [],
@@ -61,9 +62,9 @@ const resolveMeetingBotPolicyResultsForMeetings = async ({
}: {
client: CoreApiClient;
calendarEventIds: string[];
- removedOccurrences?: RemovedMeetingBotOccurrence[];
+ removedOccurrences?: RemovedCallRecorderOccurrence[];
now?: Date;
-}): Promise => {
+}): Promise => {
const changedCalendarEvents = await fetchCalendarEventsByIds(
client,
getUniqueSortedIds(calendarEventIds),
@@ -71,7 +72,7 @@ const resolveMeetingBotPolicyResultsForMeetings = async ({
const affectedMeetingKeys = new Set();
const occurrenceStartsAtAnchors = new Set();
const changedCalendarEventPolicyResults = changedCalendarEvents.map(
- (calendarEvent) => buildMeetingBotPolicyResult(calendarEvent, now),
+ (calendarEvent) => buildCallRecorderPolicyResult(calendarEvent, now),
);
for (const policyResult of changedCalendarEventPolicyResults) {
@@ -114,7 +115,7 @@ const resolveMeetingBotPolicyResultsForMeetings = async ({
policyResultsByCalendarEventId.set(
calendarEvent.id,
- buildMeetingBotPolicyResult(calendarEvent, now),
+ buildCallRecorderPolicyResult(calendarEvent, now),
);
}
@@ -129,7 +130,7 @@ const resolveMeetingBotPolicyResultsForMeetings = async ({
realMeetingKey: policyResult.realMeetingKey,
shouldRequestBot: policyResult.shouldRequestBot,
}));
- const meetingPolicyResults = aggregateMeetingBotPolicyResultsByMeeting(
+ const meetingPolicyResults = aggregateCallRecorderPolicyResultsByMeeting(
perCalendarEventPolicyResults,
);
const meetingKeysWithPolicyResult = new Set(
@@ -154,18 +155,18 @@ const resolveMeetingBotPolicyResultsForMeetings = async ({
return meetingPolicyResults;
};
-const reconcileMeetingBotForMeetingOccurrences = async ({
+const reconcileCallRecorderForMeetingOccurrences = async ({
client,
meetingPolicyResults,
removedOccurrences = [],
}: {
client: CoreApiClient;
- meetingPolicyResults: MeetingBotPolicyResultForMeeting[];
- removedOccurrences?: RemovedMeetingBotOccurrence[];
-}): Promise => {
+ meetingPolicyResults: CallRecorderPolicyResultForMeeting[];
+ removedOccurrences?: RemovedCallRecorderOccurrence[];
+}): Promise => {
const removedCalendarEventIdsByMeetingKey =
buildRemovedCalendarEventIdsByMeetingKey(removedOccurrences);
- const reconciliationResults: MeetingBotReconciliationResult[] = [];
+ const reconciliationResults: CallRecorderReconciliationResult[] = [];
const orderedMeetingPolicyResults = [
...meetingPolicyResults.filter(
(meetingPolicyResult) => !meetingPolicyResult.shouldRequestBot,
@@ -200,7 +201,7 @@ const reconcileMeetingBotForMeetingOccurrences = async ({
error instanceof Error ? error.message : String(error);
console.error(
- `[twenty-meeting-bot] reconciliation failed for meeting ${meetingPolicyResult.realMeetingKey}: ${errorMessage}`,
+ `[call-recorder] reconciliation failed for meeting ${meetingPolicyResult.realMeetingKey}: ${errorMessage}`,
);
reconciliationResults.push({
action: 'FAILED',
@@ -219,9 +220,9 @@ const reconcileActiveMeeting = async ({
removedCalendarEventIds,
}: {
client: CoreApiClient;
- meetingPolicyResult: MeetingBotPolicyResultForMeeting;
+ meetingPolicyResult: CallRecorderPolicyResultForMeeting;
removedCalendarEventIds: string[];
-}): Promise => {
+}): Promise => {
const representativeCalendarEventId = getUniqueSortedIds(
meetingPolicyResult.requestingCalendarEventIds,
)[0];
@@ -286,7 +287,7 @@ const updatePolicyManagedCallRecording = async ({
existingCallRecording: CallRecordingRecord;
representativeCalendarEvent: CalendarEventRecord;
realMeetingKey: string;
-}): Promise => {
+}): Promise => {
await updateCallRecording(client, {
id: existingCallRecording.id,
data: buildPolicyManagedCallRecordingUpdateFields({
@@ -316,7 +317,7 @@ const createPolicyManagedCallRecording = async ({
callRecordingId: string;
representativeCalendarEvent: CalendarEventRecord;
realMeetingKey: string;
-}): Promise => {
+}): Promise => {
const scheduledFields = buildScheduledCallRecordingFields(
representativeCalendarEvent,
);
@@ -345,7 +346,7 @@ const createPolicyManagedCallRecording = async ({
}
// Winning the deterministic-id insert elects this run as the single writer that creates the bot.
- await ensureMeetingBot(client, {
+ await ensureCallRecorder(client, {
callRecording: {
id: callRecordingId,
...scheduledFields,
@@ -367,7 +368,7 @@ const findManualOpenCallRecording = async ({
removedCalendarEventIds,
}: {
client: CoreApiClient;
- meetingPolicyResult: MeetingBotPolicyResultForMeeting;
+ meetingPolicyResult: CallRecorderPolicyResultForMeeting;
removedCalendarEventIds: string[];
}): Promise => {
const calendarEventIds = getUniqueSortedIds([
@@ -397,9 +398,9 @@ const reconcileCanceledMeeting = async ({
removedCalendarEventIds,
}: {
client: CoreApiClient;
- meetingPolicyResult: MeetingBotPolicyResultForMeeting;
+ meetingPolicyResult: CallRecorderPolicyResultForMeeting;
removedCalendarEventIds: string[];
-}): Promise => {
+}): Promise => {
const calendarEventIds = getUniqueSortedIds([
...meetingPolicyResult.calendarEventIds,
...removedCalendarEventIds,
@@ -459,9 +460,9 @@ const buildPolicyManagedCallRecordingUpdateFields = ({
canResetCallRecordingStatusToScheduled(existingCallRecording.status)
? {
...buildScheduledCallRecordingFields(calendarEvent),
- ...(isUndefined(existingCallRecording.meetingBotFailureReason)
+ ...(isUndefined(existingCallRecording.callRecorderFailureReason)
? {}
- : { meetingBotFailureReason: null }),
+ : { callRecorderFailureReason: null }),
}
: buildCalendarDrivenCallRecordingFields(calendarEvent);
@@ -472,7 +473,7 @@ const canResetCallRecordingStatusToScheduled = (
status === CallRecordingStatus.FAILED;
const buildRemovedCalendarEventIdsByMeetingKey = (
- removedOccurrences: RemovedMeetingBotOccurrence[],
+ removedOccurrences: RemovedCallRecorderOccurrence[],
): Map => {
const calendarEventIdsByMeetingKey = new Map();
@@ -489,7 +490,7 @@ const buildRemovedCalendarEventIdsByMeetingKey = (
const buildSkippedResult = (
realMeetingKey: string,
-): MeetingBotReconciliationResult => ({
+): CallRecorderReconciliationResult => ({
action: 'SKIPPED',
realMeetingKey,
callRecordingId: null,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts
similarity index 86%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts
index d7226cd243..18581dc5b2 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts
@@ -2,7 +2,7 @@ import { type CallRecordingUpdateFields } from 'src/logic-functions/data/update-
type CallRecordingTranscriptArtifactUpdateFields = Pick<
CallRecordingUpdateFields,
- 'meetingBotFailureReason' | 'status' | 'transcript'
+ 'callRecorderFailureReason' | 'status' | 'transcript'
>;
export type ReconcileCallRecordingTranscriptArtifactResult = {
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts
similarity index 92%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts
index a657ae961a..0d6489c59a 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts
@@ -46,7 +46,7 @@ export const reconcileCallRecordingTranscriptArtifact = async ({
if (!listResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to list Recall transcripts for recording ${externalRecordingId}: ${listResult.errorMessage}`,
+ `[call-recorder] failed to list Recall transcripts for recording ${externalRecordingId}: ${listResult.errorMessage}`,
);
return buildEmptyTranscriptArtifactResult();
@@ -73,7 +73,7 @@ export const reconcileCallRecordingTranscriptArtifact = async ({
if (!createResult.ok) {
console.warn(
- `[twenty-meeting-bot] failed to request transcript for Recall recording ${externalRecordingId}: ${createResult.errorMessage}`,
+ `[call-recorder] failed to request transcript for Recall recording ${externalRecordingId}: ${createResult.errorMessage}`,
);
return buildEmptyTranscriptArtifactResult();
@@ -142,7 +142,7 @@ export const reconcileCallRecordingTranscriptArtifact = async ({
if (downloadResult.outcome === 'error') {
console.warn(
- `[twenty-meeting-bot] could not fill transcript for call recording ${callRecordingId}: ${downloadResult.errorMessage}`,
+ `[call-recorder] could not fill transcript for call recording ${callRecordingId}: ${downloadResult.errorMessage}`,
);
}
@@ -173,7 +173,7 @@ const buildTranscriptFailureUpdate = ({
recallTranscriptId: transcriptId,
subCode,
}),
- meetingBotFailureReason: buildTranscriptFailureReason(subCode),
+ callRecorderFailureReason: buildTranscriptFailureReason(subCode),
...(isCallRecordingStatusDowngrade({
fromStatus: currentStatus,
toStatus: CallRecordingStatus.FAILED,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reschedule-call-recording-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reschedule-call-recording-bot.util.ts
similarity index 88%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reschedule-call-recording-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reschedule-call-recording-bot.util.ts
index f3be32c694..caa1e8801b 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/flows/reschedule-call-recording-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/flows/reschedule-call-recording-bot.util.ts
@@ -33,7 +33,7 @@ export const rescheduleCallRecordingBot = async (
if (isUndefined(workspaceId)) {
console.warn(
- `[twenty-meeting-bot] cannot reschedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable`,
+ `[call-recorder] cannot reschedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable`,
);
return;
@@ -65,6 +65,6 @@ export const rescheduleCallRecordingBot = async (
}
console.warn(
- `[twenty-meeting-bot] failed to update Recall bot for callRecording ${callRecording.id}: ${rescheduleResult.errorMessage}`,
+ `[call-recorder] failed to update Recall bot for callRecording ${callRecording.id}: ${rescheduleResult.errorMessage}`,
);
};
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts
similarity index 95%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts
index 8e301c55d9..aa165b12a5 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts
@@ -9,7 +9,7 @@ import { listScheduledRecallBots } from 'src/logic-functions/recall-api/list-sch
import { rescheduleRecallBot } from 'src/logic-functions/recall-api/reschedule-recall-bot.util';
import { retrieveRecallTranscript } from 'src/logic-functions/recall-api/retrieve-recall-transcript.util';
import { scheduleRecallBot } from 'src/logic-functions/recall-api/schedule-recall-bot.util';
-import { MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name';
+import { CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name';
const getRecallApiConfigMock = vi.hoisted(() => vi.fn());
const WORKSPACE_ID = '123e4567-e89b-12d3-a456-426614174000';
@@ -22,14 +22,14 @@ describe('recall bot api', () => {
const fetchMock = vi.fn();
beforeEach(() => {
- delete process.env[MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME];
+ delete process.env[CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME];
getRecallApiConfigMock.mockReset();
getRecallApiConfigMock.mockReturnValue({
success: true,
config: {
apiKey: 'recall-api-key',
baseUrl: 'https://ap-northeast-1.recall.ai/api/v1',
- botName: 'Twenty Meeting Bot',
+ botName: 'Call Recorder',
},
});
fetchMock.mockReset();
@@ -67,7 +67,7 @@ describe('recall bot api', () => {
expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toEqual({
meeting_url: 'https://meet.google.com/abc-defg-hij',
join_at: '2026-01-01T13:00:00.000Z',
- bot_name: 'Twenty Meeting Bot',
+ bot_name: 'Call Recorder',
recording_config: {
video_mixed_mp4: {},
audio_mixed_mp3: {},
@@ -83,7 +83,7 @@ describe('recall bot api', () => {
});
it('uses the configured Recall recording retention hours when scheduling a bot', async () => {
- process.env[MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME] = '240';
+ process.env[CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME] = '240';
const result = await scheduleRecallBot({
meetingUrl: 'https://meet.google.com/abc-defg-hij',
@@ -97,17 +97,17 @@ describe('recall bot api', () => {
});
expect(result).toEqual({ ok: true, externalBotId: 'recall-bot-id' });
- expect(JSON.parse(fetchMock.mock.calls[0][1].body).recording_config).toEqual(
- {
- video_mixed_mp4: {},
- audio_mixed_mp3: {},
- retention: { type: 'timed', hours: 240 },
- },
- );
+ expect(
+ JSON.parse(fetchMock.mock.calls[0][1].body).recording_config,
+ ).toEqual({
+ video_mixed_mp4: {},
+ audio_mixed_mp3: {},
+ retention: { type: 'timed', hours: 240 },
+ });
});
it('falls back to safe Recall recording retention hours when the configured value is invalid', async () => {
- process.env[MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME] =
+ process.env[CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME] =
'seven-days';
const result = await scheduleRecallBot({
@@ -122,13 +122,13 @@ describe('recall bot api', () => {
});
expect(result).toEqual({ ok: true, externalBotId: 'recall-bot-id' });
- expect(JSON.parse(fetchMock.mock.calls[0][1].body).recording_config).toEqual(
- {
- video_mixed_mp4: {},
- audio_mixed_mp3: {},
- retention: { type: 'timed', hours: 166 },
- },
- );
+ expect(
+ JSON.parse(fetchMock.mock.calls[0][1].body).recording_config,
+ ).toEqual({
+ video_mixed_mp4: {},
+ audio_mixed_mp3: {},
+ retention: { type: 'timed', hours: 166 },
+ });
});
it('fails when the create response does not include a bot id', async () => {
@@ -182,13 +182,13 @@ describe('recall bot api', () => {
errorMessage:
'Recall API responded with HTTP 404: {"detail":"Not found."}',
});
- expect(JSON.parse(fetchMock.mock.calls[0][1].body).recording_config).toEqual(
- {
- video_mixed_mp4: {},
- audio_mixed_mp3: {},
- retention: { type: 'timed', hours: 166 },
- },
- );
+ expect(
+ JSON.parse(fetchMock.mock.calls[0][1].body).recording_config,
+ ).toEqual({
+ video_mixed_mp4: {},
+ audio_mixed_mp3: {},
+ retention: { type: 'timed', hours: 166 },
+ });
});
it('does not duplicate an existing Token authorization prefix', async () => {
@@ -197,7 +197,7 @@ describe('recall bot api', () => {
config: {
apiKey: 'Token recall-api-key',
baseUrl: 'https://ap-northeast-1.recall.ai/api/v1',
- botName: 'Twenty Meeting Bot',
+ botName: 'Call Recorder',
},
});
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/cancel-recall-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/cancel-recall-bot.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/cancel-recall-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/cancel-recall-bot.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/create-async-recall-transcript.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/create-async-recall-transcript.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/create-async-recall-transcript.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/create-async-recall-transcript.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/eject-recall-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/eject-recall-bot.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/eject-recall-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/eject-recall-bot.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-bot-id.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-bot-id.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-bot-id.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-bot-id.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-media-urls.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-media-urls.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/extract-recall-media-urls.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/extract-recall-media-urls.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-api-config.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-api-config.util.ts
similarity index 79%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-api-config.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-api-config.util.ts
index 3bac96a932..d30749a6e1 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-api-config.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-api-config.util.ts
@@ -1,8 +1,8 @@
import { isUndefined } from '@sniptt/guards';
-import { DEFAULT_MEETING_BOT_NAME } from 'src/logic-functions/constants/default-meeting-bot-name';
+import { CALL_RECORDER_NAME_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-name-env-var-name';
+import { DEFAULT_CALL_RECORDER_NAME } from 'src/logic-functions/constants/default-call-recorder-name';
import { DEFAULT_RECALL_REGION } from 'src/logic-functions/constants/default-recall-region';
-import { MEETING_BOT_NAME_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-name-env-var-name';
import { RECALL_API_KEY_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-api-key-env-var-name';
import { RECALL_REGION_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-region-env-var-name';
import { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';
@@ -31,7 +31,7 @@ export const getRecallApiConfig = ():
return {
success: false,
error:
- 'RECALL_API_KEY server variable is not set. A server admin must set it on the Twenty Meeting Bot application registration before scheduling bots.',
+ 'RECALL_API_KEY server variable is not set. A server admin must set it on the Call Recorder application registration before scheduling bots.',
};
}
@@ -41,8 +41,8 @@ export const getRecallApiConfig = ():
) ?? DEFAULT_RECALL_REGION;
const botName =
normalizeOptionalString(
- getApplicationVariableValue(MEETING_BOT_NAME_ENV_VAR_NAME),
- ) ?? DEFAULT_MEETING_BOT_NAME;
+ getApplicationVariableValue(CALL_RECORDER_NAME_ENV_VAR_NAME),
+ ) ?? DEFAULT_CALL_RECORDER_NAME;
return {
success: true,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-bot.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-bot.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-recording.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-recording.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/get-recall-recording.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/get-recall-recording.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/list-recall-transcripts.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/list-recall-transcripts.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/list-recall-transcripts.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/list-recall-transcripts.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/recall-bot-api-request.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/recall-bot-api-request.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/recall-bot-api-request.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/recall-bot-api-request.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/recall-transcript-summary.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/recall-transcript-summary.type.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/recall-transcript-summary.type.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/recall-transcript-summary.type.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/reschedule-recall-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/reschedule-recall-bot.util.ts
similarity index 94%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/reschedule-recall-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/reschedule-recall-bot.util.ts
index cf6cc2d0f8..a45d27ea3b 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/reschedule-recall-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/reschedule-recall-bot.util.ts
@@ -37,7 +37,9 @@ export const rescheduleRecallBot = async ({
meeting_url: meetingUrl,
join_at: joinAt,
bot_name: configResult.config.botName,
- ...(isUndefined(automaticLeave) ? {} : { automatic_leave: automaticLeave }),
+ ...(isUndefined(automaticLeave)
+ ? {}
+ : { automatic_leave: automaticLeave }),
recording_config: getRecallBotRecordingConfig(),
metadata,
},
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/schedule-recall-bot.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/schedule-recall-bot.util.ts
similarity index 95%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/schedule-recall-bot.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/schedule-recall-bot.util.ts
index 8de80b44e1..7cec18c3cb 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/schedule-recall-bot.util.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/schedule-recall-bot.util.ts
@@ -38,7 +38,9 @@ export const scheduleRecallBot = async ({
meeting_url: meetingUrl,
join_at: joinAt,
bot_name: configResult.config.botName,
- ...(isUndefined(automaticLeave) ? {} : { automatic_leave: automaticLeave }),
+ ...(isUndefined(automaticLeave)
+ ? {}
+ : { automatic_leave: automaticLeave }),
recording_config: getRecallBotRecordingConfig(),
metadata,
},
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts
similarity index 100%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-webhook.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-webhook.ts
similarity index 95%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-webhook.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-webhook.ts
index 770989bab1..c596b17418 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/recall-webhook.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/recall-webhook.ts
@@ -13,7 +13,7 @@ import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.
// Non-2xx makes Svix retry; a returned plain object would 200-ack permanently.
const rejectWebhook = (status: number, error: string): Response => {
- console.error(`[twenty-meeting-bot] webhook rejected: ${error}`);
+ console.error(`[call-recorder] webhook rejected: ${error}`);
return new Response({ error }, { status });
};
@@ -28,7 +28,7 @@ export const recallWebhookRouteHandler = async (
if (!isNonEmptyString(webhookSecret)) {
return rejectWebhook(
500,
- 'RECALL_WEBHOOK_SECRET server variable is not set. A server admin must copy it from the Recall webhook endpoint settings and set it on the Twenty Meeting Bot application registration.',
+ 'RECALL_WEBHOOK_SECRET server variable is not set. A server admin must copy it from the Recall webhook endpoint settings and set it on the Call Recorder application registration.',
);
}
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-meeting-bot-calendar-event.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-call-recorder-calendar-event.ts
similarity index 86%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-meeting-bot-calendar-event.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-call-recorder-calendar-event.ts
index e023330383..70bf7c6818 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-meeting-bot-calendar-event.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-call-recorder-calendar-event.ts
@@ -7,16 +7,16 @@ import {
} from 'twenty-sdk/define';
import { CALENDAR_EVENT_RECONCILIATION_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/calendar-event-reconciliation-logic-function-universal-identifier';
-import { type RemovedMeetingBotOccurrence } from 'src/logic-functions/types/removed-meeting-bot-occurrence.type';
+import { type RemovedCallRecorderOccurrence } from 'src/logic-functions/types/removed-call-recorder-occurrence.type';
import { computeRealMeetingKey } from 'src/logic-functions/domain/compute-real-meeting-key.util';
import { getUniqueSortedIds } from 'src/logic-functions/utils/get-unique-sorted-ids.util';
-import { reconcileMeetingBotForCalendarEventIds } from 'src/logic-functions/flows/reconcile-meeting-bot.util';
+import { reconcileCallRecorderForCalendarEventIds } from 'src/logic-functions/flows/reconcile-call-recorder.util';
const CALENDAR_EVENT_OBJECT_NAME = 'calendarEvent';
-const MEETING_BOT_RELEVANT_CALENDAR_EVENT_FIELDS = [
+const CALL_RECORDER_RELEVANT_CALENDAR_EVENT_FIELDS = [
'title',
- 'meetingBotPreference',
+ 'callRecorderPreference',
'conferenceLink',
'startsAt',
'endsAt',
@@ -24,7 +24,7 @@ const MEETING_BOT_RELEVANT_CALENDAR_EVENT_FIELDS = [
'iCalUid',
];
-const MEETING_BOT_KEY_CALENDAR_EVENT_FIELDS = [
+const CALL_RECORDER_KEY_CALENDAR_EVENT_FIELDS = [
'conferenceLink',
'startsAt',
'iCalUid',
@@ -43,7 +43,7 @@ type CalendarEventDatabaseEvent = DatabaseEventPayload<
type CalendarEventReconciliationPayload = {
calendarEventIds: string[];
- removedOccurrences: RemovedMeetingBotOccurrence[];
+ removedOccurrences: RemovedCallRecorderOccurrence[];
};
const handler = async (
@@ -68,7 +68,7 @@ const handler = async (
}
const client = new CoreApiClient();
- const reconciliationResults = await reconcileMeetingBotForCalendarEventIds({
+ const reconciliationResults = await reconcileCallRecorderForCalendarEventIds({
client,
calendarEventIds: reconciliationPayload.calendarEventIds,
removedOccurrences: reconciliationPayload.removedOccurrences,
@@ -137,17 +137,17 @@ const buildCalendarEventReconciliationPayload = ({
const hasRelevantFieldChange = (updatedFields: string[]): boolean =>
updatedFields.some((updatedField) =>
- MEETING_BOT_RELEVANT_CALENDAR_EVENT_FIELDS.includes(updatedField),
+ CALL_RECORDER_RELEVANT_CALENDAR_EVENT_FIELDS.includes(updatedField),
);
const hasKeyFieldChange = (updatedFields: string[]): boolean =>
updatedFields.some((updatedField) =>
- MEETING_BOT_KEY_CALENDAR_EVENT_FIELDS.includes(updatedField),
+ CALL_RECORDER_KEY_CALENDAR_EVENT_FIELDS.includes(updatedField),
);
const buildRemovedOccurrence = (
calendarEvent: CalendarEventForDatabaseEvent | undefined,
-): RemovedMeetingBotOccurrence | undefined => {
+): RemovedCallRecorderOccurrence | undefined => {
if (isUndefined(calendarEvent)) {
return undefined;
}
@@ -167,7 +167,7 @@ const buildRemovedOccurrence = (
export default defineLogicFunction({
universalIdentifier:
CALENDAR_EVENT_RECONCILIATION_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,
- name: 'reconcile-meeting-bot-calendar-event',
+ name: 'reconcile-call-recorder-calendar-event',
description:
'Reconciles app-managed Recall bot recording requests when calendar events change.',
timeoutSeconds: 60,
diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-stale-bot-state.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-stale-bot-state.ts
similarity index 84%
rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-stale-bot-state.ts
rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-stale-bot-state.ts
index e83b36477d..23a7924fe6 100644
--- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/reconcile-stale-bot-state.ts
+++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/reconcile-stale-bot-state.ts
@@ -3,18 +3,16 @@ import { defineLogicFunction } from 'twenty-sdk/define';
import { STALE_BOT_STATE_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/stale-bot-state-logic-function-universal-identifier';
import { STALE_BOT_STATE_CRON_PATTERN } from 'src/logic-functions/constants/stale-bot-state-cron-pattern';
-import {
- convergeDivergedCallRecordings,
-} from 'src/logic-functions/flows/converge-diverged-call-recordings.util';
+import { convergeDivergedCallRecordings } from 'src/logic-functions/flows/converge-diverged-call-recordings.util';
import { type ConvergeDivergedCallRecordingsResult } from 'src/logic-functions/flows/converge-diverged-call-recordings-result.type';
import {
healCallRecordingsMissingBot,
type HealCallRecordingsMissingBotResult,
} from 'src/logic-functions/flows/heal-call-recordings-missing-bot.util';
import {
- reapOrphanedMeetingBots,
- type ReapOrphanedMeetingBotsResult,
-} from 'src/logic-functions/flows/reap-orphaned-meeting-bots.util';
+ reapOrphanedCallRecorders,
+ type ReapOrphanedCallRecordersResult,
+} from 'src/logic-functions/flows/reap-orphaned-call-recorders.util';
// Every unwanted bot passes through this join_at window before it can attend.
const REAPER_JOIN_AT_LOOKBACK_HOURS = 4;
@@ -30,10 +28,8 @@ const reconcileStaleBotStateHandler = async (): Promise