@twentyhq/call-recorder 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/manifest.json +297 -0
- package/package.json +2 -2
- package/src/front-components/calendar-event-recording.front-component.mjs +269 -0
- package/src/front-components/calendar-event-recording.front-component.mjs.map +7 -0
- package/src/logic-functions/process-recall-webhook.mjs +1744 -0
- package/src/logic-functions/process-recall-webhook.mjs.map +7 -0
- package/src/logic-functions/recall-webhook.mjs +391 -0
- package/src/logic-functions/recall-webhook.mjs.map +7 -0
- package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs +1602 -0
- package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs.map +7 -0
- package/src/logic-functions/reconcile-stale-bot-state.mjs +2268 -0
- package/src/logic-functions/reconcile-stale-bot-state.mjs.map +7 -0
- package/.env.example +0 -5
- package/.nvmrc +0 -1
- package/.oxlintrc.json +0 -20
- package/AGENTS.md +0 -67
- package/CLAUDE.md +0 -67
- package/README.md +0 -24
- package/SETUP.md +0 -95
- package/src/__tests__/global-setup.ts +0 -100
- package/src/__tests__/schema.integration-test.ts +0 -104
- package/src/application-config.ts +0 -96
- package/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts +0 -19
- package/src/constants/app-description.ts +0 -2
- package/src/constants/app-display-name.ts +0 -1
- package/src/constants/application-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-record-page-layout-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-front-component-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts +0 -2
- package/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-name-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-off-option-id.ts +0 -2
- package/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts +0 -2
- package/src/constants/call-recorder-preference-on-option-id.ts +0 -2
- package/src/constants/call-recorder-preference.ts +0 -4
- package/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts +0 -2
- package/src/constants/call-recording-audio-field-universal-identifier.ts +0 -2
- package/src/constants/call-recording-video-field-universal-identifier.ts +0 -2
- package/src/constants/default-role-universal-identifier.ts +0 -2
- package/src/constants/process-recall-webhook-logic-function-universal-identifier.ts +0 -2
- package/src/constants/recall-webhook-logic-function-universal-identifier.ts +0 -2
- package/src/constants/stale-bot-state-logic-function-universal-identifier.ts +0 -2
- package/src/default-role.ts +0 -69
- package/src/fields/call-recorder-failure-reason-on-call-recording.field.ts +0 -22
- package/src/fields/call-recorder-preference-on-calendar-event.field.ts +0 -41
- package/src/front-components/calendar-event-recording.front-component.tsx +0 -13
- package/src/front-components/components/CalendarEventRecording.tsx +0 -39
- package/src/front-components/components/CalendarEventRecordingBody.tsx +0 -96
- package/src/front-components/components/CalendarEventRecordingContent.tsx +0 -111
- package/src/front-components/components/RecordingTranscript.tsx +0 -92
- package/src/front-components/components/RecordingVideoPlayer.tsx +0 -52
- package/src/front-components/components/TranscriptEntryList.tsx +0 -61
- package/src/front-components/components/TranscriptEntryListItem.tsx +0 -115
- package/src/front-components/components/TranscriptErrorBox.tsx +0 -48
- package/src/front-components/components/TranscriptSpeakerAvatar.tsx +0 -141
- package/src/front-components/components/TranscriptSpeakerChip.tsx +0 -51
- package/src/front-components/constants/recording-theme-css-variables.ts +0 -40
- package/src/front-components/hooks/use-calendar-event-participants.ts +0 -172
- package/src/front-components/hooks/use-calendar-event-recording.ts +0 -155
- package/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts +0 -6
- package/src/front-components/types/calendar-event-recording-participant.type.ts +0 -7
- package/src/front-components/types/transcript-entry.type.ts +0 -13
- package/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts +0 -66
- package/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts +0 -29
- package/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts +0 -22
- package/src/front-components/utils/__tests__/parse-transcript-entries.test.ts +0 -162
- package/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts +0 -45
- package/src/front-components/utils/find-active-transcript-entry-index.util.ts +0 -77
- package/src/front-components/utils/format-transcript-timestamp.util.ts +0 -16
- package/src/front-components/utils/get-absolute-avatar-url.util.ts +0 -48
- package/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts +0 -24
- package/src/front-components/utils/get-speaker-name-match-keys.util.ts +0 -64
- package/src/front-components/utils/get-video-file-extension.util.ts +0 -23
- package/src/front-components/utils/parse-transcript-entries.util.ts +0 -85
- package/src/logic-functions/__tests__/process-recall-webhook.test.ts +0 -62
- package/src/logic-functions/__tests__/recall-webhook.test.ts +0 -180
- package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-name-env-var-name.ts +0 -1
- package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts +0 -2
- package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts +0 -1
- package/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts +0 -1
- package/src/logic-functions/constants/call-recording-request-status.ts +0 -5
- package/src/logic-functions/constants/call-recording-status.ts +0 -9
- package/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts +0 -1
- package/src/logic-functions/constants/default-call-recorder-name.ts +0 -1
- package/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts +0 -2
- package/src/logic-functions/constants/default-recall-region.ts +0 -1
- package/src/logic-functions/constants/milliseconds-per-minute.ts +0 -1
- package/src/logic-functions/constants/non-terminal-call-recording-statuses.ts +0 -8
- package/src/logic-functions/constants/recall-api-key-env-var-name.ts +0 -1
- package/src/logic-functions/constants/recall-api-max-attempts.ts +0 -1
- package/src/logic-functions/constants/recall-api-retry-delay-ms.ts +0 -1
- package/src/logic-functions/constants/recall-bot-automatic-leave.ts +0 -74
- package/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts +0 -1
- package/src/logic-functions/constants/recall-bot-recording-config.ts +0 -34
- package/src/logic-functions/constants/recall-region-env-var-name.ts +0 -1
- package/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts +0 -1
- package/src/logic-functions/constants/restricted-field-placeholder.ts +0 -3
- package/src/logic-functions/constants/stale-bot-state-cron-pattern.ts +0 -1
- package/src/logic-functions/constants/twenty-page-size.ts +0 -1
- package/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts +0 -55
- package/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts +0 -43
- package/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts +0 -38
- package/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts +0 -22
- package/src/logic-functions/data/complete-call-recording-ingestion.util.ts +0 -24
- package/src/logic-functions/data/create-call-recording.util.ts +0 -41
- package/src/logic-functions/data/fetch-all-nodes.util.ts +0 -44
- package/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts +0 -80
- package/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts +0 -20
- package/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts +0 -19
- package/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts +0 -17
- package/src/logic-functions/data/find-call-recordings-by-filter.util.ts +0 -102
- package/src/logic-functions/data/find-call-recordings-by-ids.util.ts +0 -17
- package/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts +0 -14
- package/src/logic-functions/data/get-current-workspace-id.util.ts +0 -36
- package/src/logic-functions/data/strip-restricted-field-value.util.ts +0 -6
- package/src/logic-functions/data/update-call-recording.util.ts +0 -24
- package/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts +0 -47
- package/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts +0 -71
- package/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts +0 -37
- package/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts +0 -88
- package/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts +0 -59
- package/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts +0 -37
- package/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts +0 -120
- package/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts +0 -102
- package/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts +0 -42
- package/src/logic-functions/domain/build-call-recorder-policy-result.util.ts +0 -53
- package/src/logic-functions/domain/build-failed-transcript-marker.util.ts +0 -13
- package/src/logic-functions/domain/build-pending-transcript-marker.util.ts +0 -13
- package/src/logic-functions/domain/build-recall-routing-metadata.util.ts +0 -12
- package/src/logic-functions/domain/build-transcript-failure-reason.util.ts +0 -7
- package/src/logic-functions/domain/compute-call-recording-charge.util.ts +0 -41
- package/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts +0 -16
- package/src/logic-functions/domain/compute-real-meeting-key.util.ts +0 -48
- package/src/logic-functions/domain/compute-recall-bot-join-at.util.ts +0 -34
- package/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts +0 -19
- package/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts +0 -37
- package/src/logic-functions/domain/is-recall-recording-done-signal.util.ts +0 -13
- package/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts +0 -26
- package/src/logic-functions/domain/parse-transcript-marker.util.ts +0 -29
- package/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts +0 -72
- package/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts +0 -32
- package/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts +0 -45
- package/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts +0 -61
- package/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts +0 -727
- package/src/logic-functions/flows/__tests__/download-transcript.test.ts +0 -74
- package/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts +0 -1301
- package/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts +0 -225
- package/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts +0 -153
- package/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts +0 -425
- package/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts +0 -1007
- package/src/logic-functions/flows/cancel-call-recording-request.util.ts +0 -46
- package/src/logic-functions/flows/charge-completed-call-recording.util.ts +0 -31
- package/src/logic-functions/flows/complete-and-charge-call-recording.util.ts +0 -29
- package/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts +0 -8
- package/src/logic-functions/flows/converge-diverged-call-recordings.util.ts +0 -447
- package/src/logic-functions/flows/download-transcript.util.ts +0 -67
- package/src/logic-functions/flows/ensure-call-recorder.util.ts +0 -73
- package/src/logic-functions/flows/handle-recall-webhook.util.ts +0 -672
- package/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts +0 -82
- package/src/logic-functions/flows/ingest-call-recording-media.util.ts +0 -128
- package/src/logic-functions/flows/persist-call-recording-progress.util.ts +0 -58
- package/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts +0 -183
- package/src/logic-functions/flows/reconcile-call-recorder.util.ts +0 -495
- package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts +0 -11
- package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts +0 -182
- package/src/logic-functions/flows/reschedule-call-recording-bot.util.ts +0 -69
- package/src/logic-functions/process-recall-webhook.ts +0 -23
- package/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts +0 -153
- package/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts +0 -67
- package/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts +0 -744
- package/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts +0 -122
- package/src/logic-functions/recall-api/cancel-recall-bot.util.ts +0 -28
- package/src/logic-functions/recall-api/create-async-recall-transcript.util.ts +0 -47
- package/src/logic-functions/recall-api/eject-recall-bot.util.ts +0 -28
- package/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts +0 -149
- package/src/logic-functions/recall-api/extract-recall-bot-id.util.ts +0 -10
- package/src/logic-functions/recall-api/extract-recall-media-urls.util.ts +0 -30
- package/src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util.ts +0 -8
- package/src/logic-functions/recall-api/get-recall-api-config.util.ts +0 -59
- package/src/logic-functions/recall-api/get-recall-bot.util.ts +0 -42
- package/src/logic-functions/recall-api/get-recall-recording.util.ts +0 -31
- package/src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts +0 -18
- package/src/logic-functions/recall-api/list-recall-transcripts.util.ts +0 -141
- package/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts +0 -106
- package/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts +0 -14
- package/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts +0 -88
- package/src/logic-functions/recall-api/recall-bot-api-request.util.ts +0 -165
- package/src/logic-functions/recall-api/recall-transcript-summary.type.ts +0 -5
- package/src/logic-functions/recall-api/reschedule-recall-bot.util.ts +0 -56
- package/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts +0 -71
- package/src/logic-functions/recall-api/schedule-recall-bot.util.ts +0 -68
- package/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts +0 -109
- package/src/logic-functions/recall-webhook.ts +0 -90
- package/src/logic-functions/reconcile-call-recorder-calendar-event.ts +0 -178
- package/src/logic-functions/reconcile-stale-bot-state.ts +0 -106
- package/src/logic-functions/types/calendar-event-record.type.ts +0 -5
- package/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts +0 -10
- package/src/logic-functions/types/call-recorder-policy-input.type.ts +0 -9
- package/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts +0 -5
- package/src/logic-functions/types/call-recorder-policy-required-reason.type.ts +0 -1
- package/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts +0 -9
- package/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts +0 -6
- package/src/logic-functions/types/call-recorder-policy-result.type.ts +0 -12
- package/src/logic-functions/types/call-recorder-reconciliation-result.type.ts +0 -16
- package/src/logic-functions/types/call-recording-media-file.type.ts +0 -1
- package/src/logic-functions/types/call-recording-record.type.ts +0 -15
- package/src/logic-functions/types/call-recording-update-fields.type.ts +0 -20
- package/src/logic-functions/types/files-field-value.type.ts +0 -1
- package/src/logic-functions/types/meeting-recording.type.ts +0 -7
- package/src/logic-functions/types/recall-bot-operation-result.type.ts +0 -19
- package/src/logic-functions/types/recall-routing-metadata.type.ts +0 -4
- package/src/logic-functions/types/removed-call-recorder-occurrence.type.ts +0 -6
- package/src/logic-functions/types/transcript-marker.type.ts +0 -6
- package/src/logic-functions/utils/as-record.util.ts +0 -6
- package/src/logic-functions/utils/get-application-variable-value.util.ts +0 -3
- package/src/logic-functions/utils/get-record-at-path.util.ts +0 -10
- package/src/logic-functions/utils/get-string.util.ts +0 -4
- package/src/logic-functions/utils/get-unique-sorted-ids.util.ts +0 -8
- package/src/logic-functions/utils/is-non-empty-string.util.ts +0 -5
- package/src/page-layouts/calendar-event-recording-tab.ts +0 -33
- package/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts +0 -27
- package/tsconfig.json +0 -42
- package/tsconfig.spec.json +0 -9
- package/vitest.config.ts +0 -31
- package/vitest.unit.config.ts +0 -14
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../node_modules/@sniptt/guards/lib/guards/primitives.ts", "../../../../node_modules/@sniptt/guards/lib/guards/structural.ts", "../../../../node_modules/@sniptt/guards/lib/guards/convenience.ts", "../../../../node_modules/@sniptt/guards/lib/index.ts", "../../../../src/logic-functions/reconcile-call-recorder-calendar-event.ts", "twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../../src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts", "../../../../src/logic-functions/domain/compute-real-meeting-key.util.ts", "../../../../src/logic-functions/utils/is-non-empty-string.util.ts", "../../../../src/logic-functions/utils/get-unique-sorted-ids.util.ts", "../../../../src/logic-functions/flows/reconcile-call-recorder.util.ts", "../../../../src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts", "../../../../src/constants/call-recorder-preference.ts", "../../../../src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts", "../../../../src/logic-functions/domain/build-call-recorder-policy-result.util.ts", "../../../../src/logic-functions/flows/cancel-call-recording-request.util.ts", "../../../../src/logic-functions/recall-api/get-recall-api-config.util.ts", "../../../../src/logic-functions/constants/call-recorder-name-env-var-name.ts", "../../../../src/logic-functions/constants/default-call-recorder-name.ts", "../../../../src/logic-functions/constants/default-recall-region.ts", "../../../../src/logic-functions/constants/recall-api-key-env-var-name.ts", "../../../../src/logic-functions/constants/recall-region-env-var-name.ts", "../../../../src/logic-functions/utils/get-application-variable-value.util.ts", "../../../../src/logic-functions/recall-api/recall-bot-api-request.util.ts", "../../../../src/logic-functions/constants/recall-api-max-attempts.ts", "../../../../src/logic-functions/constants/recall-api-retry-delay-ms.ts", "../../../../src/logic-functions/recall-api/cancel-recall-bot.util.ts", "../../../../src/logic-functions/data/update-call-recording.util.ts", "../../../../src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts", "../../../../src/logic-functions/data/create-call-recording.util.ts", "../../../../src/logic-functions/flows/ensure-call-recorder.util.ts", "../../../../src/logic-functions/domain/build-recall-routing-metadata.util.ts", "../../../../src/logic-functions/constants/default-call-recorder-join-early-minutes.ts", "../../../../src/logic-functions/constants/milliseconds-per-minute.ts", "../../../../src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts", "../../../../src/logic-functions/domain/compute-recall-bot-join-at.util.ts", "../../../../src/logic-functions/data/find-call-recordings-by-filter.util.ts", "../../../../src/logic-functions/constants/twenty-page-size.ts", "../../../../src/logic-functions/data/fetch-all-nodes.util.ts", "../../../../src/logic-functions/data/find-call-recordings-by-ids.util.ts", "../../../../src/logic-functions/data/get-current-workspace-id.util.ts", "../../../../src/logic-functions/utils/as-record.util.ts", "../../../../src/logic-functions/utils/get-string.util.ts", "../../../../src/logic-functions/recall-api/schedule-recall-bot.util.ts", "../../../../src/logic-functions/constants/recall-bot-automatic-leave.ts", "../../../../src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts", "../../../../src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts", "../../../../src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts", "../../../../src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts", "../../../../src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts", "../../../../src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts", "../../../../src/logic-functions/constants/recall-bot-recording-config.ts", "../../../../src/logic-functions/recall-api/extract-recall-bot-id.util.ts", "../../../../src/logic-functions/data/fetch-calendar-events-by-filter.util.ts", "../../../../src/logic-functions/constants/restricted-field-placeholder.ts", "../../../../src/logic-functions/data/strip-restricted-field-value.util.ts", "../../../../src/logic-functions/data/fetch-calendar-events-by-ids.util.ts", "../../../../src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts", "../../../../src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts", "../../../../src/logic-functions/flows/reschedule-call-recording-bot.util.ts", "../../../../src/logic-functions/recall-api/reschedule-recall-bot.util.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, "import { isUndefined } from '@sniptt/guards';\nimport { CoreApiClient } from 'twenty-client-sdk/core';\nimport {\n defineLogicFunction,\n type DatabaseEventPayload,\n type ObjectRecordBaseEvent,\n} from 'twenty-sdk/define';\n\nimport { CALENDAR_EVENT_RECONCILIATION_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/calendar-event-reconciliation-logic-function-universal-identifier';\nimport { type RemovedCallRecorderOccurrence } from 'src/logic-functions/types/removed-call-recorder-occurrence.type';\nimport { computeRealMeetingKey } from 'src/logic-functions/domain/compute-real-meeting-key.util';\nimport { getUniqueSortedIds } from 'src/logic-functions/utils/get-unique-sorted-ids.util';\nimport { reconcileCallRecorderForCalendarEventIds } from 'src/logic-functions/flows/reconcile-call-recorder.util';\n\nconst CALENDAR_EVENT_OBJECT_NAME = 'calendarEvent';\n\nconst CALL_RECORDER_RELEVANT_CALENDAR_EVENT_FIELDS = [\n 'title',\n 'callRecorderPreference',\n 'conferenceLink',\n 'startsAt',\n 'endsAt',\n 'isCanceled',\n 'iCalUid',\n];\n\nconst CALL_RECORDER_KEY_CALENDAR_EVENT_FIELDS = [\n 'conferenceLink',\n 'startsAt',\n 'iCalUid',\n];\n\ntype CalendarEventForDatabaseEvent = {\n id: string;\n conferenceLink?: { primaryLinkUrl?: string | null } | null;\n iCalUid?: string | null;\n startsAt?: string | null;\n};\n\ntype CalendarEventDatabaseEvent = DatabaseEventPayload<\n ObjectRecordBaseEvent<CalendarEventForDatabaseEvent>\n>;\n\ntype CalendarEventReconciliationPayload = {\n calendarEventIds: string[];\n removedOccurrences: RemovedCallRecorderOccurrence[];\n};\n\nconst handler = async (\n event: CalendarEventDatabaseEvent,\n): Promise<object | undefined> => {\n const [objectName, action] = event.name.split('.');\n\n if (objectName !== CALENDAR_EVENT_OBJECT_NAME) {\n return { skipped: true, reason: 'not a calendar event' };\n }\n\n const reconciliationPayload = buildCalendarEventReconciliationPayload({\n event,\n action,\n });\n\n if (\n reconciliationPayload.calendarEventIds.length === 0 &&\n reconciliationPayload.removedOccurrences.length === 0\n ) {\n return { skipped: true, reason: 'no relevant calendar event change' };\n }\n\n const client = new CoreApiClient();\n const reconciliationResults = await reconcileCallRecorderForCalendarEventIds({\n client,\n calendarEventIds: reconciliationPayload.calendarEventIds,\n removedOccurrences: reconciliationPayload.removedOccurrences,\n });\n\n return {\n reconciled: true,\n calendarEventIds: reconciliationPayload.calendarEventIds,\n removedOccurrenceCount: reconciliationPayload.removedOccurrences.length,\n reconciliationResults,\n };\n};\n\nconst buildCalendarEventReconciliationPayload = ({\n event,\n action,\n}: {\n event: CalendarEventDatabaseEvent;\n action: string | undefined;\n}): CalendarEventReconciliationPayload => {\n if (action === 'created') {\n return {\n calendarEventIds: getUniqueSortedIds([\n event.recordId,\n event.properties.after?.id,\n ]),\n removedOccurrences: [],\n };\n }\n\n if (action === 'updated') {\n const updatedFields = event.properties.updatedFields ?? [];\n\n if (!hasRelevantFieldChange(updatedFields)) {\n return { calendarEventIds: [], removedOccurrences: [] };\n }\n\n const removedOccurrence = hasKeyFieldChange(updatedFields)\n ? buildRemovedOccurrence(event.properties.before)\n : undefined;\n\n return {\n calendarEventIds: getUniqueSortedIds([\n event.recordId,\n event.properties.after?.id,\n ]),\n removedOccurrences: isUndefined(removedOccurrence)\n ? []\n : [removedOccurrence],\n };\n }\n\n if (action === 'deleted' || action === 'destroyed') {\n const removedOccurrence = buildRemovedOccurrence(event.properties.before);\n\n return {\n calendarEventIds: [],\n removedOccurrences: isUndefined(removedOccurrence)\n ? []\n : [removedOccurrence],\n };\n }\n\n return { calendarEventIds: [], removedOccurrences: [] };\n};\n\nconst hasRelevantFieldChange = (updatedFields: string[]): boolean =>\n updatedFields.some((updatedField) =>\n CALL_RECORDER_RELEVANT_CALENDAR_EVENT_FIELDS.includes(updatedField),\n );\n\nconst hasKeyFieldChange = (updatedFields: string[]): boolean =>\n updatedFields.some((updatedField) =>\n CALL_RECORDER_KEY_CALENDAR_EVENT_FIELDS.includes(updatedField),\n );\n\nconst buildRemovedOccurrence = (\n calendarEvent: CalendarEventForDatabaseEvent | undefined,\n): RemovedCallRecorderOccurrence | undefined => {\n if (isUndefined(calendarEvent)) {\n return undefined;\n }\n\n return {\n calendarEventId: calendarEvent.id,\n realMeetingKey: computeRealMeetingKey({\n calendarEventId: calendarEvent.id,\n conferenceLinkUrl: calendarEvent.conferenceLink?.primaryLinkUrl,\n iCalUid: calendarEvent.iCalUid ?? undefined,\n startsAt: calendarEvent.startsAt ?? undefined,\n }),\n startsAt: calendarEvent.startsAt ?? undefined,\n };\n};\n\nexport default defineLogicFunction({\n universalIdentifier:\n CALENDAR_EVENT_RECONCILIATION_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,\n name: 'reconcile-call-recorder-calendar-event',\n description:\n 'Reconciles app-managed Recall bot recording requests when calendar events change.',\n timeoutSeconds: 60,\n handler,\n databaseEventTriggerSettings: {\n eventName: `${CALENDAR_EVENT_OBJECT_NAME}.*`,\n },\n});\n", "\n// Auto-generated stub for twenty-sdk/define injected by the SDK CLI build.\n// Real implementations would pull in zod, twenty-shared and ~1MB of code; at\n// runtime only `default.config.handler` is consumed, so tiny no-ops suffice.\nconst __defineFactoryStub = (config) => ({\n success: true,\n config,\n errors: [],\n});\n\nconst __anyHandler = {\n get(_target, prop) {\n if (prop === '__esModule') return true;\n if (prop === Symbol.toPrimitive) return () => '';\n if (typeof prop === 'symbol') return undefined;\n return new Proxy(() => undefined, __anyHandler);\n },\n apply() {\n return new Proxy(() => undefined, __anyHandler);\n },\n};\nconst __anyStub = new Proxy(() => undefined, __anyHandler);\n\nexport const createValidationResult = __defineFactoryStub;\nexport const defineAgent = __defineFactoryStub;\nexport const defineApplication = __defineFactoryStub;\nexport const defineApplicationRole = __defineFactoryStub;\nexport const defineCommandMenuItem = __defineFactoryStub;\nexport const defineConnectionProvider = __defineFactoryStub;\nexport const defineField = __defineFactoryStub;\nexport const defineFrontComponent = __defineFactoryStub;\nexport const defineIndex = __defineFactoryStub;\nexport const defineLogicFunction = __defineFactoryStub;\nexport const defineNavigationMenuItem = __defineFactoryStub;\nexport const defineObject = __defineFactoryStub;\nexport const definePageLayout = __defineFactoryStub;\nexport const definePageLayoutTab = __defineFactoryStub;\nexport const definePermissionFlag = __defineFactoryStub;\nexport const definePostInstallLogicFunction = __defineFactoryStub;\nexport const definePreInstallLogicFunction = __defineFactoryStub;\nexport const defineRole = __defineFactoryStub;\nexport const defineSkill = __defineFactoryStub;\nexport const defineView = __defineFactoryStub;\nexport const defineViewField = __defineFactoryStub;\nexport const AggregateOperations = __anyStub;\nexport const DateDisplayFormat = __anyStub;\nexport const FieldMetadataSettingsOnClickAction = __anyStub;\nexport const FieldType = __anyStub;\nexport const HTTPMethod = __anyStub;\nexport const NavigationMenuItemType = __anyStub;\nexport const NumberDataType = __anyStub;\nexport const ObjectRecordGroupByDateGranularity = __anyStub;\nexport const OnDeleteAction = __anyStub;\nexport const PageLayoutTabLayoutMode = __anyStub;\nexport const RelationType = __anyStub;\nexport const RowLevelPermissionPredicateGroupLogicalOperator = __anyStub;\nexport const RowLevelPermissionPredicateOperand = __anyStub;\nexport const STANDARD_OBJECT = __anyStub;\nexport const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const STANDARD_PAGE_LAYOUT = __anyStub;\nexport const STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const SystemPermissionFlag = __anyStub;\nexport const ViewCalendarLayout = __anyStub;\nexport const ViewFilterGroupLogicalOperator = __anyStub;\nexport const ViewFilterOperand = __anyStub;\nexport const ViewKey = __anyStub;\nexport const ViewOpenRecordIn = __anyStub;\nexport const ViewSortDirection = __anyStub;\nexport const ViewType = __anyStub;\nexport const ViewVisibility = __anyStub;\nexport const canAccessFullAdminPanel = __anyStub;\nexport const canImpersonate = __anyStub;\nexport const every = __anyStub;\nexport const everyDefined = __anyStub;\nexport const everyEquals = __anyStub;\nexport const favoriteRecordIds = __anyStub;\nexport const featureFlags = __anyStub;\nexport const generateDefaultFieldUniversalIdentifier = __anyStub;\nexport const hasAnySoftDeleteFilterOnView = __anyStub;\nexport const includes = __anyStub;\nexport const includesEvery = __anyStub;\nexport const isDashboardPageLayoutInEditMode = __anyStub;\nexport const isDefined = __anyStub;\nexport const isInSidePanel = __anyStub;\nexport const isLayoutCustomizationModeEnabled = __anyStub;\nexport const isNonEmptyString = __anyStub;\nexport const isSelectAll = __anyStub;\nexport const none = __anyStub;\nexport const noneDefined = __anyStub;\nexport const noneEquals = __anyStub;\nexport const numberOfSelectedRecords = __anyStub;\nexport const objectMetadataItem = __anyStub;\nexport const objectMetadataLabel = __anyStub;\nexport const objectPermissions = __anyStub;\nexport const pageType = __anyStub;\nexport const selectedRecords = __anyStub;\nexport const some = __anyStub;\nexport const someDefined = __anyStub;\nexport const someEquals = __anyStub;\nexport const someNonEmptyString = __anyStub;\nexport const targetObjectReadPermissions = __anyStub;\nexport const targetObjectWritePermissions = __anyStub;\nexport const validateFields = __anyStub;\n", "export const CALENDAR_EVENT_RECONCILIATION_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n '1f28c477-6423-4911-85bf-2296ef112be9';\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\ntype ComputeRealMeetingKeyInput = {\n calendarEventId: string;\n conferenceLinkUrl: unknown;\n iCalUid: string | undefined;\n startsAt: string | undefined;\n};\n\nexport const computeRealMeetingKey = ({\n calendarEventId,\n conferenceLinkUrl,\n iCalUid,\n startsAt,\n}: ComputeRealMeetingKeyInput): string => {\n const normalizedConferenceLink = normalizeConferenceLink(conferenceLinkUrl);\n\n if (!isUndefined(normalizedConferenceLink)) {\n return `link:${normalizedConferenceLink}:${startsAt ?? ''}`;\n }\n\n if (isNonEmptyString(iCalUid)) {\n return `ical:${iCalUid}:${startsAt ?? ''}`;\n }\n\n return `event:${calendarEventId}`;\n};\n\nconst normalizeConferenceLink = (\n conferenceLinkUrl: unknown,\n): string | undefined => {\n if (!isNonEmptyString(conferenceLinkUrl)) {\n return undefined;\n }\n\n const withoutProtocol = conferenceLinkUrl\n .trim()\n .toLowerCase()\n .replace(/^https?:\\/\\//, '')\n .replace(/^www\\./, '');\n\n const withoutQueryAndFragment = withoutProtocol.split(/[?#]/)[0];\n const withoutTrailingSlash = withoutQueryAndFragment.replace(/\\/+$/, '');\n\n return withoutTrailingSlash === '' ? undefined : withoutTrailingSlash;\n};\n", "import { isString } from '@sniptt/guards';\n\n// Trimming variant of @sniptt/guards isNonEmptyString, for normalizing at read boundaries.\nexport const isNonEmptyString = (value: unknown): value is string =>\n isString(value) && value.trim() !== '';\n", "import { isString } from '@sniptt/guards';\n\nexport const getUniqueSortedIds = (\n ids: Array<string | null | undefined>,\n): string[] =>\n [...new Set(ids.filter(isString))].sort((firstId, secondId) =>\n firstId.localeCompare(secondId),\n );\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingRequestStatus } from 'src/logic-functions/constants/call-recording-request-status';\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';\nimport { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';\nimport { type CallRecorderPolicyResultForMeeting } from 'src/logic-functions/types/call-recorder-policy-result-for-meeting.type';\nimport { type CallRecorderReconciliationResult } from 'src/logic-functions/types/call-recorder-reconciliation-result.type';\nimport { type RemovedCallRecorderOccurrence } from 'src/logic-functions/types/removed-call-recorder-occurrence.type';\nimport { aggregateCallRecorderPolicyResultsByMeeting } from 'src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util';\nimport { buildCallRecorderPolicyResult } from 'src/logic-functions/domain/build-call-recorder-policy-result.util';\nimport { cancelCallRecordingRequest } from 'src/logic-functions/flows/cancel-call-recording-request.util';\nimport { computeCallRecordingIdForMeeting } from 'src/logic-functions/domain/compute-call-recording-id-for-meeting.util';\nimport {\n createCallRecording,\n type ScheduledCallRecordingFields,\n} from 'src/logic-functions/data/create-call-recording.util';\nimport { ensureCallRecorder } from 'src/logic-functions/flows/ensure-call-recorder.util';\nimport { fetchCalendarEventsByIds } from 'src/logic-functions/data/fetch-calendar-events-by-ids.util';\nimport { fetchCalendarEventsByStartsAtValues } from 'src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util';\nimport { findCallRecordingsByCalendarEventIds } from 'src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util';\nimport { findCallRecordingsByIds } from 'src/logic-functions/data/find-call-recordings-by-ids.util';\nimport { getUniqueSortedIds } from 'src/logic-functions/utils/get-unique-sorted-ids.util';\nimport { rescheduleCallRecordingBot } from 'src/logic-functions/flows/reschedule-call-recording-bot.util';\nimport { updateCallRecording } from 'src/logic-functions/data/update-call-recording.util';\nimport { type CallRecordingUpdateFields } from 'src/logic-functions/types/call-recording-update-fields.type';\n\nexport const reconcileCallRecorderForCalendarEventIds = async ({\n client,\n calendarEventIds,\n removedOccurrences = [],\n now = new Date(),\n}: {\n client: CoreApiClient;\n calendarEventIds: string[];\n removedOccurrences?: RemovedCallRecorderOccurrence[];\n now?: Date;\n}): Promise<CallRecorderReconciliationResult[]> => {\n const meetingPolicyResults =\n await resolveCallRecorderPolicyResultsForMeetings({\n client,\n calendarEventIds,\n removedOccurrences,\n now,\n });\n\n return reconcileCallRecorderForMeetingOccurrences({\n client,\n meetingPolicyResults,\n removedOccurrences,\n });\n};\n\nconst resolveCallRecorderPolicyResultsForMeetings = async ({\n client,\n calendarEventIds,\n removedOccurrences = [],\n now = new Date(),\n}: {\n client: CoreApiClient;\n calendarEventIds: string[];\n removedOccurrences?: RemovedCallRecorderOccurrence[];\n now?: Date;\n}): Promise<CallRecorderPolicyResultForMeeting[]> => {\n const changedCalendarEvents = await fetchCalendarEventsByIds(\n client,\n getUniqueSortedIds(calendarEventIds),\n );\n const affectedMeetingKeys = new Set<string>();\n const occurrenceStartsAtAnchors = new Set<string>();\n const changedCalendarEventPolicyResults = changedCalendarEvents.map(\n (calendarEvent) => buildCallRecorderPolicyResult(calendarEvent, now),\n );\n\n for (const policyResult of changedCalendarEventPolicyResults) {\n affectedMeetingKeys.add(policyResult.realMeetingKey);\n }\n\n for (const calendarEvent of changedCalendarEvents) {\n if (!isUndefined(calendarEvent.startsAt)) {\n occurrenceStartsAtAnchors.add(calendarEvent.startsAt);\n }\n }\n\n for (const removedOccurrence of removedOccurrences) {\n affectedMeetingKeys.add(removedOccurrence.realMeetingKey);\n\n if (!isUndefined(removedOccurrence.startsAt)) {\n occurrenceStartsAtAnchors.add(removedOccurrence.startsAt);\n }\n }\n\n if (affectedMeetingKeys.size === 0) {\n return [];\n }\n\n const occurrenceSiblingEvents = await fetchCalendarEventsByStartsAtValues(\n client,\n [...occurrenceStartsAtAnchors],\n );\n const policyResultsByCalendarEventId = new Map(\n changedCalendarEventPolicyResults.map((policyResult) => [\n policyResult.calendarEventId,\n policyResult,\n ]),\n );\n\n for (const calendarEvent of occurrenceSiblingEvents) {\n if (policyResultsByCalendarEventId.has(calendarEvent.id)) {\n continue;\n }\n\n policyResultsByCalendarEventId.set(\n calendarEvent.id,\n buildCallRecorderPolicyResult(calendarEvent, now),\n );\n }\n\n const perCalendarEventPolicyResults = [\n ...policyResultsByCalendarEventId.values(),\n ]\n .filter((policyResult) =>\n affectedMeetingKeys.has(policyResult.realMeetingKey),\n )\n .map((policyResult) => ({\n calendarEventId: policyResult.calendarEventId,\n realMeetingKey: policyResult.realMeetingKey,\n shouldRequestBot: policyResult.shouldRequestBot,\n }));\n const meetingPolicyResults = aggregateCallRecorderPolicyResultsByMeeting(\n perCalendarEventPolicyResults,\n );\n const meetingKeysWithPolicyResult = new Set(\n meetingPolicyResults.map(\n (meetingPolicyResult) => meetingPolicyResult.realMeetingKey,\n ),\n );\n\n for (const meetingKey of [...affectedMeetingKeys].sort()) {\n if (meetingKeysWithPolicyResult.has(meetingKey)) {\n continue;\n }\n\n meetingPolicyResults.push({\n realMeetingKey: meetingKey,\n shouldRequestBot: false,\n calendarEventIds: [],\n requestingCalendarEventIds: [],\n });\n }\n\n return meetingPolicyResults;\n};\n\nconst reconcileCallRecorderForMeetingOccurrences = async ({\n client,\n meetingPolicyResults,\n removedOccurrences = [],\n}: {\n client: CoreApiClient;\n meetingPolicyResults: CallRecorderPolicyResultForMeeting[];\n removedOccurrences?: RemovedCallRecorderOccurrence[];\n}): Promise<CallRecorderReconciliationResult[]> => {\n const removedCalendarEventIdsByMeetingKey =\n buildRemovedCalendarEventIdsByMeetingKey(removedOccurrences);\n const reconciliationResults: CallRecorderReconciliationResult[] = [];\n const orderedMeetingPolicyResults = [\n ...meetingPolicyResults.filter(\n (meetingPolicyResult) => !meetingPolicyResult.shouldRequestBot,\n ),\n ...meetingPolicyResults.filter(\n (meetingPolicyResult) => meetingPolicyResult.shouldRequestBot,\n ),\n ];\n\n for (const meetingPolicyResult of orderedMeetingPolicyResults) {\n const removedCalendarEventIds =\n removedCalendarEventIdsByMeetingKey.get(\n meetingPolicyResult.realMeetingKey,\n ) ?? [];\n\n try {\n reconciliationResults.push(\n meetingPolicyResult.shouldRequestBot\n ? await reconcileActiveMeeting({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n })\n : await reconcileCanceledMeeting({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n }),\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n console.error(\n `[call-recorder] reconciliation failed for meeting ${meetingPolicyResult.realMeetingKey}: ${errorMessage}`,\n );\n reconciliationResults.push({\n action: 'FAILED',\n realMeetingKey: meetingPolicyResult.realMeetingKey,\n errorMessage,\n });\n }\n }\n\n return reconciliationResults;\n};\n\nconst reconcileActiveMeeting = async ({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n}: {\n client: CoreApiClient;\n meetingPolicyResult: CallRecorderPolicyResultForMeeting;\n removedCalendarEventIds: string[];\n}): Promise<CallRecorderReconciliationResult> => {\n const representativeCalendarEventId = getUniqueSortedIds(\n meetingPolicyResult.requestingCalendarEventIds,\n )[0];\n\n if (isUndefined(representativeCalendarEventId)) {\n return buildSkippedResult(meetingPolicyResult.realMeetingKey);\n }\n\n const representativeCalendarEvent = (\n await fetchCalendarEventsByIds(client, [representativeCalendarEventId])\n )[0];\n\n if (isUndefined(representativeCalendarEvent)) {\n return buildSkippedResult(meetingPolicyResult.realMeetingKey);\n }\n\n const callRecordingId = computeCallRecordingIdForMeeting(\n meetingPolicyResult.realMeetingKey,\n );\n const existingCallRecording = (\n await findCallRecordingsByIds(client, [callRecordingId])\n )[0];\n\n if (!isUndefined(existingCallRecording)) {\n return updatePolicyManagedCallRecording({\n client,\n existingCallRecording,\n representativeCalendarEvent,\n realMeetingKey: meetingPolicyResult.realMeetingKey,\n });\n }\n\n const manualOpenCallRecording = await findManualOpenCallRecording({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n });\n\n if (!isUndefined(manualOpenCallRecording)) {\n return {\n action: 'SKIPPED',\n realMeetingKey: meetingPolicyResult.realMeetingKey,\n callRecordingId: manualOpenCallRecording.id,\n };\n }\n\n return createPolicyManagedCallRecording({\n client,\n callRecordingId,\n representativeCalendarEvent,\n realMeetingKey: meetingPolicyResult.realMeetingKey,\n });\n};\n\nconst updatePolicyManagedCallRecording = async ({\n client,\n existingCallRecording,\n representativeCalendarEvent,\n realMeetingKey,\n}: {\n client: CoreApiClient;\n existingCallRecording: CallRecordingRecord;\n representativeCalendarEvent: CalendarEventRecord;\n realMeetingKey: string;\n}): Promise<CallRecorderReconciliationResult> => {\n await updateCallRecording(client, {\n id: existingCallRecording.id,\n data: buildPolicyManagedCallRecordingUpdateFields({\n existingCallRecording,\n calendarEvent: representativeCalendarEvent,\n }),\n });\n await rescheduleCallRecordingBot(client, {\n callRecording: existingCallRecording,\n calendarEvent: representativeCalendarEvent,\n });\n\n return {\n action: 'UPDATED',\n realMeetingKey,\n callRecordingId: existingCallRecording.id,\n };\n};\n\nconst createPolicyManagedCallRecording = async ({\n client,\n callRecordingId,\n representativeCalendarEvent,\n realMeetingKey,\n}: {\n client: CoreApiClient;\n callRecordingId: string;\n representativeCalendarEvent: CalendarEventRecord;\n realMeetingKey: string;\n}): Promise<CallRecorderReconciliationResult> => {\n const scheduledFields = buildScheduledCallRecordingFields(\n representativeCalendarEvent,\n );\n\n try {\n await createCallRecording(client, {\n id: callRecordingId,\n data: scheduledFields,\n });\n } catch (error) {\n // The id is deterministic, so a conflict means a concurrent run created the row first.\n const concurrentlyCreatedCallRecording = (\n await findCallRecordingsByIds(client, [callRecordingId])\n )[0];\n\n if (isUndefined(concurrentlyCreatedCallRecording)) {\n throw error;\n }\n\n return updatePolicyManagedCallRecording({\n client,\n existingCallRecording: concurrentlyCreatedCallRecording,\n representativeCalendarEvent,\n realMeetingKey,\n });\n }\n\n // Winning the deterministic-id insert elects this run as the single writer that creates the bot.\n await ensureCallRecorder(client, {\n callRecording: {\n id: callRecordingId,\n ...scheduledFields,\n title: scheduledFields.title ?? undefined,\n },\n calendarEvent: representativeCalendarEvent,\n });\n\n return {\n action: 'CREATED',\n realMeetingKey,\n callRecordingId,\n };\n};\n\nconst findManualOpenCallRecording = async ({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n}: {\n client: CoreApiClient;\n meetingPolicyResult: CallRecorderPolicyResultForMeeting;\n removedCalendarEventIds: string[];\n}): Promise<CallRecordingRecord | undefined> => {\n const calendarEventIds = getUniqueSortedIds([\n ...meetingPolicyResult.calendarEventIds,\n ...meetingPolicyResult.requestingCalendarEventIds,\n ...removedCalendarEventIds,\n ]);\n const callRecordings = await findCallRecordingsByCalendarEventIds(\n client,\n calendarEventIds,\n );\n\n return [...callRecordings]\n .sort((firstCallRecording, secondCallRecording) =>\n firstCallRecording.id.localeCompare(secondCallRecording.id),\n )\n .find(\n (callRecording) =>\n callRecording.status !== CallRecordingStatus.COMPLETED &&\n isUndefined(callRecording.recordingRequestStatus),\n );\n};\n\nconst reconcileCanceledMeeting = async ({\n client,\n meetingPolicyResult,\n removedCalendarEventIds,\n}: {\n client: CoreApiClient;\n meetingPolicyResult: CallRecorderPolicyResultForMeeting;\n removedCalendarEventIds: string[];\n}): Promise<CallRecorderReconciliationResult> => {\n const calendarEventIds = getUniqueSortedIds([\n ...meetingPolicyResult.calendarEventIds,\n ...removedCalendarEventIds,\n ]);\n const cancellableCallRecordings = (\n await findCallRecordingsByCalendarEventIds(client, calendarEventIds)\n ).filter(\n (callRecording) =>\n callRecording.status === CallRecordingStatus.SCHEDULED &&\n callRecording.recordingRequestStatus ===\n CallRecordingRequestStatus.REQUESTED,\n );\n\n if (cancellableCallRecordings.length === 0) {\n return buildSkippedResult(meetingPolicyResult.realMeetingKey);\n }\n\n for (const callRecording of cancellableCallRecordings) {\n await cancelCallRecordingRequest({\n client,\n callRecording,\n });\n }\n\n return {\n action: 'CANCELED',\n realMeetingKey: meetingPolicyResult.realMeetingKey,\n callRecordingId: cancellableCallRecordings[0].id,\n };\n};\n\n// startedAt/endedAt come from the webhook; calendar writes never touch them.\nconst buildCalendarDrivenCallRecordingFields = (\n calendarEvent: CalendarEventRecord,\n): Omit<ScheduledCallRecordingFields, 'status'> => ({\n // Wire null clears a stale title when the calendar title is gone or restricted.\n title: calendarEvent.title ?? null,\n recordingRequestStatus: CallRecordingRequestStatus.REQUESTED,\n calendarEventId: calendarEvent.id,\n});\n\nconst buildScheduledCallRecordingFields = (\n calendarEvent: CalendarEventRecord,\n): ScheduledCallRecordingFields => ({\n ...buildCalendarDrivenCallRecordingFields(calendarEvent),\n status: CallRecordingStatus.SCHEDULED,\n});\n\n// A live or finished bot lifecycle must never be reset to SCHEDULED by a calendar-driven update.\nconst buildPolicyManagedCallRecordingUpdateFields = ({\n existingCallRecording,\n calendarEvent,\n}: {\n existingCallRecording: CallRecordingRecord;\n calendarEvent: CalendarEventRecord;\n}): CallRecordingUpdateFields =>\n canResetCallRecordingStatusToScheduled(existingCallRecording.status)\n ? {\n ...buildScheduledCallRecordingFields(calendarEvent),\n ...(isUndefined(existingCallRecording.callRecorderFailureReason)\n ? {}\n : { callRecorderFailureReason: null }),\n }\n : buildCalendarDrivenCallRecordingFields(calendarEvent);\n\nconst canResetCallRecordingStatusToScheduled = (\n status: string | undefined,\n): boolean =>\n status === CallRecordingStatus.SCHEDULED ||\n status === CallRecordingStatus.FAILED;\n\nconst buildRemovedCalendarEventIdsByMeetingKey = (\n removedOccurrences: RemovedCallRecorderOccurrence[],\n): Map<string, string[]> => {\n const calendarEventIdsByMeetingKey = new Map<string, string[]>();\n\n for (const removedOccurrence of removedOccurrences) {\n calendarEventIdsByMeetingKey.set(removedOccurrence.realMeetingKey, [\n ...(calendarEventIdsByMeetingKey.get(removedOccurrence.realMeetingKey) ??\n []),\n removedOccurrence.calendarEventId,\n ]);\n }\n\n return calendarEventIdsByMeetingKey;\n};\n\nconst buildSkippedResult = (\n realMeetingKey: string,\n): CallRecorderReconciliationResult => ({\n action: 'SKIPPED',\n realMeetingKey,\n callRecordingId: null,\n});\n", "import { type CallRecorderPolicyResultForCalendarEvent } from 'src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type';\nimport { type CallRecorderPolicyResultForMeeting } from 'src/logic-functions/types/call-recorder-policy-result-for-meeting.type';\n\ntype CallRecorderPolicyResultForMeetingInput = Pick<\n CallRecorderPolicyResultForCalendarEvent,\n 'calendarEventId' | 'realMeetingKey' | 'shouldRequestBot'\n>;\n\nexport const aggregateCallRecorderPolicyResultsByMeeting = (\n perCalendarEventPolicyResults: CallRecorderPolicyResultForMeetingInput[],\n): CallRecorderPolicyResultForMeeting[] => {\n const meetingPolicyResultsByMeetingKey = new Map<\n string,\n CallRecorderPolicyResultForMeeting\n >();\n\n for (const {\n calendarEventId,\n realMeetingKey,\n shouldRequestBot,\n } of perCalendarEventPolicyResults) {\n const meetingPolicyResult = meetingPolicyResultsByMeetingKey.get(\n realMeetingKey,\n ) ?? {\n realMeetingKey,\n shouldRequestBot: false,\n calendarEventIds: [],\n requestingCalendarEventIds: [],\n };\n\n meetingPolicyResult.calendarEventIds.push(calendarEventId);\n\n if (shouldRequestBot) {\n meetingPolicyResult.shouldRequestBot = true;\n meetingPolicyResult.requestingCalendarEventIds.push(calendarEventId);\n }\n\n meetingPolicyResultsByMeetingKey.set(realMeetingKey, meetingPolicyResult);\n }\n\n return [...meetingPolicyResultsByMeetingKey.values()];\n};\n", "export enum CallRecorderPreference {\n ON = 'ON',\n OFF = 'OFF',\n}\n", "import { CallRecorderPreference } from 'src/constants/call-recorder-preference';\nimport { type CallRecorderPolicyInput } from 'src/logic-functions/types/call-recorder-policy-input.type';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\nimport { type CallRecorderPolicyNotRequiredReason } from 'src/logic-functions/types/call-recorder-policy-not-required-reason.type';\nimport { type CallRecorderPolicyRequiredReason } from 'src/logic-functions/types/call-recorder-policy-required-reason.type';\nimport { type CallRecorderPolicyResult } from 'src/logic-functions/types/call-recorder-policy-result.type';\n\ntype ResolveCallRecorderPolicyResultArgs = {\n input: CallRecorderPolicyInput;\n now: Date;\n};\n\nexport const resolveCallRecorderPolicyResult = ({\n input,\n now,\n}: ResolveCallRecorderPolicyResultArgs): CallRecorderPolicyResult => {\n if (input.isCanceled) {\n return botNotRequired('EVENT_CANCELED');\n }\n\n if (input.callRecorderPreference === CallRecorderPreference.OFF) {\n return botNotRequired('PREFERENCE_OFF');\n }\n\n if (!isNonEmptyString(input.conferenceLinkUrl)) {\n return botNotRequired('MISSING_CONFERENCE_LINK');\n }\n\n if (\n !isCalendarEventInFuture({\n startsAt: input.startsAt,\n endsAt: input.endsAt,\n now,\n })\n ) {\n return botNotRequired('EVENT_NOT_UPCOMING');\n }\n\n return botRequired('RECORDING_ENABLED');\n};\n\nconst isCalendarEventInFuture = ({\n startsAt,\n endsAt,\n now,\n}: {\n startsAt: string | undefined;\n endsAt: string | undefined;\n now: Date;\n}): boolean => {\n const reference = endsAt ?? startsAt;\n\n if (!isNonEmptyString(reference)) {\n return false;\n }\n\n const referenceTime = new Date(reference).getTime();\n\n if (Number.isNaN(referenceTime)) {\n return false;\n }\n\n return referenceTime > now.getTime();\n};\n\nconst botRequired = (\n reason: CallRecorderPolicyRequiredReason,\n): CallRecorderPolicyResult => ({ shouldRequestBot: true, reason });\n\nconst botNotRequired = (\n reason: CallRecorderPolicyNotRequiredReason,\n): CallRecorderPolicyResult => ({ shouldRequestBot: false, reason });\n", "import { CallRecorderPreference } from 'src/constants/call-recorder-preference';\nimport { type CallRecorderPolicyCalendarEventInput } from 'src/logic-functions/types/call-recorder-policy-calendar-event-input.type';\nimport { type CallRecorderPolicyResultForCalendarEvent } from 'src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type';\nimport { computeRealMeetingKey } from 'src/logic-functions/domain/compute-real-meeting-key.util';\nimport { resolveCallRecorderPolicyResult } from 'src/logic-functions/domain/resolve-call-recorder-policy-result.util';\n\nexport const buildCallRecorderPolicyResult = (\n calendarEvent: CallRecorderPolicyCalendarEventInput,\n now: Date,\n): CallRecorderPolicyResultForCalendarEvent => {\n const realMeetingKey = computeRealMeetingKey({\n calendarEventId: calendarEvent.id,\n conferenceLinkUrl: calendarEvent.conferenceLinkUrl,\n iCalUid: calendarEvent.iCalUid,\n startsAt: calendarEvent.startsAt,\n });\n\n const callRecorderPreference = normalizeCallRecorderPreference(\n calendarEvent.callRecorderPreference,\n );\n\n const policyResult = resolveCallRecorderPolicyResult({\n input: {\n callRecorderPreference,\n isCanceled: calendarEvent.isCanceled,\n startsAt: calendarEvent.startsAt,\n endsAt: calendarEvent.endsAt,\n conferenceLinkUrl: calendarEvent.conferenceLinkUrl,\n },\n now,\n });\n\n return {\n calendarEventId: calendarEvent.id,\n callRecorderPreference,\n realMeetingKey,\n ...policyResult,\n };\n};\n\nconst normalizeCallRecorderPreference = (\n callRecorderPreference: string | undefined,\n): CallRecorderPreference | undefined =>\n isCallRecorderPreference(callRecorderPreference)\n ? callRecorderPreference\n : undefined;\n\nconst isCallRecorderPreference = (\n callRecorderPreference: string | undefined,\n): callRecorderPreference is CallRecorderPreference =>\n Object.values(CallRecorderPreference).some(\n (preference) => preference === callRecorderPreference,\n );\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingRequestStatus } from 'src/logic-functions/constants/call-recording-request-status';\nimport { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';\nimport { cancelRecallBot } from 'src/logic-functions/recall-api/cancel-recall-bot.util';\nimport { updateCallRecording } from 'src/logic-functions/data/update-call-recording.util';\n\n// Intent-first: the stale-state cron finishes the Recall half when this call fails.\nexport const cancelCallRecordingRequest = async ({\n client,\n callRecording,\n}: {\n client: CoreApiClient;\n callRecording: CallRecordingRecord;\n}): Promise<void> => {\n await updateCallRecording(client, {\n id: callRecording.id,\n data: {\n recordingRequestStatus: CallRecordingRequestStatus.CANCELED,\n },\n });\n\n if (isUndefined(callRecording.externalBotId)) {\n return;\n }\n\n const cancelResult = await cancelRecallBot({\n externalBotId: callRecording.externalBotId,\n });\n\n if (!cancelResult.ok) {\n console.warn(\n `[call-recorder] failed to cancel Recall bot for callRecording ${callRecording.id}, leaving it for the stale-state cron: ${cancelResult.errorMessage}`,\n );\n\n return;\n }\n\n await updateCallRecording(client, {\n id: callRecording.id,\n data: {\n externalBotId: null,\n },\n });\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { CALL_RECORDER_NAME_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-name-env-var-name';\nimport { DEFAULT_CALL_RECORDER_NAME } from 'src/logic-functions/constants/default-call-recorder-name';\nimport { DEFAULT_RECALL_REGION } from 'src/logic-functions/constants/default-recall-region';\nimport { RECALL_API_KEY_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-api-key-env-var-name';\nimport { RECALL_REGION_ENV_VAR_NAME } from 'src/logic-functions/constants/recall-region-env-var-name';\nimport { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\nexport type RecallApiConfig = {\n apiKey: string;\n baseUrl: string;\n botName: string;\n};\n\nexport const getRecallApiConfig = ():\n | {\n success: true;\n config: RecallApiConfig;\n }\n | {\n success: false;\n error: string;\n } => {\n const apiKey = normalizeOptionalString(\n getApplicationVariableValue(RECALL_API_KEY_ENV_VAR_NAME),\n );\n\n if (isUndefined(apiKey)) {\n return {\n success: false,\n error:\n 'RECALL_API_KEY server variable is not set. A server admin must set it on the Call Recorder application registration before scheduling bots.',\n };\n }\n\n const region =\n normalizeOptionalString(\n getApplicationVariableValue(RECALL_REGION_ENV_VAR_NAME),\n ) ?? DEFAULT_RECALL_REGION;\n const botName =\n normalizeOptionalString(\n getApplicationVariableValue(CALL_RECORDER_NAME_ENV_VAR_NAME),\n ) ?? DEFAULT_CALL_RECORDER_NAME;\n\n return {\n success: true,\n config: {\n apiKey,\n baseUrl: `https://${region}.recall.ai/api/v1`,\n botName,\n },\n };\n};\n\nconst normalizeOptionalString = (\n value: string | undefined,\n): string | undefined => (isNonEmptyString(value) ? value.trim() : undefined);\n", "export const CALL_RECORDER_NAME_ENV_VAR_NAME = 'CALL_RECORDER_NAME';\n", "export const DEFAULT_CALL_RECORDER_NAME = 'Twenty.com';\n", "export const DEFAULT_RECALL_REGION = 'eu-central-1';\n", "export const RECALL_API_KEY_ENV_VAR_NAME = 'RECALL_API_KEY';\n", "export const RECALL_REGION_ENV_VAR_NAME = 'RECALL_REGION';\n", "// Application and server variables are injected into process.env on every execution.\nexport const getApplicationVariableValue = (key: string): string | undefined =>\n process.env[key];\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { RECALL_API_MAX_ATTEMPTS } from 'src/logic-functions/constants/recall-api-max-attempts';\nimport { RECALL_API_RETRY_DELAY_MS } from 'src/logic-functions/constants/recall-api-retry-delay-ms';\nimport { type RecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';\n\ntype RecallBotApiRequestArgs = {\n config: RecallApiConfig;\n path: string;\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE';\n body?: unknown;\n allowNotFound?: boolean;\n maxAttempts?: number;\n};\n\ntype RecallBotApiRequestResult<TData> =\n | {\n ok: true;\n status: number;\n data: TData;\n }\n | {\n ok: false;\n status: number | null;\n errorMessage: string;\n };\n\n// Bot creates tolerate retries because duplicates stay unclaimed and get reaped.\n// Callers that cannot retry idempotently can lower maxAttempts.\nexport const recallBotApiRequest = async <TData>(\n requestArgs: RecallBotApiRequestArgs,\n): Promise<RecallBotApiRequestResult<TData>> => {\n const maxAttempts = requestArgs.maxAttempts ?? RECALL_API_MAX_ATTEMPTS;\n\n for (let attemptNumber = 1; ; attemptNumber++) {\n const { result, isRetryable } =\n await performRecallBotApiRequestAttempt<TData>(requestArgs);\n\n if (!isRetryable || attemptNumber >= maxAttempts) {\n return result;\n }\n\n await sleep(RECALL_API_RETRY_DELAY_MS * attemptNumber);\n }\n};\n\nconst performRecallBotApiRequestAttempt = async <TData>({\n config,\n path,\n method,\n body,\n allowNotFound = false,\n}: RecallBotApiRequestArgs): Promise<{\n result: RecallBotApiRequestResult<TData>;\n isRetryable: boolean;\n}> => {\n let response: Response;\n\n try {\n response = await fetch(`${config.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: buildRecallApiAuthorizationHeader(config.apiKey),\n ...(isUndefined(body) ? {} : { 'Content-Type': 'application/json' }),\n },\n ...(isUndefined(body) ? {} : { body: JSON.stringify(body) }),\n });\n } catch (error) {\n return {\n isRetryable: true,\n result: {\n ok: false,\n status: null,\n errorMessage: `Recall API request failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n };\n }\n\n if (allowNotFound && response.status === 404) {\n return {\n isRetryable: false,\n result: {\n ok: true,\n status: response.status,\n data: undefined as TData,\n },\n };\n }\n\n if (response.status === 204) {\n return {\n isRetryable: false,\n result: {\n ok: true,\n status: response.status,\n data: undefined as TData,\n },\n };\n }\n\n if (!response.ok) {\n return {\n isRetryable: isRetryableRecallApiStatus(response.status),\n result: {\n ok: false,\n status: response.status,\n errorMessage: await extractRecallApiErrorMessage(response),\n },\n };\n }\n\n try {\n return {\n isRetryable: false,\n result: {\n ok: true,\n status: response.status,\n data: (await response.json()) as TData,\n },\n };\n } catch (error) {\n return {\n isRetryable: false,\n result: {\n ok: false,\n status: response.status,\n errorMessage: `Recall API returned a non-JSON response: ${\n error instanceof Error ? error.message : String(error)\n }`,\n },\n };\n }\n};\n\nconst isRetryableRecallApiStatus = (status: number): boolean =>\n status === 429 || status >= 500;\n\nconst sleep = (delayMs: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, delayMs);\n });\n\nconst buildRecallApiAuthorizationHeader = (apiKey: string): string => {\n const trimmedApiKey = apiKey.trim();\n\n return trimmedApiKey.toLowerCase().startsWith('token ')\n ? trimmedApiKey\n : `Token ${trimmedApiKey}`;\n};\n\nconst extractRecallApiErrorMessage = async (\n response: Response,\n): Promise<string> => {\n const fallback = `Recall API responded with HTTP ${response.status}`;\n\n try {\n const body = (await response.json()) as unknown;\n\n return `${fallback}: ${JSON.stringify(body)}`;\n } catch {\n return fallback;\n }\n};\n", "export const RECALL_API_MAX_ATTEMPTS = 3;\n", "export const RECALL_API_RETRY_DELAY_MS = 500;\n", "import { type RecallBotRemovalResult } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport { getRecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';\nimport { recallBotApiRequest } from 'src/logic-functions/recall-api/recall-bot-api-request.util';\n\nexport const cancelRecallBot = async ({\n externalBotId,\n}: {\n externalBotId: string;\n}): Promise<RecallBotRemovalResult> => {\n const configResult = getRecallApiConfig();\n\n if (!configResult.success) {\n return { ok: false, status: null, errorMessage: configResult.error };\n }\n\n const result = await recallBotApiRequest<undefined>({\n config: configResult.config,\n path: `/bot/${externalBotId}/`,\n method: 'DELETE',\n allowNotFound: true,\n });\n\n if (!result.ok) {\n return result;\n }\n\n return { ok: true };\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CallRecordingUpdateFields } from 'src/logic-functions/types/call-recording-update-fields.type';\n\nexport const updateCallRecording = async (\n client: CoreApiClient,\n {\n id,\n data,\n }: {\n id: string;\n data: CallRecordingUpdateFields;\n },\n): Promise<void> => {\n await client.mutation({\n updateCallRecording: {\n __args: {\n id,\n data,\n },\n id: true,\n },\n });\n};\n", "import { createHash } from 'crypto';\n\n// Same meeting key \u2192 same id: the primary key serializes concurrent creates.\nexport const computeCallRecordingIdForMeeting = (\n realMeetingKey: string,\n): string => {\n const bytes = createHash('sha256').update(realMeetingKey).digest();\n\n // v4 version/variant bits so server-side UUID validation accepts the hash.\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = bytes.subarray(0, 16).toString('hex');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CallRecordingRequestStatus } from 'src/logic-functions/constants/call-recording-request-status';\nimport { type CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\n\nexport type ScheduledCallRecordingFields = {\n title: string | null;\n status: CallRecordingStatus.SCHEDULED;\n recordingRequestStatus: CallRecordingRequestStatus.REQUESTED;\n calendarEventId: string;\n};\n\nexport const createCallRecording = async (\n client: CoreApiClient,\n {\n id,\n data,\n }: {\n id: string;\n data: ScheduledCallRecordingFields;\n },\n): Promise<string> => {\n const mutationResult = await client.mutation({\n createCallRecording: {\n __args: {\n data: { id, ...data },\n },\n id: true,\n },\n });\n const createdCallRecordingId = mutationResult.createCallRecording?.id;\n\n if (isUndefined(createdCallRecordingId)) {\n throw new Error(\n 'createCallRecording mutation did not return a call recording id',\n );\n }\n\n return createdCallRecordingId;\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingRequestStatus } from 'src/logic-functions/constants/call-recording-request-status';\nimport { type MeetingRecording } from 'src/logic-functions/types/meeting-recording.type';\nimport { buildRecallRoutingMetadata } from 'src/logic-functions/domain/build-recall-routing-metadata.util';\nimport { computeRecallBotJoinAt } from 'src/logic-functions/domain/compute-recall-bot-join-at.util';\nimport { findCallRecordingsByIds } from 'src/logic-functions/data/find-call-recordings-by-ids.util';\nimport { getCurrentWorkspaceId } from 'src/logic-functions/data/get-current-workspace-id.util';\nimport { scheduleRecallBot } from 'src/logic-functions/recall-api/schedule-recall-bot.util';\nimport { updateCallRecording } from 'src/logic-functions/data/update-call-recording.util';\n\n// 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.\nexport const ensureCallRecorder = async (\n client: CoreApiClient,\n { callRecording, calendarEvent }: MeetingRecording,\n): Promise<boolean> => {\n const meetingUrl = calendarEvent.conferenceLinkUrl;\n const meetingStartsAt = calendarEvent.startsAt;\n\n if (isUndefined(meetingUrl) || isUndefined(meetingStartsAt)) {\n return false;\n }\n\n const joinAt = computeRecallBotJoinAt(meetingStartsAt);\n\n const freshCallRecording = (\n await findCallRecordingsByIds(client, [callRecording.id])\n )[0];\n\n if (\n isUndefined(freshCallRecording) ||\n freshCallRecording.recordingRequestStatus !==\n CallRecordingRequestStatus.REQUESTED ||\n !isUndefined(freshCallRecording.externalBotId)\n ) {\n return false;\n }\n\n const workspaceId = getCurrentWorkspaceId();\n\n if (isUndefined(workspaceId)) {\n console.error(\n `[call-recorder] cannot schedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable, the shared webhook could not be routed back`,\n );\n\n return false;\n }\n\n const scheduleResult = await scheduleRecallBot({\n meetingUrl,\n joinAt,\n metadata: buildRecallRoutingMetadata({\n callRecordingId: callRecording.id,\n workspaceId,\n }),\n });\n\n if (!scheduleResult.ok) {\n console.warn(\n `[call-recorder] failed to schedule Recall bot for callRecording ${callRecording.id}: ${scheduleResult.errorMessage}`,\n );\n\n return false;\n }\n\n await updateCallRecording(client, {\n id: callRecording.id,\n data: { externalBotId: scheduleResult.externalBotId },\n });\n\n return true;\n};\n", "import { type RecallRoutingMetadata } from 'src/logic-functions/types/recall-routing-metadata.type';\n\nexport const buildRecallRoutingMetadata = ({\n callRecordingId,\n workspaceId,\n}: {\n callRecordingId: string;\n workspaceId: string;\n}): RecallRoutingMetadata => ({\n twentyWorkspaceId: workspaceId,\n twentyCallRecordingId: callRecordingId,\n});\n", "export const DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES = 1;\n", "export const MILLISECONDS_PER_MINUTE = 60_000;\n", "export const CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME =\n 'CALL_RECORDER_JOIN_EARLY_MINUTES';\n", "import { DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES } from 'src/logic-functions/constants/default-call-recorder-join-early-minutes';\nimport { MILLISECONDS_PER_MINUTE } from 'src/logic-functions/constants/milliseconds-per-minute';\nimport { CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name';\nimport { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\nexport const computeRecallBotJoinAt = (meetingStartsAt: string): string => {\n const meetingStartTimeInMilliseconds = new Date(meetingStartsAt).getTime();\n\n if (Number.isNaN(meetingStartTimeInMilliseconds)) {\n return meetingStartsAt;\n }\n\n return new Date(\n meetingStartTimeInMilliseconds -\n getRecallBotJoinEarlyMinutes() * MILLISECONDS_PER_MINUTE,\n ).toISOString();\n};\n\nconst getRecallBotJoinEarlyMinutes = (): number => {\n const rawValue = getApplicationVariableValue(\n CALL_RECORDER_JOIN_EARLY_MINUTES_ENV_VAR_NAME,\n );\n\n if (!isNonEmptyString(rawValue)) {\n return DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES;\n }\n\n const joinEarlyMinutes = Number(rawValue.trim());\n\n return Number.isInteger(joinEarlyMinutes) && joinEarlyMinutes >= 0\n ? joinEarlyMinutes\n : DEFAULT_CALL_RECORDER_JOIN_EARLY_MINUTES;\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingRequestStatus } from 'src/logic-functions/constants/call-recording-request-status';\nimport { TWENTY_PAGE_SIZE } from 'src/logic-functions/constants/twenty-page-size';\nimport { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';\nimport {\n fetchAllNodes,\n type ConnectionPage,\n} from 'src/logic-functions/data/fetch-all-nodes.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\ntype CallRecordingNode = {\n id: string;\n title?: string | null;\n status?: string | null;\n recordingRequestStatus?: unknown;\n startedAt?: string | null;\n endedAt?: string | null;\n calendarEventId?: string | null;\n externalBotId?: string | null;\n externalRecordingId?: string | null;\n callRecorderFailureReason?: string | null;\n};\n\nexport const findCallRecordingsByFilter = async (\n client: CoreApiClient,\n filter: Record<string, unknown>,\n): Promise<CallRecordingRecord[]> => {\n const callRecordingNodes = await fetchAllNodes<CallRecordingNode>(\n async (afterCursor) => {\n const queryResult = await client.query({\n callRecordings: {\n __args: {\n filter,\n first: TWENTY_PAGE_SIZE,\n ...(isUndefined(afterCursor) ? {} : { after: afterCursor }),\n },\n pageInfo: {\n hasNextPage: true,\n endCursor: true,\n },\n edges: {\n node: {\n id: true,\n title: true,\n status: true,\n recordingRequestStatus: true,\n startedAt: true,\n endedAt: true,\n calendarEventId: true,\n externalBotId: true,\n externalRecordingId: true,\n callRecorderFailureReason: true,\n },\n },\n },\n });\n\n return queryResult.callRecordings as\n | ConnectionPage<CallRecordingNode>\n | undefined;\n },\n );\n\n return callRecordingNodes.map((callRecording) => ({\n id: callRecording.id,\n title: callRecording.title ?? undefined,\n status: callRecording.status ?? undefined,\n recordingRequestStatus: normalizeCallRecordingRequestStatus(\n callRecording.recordingRequestStatus,\n ),\n startedAt: callRecording.startedAt ?? undefined,\n endedAt: callRecording.endedAt ?? undefined,\n calendarEventId: callRecording.calendarEventId ?? undefined,\n externalBotId: normalizeOptionalString(callRecording.externalBotId),\n externalRecordingId: normalizeOptionalString(\n callRecording.externalRecordingId,\n ),\n callRecorderFailureReason: normalizeOptionalString(\n callRecording.callRecorderFailureReason,\n ),\n }));\n};\n\nconst normalizeOptionalString = (\n value: string | null | undefined,\n): string | undefined => (isNonEmptyString(value) ? value : undefined);\n\nconst normalizeCallRecordingRequestStatus = (\n recordingRequestStatus: unknown,\n): CallRecordingRequestStatus | undefined => {\n if (recordingRequestStatus === CallRecordingRequestStatus.REQUESTED) {\n return recordingRequestStatus;\n }\n\n if (recordingRequestStatus === CallRecordingRequestStatus.CANCELED) {\n return recordingRequestStatus;\n }\n\n return undefined;\n};\n", "export const TWENTY_PAGE_SIZE = 100;\n", "import { isString, isUndefined } from '@sniptt/guards';\n\nexport type ConnectionPage<TNode> = {\n pageInfo?: {\n hasNextPage?: boolean | null;\n endCursor?: string | null;\n } | null;\n edges?: Array<{ node: TNode }> | null;\n};\n\nexport const fetchAllNodes = async <TNode>(\n fetchPage: (\n afterCursor: string | undefined,\n ) => Promise<ConnectionPage<TNode> | undefined>,\n): Promise<TNode[]> => {\n const nodes: TNode[] = [];\n let hasNextPage = true;\n let afterCursor: string | undefined;\n\n while (hasNextPage) {\n const connection = await fetchPage(afterCursor);\n\n if (isUndefined(connection)) {\n throw new Error('Pagination query returned no connection');\n }\n\n for (const edge of connection.edges ?? []) {\n nodes.push(edge.node);\n }\n\n hasNextPage = connection.pageInfo?.hasNextPage === true;\n const endCursor = connection.pageInfo?.endCursor;\n\n if (hasNextPage && !isString(endCursor)) {\n throw new Error(\n 'Inconsistent pagination state: hasNextPage is true without an endCursor',\n );\n }\n\n afterCursor = isString(endCursor) ? endCursor : undefined;\n }\n\n return nodes;\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';\nimport { findCallRecordingsByFilter } from 'src/logic-functions/data/find-call-recordings-by-filter.util';\n\nexport const findCallRecordingsByIds = async (\n client: CoreApiClient,\n callRecordingIds: string[],\n): Promise<CallRecordingRecord[]> => {\n if (callRecordingIds.length === 0) {\n return [];\n }\n\n return findCallRecordingsByFilter(client, {\n id: { in: callRecordingIds },\n });\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\n\nconst APP_ACCESS_TOKEN_ENV_VAR_NAME = 'TWENTY_APP_ACCESS_TOKEN';\n\nexport const getCurrentWorkspaceId = (): string | undefined => {\n const accessToken = getString(process.env[APP_ACCESS_TOKEN_ENV_VAR_NAME]);\n\n if (isUndefined(accessToken)) {\n return undefined;\n }\n\n return getWorkspaceIdFromAccessToken(accessToken);\n};\n\nconst getWorkspaceIdFromAccessToken = (\n accessToken: string,\n): string | undefined => {\n const encodedPayload = accessToken.split('.')[1];\n\n if (isUndefined(encodedPayload)) {\n return undefined;\n }\n\n try {\n const payload = asRecord(\n JSON.parse(Buffer.from(encodedPayload, 'base64url').toString('utf8')),\n );\n\n return getString(payload?.workspaceId);\n } catch {\n return undefined;\n }\n};\n", "import { isArray, isObject } from '@sniptt/guards';\n\nexport const asRecord = (value: unknown): Record<string, unknown> | undefined =>\n isObject(value) && !isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n", "import { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\nexport const getString = (value: unknown): string | undefined =>\n isNonEmptyString(value) ? value : undefined;\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { getRecallBotAutomaticLeave } from 'src/logic-functions/constants/recall-bot-automatic-leave';\nimport { getRecallBotRecordingConfig } from 'src/logic-functions/constants/recall-bot-recording-config';\nimport { type RecallRoutingMetadata } from 'src/logic-functions/types/recall-routing-metadata.type';\nimport { type RecallBotScheduleResult } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport {\n extractRecallBotId,\n type RecallBotResponse,\n} from 'src/logic-functions/recall-api/extract-recall-bot-id.util';\nimport { getRecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';\nimport { recallBotApiRequest } from 'src/logic-functions/recall-api/recall-bot-api-request.util';\n\nexport type ScheduleRecallBotArgs = {\n meetingUrl: string;\n joinAt: string;\n metadata: RecallRoutingMetadata;\n};\n\nexport const scheduleRecallBot = async ({\n meetingUrl,\n joinAt,\n metadata,\n}: ScheduleRecallBotArgs): Promise<RecallBotScheduleResult> => {\n const configResult = getRecallApiConfig();\n\n if (!configResult.success) {\n return { ok: false, status: null, errorMessage: configResult.error };\n }\n\n const automaticLeave = getRecallBotAutomaticLeave();\n\n const result = await recallBotApiRequest<RecallBotResponse>({\n config: configResult.config,\n path: '/bot/',\n method: 'POST',\n body: {\n meeting_url: meetingUrl,\n join_at: joinAt,\n bot_name: configResult.config.botName,\n ...(isUndefined(automaticLeave)\n ? {}\n : { automatic_leave: automaticLeave }),\n recording_config: getRecallBotRecordingConfig(),\n metadata,\n },\n });\n\n if (!result.ok) {\n return result;\n }\n\n const externalBotId = extractRecallBotId(result.data);\n\n if (isUndefined(externalBotId)) {\n return {\n ok: false,\n status: null,\n errorMessage:\n 'Recall API created a bot but the response did not include a bot id',\n };\n }\n\n return {\n ok: true,\n externalBotId,\n };\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name';\nimport { CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name';\nimport { CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name';\nimport { RECALL_BOT_EVERYONE_LEFT_MIN_ACTIVATE_AFTER_SECONDS } from 'src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds';\nimport { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\ntype RecallBotAutomaticLeave = {\n waiting_room_timeout?: number;\n noone_joined_timeout?: number;\n everyone_left_timeout?: {\n timeout: number;\n activate_after: number;\n };\n};\n\nexport const getRecallBotAutomaticLeave = ():\n | RecallBotAutomaticLeave\n | undefined => {\n const waitingRoomTimeoutSeconds = getOptionalPositiveIntegerVariable(\n CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME,\n );\n const nooneJoinedTimeoutSeconds = getOptionalPositiveIntegerVariable(\n CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME,\n );\n const everyoneLeftTimeoutSeconds = getOptionalPositiveIntegerVariable(\n CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME,\n );\n\n const automaticLeave: RecallBotAutomaticLeave = {};\n\n if (!isUndefined(waitingRoomTimeoutSeconds)) {\n automaticLeave.waiting_room_timeout = waitingRoomTimeoutSeconds;\n }\n\n if (!isUndefined(nooneJoinedTimeoutSeconds)) {\n automaticLeave.noone_joined_timeout = nooneJoinedTimeoutSeconds;\n }\n\n if (!isUndefined(everyoneLeftTimeoutSeconds)) {\n automaticLeave.everyone_left_timeout = {\n timeout: everyoneLeftTimeoutSeconds,\n activate_after: RECALL_BOT_EVERYONE_LEFT_MIN_ACTIVATE_AFTER_SECONDS,\n };\n }\n\n return Object.keys(automaticLeave).length === 0 ? undefined : automaticLeave;\n};\n\nconst getOptionalPositiveIntegerVariable = (\n variableName: string,\n): number | undefined => {\n const rawValue = normalizeOptionalString(\n getApplicationVariableValue(variableName),\n );\n\n if (isUndefined(rawValue)) {\n return undefined;\n }\n\n const timeoutSeconds = Number(rawValue);\n\n if (!Number.isInteger(timeoutSeconds) || timeoutSeconds <= 0) {\n return undefined;\n }\n\n return timeoutSeconds;\n};\n\nconst normalizeOptionalString = (\n value: string | undefined,\n): string | undefined => (isNonEmptyString(value) ? value.trim() : undefined);\n", "export const CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS_ENV_VAR_NAME =\n 'CALL_RECORDER_EVERYONE_LEFT_TIMEOUT_SECONDS';\n", "export const CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS_ENV_VAR_NAME =\n 'CALL_RECORDER_NOONE_JOINED_TIMEOUT_SECONDS';\n", "export const CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS_ENV_VAR_NAME =\n 'CALL_RECORDER_WAITING_ROOM_TIMEOUT_SECONDS';\n", "export const RECALL_BOT_EVERYONE_LEFT_MIN_ACTIVATE_AFTER_SECONDS = 1;\n", "export const CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME =\n 'CALL_RECORDER_RECORDING_RETENTION_HOURS';\n", "// Twenty stores ingested recording artifacts, so Recall.ai media is temporary. Keep the default below Recall.ai's 168-hour free storage window.\nexport const DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS = 166;\n", "import { CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME } from 'src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name';\nimport { DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS } from 'src/logic-functions/constants/default-call-recorder-recording-retention-hours';\nimport { getApplicationVariableValue } from 'src/logic-functions/utils/get-application-variable-value.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\n\ntype RecallBotRecordingConfig = {\n video_mixed_mp4: Record<string, never>;\n audio_mixed_mp3: Record<string, never>;\n retention: { type: 'timed'; hours: number };\n};\n\n// Recall only produces artifacts declared at bot creation; both gate COMPLETED.\nexport const getRecallBotRecordingConfig = (): RecallBotRecordingConfig => {\n const configuredRecordingRetentionHours = getApplicationVariableValue(\n CALL_RECORDER_RECORDING_RETENTION_HOURS_ENV_VAR_NAME,\n );\n\n const recordingRetentionHours = isNonEmptyString(\n configuredRecordingRetentionHours,\n )\n ? Number(configuredRecordingRetentionHours.trim())\n : NaN;\n\n const resolvedRecordingRetentionHours =\n Number.isInteger(recordingRetentionHours) && recordingRetentionHours > 0\n ? recordingRetentionHours\n : DEFAULT_CALL_RECORDER_RECORDING_RETENTION_HOURS;\n\n return {\n video_mixed_mp4: {},\n audio_mixed_mp3: {},\n retention: { type: 'timed', hours: resolvedRecordingRetentionHours },\n };\n};\n", "import { getString } from 'src/logic-functions/utils/get-string.util';\n\nexport type RecallBotResponse = {\n id?: unknown;\n bot_id?: unknown;\n};\n\nexport const extractRecallBotId = (\n response: RecallBotResponse | undefined,\n): string | undefined => getString(response?.id) ?? getString(response?.bot_id);\n", "import { isString, isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { TWENTY_PAGE_SIZE } from 'src/logic-functions/constants/twenty-page-size';\nimport { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';\nimport {\n fetchAllNodes,\n type ConnectionPage,\n} from 'src/logic-functions/data/fetch-all-nodes.util';\nimport { isNonEmptyString } from 'src/logic-functions/utils/is-non-empty-string.util';\nimport { stripRestrictedFieldValue } from 'src/logic-functions/data/strip-restricted-field-value.util';\n\ntype CalendarEventNode = {\n id: string;\n title?: string | null;\n isCanceled?: boolean | null;\n startsAt?: string | null;\n endsAt?: string | null;\n iCalUid?: string | null;\n conferenceLink?: { primaryLinkUrl?: string | null } | null;\n callRecorderPreference?: string | null;\n};\n\nexport const fetchCalendarEventsByFilter = async (\n client: CoreApiClient,\n filter: Record<string, unknown>,\n): Promise<CalendarEventRecord[]> => {\n const calendarEventNodes = await fetchAllNodes<CalendarEventNode>(\n async (afterCursor) => {\n const queryResult = await client.query({\n calendarEvents: {\n __args: {\n filter,\n first: TWENTY_PAGE_SIZE,\n ...(isUndefined(afterCursor) ? {} : { after: afterCursor }),\n },\n pageInfo: {\n hasNextPage: true,\n endCursor: true,\n },\n edges: {\n node: {\n id: true,\n title: true,\n isCanceled: true,\n startsAt: true,\n endsAt: true,\n iCalUid: true,\n conferenceLink: {\n primaryLinkUrl: true,\n },\n callRecorderPreference: true,\n },\n },\n },\n });\n\n return queryResult.calendarEvents as\n | ConnectionPage<CalendarEventNode>\n | undefined;\n },\n );\n\n return calendarEventNodes.map((calendarEvent) => ({\n id: calendarEvent.id,\n title: stripRestrictedFieldValue(calendarEvent.title ?? undefined),\n isCanceled: calendarEvent.isCanceled ?? false,\n startsAt: calendarEvent.startsAt ?? undefined,\n endsAt: calendarEvent.endsAt ?? undefined,\n iCalUid: calendarEvent.iCalUid ?? undefined,\n conferenceLinkUrl: isNonEmptyString(\n calendarEvent.conferenceLink?.primaryLinkUrl,\n )\n ? calendarEvent.conferenceLink.primaryLinkUrl\n : undefined,\n callRecorderPreference: isString(calendarEvent.callRecorderPreference)\n ? calendarEvent.callRecorderPreference\n : undefined,\n }));\n};\n", "// Mirrors twenty-shared; calendar restrictions write it over title/description.\nexport const RESTRICTED_FIELD_PLACEHOLDER =\n 'FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED';\n", "import { RESTRICTED_FIELD_PLACEHOLDER } from 'src/logic-functions/constants/restricted-field-placeholder';\n\nexport const stripRestrictedFieldValue = (\n value: string | undefined,\n): string | undefined =>\n value === RESTRICTED_FIELD_PLACEHOLDER ? undefined : value;\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';\nimport { fetchCalendarEventsByFilter } from 'src/logic-functions/data/fetch-calendar-events-by-filter.util';\nimport { getUniqueSortedIds } from 'src/logic-functions/utils/get-unique-sorted-ids.util';\n\nexport const fetchCalendarEventsByIds = async (\n client: CoreApiClient,\n calendarEventIds: string[],\n): Promise<CalendarEventRecord[]> => {\n const uniqueCalendarEventIds = getUniqueSortedIds(calendarEventIds);\n\n if (uniqueCalendarEventIds.length === 0) {\n return [];\n }\n\n return fetchCalendarEventsByFilter(client, {\n id: { in: uniqueCalendarEventIds },\n });\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CalendarEventRecord } from 'src/logic-functions/types/calendar-event-record.type';\nimport { fetchCalendarEventsByFilter } from 'src/logic-functions/data/fetch-calendar-events-by-filter.util';\n\nexport const fetchCalendarEventsByStartsAtValues = async (\n client: CoreApiClient,\n startsAtValues: string[],\n): Promise<CalendarEventRecord[]> => {\n const uniqueStartsAtValues = [...new Set(startsAtValues)].sort();\n\n if (uniqueStartsAtValues.length === 0) {\n return [];\n }\n\n return fetchCalendarEventsByFilter(client, {\n startsAt: { in: uniqueStartsAtValues },\n });\n};\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type CallRecordingRecord } from 'src/logic-functions/types/call-recording-record.type';\nimport { findCallRecordingsByFilter } from 'src/logic-functions/data/find-call-recordings-by-filter.util';\n\nexport const findCallRecordingsByCalendarEventIds = async (\n client: CoreApiClient,\n calendarEventIds: string[],\n): Promise<CallRecordingRecord[]> => {\n if (calendarEventIds.length === 0) {\n return [];\n }\n\n return findCallRecordingsByFilter(client, {\n calendarEventId: { in: calendarEventIds },\n });\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type MeetingRecording } from 'src/logic-functions/types/meeting-recording.type';\nimport { buildRecallRoutingMetadata } from 'src/logic-functions/domain/build-recall-routing-metadata.util';\nimport { computeRecallBotJoinAt } from 'src/logic-functions/domain/compute-recall-bot-join-at.util';\nimport { getCurrentWorkspaceId } from 'src/logic-functions/data/get-current-workspace-id.util';\nimport { rescheduleRecallBot } from 'src/logic-functions/recall-api/reschedule-recall-bot.util';\nimport { updateCallRecording } from 'src/logic-functions/data/update-call-recording.util';\n\nconst RECALL_BOT_NOT_FOUND_STATUS = 404;\n\nexport const rescheduleCallRecordingBot = async (\n client: CoreApiClient,\n { callRecording, calendarEvent }: MeetingRecording,\n): Promise<void> => {\n const externalBotId = callRecording.externalBotId;\n\n if (isUndefined(externalBotId)) {\n return;\n }\n\n const meetingUrl = calendarEvent.conferenceLinkUrl;\n const meetingStartsAt = calendarEvent.startsAt;\n\n if (isUndefined(meetingUrl) || isUndefined(meetingStartsAt)) {\n return;\n }\n\n const joinAt = computeRecallBotJoinAt(meetingStartsAt);\n\n const workspaceId = getCurrentWorkspaceId();\n\n if (isUndefined(workspaceId)) {\n console.warn(\n `[call-recorder] cannot reschedule Recall bot for callRecording ${callRecording.id}: workspace id unavailable`,\n );\n\n return;\n }\n\n const rescheduleResult = await rescheduleRecallBot({\n externalBotId,\n meetingUrl,\n joinAt,\n metadata: buildRecallRoutingMetadata({\n callRecordingId: callRecording.id,\n workspaceId,\n }),\n });\n\n if (rescheduleResult.ok) {\n return;\n }\n\n // The bot vanished externally; drop the id so the stale-state cron re-creates it as the single writer.\n if (rescheduleResult.status === RECALL_BOT_NOT_FOUND_STATUS) {\n await updateCallRecording(client, {\n id: callRecording.id,\n data: { externalBotId: null },\n });\n\n return;\n }\n\n console.warn(\n `[call-recorder] failed to update Recall bot for callRecording ${callRecording.id}: ${rescheduleResult.errorMessage}`,\n );\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { getRecallBotAutomaticLeave } from 'src/logic-functions/constants/recall-bot-automatic-leave';\nimport { getRecallBotRecordingConfig } from 'src/logic-functions/constants/recall-bot-recording-config';\nimport { type RecallBotScheduleResult } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport {\n extractRecallBotId,\n type RecallBotResponse,\n} from 'src/logic-functions/recall-api/extract-recall-bot-id.util';\nimport { getRecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';\nimport { recallBotApiRequest } from 'src/logic-functions/recall-api/recall-bot-api-request.util';\nimport { type ScheduleRecallBotArgs } from 'src/logic-functions/recall-api/schedule-recall-bot.util';\n\ntype RescheduleRecallBotArgs = ScheduleRecallBotArgs & {\n externalBotId: string;\n};\n\nexport const rescheduleRecallBot = async ({\n externalBotId,\n meetingUrl,\n joinAt,\n metadata,\n}: RescheduleRecallBotArgs): Promise<RecallBotScheduleResult> => {\n const configResult = getRecallApiConfig();\n\n if (!configResult.success) {\n return { ok: false, status: null, errorMessage: configResult.error };\n }\n\n const automaticLeave = getRecallBotAutomaticLeave();\n\n const result = await recallBotApiRequest<RecallBotResponse>({\n config: configResult.config,\n path: `/bot/${externalBotId}/`,\n method: 'PATCH',\n body: {\n meeting_url: meetingUrl,\n join_at: joinAt,\n bot_name: configResult.config.botName,\n ...(isUndefined(automaticLeave)\n ? {}\n : { automatic_leave: automaticLeave }),\n recording_config: getRecallBotRecordingConfig(),\n metadata,\n },\n });\n\n if (!result.ok) {\n return result;\n }\n\n return {\n ok: true,\n externalBotId: extractRecallBotId(result.data) ?? externalBotId,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isUndefined", "isString", "isObject", "isArray", "isNonEmptyString", "import_guards", "import_guards", "import_guards", "import_guards", "CallRecorderPreference", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "normalizeOptionalString", "import_guards", "import_guards", "import_guards", "import_guards", "normalizeOptionalString", "import_guards", "import_guards", "import_guards"]
|
|
7
|
+
}
|