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) Review in cubic --------- 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 => { client, now, ); - const orphanedBotReapingResult = await reapOrphanedMeetingBotsInJoinAtWindow( - client, - now, - ); + const orphanedBotReapingResult = + await reapOrphanedCallRecordersInJoinAtWindow(client, now); const statusConvergenceResult = await convergeDivergedCallRecordingsSafely( client, now, @@ -57,12 +53,12 @@ const healCallRecordingsMissingBotSafely = async ( } }; -const reapOrphanedMeetingBotsInJoinAtWindow = async ( +const reapOrphanedCallRecordersInJoinAtWindow = async ( client: CoreApiClient, now: Date, -): Promise => { +): Promise => { try { - return await reapOrphanedMeetingBots({ + return await reapOrphanedCallRecorders({ client, joinAtAfter: new Date( now.getTime() - REAPER_JOIN_AT_LOOKBACK_HOURS * 60 * 60 * 1000, @@ -91,7 +87,7 @@ const buildStepFailure = (stepLabel: string, error: unknown): StepFailure => { const errorMessage = error instanceof Error ? error.message : String(error); if (process.env.NODE_ENV !== 'test') { - console.error(`[twenty-meeting-bot] ${stepLabel} failed: ${errorMessage}`); + console.error(`[call-recorder] ${stepLabel} failed: ${errorMessage}`); } return { error: `${stepLabel} failed` }; diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/calendar-event-record.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/calendar-event-record.type.ts new file mode 100644 index 0000000000..fafefc9294 --- /dev/null +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/calendar-event-record.type.ts @@ -0,0 +1,5 @@ +import { type CallRecorderPolicyCalendarEventInput } from 'src/logic-functions/types/call-recorder-policy-calendar-event-input.type'; + +export type CalendarEventRecord = CallRecorderPolicyCalendarEventInput & { + title: string | undefined; +}; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-calendar-event-input.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts similarity index 71% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-calendar-event-input.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts index 0a87c8114a..c1d8cc4bd9 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-calendar-event-input.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts @@ -1,10 +1,10 @@ // Domain read shape: wire composites are flattened and absence is undefined. -export type MeetingBotPolicyCalendarEventInput = { +export type CallRecorderPolicyCalendarEventInput = { id: string; isCanceled: boolean; startsAt: string | undefined; endsAt: string | undefined; iCalUid: string | undefined; conferenceLinkUrl: string | undefined; - meetingBotPreference: string | undefined; + callRecorderPreference: string | undefined; }; diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-input.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-input.type.ts new file mode 100644 index 0000000000..e81c29612b --- /dev/null +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-input.type.ts @@ -0,0 +1,9 @@ +import { type CallRecorderPreference } from 'src/constants/call-recorder-preference'; + +export type CallRecorderPolicyInput = { + callRecorderPreference: CallRecorderPreference | undefined; + isCanceled: boolean; + startsAt: string | undefined; + endsAt: string | undefined; + conferenceLinkUrl: string | undefined; +}; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-not-required-reason.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts similarity index 66% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-not-required-reason.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts index 748a5a5dc0..ec296d1784 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-not-required-reason.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts @@ -1,4 +1,4 @@ -export type MeetingBotPolicyNotRequiredReason = +export type CallRecorderPolicyNotRequiredReason = | 'EVENT_CANCELED' | 'PREFERENCE_OFF' | 'MISSING_CONFERENCE_LINK' diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-required-reason.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-required-reason.type.ts new file mode 100644 index 0000000000..74c8467552 --- /dev/null +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-required-reason.type.ts @@ -0,0 +1 @@ +export type CallRecorderPolicyRequiredReason = 'RECORDING_ENABLED'; diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts new file mode 100644 index 0000000000..51582edba7 --- /dev/null +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts @@ -0,0 +1,9 @@ +import { type CallRecorderPreference } from 'src/constants/call-recorder-preference'; +import { type CallRecorderPolicyResult } from 'src/logic-functions/types/call-recorder-policy-result.type'; + +export type CallRecorderPolicyResultForCalendarEvent = + CallRecorderPolicyResult & { + calendarEventId: string; + callRecorderPreference: CallRecorderPreference | undefined; + realMeetingKey: string; + }; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-meeting.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts similarity index 71% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-meeting.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts index 7091c0addb..d3e37eda63 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-meeting.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts @@ -1,4 +1,4 @@ -export type MeetingBotPolicyResultForMeeting = { +export type CallRecorderPolicyResultForMeeting = { realMeetingKey: string; shouldRequestBot: boolean; calendarEventIds: string[]; diff --git a/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result.type.ts new file mode 100644 index 0000000000..f6aaafb081 --- /dev/null +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-policy-result.type.ts @@ -0,0 +1,12 @@ +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'; + +export type CallRecorderPolicyResult = + | { + shouldRequestBot: true; + reason: CallRecorderPolicyRequiredReason; + } + | { + shouldRequestBot: false; + reason: CallRecorderPolicyNotRequiredReason; + }; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-reconciliation-result.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-reconciliation-result.type.ts similarity index 87% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-reconciliation-result.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-reconciliation-result.type.ts index ae463e04b5..255c8897cf 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-reconciliation-result.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recorder-reconciliation-result.type.ts @@ -1,4 +1,4 @@ -export type MeetingBotReconciliationResult = +export type CallRecorderReconciliationResult = | { action: 'CREATED' | 'UPDATED' | 'CANCELED'; realMeetingKey: string; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/call-recording-record.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recording-record.type.ts similarity index 92% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/call-recording-record.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recording-record.type.ts index 8d046052c8..350d5210d7 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/call-recording-record.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/call-recording-record.type.ts @@ -11,5 +11,5 @@ export type CallRecordingRecord = { calendarEventId?: string; externalBotId?: string; externalRecordingId?: string; - meetingBotFailureReason?: string; + callRecorderFailureReason?: string; }; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/files-field-value.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/files-field-value.type.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/files-field-value.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/files-field-value.type.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-recording.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/meeting-recording.type.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-recording.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/meeting-recording.type.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/recall-bot-metadata.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/recall-bot-metadata.type.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/recall-bot-metadata.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/recall-bot-metadata.type.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/recall-bot-operation-result.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/recall-bot-operation-result.type.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/recall-bot-operation-result.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/recall-bot-operation-result.type.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/removed-meeting-bot-occurrence.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/removed-call-recorder-occurrence.type.ts similarity index 78% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/removed-meeting-bot-occurrence.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/removed-call-recorder-occurrence.type.ts index 506a3490d5..a0c11f619a 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/removed-meeting-bot-occurrence.type.ts +++ b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/removed-call-recorder-occurrence.type.ts @@ -1,5 +1,5 @@ // An occurrence whose event was deleted/moved; key + start re-checks siblings. -export type RemovedMeetingBotOccurrence = { +export type RemovedCallRecorderOccurrence = { calendarEventId: string; realMeetingKey: string; startsAt: string | undefined; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/transcript-marker.type.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/types/transcript-marker.type.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/transcript-marker.type.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/types/transcript-marker.type.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/as-record.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/as-record.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/as-record.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/as-record.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-application-variable-value.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-application-variable-value.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-application-variable-value.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-application-variable-value.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-record-at-path.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-record-at-path.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-record-at-path.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-record-at-path.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-string.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-string.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-string.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-string.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-unique-sorted-ids.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-unique-sorted-ids.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/get-unique-sorted-ids.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/get-unique-sorted-ids.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/is-non-empty-string.util.ts b/packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/is-non-empty-string.util.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/utils/is-non-empty-string.util.ts rename to packages/twenty-apps/internal/call-recorder/src/logic-functions/utils/is-non-empty-string.util.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/page-layouts/calendar-event-recording-tab.ts b/packages/twenty-apps/internal/call-recorder/src/page-layouts/calendar-event-recording-tab.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/page-layouts/calendar-event-recording-tab.ts rename to packages/twenty-apps/internal/call-recorder/src/page-layouts/calendar-event-recording-tab.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts b/packages/twenty-apps/internal/call-recorder/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts similarity index 63% rename from packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts rename to packages/twenty-apps/internal/call-recorder/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts index 8cba6d1ae8..015e66424b 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/view-fields/meeting-bot-preference-on-calendar-event.view-field.ts +++ b/packages/twenty-apps/internal/call-recorder/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts @@ -1,7 +1,7 @@ import { defineViewField } from 'twenty-sdk/define'; -import { MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier'; -import { MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier'; +import { CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier'; +import { CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier'; // TODO: hardcoded because the published twenty-sdk (2.14.0) predates the // calendarEventRecordPageFields view. Replace both with @@ -14,13 +14,13 @@ const CALENDAR_EVENT_RECORD_PAGE_FIELDS_GENERAL_GROUP_UNIVERSAL_IDENTIFIER = export default defineViewField({ universalIdentifier: - MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER, + CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER, viewUniversalIdentifier: CALENDAR_EVENT_RECORD_PAGE_FIELDS_VIEW_UNIVERSAL_IDENTIFIER, viewFieldGroupUniversalIdentifier: CALENDAR_EVENT_RECORD_PAGE_FIELDS_GENERAL_GROUP_UNIVERSAL_IDENTIFIER, fieldMetadataUniversalIdentifier: - MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER, + CALL_RECORDER_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER, position: 8, isVisible: true, size: 150, diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/tsconfig.json b/packages/twenty-apps/internal/call-recorder/tsconfig.json similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/tsconfig.json rename to packages/twenty-apps/internal/call-recorder/tsconfig.json diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/tsconfig.spec.json b/packages/twenty-apps/internal/call-recorder/tsconfig.spec.json similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/tsconfig.spec.json rename to packages/twenty-apps/internal/call-recorder/tsconfig.spec.json diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/vitest.config.ts b/packages/twenty-apps/internal/call-recorder/vitest.config.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/vitest.config.ts rename to packages/twenty-apps/internal/call-recorder/vitest.config.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/vitest.unit.config.ts b/packages/twenty-apps/internal/call-recorder/vitest.unit.config.ts similarity index 100% rename from packages/twenty-apps/internal/twenty-meeting-bot/vitest.unit.config.ts rename to packages/twenty-apps/internal/call-recorder/vitest.unit.config.ts diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/yarn.lock b/packages/twenty-apps/internal/call-recorder/yarn.lock similarity index 99% rename from packages/twenty-apps/internal/twenty-meeting-bot/yarn.lock rename to packages/twenty-apps/internal/call-recorder/yarn.lock index 2282a5403f..32ea508482 100644 --- a/packages/twenty-apps/internal/twenty-meeting-bot/yarn.lock +++ b/packages/twenty-apps/internal/call-recorder/yarn.lock @@ -989,6 +989,27 @@ __metadata: languageName: node linkType: hard +"@twentyhq/call-recorder@workspace:.": + version: 0.0.0-use.local + resolution: "@twentyhq/call-recorder@workspace:." + dependencies: + "@emotion/react": "npm:^11.14.0" + "@emotion/styled": "npm:^11.14.0" + "@sniptt/guards": "npm:^0.2.0" + "@types/node": "npm:^24.7.2" + "@types/react": "npm:^19.0.0" + "@typescript/native-preview": "npm:^7.0.0-dev.20260116.1" + oxlint: "npm:^0.16.0" + react: "npm:^19.0.0" + react-dom: "npm:^19.0.0" + twenty-client-sdk: "npm:2.15.0" + twenty-sdk: "npm:2.15.0" + typescript: "npm:^5.9.3" + vite-tsconfig-paths: "npm:^4.2.1" + vitest: "npm:^4.1.9" + languageName: unknown + linkType: soft + "@tybys/wasm-util@npm:^0.10.2": version: 0.10.2 resolution: "@tybys/wasm-util@npm:0.10.2" @@ -2994,27 +3015,6 @@ __metadata: languageName: node linkType: hard -"twenty-meeting-bot@workspace:.": - version: 0.0.0-use.local - resolution: "twenty-meeting-bot@workspace:." - dependencies: - "@emotion/react": "npm:^11.14.0" - "@emotion/styled": "npm:^11.14.0" - "@sniptt/guards": "npm:^0.2.0" - "@types/node": "npm:^24.7.2" - "@types/react": "npm:^19.0.0" - "@typescript/native-preview": "npm:^7.0.0-dev.20260116.1" - oxlint: "npm:^0.16.0" - react: "npm:^19.0.0" - react-dom: "npm:^19.0.0" - twenty-client-sdk: "npm:2.15.0" - twenty-sdk: "npm:2.15.0" - typescript: "npm:^5.9.3" - vite-tsconfig-paths: "npm:^4.2.1" - vitest: "npm:^4.1.9" - languageName: unknown - linkType: soft - "twenty-sdk@npm:2.15.0": version: 2.15.0 resolution: "twenty-sdk@npm:2.15.0" diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/application-config.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/application-config.ts deleted file mode 100644 index 0ecf95e8a8..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/application-config.ts +++ /dev/null @@ -1,96 +0,0 @@ -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 { MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-everyone-left-timeout-seconds-app-variable-universal-identifier'; -import { MEETING_BOT_JOIN_EARLY_MINUTES_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-join-early-minutes-app-variable-universal-identifier'; -import { MEETING_BOT_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-name-app-variable-universal-identifier'; -import { MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-noone-joined-timeout-seconds-app-variable-universal-identifier'; -import { MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-waiting-room-timeout-seconds-app-variable-universal-identifier'; -import { DEFAULT_MEETING_BOT_JOIN_EARLY_MINUTES } from 'src/logic-functions/constants/default-meeting-bot-join-early-minutes'; -import { DEFAULT_MEETING_BOT_NAME } from 'src/logic-functions/constants/default-meeting-bot-name'; -import { DEFAULT_MEETING_BOT_RECORDING_RETENTION_HOURS } from 'src/logic-functions/constants/default-meeting-bot-recording-retention-hours'; -import { DEFAULT_RECALL_REGION } from 'src/logic-functions/constants/default-recall-region'; -import { MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS } from 'src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds'; -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_JOIN_EARLY_MINUTES_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name'; -import { MEETING_BOT_NAME_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-name-env-var-name'; -import { MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS } from 'src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds'; -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_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name'; -import { MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS } from 'src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds'; -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 { 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/twenty-meeting-bot-cover.png'], - applicationVariables: { - [MEETING_BOT_NAME_ENV_VAR_NAME]: { - universalIdentifier: MEETING_BOT_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER, - description: 'Display name the meeting bot uses when it joins a call.', - isSecret: false, - value: DEFAULT_MEETING_BOT_NAME, - }, - [MEETING_BOT_JOIN_EARLY_MINUTES_ENV_VAR_NAME]: { - universalIdentifier: - MEETING_BOT_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_MEETING_BOT_JOIN_EARLY_MINUTES), - }, - [MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME]: { - universalIdentifier: - MEETING_BOT_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(MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS), - }, - [MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME]: { - universalIdentifier: - MEETING_BOT_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(MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS), - }, - [MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME]: { - universalIdentifier: - MEETING_BOT_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(MEETING_BOT_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 meeting 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, - }, - [MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME]: { - description: `How many hours Recall.ai retains recording media after processing. Defaults to ${DEFAULT_MEETING_BOT_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/app-description.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-description.ts deleted file mode 100644 index e5580e7cae..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-description.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const APP_DESCRIPTION = - 'Capture every customer conversation automatically. A meeting bot joins eligible meetings and records calls for you.'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-display-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-display-name.ts deleted file mode 100644 index 9208fcde47..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/app-display-name.ts +++ /dev/null @@ -1 +0,0 @@ -export const APP_DISPLAY_NAME = 'Twenty Meeting Bot'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-everyone-left-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-everyone-left-timeout-seconds-app-variable-universal-identifier.ts deleted file mode 100644 index 6197b972b7..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-everyone-left-timeout-seconds-app-variable-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER = - 'c866ddd4-fb7b-4cb4-8ad1-5599755e495c'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-failure-reason-on-call-recording-field-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-failure-reason-on-call-recording-field-universal-identifier.ts deleted file mode 100644 index 8de20ef3a7..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-failure-reason-on-call-recording-field-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER = - '33a577e4-02f5-48bd-8bed-d365949caa72'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-join-early-minutes-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-join-early-minutes-app-variable-universal-identifier.ts deleted file mode 100644 index 3d4165ec0e..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-join-early-minutes-app-variable-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_JOIN_EARLY_MINUTES_APP_VARIABLE_UNIVERSAL_IDENTIFIER = - '0568ebb2-3f64-47de-8c0d-d367dfbb7462'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-name-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-name-app-variable-universal-identifier.ts deleted file mode 100644 index 51a8ac9177..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-name-app-variable-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_NAME_APP_VARIABLE_UNIVERSAL_IDENTIFIER = - 'c54cbacd-ad10-40b4-9056-7aaf23846d64'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-noone-joined-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-noone-joined-timeout-seconds-app-variable-universal-identifier.ts deleted file mode 100644 index 60b8a04a00..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-noone-joined-timeout-seconds-app-variable-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER = - '241180e8-d864-4160-ad02-db44a9e8d395'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-off-option-id.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-off-option-id.ts deleted file mode 100644 index 7a51ea4c2f..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-off-option-id.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_PREFERENCE_OFF_OPTION_ID = - 'cc7de62a-08b6-46c8-aa69-f8117e7dd722'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier.ts deleted file mode 100644 index c321578654..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER = - '8ee9444a-2437-4def-8e61-6e493862a4fd'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts deleted file mode 100644 index 477d5abd6b..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-calendar-event-view-field-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_VIEW_FIELD_UNIVERSAL_IDENTIFIER = - 'e8c7e9c5-2b4f-4a75-ae46-ea331809106c'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-option-id.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-option-id.ts deleted file mode 100644 index 77a82fa86d..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference-on-option-id.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_PREFERENCE_ON_OPTION_ID = - '72431216-49c4-47c8-99af-de4c3831b0be'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference.ts deleted file mode 100644 index 670e71c935..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-preference.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum MeetingBotPreference { - ON = 'ON', - OFF = 'OFF', -} diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-waiting-room-timeout-seconds-app-variable-universal-identifier.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-waiting-room-timeout-seconds-app-variable-universal-identifier.ts deleted file mode 100644 index bec5abdce4..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/constants/meeting-bot-waiting-room-timeout-seconds-app-variable-universal-identifier.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_APP_VARIABLE_UNIVERSAL_IDENTIFIER = - '12e4e14d-d539-4d07-b477-4773539dd20b'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-failure-reason-on-call-recording.field.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-failure-reason-on-call-recording.field.ts deleted file mode 100644 index af87ce4b87..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-failure-reason-on-call-recording.field.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - defineField, - FieldType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, -} from 'twenty-sdk/define'; - -import { MEETING_BOT_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-failure-reason-on-call-recording-field-universal-identifier'; - -export default defineField({ - universalIdentifier: - MEETING_BOT_FAILURE_REASON_ON_CALL_RECORDING_FIELD_UNIVERSAL_IDENTIFIER, - objectUniversalIdentifier: - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.callRecording.universalIdentifier, - type: FieldType.TEXT, - name: 'meetingBotFailureReason', - label: 'Meeting Bot Failure Reason', - description: - 'Provider-specific reason the meeting bot could not produce a recording.', - icon: 'IconAlertTriangle', - isNullable: true, - isUIEditable: false, -}); diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-preference-on-calendar-event.field.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-preference-on-calendar-event.field.ts deleted file mode 100644 index 078c91a327..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/fields/meeting-bot-preference-on-calendar-event.field.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - defineField, - FieldType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, -} from 'twenty-sdk/define'; - -import { MeetingBotPreference } from 'src/constants/meeting-bot-preference'; -import { MEETING_BOT_PREFERENCE_OFF_OPTION_ID } from 'src/constants/meeting-bot-preference-off-option-id'; -import { MEETING_BOT_PREFERENCE_ON_OPTION_ID } from 'src/constants/meeting-bot-preference-on-option-id'; -import { MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/meeting-bot-preference-on-calendar-event-field-universal-identifier'; - -export default defineField({ - universalIdentifier: - MEETING_BOT_PREFERENCE_ON_CALENDAR_EVENT_FIELD_UNIVERSAL_IDENTIFIER, - objectUniversalIdentifier: - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.calendarEvent.universalIdentifier, - type: FieldType.SELECT, - name: 'meetingBotPreference', - label: 'Recording Bot', - description: - 'Meeting bot recording is on by default when the app is installed. Turn it off for this event when needed.', - icon: 'IconRobot', - isNullable: false, - defaultValue: `'${MeetingBotPreference.ON}'`, - options: [ - { - id: MEETING_BOT_PREFERENCE_ON_OPTION_ID, - value: MeetingBotPreference.ON, - label: 'On', - position: 0, - color: 'green', - }, - { - id: MEETING_BOT_PREFERENCE_OFF_OPTION_ID, - value: MeetingBotPreference.OFF, - label: 'Off', - position: 1, - color: 'red', - }, - ], -}); diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-join-early-minutes.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-join-early-minutes.ts deleted file mode 100644 index 4af45b74e9..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-join-early-minutes.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_MEETING_BOT_JOIN_EARLY_MINUTES = 1; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-name.ts deleted file mode 100644 index 4c2a6f77e3..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/default-meeting-bot-name.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_MEETING_BOT_NAME = 'Twenty Meeting Bot'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds-env-var-name.ts deleted file mode 100644 index 2528599282..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds-env-var-name.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME = - 'MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds.ts deleted file mode 100644 index e4c841805a..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-everyone-left-timeout-seconds.ts +++ /dev/null @@ -1 +0,0 @@ -export const MEETING_BOT_EVERYONE_LEFT_TIMEOUT_SECONDS = 2; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name.ts deleted file mode 100644 index 7cb8ac5121..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-join-early-minutes-env-var-name.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_JOIN_EARLY_MINUTES_ENV_VAR_NAME = - 'MEETING_BOT_JOIN_EARLY_MINUTES'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-name-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-name-env-var-name.ts deleted file mode 100644 index efa200e15e..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-name-env-var-name.ts +++ /dev/null @@ -1 +0,0 @@ -export const MEETING_BOT_NAME_ENV_VAR_NAME = 'MEETING_BOT_NAME'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds-env-var-name.ts deleted file mode 100644 index f530a83ca4..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds-env-var-name.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME = - 'MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds.ts deleted file mode 100644 index 52ed2c3672..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-noone-joined-timeout-seconds.ts +++ /dev/null @@ -1 +0,0 @@ -export const MEETING_BOT_NOONE_JOINED_TIMEOUT_SECONDS = 20 * 60; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name.ts deleted file mode 100644 index f8a6573c9e..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-recording-retention-hours-env-var-name.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_RECORDING_RETENTION_HOURS_ENV_VAR_NAME = - 'MEETING_BOT_RECORDING_RETENTION_HOURS'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds-env-var-name.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds-env-var-name.ts deleted file mode 100644 index ca872670bc..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds-env-var-name.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME = - 'MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds.ts deleted file mode 100644 index 42bfa92498..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/constants/meeting-bot-waiting-room-timeout-seconds.ts +++ /dev/null @@ -1 +0,0 @@ -export const MEETING_BOT_WAITING_ROOM_TIMEOUT_SECONDS = 1200; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-meeting-bot-policy-result.util.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-meeting-bot-policy-result.util.ts deleted file mode 100644 index fc181bcd06..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-meeting-bot-policy-result.util.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { MeetingBotPreference } from 'src/constants/meeting-bot-preference'; -import { type MeetingBotPolicyCalendarEventInput } from 'src/logic-functions/types/meeting-bot-policy-calendar-event-input.type'; -import { type MeetingBotPolicyResultForCalendarEvent } from 'src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type'; -import { computeRealMeetingKey } from 'src/logic-functions/domain/compute-real-meeting-key.util'; -import { resolveMeetingBotPolicyResult } from 'src/logic-functions/domain/resolve-meeting-bot-policy-result.util'; - -export const buildMeetingBotPolicyResult = ( - calendarEvent: MeetingBotPolicyCalendarEventInput, - now: Date, -): MeetingBotPolicyResultForCalendarEvent => { - const realMeetingKey = computeRealMeetingKey({ - calendarEventId: calendarEvent.id, - conferenceLinkUrl: calendarEvent.conferenceLinkUrl, - iCalUid: calendarEvent.iCalUid, - startsAt: calendarEvent.startsAt, - }); - - const meetingBotPreference = normalizeMeetingBotPreference( - calendarEvent.meetingBotPreference, - ); - - const policyResult = resolveMeetingBotPolicyResult({ - input: { - meetingBotPreference, - isCanceled: calendarEvent.isCanceled, - startsAt: calendarEvent.startsAt, - endsAt: calendarEvent.endsAt, - conferenceLinkUrl: calendarEvent.conferenceLinkUrl, - }, - now, - }); - - return { - calendarEventId: calendarEvent.id, - meetingBotPreference, - realMeetingKey, - ...policyResult, - }; -}; - -const normalizeMeetingBotPreference = ( - meetingBotPreference: string | undefined, -): MeetingBotPreference | undefined => - isMeetingBotPreference(meetingBotPreference) - ? meetingBotPreference - : undefined; - -const isMeetingBotPreference = ( - meetingBotPreference: string | undefined, -): meetingBotPreference is MeetingBotPreference => - Object.values(MeetingBotPreference).some( - (preference) => preference === meetingBotPreference, - ); diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-transcript-failure-reason.util.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-transcript-failure-reason.util.ts deleted file mode 100644 index aab66570b5..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/domain/build-transcript-failure-reason.util.ts +++ /dev/null @@ -1,7 +0,0 @@ -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/types/calendar-event-record.type.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/calendar-event-record.type.ts deleted file mode 100644 index 1871fee9a2..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/calendar-event-record.type.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type MeetingBotPolicyCalendarEventInput } from 'src/logic-functions/types/meeting-bot-policy-calendar-event-input.type'; - -export type CalendarEventRecord = MeetingBotPolicyCalendarEventInput & { - title: string | undefined; -}; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-input.type.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-input.type.ts deleted file mode 100644 index 5a90fd60f4..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-input.type.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type MeetingBotPreference } from 'src/constants/meeting-bot-preference'; - -export type MeetingBotPolicyInput = { - meetingBotPreference: MeetingBotPreference | undefined; - isCanceled: boolean; - startsAt: string | undefined; - endsAt: string | undefined; - conferenceLinkUrl: string | undefined; -}; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-required-reason.type.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-required-reason.type.ts deleted file mode 100644 index ef80f8eaeb..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-required-reason.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type MeetingBotPolicyRequiredReason = 'RECORDING_ENABLED'; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type.ts deleted file mode 100644 index a8c5b0762e..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result-for-calendar-event.type.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type MeetingBotPreference } from 'src/constants/meeting-bot-preference'; -import { type MeetingBotPolicyResult } from 'src/logic-functions/types/meeting-bot-policy-result.type'; - -export type MeetingBotPolicyResultForCalendarEvent = MeetingBotPolicyResult & { - calendarEventId: string; - meetingBotPreference: MeetingBotPreference | undefined; - realMeetingKey: string; -}; diff --git a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result.type.ts b/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result.type.ts deleted file mode 100644 index 2b420ff94f..0000000000 --- a/packages/twenty-apps/internal/twenty-meeting-bot/src/logic-functions/types/meeting-bot-policy-result.type.ts +++ /dev/null @@ -1,12 +0,0 @@ -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'; - -export type MeetingBotPolicyResult = - | { - shouldRequestBot: true; - reason: MeetingBotPolicyRequiredReason; - } - | { - shouldRequestBot: false; - reason: MeetingBotPolicyNotRequiredReason; - };