@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.
Files changed (237) hide show
  1. package/manifest.json +297 -0
  2. package/package.json +2 -2
  3. package/src/front-components/calendar-event-recording.front-component.mjs +269 -0
  4. package/src/front-components/calendar-event-recording.front-component.mjs.map +7 -0
  5. package/src/logic-functions/process-recall-webhook.mjs +1744 -0
  6. package/src/logic-functions/process-recall-webhook.mjs.map +7 -0
  7. package/src/logic-functions/recall-webhook.mjs +391 -0
  8. package/src/logic-functions/recall-webhook.mjs.map +7 -0
  9. package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs +1602 -0
  10. package/src/logic-functions/reconcile-call-recorder-calendar-event.mjs.map +7 -0
  11. package/src/logic-functions/reconcile-stale-bot-state.mjs +2268 -0
  12. package/src/logic-functions/reconcile-stale-bot-state.mjs.map +7 -0
  13. package/.env.example +0 -5
  14. package/.nvmrc +0 -1
  15. package/.oxlintrc.json +0 -20
  16. package/AGENTS.md +0 -67
  17. package/CLAUDE.md +0 -67
  18. package/README.md +0 -24
  19. package/SETUP.md +0 -95
  20. package/src/__tests__/global-setup.ts +0 -100
  21. package/src/__tests__/schema.integration-test.ts +0 -104
  22. package/src/application-config.ts +0 -96
  23. package/src/constants/__tests__/call-recording-field-universal-identifiers.test.ts +0 -19
  24. package/src/constants/app-description.ts +0 -2
  25. package/src/constants/app-display-name.ts +0 -1
  26. package/src/constants/application-universal-identifier.ts +0 -2
  27. package/src/constants/calendar-event-reconciliation-logic-function-universal-identifier.ts +0 -2
  28. package/src/constants/calendar-event-record-page-layout-universal-identifier.ts +0 -2
  29. package/src/constants/calendar-event-recording-front-component-universal-identifier.ts +0 -2
  30. package/src/constants/calendar-event-recording-page-layout-tab-universal-identifier.ts +0 -2
  31. package/src/constants/calendar-event-recording-page-layout-widget-universal-identifier.ts +0 -2
  32. package/src/constants/call-recorder-everyone-left-timeout-seconds-app-variable-universal-identifier.ts +0 -2
  33. package/src/constants/call-recorder-failure-reason-on-call-recording-field-universal-identifier.ts +0 -2
  34. package/src/constants/call-recorder-join-early-minutes-app-variable-universal-identifier.ts +0 -2
  35. package/src/constants/call-recorder-name-app-variable-universal-identifier.ts +0 -2
  36. package/src/constants/call-recorder-noone-joined-timeout-seconds-app-variable-universal-identifier.ts +0 -2
  37. package/src/constants/call-recorder-preference-off-option-id.ts +0 -2
  38. package/src/constants/call-recorder-preference-on-calendar-event-field-universal-identifier.ts +0 -2
  39. package/src/constants/call-recorder-preference-on-calendar-event-view-field-universal-identifier.ts +0 -2
  40. package/src/constants/call-recorder-preference-on-option-id.ts +0 -2
  41. package/src/constants/call-recorder-preference.ts +0 -4
  42. package/src/constants/call-recorder-waiting-room-timeout-seconds-app-variable-universal-identifier.ts +0 -2
  43. package/src/constants/call-recording-audio-field-universal-identifier.ts +0 -2
  44. package/src/constants/call-recording-video-field-universal-identifier.ts +0 -2
  45. package/src/constants/default-role-universal-identifier.ts +0 -2
  46. package/src/constants/process-recall-webhook-logic-function-universal-identifier.ts +0 -2
  47. package/src/constants/recall-webhook-logic-function-universal-identifier.ts +0 -2
  48. package/src/constants/stale-bot-state-logic-function-universal-identifier.ts +0 -2
  49. package/src/default-role.ts +0 -69
  50. package/src/fields/call-recorder-failure-reason-on-call-recording.field.ts +0 -22
  51. package/src/fields/call-recorder-preference-on-calendar-event.field.ts +0 -41
  52. package/src/front-components/calendar-event-recording.front-component.tsx +0 -13
  53. package/src/front-components/components/CalendarEventRecording.tsx +0 -39
  54. package/src/front-components/components/CalendarEventRecordingBody.tsx +0 -96
  55. package/src/front-components/components/CalendarEventRecordingContent.tsx +0 -111
  56. package/src/front-components/components/RecordingTranscript.tsx +0 -92
  57. package/src/front-components/components/RecordingVideoPlayer.tsx +0 -52
  58. package/src/front-components/components/TranscriptEntryList.tsx +0 -61
  59. package/src/front-components/components/TranscriptEntryListItem.tsx +0 -115
  60. package/src/front-components/components/TranscriptErrorBox.tsx +0 -48
  61. package/src/front-components/components/TranscriptSpeakerAvatar.tsx +0 -141
  62. package/src/front-components/components/TranscriptSpeakerChip.tsx +0 -51
  63. package/src/front-components/constants/recording-theme-css-variables.ts +0 -40
  64. package/src/front-components/hooks/use-calendar-event-participants.ts +0 -172
  65. package/src/front-components/hooks/use-calendar-event-recording.ts +0 -155
  66. package/src/front-components/types/calendar-event-participant-by-speaker-name.type.ts +0 -6
  67. package/src/front-components/types/calendar-event-recording-participant.type.ts +0 -7
  68. package/src/front-components/types/transcript-entry.type.ts +0 -13
  69. package/src/front-components/utils/__tests__/find-active-transcript-entry-index.test.ts +0 -66
  70. package/src/front-components/utils/__tests__/format-transcript-timestamp.test.ts +0 -29
  71. package/src/front-components/utils/__tests__/get-speaker-name-match-keys.test.ts +0 -22
  72. package/src/front-components/utils/__tests__/parse-transcript-entries.test.ts +0 -162
  73. package/src/front-components/utils/build-calendar-event-participant-by-speaker-name.util.ts +0 -45
  74. package/src/front-components/utils/find-active-transcript-entry-index.util.ts +0 -77
  75. package/src/front-components/utils/format-transcript-timestamp.util.ts +0 -16
  76. package/src/front-components/utils/get-absolute-avatar-url.util.ts +0 -48
  77. package/src/front-components/utils/get-calendar-event-participant-for-speaker-name.util.ts +0 -24
  78. package/src/front-components/utils/get-speaker-name-match-keys.util.ts +0 -64
  79. package/src/front-components/utils/get-video-file-extension.util.ts +0 -23
  80. package/src/front-components/utils/parse-transcript-entries.util.ts +0 -85
  81. package/src/logic-functions/__tests__/process-recall-webhook.test.ts +0 -62
  82. package/src/logic-functions/__tests__/recall-webhook.test.ts +0 -180
  83. package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds-env-var-name.ts +0 -2
  84. package/src/logic-functions/constants/call-recorder-everyone-left-timeout-seconds.ts +0 -1
  85. package/src/logic-functions/constants/call-recorder-join-early-minutes-env-var-name.ts +0 -2
  86. package/src/logic-functions/constants/call-recorder-name-env-var-name.ts +0 -1
  87. package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds-env-var-name.ts +0 -2
  88. package/src/logic-functions/constants/call-recorder-noone-joined-timeout-seconds.ts +0 -1
  89. package/src/logic-functions/constants/call-recorder-recording-retention-hours-env-var-name.ts +0 -2
  90. package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds-env-var-name.ts +0 -2
  91. package/src/logic-functions/constants/call-recorder-waiting-room-timeout-seconds.ts +0 -1
  92. package/src/logic-functions/constants/call-recording-micro-credits-per-hour.ts +0 -1
  93. package/src/logic-functions/constants/call-recording-request-status.ts +0 -5
  94. package/src/logic-functions/constants/call-recording-status.ts +0 -9
  95. package/src/logic-functions/constants/default-call-recorder-join-early-minutes.ts +0 -1
  96. package/src/logic-functions/constants/default-call-recorder-name.ts +0 -1
  97. package/src/logic-functions/constants/default-call-recorder-recording-retention-hours.ts +0 -2
  98. package/src/logic-functions/constants/default-recall-region.ts +0 -1
  99. package/src/logic-functions/constants/milliseconds-per-minute.ts +0 -1
  100. package/src/logic-functions/constants/non-terminal-call-recording-statuses.ts +0 -8
  101. package/src/logic-functions/constants/recall-api-key-env-var-name.ts +0 -1
  102. package/src/logic-functions/constants/recall-api-max-attempts.ts +0 -1
  103. package/src/logic-functions/constants/recall-api-retry-delay-ms.ts +0 -1
  104. package/src/logic-functions/constants/recall-bot-automatic-leave.ts +0 -74
  105. package/src/logic-functions/constants/recall-bot-everyone-left-min-activate-after-seconds.ts +0 -1
  106. package/src/logic-functions/constants/recall-bot-recording-config.ts +0 -34
  107. package/src/logic-functions/constants/recall-region-env-var-name.ts +0 -1
  108. package/src/logic-functions/constants/recall-webhook-secret-env-var-name.ts +0 -1
  109. package/src/logic-functions/constants/restricted-field-placeholder.ts +0 -3
  110. package/src/logic-functions/constants/stale-bot-state-cron-pattern.ts +0 -1
  111. package/src/logic-functions/constants/twenty-page-size.ts +0 -1
  112. package/src/logic-functions/data/__tests__/complete-call-recording-ingestion.test.ts +0 -55
  113. package/src/logic-functions/data/__tests__/fetch-all-nodes.test.ts +0 -43
  114. package/src/logic-functions/data/__tests__/get-current-workspace-id.test.ts +0 -38
  115. package/src/logic-functions/data/__tests__/strip-restricted-field-value.test.ts +0 -22
  116. package/src/logic-functions/data/complete-call-recording-ingestion.util.ts +0 -24
  117. package/src/logic-functions/data/create-call-recording.util.ts +0 -41
  118. package/src/logic-functions/data/fetch-all-nodes.util.ts +0 -44
  119. package/src/logic-functions/data/fetch-calendar-events-by-filter.util.ts +0 -80
  120. package/src/logic-functions/data/fetch-calendar-events-by-ids.util.ts +0 -20
  121. package/src/logic-functions/data/fetch-calendar-events-by-starts-at-values.util.ts +0 -19
  122. package/src/logic-functions/data/find-call-recordings-by-calendar-event-ids.util.ts +0 -17
  123. package/src/logic-functions/data/find-call-recordings-by-filter.util.ts +0 -102
  124. package/src/logic-functions/data/find-call-recordings-by-ids.util.ts +0 -17
  125. package/src/logic-functions/data/find-open-scheduled-call-recordings.util.ts +0 -14
  126. package/src/logic-functions/data/get-current-workspace-id.util.ts +0 -36
  127. package/src/logic-functions/data/strip-restricted-field-value.util.ts +0 -6
  128. package/src/logic-functions/data/update-call-recording.util.ts +0 -24
  129. package/src/logic-functions/domain/__tests__/build-call-recorder-policy-result.test.ts +0 -47
  130. package/src/logic-functions/domain/__tests__/compute-call-recording-charge.test.ts +0 -71
  131. package/src/logic-functions/domain/__tests__/compute-call-recording-id-for-meeting.test.ts +0 -37
  132. package/src/logic-functions/domain/__tests__/compute-real-meeting-key.test.ts +0 -88
  133. package/src/logic-functions/domain/__tests__/is-call-recording-ingestion-complete.test.ts +0 -59
  134. package/src/logic-functions/domain/__tests__/is-call-recording-status-downgrade.test.ts +0 -37
  135. package/src/logic-functions/domain/__tests__/resolve-call-recorder-policy-result.test.ts +0 -120
  136. package/src/logic-functions/domain/__tests__/should-complete-call-recording-ingestion.test.ts +0 -102
  137. package/src/logic-functions/domain/aggregate-call-recorder-policy-results-by-meeting.util.ts +0 -42
  138. package/src/logic-functions/domain/build-call-recorder-policy-result.util.ts +0 -53
  139. package/src/logic-functions/domain/build-failed-transcript-marker.util.ts +0 -13
  140. package/src/logic-functions/domain/build-pending-transcript-marker.util.ts +0 -13
  141. package/src/logic-functions/domain/build-recall-routing-metadata.util.ts +0 -12
  142. package/src/logic-functions/domain/build-transcript-failure-reason.util.ts +0 -7
  143. package/src/logic-functions/domain/compute-call-recording-charge.util.ts +0 -41
  144. package/src/logic-functions/domain/compute-call-recording-id-for-meeting.util.ts +0 -16
  145. package/src/logic-functions/domain/compute-real-meeting-key.util.ts +0 -48
  146. package/src/logic-functions/domain/compute-recall-bot-join-at.util.ts +0 -34
  147. package/src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts +0 -19
  148. package/src/logic-functions/domain/is-call-recording-status-downgrade.util.ts +0 -37
  149. package/src/logic-functions/domain/is-recall-recording-done-signal.util.ts +0 -13
  150. package/src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts +0 -26
  151. package/src/logic-functions/domain/parse-transcript-marker.util.ts +0 -29
  152. package/src/logic-functions/domain/resolve-call-recorder-policy-result.util.ts +0 -72
  153. package/src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts +0 -32
  154. package/src/logic-functions/flows/__tests__/charge-completed-call-recording.test.ts +0 -45
  155. package/src/logic-functions/flows/__tests__/complete-and-charge-call-recording.test.ts +0 -61
  156. package/src/logic-functions/flows/__tests__/converge-diverged-call-recordings.test.ts +0 -727
  157. package/src/logic-functions/flows/__tests__/download-transcript.test.ts +0 -74
  158. package/src/logic-functions/flows/__tests__/handle-recall-webhook.test.ts +0 -1301
  159. package/src/logic-functions/flows/__tests__/heal-call-recordings-missing-bot.test.ts +0 -225
  160. package/src/logic-functions/flows/__tests__/ingest-call-recording-media.test.ts +0 -153
  161. package/src/logic-functions/flows/__tests__/reap-orphaned-call-recorders.test.ts +0 -425
  162. package/src/logic-functions/flows/__tests__/reconcile-call-recorder.test.ts +0 -1007
  163. package/src/logic-functions/flows/cancel-call-recording-request.util.ts +0 -46
  164. package/src/logic-functions/flows/charge-completed-call-recording.util.ts +0 -31
  165. package/src/logic-functions/flows/complete-and-charge-call-recording.util.ts +0 -29
  166. package/src/logic-functions/flows/converge-diverged-call-recordings-result.type.ts +0 -8
  167. package/src/logic-functions/flows/converge-diverged-call-recordings.util.ts +0 -447
  168. package/src/logic-functions/flows/download-transcript.util.ts +0 -67
  169. package/src/logic-functions/flows/ensure-call-recorder.util.ts +0 -73
  170. package/src/logic-functions/flows/handle-recall-webhook.util.ts +0 -672
  171. package/src/logic-functions/flows/heal-call-recordings-missing-bot.util.ts +0 -82
  172. package/src/logic-functions/flows/ingest-call-recording-media.util.ts +0 -128
  173. package/src/logic-functions/flows/persist-call-recording-progress.util.ts +0 -58
  174. package/src/logic-functions/flows/reap-orphaned-call-recorders.util.ts +0 -183
  175. package/src/logic-functions/flows/reconcile-call-recorder.util.ts +0 -495
  176. package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type.ts +0 -11
  177. package/src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts +0 -182
  178. package/src/logic-functions/flows/reschedule-call-recording-bot.util.ts +0 -69
  179. package/src/logic-functions/process-recall-webhook.ts +0 -23
  180. package/src/logic-functions/recall-api/__tests__/extract-recall-bot-convergence.test.ts +0 -153
  181. package/src/logic-functions/recall-api/__tests__/extract-recall-media-urls.test.ts +0 -67
  182. package/src/logic-functions/recall-api/__tests__/recall-bot-api.test.ts +0 -744
  183. package/src/logic-functions/recall-api/__tests__/verify-recall-webhook-signature.test.ts +0 -122
  184. package/src/logic-functions/recall-api/cancel-recall-bot.util.ts +0 -28
  185. package/src/logic-functions/recall-api/create-async-recall-transcript.util.ts +0 -47
  186. package/src/logic-functions/recall-api/eject-recall-bot.util.ts +0 -28
  187. package/src/logic-functions/recall-api/extract-recall-bot-convergence.util.ts +0 -149
  188. package/src/logic-functions/recall-api/extract-recall-bot-id.util.ts +0 -10
  189. package/src/logic-functions/recall-api/extract-recall-media-urls.util.ts +0 -30
  190. package/src/logic-functions/recall-api/extract-twenty-workspace-id-from-recall-webhook.util.ts +0 -8
  191. package/src/logic-functions/recall-api/get-recall-api-config.util.ts +0 -59
  192. package/src/logic-functions/recall-api/get-recall-bot.util.ts +0 -42
  193. package/src/logic-functions/recall-api/get-recall-recording.util.ts +0 -31
  194. package/src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts +0 -18
  195. package/src/logic-functions/recall-api/list-recall-transcripts.util.ts +0 -141
  196. package/src/logic-functions/recall-api/list-scheduled-recall-bots.util.ts +0 -106
  197. package/src/logic-functions/recall-api/normalize-recall-timestamp.util.ts +0 -14
  198. package/src/logic-functions/recall-api/parse-recall-webhook-event.util.ts +0 -88
  199. package/src/logic-functions/recall-api/recall-bot-api-request.util.ts +0 -165
  200. package/src/logic-functions/recall-api/recall-transcript-summary.type.ts +0 -5
  201. package/src/logic-functions/recall-api/reschedule-recall-bot.util.ts +0 -56
  202. package/src/logic-functions/recall-api/retrieve-recall-transcript.util.ts +0 -71
  203. package/src/logic-functions/recall-api/schedule-recall-bot.util.ts +0 -68
  204. package/src/logic-functions/recall-api/verify-recall-webhook-signature.util.ts +0 -109
  205. package/src/logic-functions/recall-webhook.ts +0 -90
  206. package/src/logic-functions/reconcile-call-recorder-calendar-event.ts +0 -178
  207. package/src/logic-functions/reconcile-stale-bot-state.ts +0 -106
  208. package/src/logic-functions/types/calendar-event-record.type.ts +0 -5
  209. package/src/logic-functions/types/call-recorder-policy-calendar-event-input.type.ts +0 -10
  210. package/src/logic-functions/types/call-recorder-policy-input.type.ts +0 -9
  211. package/src/logic-functions/types/call-recorder-policy-not-required-reason.type.ts +0 -5
  212. package/src/logic-functions/types/call-recorder-policy-required-reason.type.ts +0 -1
  213. package/src/logic-functions/types/call-recorder-policy-result-for-calendar-event.type.ts +0 -9
  214. package/src/logic-functions/types/call-recorder-policy-result-for-meeting.type.ts +0 -6
  215. package/src/logic-functions/types/call-recorder-policy-result.type.ts +0 -12
  216. package/src/logic-functions/types/call-recorder-reconciliation-result.type.ts +0 -16
  217. package/src/logic-functions/types/call-recording-media-file.type.ts +0 -1
  218. package/src/logic-functions/types/call-recording-record.type.ts +0 -15
  219. package/src/logic-functions/types/call-recording-update-fields.type.ts +0 -20
  220. package/src/logic-functions/types/files-field-value.type.ts +0 -1
  221. package/src/logic-functions/types/meeting-recording.type.ts +0 -7
  222. package/src/logic-functions/types/recall-bot-operation-result.type.ts +0 -19
  223. package/src/logic-functions/types/recall-routing-metadata.type.ts +0 -4
  224. package/src/logic-functions/types/removed-call-recorder-occurrence.type.ts +0 -6
  225. package/src/logic-functions/types/transcript-marker.type.ts +0 -6
  226. package/src/logic-functions/utils/as-record.util.ts +0 -6
  227. package/src/logic-functions/utils/get-application-variable-value.util.ts +0 -3
  228. package/src/logic-functions/utils/get-record-at-path.util.ts +0 -10
  229. package/src/logic-functions/utils/get-string.util.ts +0 -4
  230. package/src/logic-functions/utils/get-unique-sorted-ids.util.ts +0 -8
  231. package/src/logic-functions/utils/is-non-empty-string.util.ts +0 -5
  232. package/src/page-layouts/calendar-event-recording-tab.ts +0 -33
  233. package/src/view-fields/call-recorder-preference-on-calendar-event.view-field.ts +0 -27
  234. package/tsconfig.json +0 -42
  235. package/tsconfig.spec.json +0 -9
  236. package/vitest.config.ts +0 -31
  237. 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/process-recall-webhook.ts", "twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../../src/constants/process-recall-webhook-logic-function-universal-identifier.ts", "../../../../src/logic-functions/flows/handle-recall-webhook.util.ts", "../../../../src/logic-functions/domain/build-failed-transcript-marker.util.ts", "../../../../src/logic-functions/domain/build-transcript-failure-reason.util.ts", "../../../../src/logic-functions/flows/download-transcript.util.ts", "../../../../src/logic-functions/recall-api/retrieve-recall-transcript.util.ts", "../../../../src/logic-functions/utils/as-record.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/utils/is-non-empty-string.util.ts", "../../../../src/logic-functions/utils/get-string.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/extract-recall-bot-convergence.util.ts", "../../../../src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util.ts", "../../../../src/logic-functions/recall-api/normalize-recall-timestamp.util.ts", "../../../../src/logic-functions/recall-api/get-recall-bot.util.ts", "../../../../src/logic-functions/flows/ingest-call-recording-media.util.ts", "../../../../src/constants/call-recording-audio-field-universal-identifier.ts", "../../../../src/constants/call-recording-video-field-universal-identifier.ts", "../../../../src/logic-functions/utils/get-record-at-path.util.ts", "../../../../src/logic-functions/recall-api/extract-recall-media-urls.util.ts", "../../../../src/logic-functions/recall-api/get-recall-recording.util.ts", "../../../../src/logic-functions/domain/is-call-recording-status-downgrade.util.ts", "../../../../src/logic-functions/domain/is-recall-recording-done-signal.util.ts", "../../../../src/logic-functions/recall-api/parse-recall-webhook-event.util.ts", "../../../../src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util.ts", "../../../../src/logic-functions/domain/parse-transcript-marker.util.ts", "../../../../src/logic-functions/constants/non-terminal-call-recording-statuses.ts", "../../../../src/logic-functions/data/complete-call-recording-ingestion.util.ts", "../../../../src/logic-functions/flows/charge-completed-call-recording.util.ts", "../../../../node_modules/twenty-shared/dist/ViewKey-Dib-Wyry.mjs", "../../../../node_modules/twenty-shared/dist/application.mjs", "../../../../node_modules/twenty-sdk/src/sdk/billing/charge-credits.ts", "../../../../src/logic-functions/domain/compute-call-recording-charge.util.ts", "../../../../src/logic-functions/constants/call-recording-micro-credits-per-hour.ts", "../../../../src/logic-functions/constants/milliseconds-per-minute.ts", "../../../../src/logic-functions/flows/complete-and-charge-call-recording.util.ts", "../../../../src/logic-functions/domain/is-call-recording-ingestion-complete.util.ts", "../../../../src/logic-functions/domain/should-complete-call-recording-ingestion.util.ts", "../../../../src/logic-functions/data/update-call-recording.util.ts", "../../../../src/logic-functions/flows/persist-call-recording-progress.util.ts", "../../../../src/logic-functions/flows/reconcile-call-recording-transcript-artifact.util.ts", "../../../../src/logic-functions/domain/build-pending-transcript-marker.util.ts", "../../../../src/logic-functions/recall-api/create-async-recall-transcript.util.ts", "../../../../src/logic-functions/recall-api/list-recall-transcripts.util.ts"],
4
+ "sourcesContent": [null, null, null, null, "import { CoreApiClient } from 'twenty-client-sdk/core';\nimport { defineLogicFunction } from 'twenty-sdk/define';\n\nimport { PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/constants/process-recall-webhook-logic-function-universal-identifier';\nimport { handleRecallWebhook } from 'src/logic-functions/flows/handle-recall-webhook.util';\nimport { type RecallWebhookBody } from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\n\n// Dispatched by the recall-webhook resolver; runs in the resolved workspace so the client is workspace-scoped.\nexport const processRecallWebhookHandler = (body: RecallWebhookBody) =>\n handleRecallWebhook({\n client: new CoreApiClient(),\n body,\n });\n\nexport default defineLogicFunction({\n universalIdentifier:\n PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,\n name: 'process-recall-webhook',\n description:\n 'Updates the matching CallRecording lifecycle status from a verified Recall.ai webhook event.',\n timeoutSeconds: 30,\n handler: processRecallWebhookHandler,\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 PROCESS_RECALL_WEBHOOK_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n '13d9c427-447e-494a-8d3c-1af5d0bacb82';\n", "import { isNonEmptyArray, isNull, isUndefined } from '@sniptt/guards';\nimport { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { type FilesFieldValue } from 'src/logic-functions/types/files-field-value.type';\nimport { buildFailedTranscriptMarker } from 'src/logic-functions/domain/build-failed-transcript-marker.util';\nimport { buildTranscriptFailureReason } from 'src/logic-functions/domain/build-transcript-failure-reason.util';\nimport { downloadTranscript } from 'src/logic-functions/flows/download-transcript.util';\nimport { extractRecallBotConvergence } from 'src/logic-functions/recall-api/extract-recall-bot-convergence.util';\nimport { getRecallBot } from 'src/logic-functions/recall-api/get-recall-bot.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\nimport { ingestCallRecordingMedia } from 'src/logic-functions/flows/ingest-call-recording-media.util';\nimport { isCallRecordingStatusDowngrade } from 'src/logic-functions/domain/is-call-recording-status-downgrade.util';\nimport { isRecallRecordingDoneSignal } from 'src/logic-functions/domain/is-recall-recording-done-signal.util';\nimport { mapRecallStatusCodeToCallRecordingStatus } from 'src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util';\nimport {\n parseRecallWebhookEvent,\n type RecallWebhookBody,\n type RecallWebhookEvent,\n} from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\nimport { parseTranscriptMarker } from 'src/logic-functions/domain/parse-transcript-marker.util';\nimport { persistCallRecordingProgress } from 'src/logic-functions/flows/persist-call-recording-progress.util';\nimport { reconcileCallRecordingTranscriptArtifact } from 'src/logic-functions/flows/reconcile-call-recording-transcript-artifact.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\ntype MatchedCallRecording = {\n id: string;\n status?: string;\n startedAt?: string;\n endedAt?: string;\n externalRecordingId?: string;\n transcript?: unknown;\n audio?: FilesFieldValue;\n video?: FilesFieldValue;\n};\n\ntype ExternalRecordingIdResolution = {\n externalRecordingId: string | undefined;\n providerLookupFailed: boolean;\n};\n\ntype RecallWebhookHandlerResult =\n | {\n status: 'updated';\n callRecordingId: string;\n event: string;\n callRecordingStatus: string;\n }\n | {\n status: 'updated';\n callRecordingId: string;\n event: string;\n transcriptOutcome: 'FILLED' | 'FAILED';\n }\n | {\n status: 'skipped';\n event: string | null;\n reason: string;\n };\n\nexport const handleRecallWebhook = async ({\n client,\n body,\n}: {\n client: CoreApiClient;\n body: RecallWebhookBody;\n}): Promise<RecallWebhookHandlerResult> => {\n const webhookEvent = parseRecallWebhookEvent(body);\n\n if (isUndefined(webhookEvent)) {\n return {\n status: 'skipped',\n event: null,\n reason: 'missing event type',\n };\n }\n\n const { event } = webhookEvent;\n\n if (event === 'transcript.done' || event === 'transcript.failed') {\n return handleRecallTranscriptEvent({ client, webhookEvent, event });\n }\n\n return handleRecallStatusEvent({ client, webhookEvent });\n};\n\nconst handleRecallStatusEvent = async ({\n client,\n webhookEvent,\n}: {\n client: CoreApiClient;\n webhookEvent: RecallWebhookEvent;\n}): Promise<RecallWebhookHandlerResult> => {\n const { event, statusCode } = webhookEvent;\n const callRecordingStatus = mapRecallEventToCallRecordingStatus({\n event,\n statusCode,\n });\n\n if (isUndefined(callRecordingStatus)) {\n return {\n status: 'skipped',\n event,\n reason: `unsupported Recall event status ${statusCode ?? event}`,\n };\n }\n\n const callRecording = await findMatchingCallRecording({\n client,\n webhookEvent,\n });\n\n if (isUndefined(callRecording)) {\n return {\n status: 'skipped',\n event,\n reason: 'no matching call recording',\n };\n }\n\n if (\n isCallRecordingStatusDowngrade({\n fromStatus: callRecording.status,\n toStatus: callRecordingStatus,\n })\n ) {\n return {\n status: 'skipped',\n event,\n reason: `stale status event (${callRecording.status} -> ${callRecordingStatus})`,\n };\n }\n\n const updateData: CallRecordingUpdateFields = {\n ...(isUndefined(webhookEvent.externalBotId)\n ? {}\n : { externalBotId: webhookEvent.externalBotId }),\n ...buildExternalRecordingIdUpdate(webhookEvent),\n ...buildCallRecordingStatusUpdate({\n reason: getRecallWebhookFailureReason(webhookEvent),\n status: callRecordingStatus,\n }),\n ...buildRecordingTimestampsUpdate({ webhookEvent, callRecording }),\n };\n\n if (isRecallRecordingDoneSignal({ event, statusCode })) {\n const externalRecordingIdResolution = await resolveExternalRecordingId({\n callRecording,\n webhookEvent,\n });\n\n Object.assign(\n updateData,\n await buildTranscriptArtifactUpdate({\n callRecording,\n externalRecordingId: externalRecordingIdResolution.externalRecordingId,\n }),\n );\n\n Object.assign(\n updateData,\n await buildMediaIngestionUpdate({\n callRecording,\n externalRecordingId: externalRecordingIdResolution.externalRecordingId,\n }),\n );\n\n const terminalArtifactGateFailureUpdate =\n buildTerminalArtifactGateFailureUpdate({\n callRecording,\n providerLookupFailed:\n externalRecordingIdResolution.providerLookupFailed,\n updateData,\n webhookEvent,\n });\n\n if (!isUndefined(terminalArtifactGateFailureUpdate)) {\n Object.assign(updateData, terminalArtifactGateFailureUpdate);\n }\n }\n\n const { completesIngestion } = await persistCallRecordingProgress(client, {\n id: callRecording.id,\n current: callRecording,\n updateData,\n });\n\n return {\n status: 'updated',\n event,\n callRecordingId: callRecording.id,\n callRecordingStatus: completesIngestion\n ? CallRecordingStatus.COMPLETED\n : (updateData.status ?? callRecordingStatus),\n };\n};\n\nconst findMatchingCallRecording = async ({\n client,\n webhookEvent,\n}: {\n client: CoreApiClient;\n webhookEvent: RecallWebhookEvent;\n}): Promise<MatchedCallRecording | undefined> => {\n if (!isUndefined(webhookEvent.callRecordingIdFromMetadata)) {\n return findCallRecordingByFilter(client, {\n id: { eq: webhookEvent.callRecordingIdFromMetadata },\n });\n }\n\n if (isUndefined(webhookEvent.externalBotId)) {\n return undefined;\n }\n\n return findCallRecordingByFilter(client, {\n externalBotId: { eq: webhookEvent.externalBotId },\n });\n};\n\nconst findCallRecordingByFilter = async (\n client: CoreApiClient,\n filter: Record<string, unknown>,\n): Promise<MatchedCallRecording | undefined> => {\n const queryResult = await client.query({\n callRecordings: {\n __args: {\n filter,\n first: 1,\n },\n edges: {\n node: {\n id: true,\n status: true,\n startedAt: true,\n endedAt: true,\n externalRecordingId: true,\n transcript: true,\n audio: { fileId: true },\n video: { fileId: true },\n },\n },\n },\n });\n\n const node = queryResult.callRecordings?.edges?.[0]?.node;\n\n if (isUndefined(node) || isNull(node)) {\n return undefined;\n }\n\n return {\n id: node.id,\n status: getString(node.status),\n startedAt: getString(node.startedAt),\n endedAt: getString(node.endedAt),\n externalRecordingId: getString(node.externalRecordingId),\n transcript: node.transcript ?? undefined,\n audio: node.audio ?? undefined,\n video: node.video ?? undefined,\n };\n};\n\nconst mapRecallEventToCallRecordingStatus = ({\n event,\n statusCode,\n}: {\n event: string;\n statusCode: string | undefined;\n}): CallRecordingStatus | undefined => {\n if (event === 'recording.done') {\n return CallRecordingStatus.PROCESSING;\n }\n\n if (event === 'recording.failed') {\n return CallRecordingStatus.FAILED;\n }\n\n return mapRecallStatusCodeToCallRecordingStatus(statusCode);\n};\n\nconst buildRecordingTimestampsUpdate = ({\n webhookEvent,\n callRecording,\n}: {\n webhookEvent: RecallWebhookEvent;\n callRecording: MatchedCallRecording;\n}): { startedAt?: string; endedAt?: string } => {\n const { event, statusCode, statusTimestamp } = webhookEvent;\n\n const impliesRecordingStarted = statusCode === 'in_call_recording';\n const impliesRecordingEnded =\n event === 'recording.done' ||\n statusCode === 'call_ended' ||\n statusCode === 'done';\n\n const startedAt =\n webhookEvent.recordingStartedAt ??\n (impliesRecordingStarted ? statusTimestamp : undefined);\n const endedAt =\n webhookEvent.recordingEndedAt ??\n (impliesRecordingEnded ? statusTimestamp : undefined);\n\n return {\n ...(!isUndefined(startedAt) && isUndefined(callRecording.startedAt)\n ? { startedAt }\n : {}),\n ...(!isUndefined(endedAt) && isUndefined(callRecording.endedAt)\n ? { endedAt }\n : {}),\n };\n};\n\nconst buildExternalRecordingIdUpdate = (\n webhookEvent: RecallWebhookEvent,\n): { externalRecordingId?: string } =>\n isUndefined(webhookEvent.externalRecordingId)\n ? {}\n : { externalRecordingId: webhookEvent.externalRecordingId };\n\ntype NonFailedCallRecordingStatus = Exclude<\n CallRecordingStatus,\n CallRecordingStatus.FAILED\n>;\n\ntype CallRecordingStatusUpdate =\n | {\n status: NonFailedCallRecordingStatus;\n }\n | {\n status: CallRecordingStatus.FAILED;\n callRecorderFailureReason: string;\n };\n\ntype TerminalArtifactGateFailureUpdate = {\n status: CallRecordingStatus.FAILED;\n callRecorderFailureReason: string;\n};\n\nconst buildCallRecordingStatusUpdate = ({\n reason,\n status,\n}: {\n reason: string;\n status: CallRecordingStatus;\n}): CallRecordingStatusUpdate => {\n if (status === CallRecordingStatus.FAILED) {\n return { status, callRecorderFailureReason: reason };\n }\n\n return { status };\n};\n\nconst buildTerminalArtifactGateFailureUpdate = ({\n callRecording,\n providerLookupFailed,\n updateData,\n webhookEvent,\n}: {\n callRecording: MatchedCallRecording;\n providerLookupFailed: boolean;\n updateData: CallRecordingUpdateFields;\n webhookEvent: RecallWebhookEvent;\n}): TerminalArtifactGateFailureUpdate | undefined => {\n if (updateData.status === CallRecordingStatus.FAILED) {\n return isUndefined(updateData.callRecorderFailureReason)\n ? {\n status: CallRecordingStatus.FAILED,\n callRecorderFailureReason:\n getRecallWebhookFailureReason(webhookEvent),\n }\n : undefined;\n }\n\n if (\n providerLookupFailed ||\n hasRecordingArtifactPath({ callRecording, updateData })\n ) {\n return undefined;\n }\n\n return {\n status: CallRecordingStatus.FAILED,\n callRecorderFailureReason: 'recording_artifacts_unavailable',\n };\n};\n\nconst getRecallWebhookFailureReason = ({\n event,\n statusCode,\n}: RecallWebhookEvent): string => statusCode ?? event;\n\nconst hasRecordingArtifactPath = ({\n callRecording,\n updateData,\n}: {\n callRecording: MatchedCallRecording;\n updateData: CallRecordingUpdateFields;\n}): boolean => {\n return (\n !isUndefined(\n updateData.externalRecordingId ?? callRecording.externalRecordingId,\n ) ||\n isNonEmptyArray(updateData.audio ?? callRecording.audio) ||\n isNonEmptyArray(updateData.video ?? callRecording.video) ||\n hasReachableTranscript(updateData.transcript ?? callRecording.transcript)\n );\n};\n\nconst hasReachableTranscript = (transcript: unknown): boolean => {\n if (isNull(transcript) || isUndefined(transcript)) {\n return false;\n }\n\n const marker = parseTranscriptMarker(transcript);\n\n return isUndefined(marker) || marker.status === 'PENDING';\n};\n\nconst isTranscriptUnset = (callRecording: MatchedCallRecording): boolean =>\n isUndefined(callRecording.transcript);\n\nconst buildMediaIngestionUpdate = async ({\n callRecording,\n externalRecordingId,\n}: {\n callRecording: MatchedCallRecording;\n externalRecordingId: string | undefined;\n}): Promise<Pick<CallRecordingUpdateFields, 'audio' | 'video'>> => {\n const hasAudio = isNonEmptyArray(callRecording.audio);\n const hasVideo = isNonEmptyArray(callRecording.video);\n\n if (hasAudio && hasVideo) {\n return {};\n }\n\n if (isUndefined(externalRecordingId)) {\n console.warn(\n `[call-recorder] cannot ingest media for call recording ${callRecording.id}: no Recall recording id available`,\n );\n\n return {};\n }\n\n return ingestCallRecordingMedia({\n callRecordingId: callRecording.id,\n externalRecordingId,\n hasAudio,\n hasVideo,\n });\n};\n\nconst buildTranscriptArtifactUpdate = async ({\n callRecording,\n externalRecordingId,\n}: {\n callRecording: MatchedCallRecording;\n externalRecordingId: string | undefined;\n}): Promise<CallRecordingUpdateFields> => {\n if (isUndefined(externalRecordingId)) {\n console.warn(\n `[call-recorder] cannot reconcile transcript for call recording ${callRecording.id}: no Recall recording id available`,\n );\n\n return {};\n }\n\n const transcriptArtifactResult =\n await reconcileCallRecordingTranscriptArtifact({\n callRecordingId: callRecording.id,\n currentStatus: callRecording.status,\n externalRecordingId,\n requestedAt: new Date().toISOString(),\n transcript: callRecording.transcript,\n });\n\n return {\n ...(isUndefined(callRecording.externalRecordingId)\n ? { externalRecordingId }\n : {}),\n ...transcriptArtifactResult.updateData,\n };\n};\n\nconst resolveExternalRecordingId = async ({\n callRecording,\n webhookEvent,\n}: {\n callRecording: MatchedCallRecording;\n webhookEvent: RecallWebhookEvent;\n}): Promise<ExternalRecordingIdResolution> => {\n const externalRecordingId =\n webhookEvent.externalRecordingId ?? callRecording.externalRecordingId;\n\n if (!isUndefined(externalRecordingId)) {\n return { externalRecordingId, providerLookupFailed: false };\n }\n\n if (isUndefined(webhookEvent.externalBotId)) {\n return { externalRecordingId: undefined, providerLookupFailed: false };\n }\n\n return fetchExternalRecordingIdFromRecallBot(webhookEvent.externalBotId);\n};\n\nconst fetchExternalRecordingIdFromRecallBot = async (\n externalBotId: string,\n): Promise<ExternalRecordingIdResolution> => {\n const botResult = await getRecallBot({ externalBotId });\n\n if (!botResult.ok) {\n console.warn(\n `[call-recorder] failed to fetch Recall bot ${externalBotId} while resolving a recording id: ${botResult.errorMessage}`,\n );\n\n return { externalRecordingId: undefined, providerLookupFailed: true };\n }\n\n return {\n externalRecordingId: extractRecallBotConvergence(botResult.bot)\n .externalRecordingId,\n providerLookupFailed: false,\n };\n};\n\nconst handleRecallTranscriptEvent = async ({\n client,\n webhookEvent,\n event,\n}: {\n client: CoreApiClient;\n webhookEvent: RecallWebhookEvent;\n event: 'transcript.done' | 'transcript.failed';\n}): Promise<RecallWebhookHandlerResult> => {\n const callRecording = await findMatchingCallRecording({\n client,\n webhookEvent,\n });\n\n if (isUndefined(callRecording)) {\n return {\n status: 'skipped',\n event,\n reason: 'no matching call recording',\n };\n }\n\n const { transcriptId } = webhookEvent;\n\n if (event === 'transcript.failed') {\n return applyTranscriptFailure({\n client,\n callRecording,\n event,\n transcriptId,\n subCode: webhookEvent.transcriptFailureSubCode ?? null,\n });\n }\n\n if (isUndefined(transcriptId)) {\n return {\n status: 'skipped',\n event,\n reason: 'missing transcript id',\n };\n }\n\n const downloadResult = await downloadTranscript({ transcriptId });\n\n switch (downloadResult.outcome) {\n case 'filled': {\n const updateData: CallRecordingUpdateFields = {\n transcript: downloadResult.content as Record<string, unknown>,\n ...(isUndefined(callRecording.externalRecordingId)\n ? buildExternalRecordingIdUpdate(webhookEvent)\n : {}),\n };\n\n await persistCallRecordingProgress(client, {\n id: callRecording.id,\n current: callRecording,\n updateData,\n });\n\n return {\n status: 'updated',\n event,\n callRecordingId: callRecording.id,\n transcriptOutcome: 'FILLED',\n };\n }\n case 'failed':\n return applyTranscriptFailure({\n client,\n callRecording,\n event,\n transcriptId,\n subCode: downloadResult.subCode,\n });\n case 'pending':\n case 'error': {\n // 200-acked either way, Svix never redelivers; the cron re-check retries this.\n const reason =\n downloadResult.outcome === 'pending'\n ? 'transcript not downloadable yet'\n : downloadResult.errorMessage;\n\n console.warn(\n `[call-recorder] could not fill transcript for call recording ${callRecording.id}: ${reason}`,\n );\n\n return {\n status: 'skipped',\n event,\n reason,\n };\n }\n }\n};\n\nconst applyTranscriptFailure = async ({\n client,\n callRecording,\n event,\n transcriptId,\n subCode,\n}: {\n client: CoreApiClient;\n callRecording: MatchedCallRecording;\n event: string;\n transcriptId: string | undefined;\n subCode: string | null;\n}): Promise<RecallWebhookHandlerResult> => {\n const existingMarker = parseTranscriptMarker(callRecording.transcript);\n\n if (!isTranscriptUnset(callRecording) && isUndefined(existingMarker)) {\n return {\n status: 'skipped',\n event,\n reason: 'transcript already filled',\n };\n }\n\n console.warn(\n `[call-recorder] transcript failed for call recording ${callRecording.id}${isNull(subCode) ? '' : ` (${subCode})`}`,\n );\n\n await updateCallRecording(client, {\n id: callRecording.id,\n data: {\n transcript: buildFailedTranscriptMarker({\n recallTranscriptId:\n transcriptId ?? existingMarker?.recallTranscriptId ?? null,\n subCode,\n }),\n callRecorderFailureReason: buildTranscriptFailureReason(subCode),\n ...(isCallRecordingStatusDowngrade({\n fromStatus: callRecording.status,\n toStatus: CallRecordingStatus.FAILED,\n })\n ? {}\n : { status: CallRecordingStatus.FAILED }),\n },\n });\n\n return {\n status: 'updated',\n event,\n callRecordingId: callRecording.id,\n transcriptOutcome: 'FAILED',\n };\n};\n", "import { type TranscriptMarker } from 'src/logic-functions/types/transcript-marker.type';\n\nexport const buildFailedTranscriptMarker = ({\n recallTranscriptId,\n subCode,\n}: {\n recallTranscriptId: string | null;\n subCode: string | null;\n}): TranscriptMarker => ({\n recallTranscriptId,\n status: 'FAILED',\n subCode,\n});\n", "import { isNull } from '@sniptt/guards';\n\nexport const buildTranscriptFailureReason = (\n subCode: string | null,\n): string => {\n return isNull(subCode) ? 'transcript_failed' : `transcript_failed:${subCode}`;\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { retrieveRecallTranscript } from 'src/logic-functions/recall-api/retrieve-recall-transcript.util';\n\nconst TRANSCRIPT_DOWNLOAD_TIMEOUT_MS = 20_000;\n\nexport type DownloadTranscriptResult =\n | { outcome: 'filled'; content: unknown }\n | { outcome: 'failed'; subCode: string | null }\n | { outcome: 'pending' }\n | { outcome: 'error'; errorMessage: string };\n\nexport const downloadTranscript = async ({\n transcriptId,\n}: {\n transcriptId: string;\n}): Promise<DownloadTranscriptResult> => {\n const retrieveResult = await retrieveRecallTranscript({ transcriptId });\n\n if (!retrieveResult.ok) {\n return { outcome: 'error', errorMessage: retrieveResult.errorMessage };\n }\n\n const { downloadUrl, statusCode, statusSubCode } = retrieveResult.transcript;\n\n if (!isUndefined(downloadUrl)) {\n return downloadTranscriptContent(downloadUrl);\n }\n\n if (statusCode === 'error' || statusCode === 'failed') {\n return { outcome: 'failed', subCode: statusSubCode ?? null };\n }\n\n return { outcome: 'pending' };\n};\n\nconst downloadTranscriptContent = async (\n downloadUrl: string,\n): Promise<DownloadTranscriptResult> => {\n try {\n const response = await fetch(downloadUrl, {\n signal: AbortSignal.timeout(TRANSCRIPT_DOWNLOAD_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n console.warn(\n `[call-recorder] transcript download responded with HTTP ${response.status}`,\n );\n\n return {\n outcome: 'error',\n errorMessage: 'transcript download failed',\n };\n }\n\n return { outcome: 'filled', content: await response.json() };\n } catch (error) {\n console.warn(\n `[call-recorder] transcript download failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n\n return {\n outcome: 'error',\n errorMessage: 'transcript download failed',\n };\n }\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { type RecallBotOperationFailure } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getRecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\nimport { recallBotApiRequest } from 'src/logic-functions/recall-api/recall-bot-api-request.util';\n\nexport type RecallTranscriptDetails = {\n downloadUrl: string | undefined;\n statusCode: string | undefined;\n statusSubCode: string | undefined;\n};\n\ntype RetrieveRecallTranscriptResult =\n | { ok: true; transcript: RecallTranscriptDetails }\n | RecallBotOperationFailure;\n\nexport const retrieveRecallTranscript = async ({\n transcriptId,\n}: {\n transcriptId: string;\n}): Promise<RetrieveRecallTranscriptResult> => {\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<Record<string, unknown>>({\n config: configResult.config,\n path: `/transcript/${transcriptId}/`,\n method: 'GET',\n });\n\n if (!result.ok) {\n return result;\n }\n\n const transcript = extractRecallTranscriptDetails(result.data);\n\n if (isMalformedRecallTranscriptDetails(transcript)) {\n return {\n ok: false,\n status: result.status,\n errorMessage: 'Recall API returned malformed transcript details',\n };\n }\n\n return { ok: true, transcript };\n};\n\nconst extractRecallTranscriptDetails = (\n response: Record<string, unknown> | undefined,\n): RecallTranscriptDetails => {\n const data = asRecord(response?.data);\n const status = asRecord(response?.status);\n\n return {\n downloadUrl: getString(data?.download_url),\n statusCode: getString(status?.code),\n statusSubCode: getString(status?.sub_code),\n };\n};\n\nconst isMalformedRecallTranscriptDetails = ({\n downloadUrl,\n statusCode,\n}: RecallTranscriptDetails): boolean =>\n (isUndefined(downloadUrl) && isUndefined(statusCode)) ||\n (isUndefined(downloadUrl) && statusCode === 'done');\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 { 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 { 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 { 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 { 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 { isArray, isUndefined } from '@sniptt/guards';\n\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\nimport { mapRecallStatusCodeToCallRecordingStatus } from 'src/logic-functions/domain/map-recall-status-code-to-call-recording-status.util';\nimport { normalizeRecallTimestamp } from 'src/logic-functions/recall-api/normalize-recall-timestamp.util';\n\nexport type RecallBotConvergence = {\n status: CallRecordingStatus | undefined;\n failureReason: string | undefined;\n startedAt: string | undefined;\n endedAt: string | undefined;\n externalRecordingId: string | undefined;\n isRecallRecordingDone: boolean;\n};\n\ntype RecallBotStatusChange = {\n code: string;\n createdAt: string | undefined;\n};\n\n// Derives the state a full webhook history would have produced from GET /bot.\nexport const extractRecallBotConvergence = (\n bot: Record<string, unknown>,\n): RecallBotConvergence => {\n const statusChanges = extractStatusChanges(bot);\n const latestStatusChange = getLatestStatusChange(statusChanges);\n const status = mapRecallStatusCodeToCallRecordingStatus(\n latestStatusChange?.code,\n );\n const recording = extractFirstRecording(bot);\n\n return {\n status,\n failureReason:\n status === CallRecordingStatus.FAILED\n ? latestStatusChange?.code\n : undefined,\n startedAt: normalizeRecallTimestamp(\n recording?.startedAt ??\n findStatusChangeTimestamp(statusChanges, 'in_call_recording'),\n ),\n endedAt: normalizeRecallTimestamp(\n recording?.completedAt ??\n findStatusChangeTimestamp(statusChanges, 'call_ended'),\n ),\n externalRecordingId: recording?.id,\n isRecallRecordingDone:\n !isUndefined(recording?.completedAt) ||\n statusChanges.some((statusChange) => statusChange.code === 'done'),\n };\n};\n\nconst extractStatusChanges = (\n bot: Record<string, unknown>,\n): RecallBotStatusChange[] => {\n if (!isArray(bot.status_changes)) {\n return [];\n }\n\n return bot.status_changes.flatMap((statusChange: unknown) => {\n const code = getString(asRecord(statusChange)?.code);\n\n if (isUndefined(code)) {\n return [];\n }\n\n return [{ code, createdAt: getString(asRecord(statusChange)?.created_at) }];\n });\n};\n\nconst getLatestStatusChange = (\n statusChanges: RecallBotStatusChange[],\n): RecallBotStatusChange | undefined =>\n statusChanges.reduce<RecallBotStatusChange | undefined>(\n (latestStatusChange, statusChange) => {\n if (isUndefined(latestStatusChange)) {\n return statusChange;\n }\n\n const statusChangeTime = getStatusChangeTime(statusChange);\n const latestStatusChangeTime = getStatusChangeTime(latestStatusChange);\n\n if (\n isUndefined(statusChangeTime) &&\n isUndefined(latestStatusChangeTime)\n ) {\n return statusChange;\n }\n\n if (isUndefined(statusChangeTime)) {\n return latestStatusChange;\n }\n\n if (isUndefined(latestStatusChangeTime)) {\n return statusChange;\n }\n\n return statusChangeTime >= latestStatusChangeTime\n ? statusChange\n : latestStatusChange;\n },\n undefined,\n );\n\nconst getStatusChangeTime = (\n statusChange: RecallBotStatusChange,\n): number | undefined => {\n const normalizedTimestamp = normalizeRecallTimestamp(statusChange.createdAt);\n\n if (isUndefined(normalizedTimestamp)) {\n return undefined;\n }\n\n return new Date(normalizedTimestamp).getTime();\n};\n\nconst extractFirstRecording = (\n bot: Record<string, unknown>,\n):\n | {\n id: string | undefined;\n startedAt: string | undefined;\n completedAt: string | undefined;\n }\n | undefined => {\n if (!isArray(bot.recordings)) {\n return undefined;\n }\n\n const recording = asRecord(bot.recordings[0]);\n\n if (isUndefined(recording)) {\n return undefined;\n }\n\n return {\n id: getString(recording.id),\n startedAt: getString(recording.started_at),\n completedAt: getString(recording.completed_at),\n };\n};\n\nconst findStatusChangeTimestamp = (\n statusChanges: RecallBotStatusChange[],\n code: string,\n): string | undefined =>\n statusChanges.find((statusChange) => statusChange.code === code)?.createdAt;\n", "import { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\n\nexport const mapRecallStatusCodeToCallRecordingStatus = (\n statusCode: string | undefined,\n): CallRecordingStatus | undefined => {\n switch (statusCode) {\n case 'joining_call':\n case 'in_waiting_room':\n return CallRecordingStatus.JOINING;\n case 'in_call_not_recording':\n case 'recording_permission_allowed':\n case 'in_call_recording':\n return CallRecordingStatus.RECORDING;\n // 'done' stays PROCESSING: COMPLETED is set only after all artifacts are ingested.\n case 'call_ended':\n case 'analysis_done':\n case 'done':\n return CallRecordingStatus.PROCESSING;\n case 'fatal':\n case 'analysis_failed':\n case 'recording_permission_denied':\n return CallRecordingStatus.FAILED;\n default:\n return undefined;\n }\n};\n", "import { isUndefined } from '@sniptt/guards';\n\n// Twenty rejects Recall's microsecond precision; truncate to millisecond ISO.\nexport const normalizeRecallTimestamp = (\n value: string | undefined,\n): string | undefined => {\n if (isUndefined(value)) {\n return undefined;\n }\n\n const parsed = new Date(value);\n\n return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString();\n};\n", "import { type RecallBotOperationFailure } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport { asRecord } from 'src/logic-functions/utils/as-record.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\ntype GetRecallBotResult =\n | { ok: true; bot: Record<string, unknown> }\n | RecallBotOperationFailure;\n\nexport const getRecallBot = async ({\n externalBotId,\n}: {\n externalBotId: string;\n}): Promise<GetRecallBotResult> => {\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<Record<string, unknown>>({\n config: configResult.config,\n path: `/bot/${externalBotId}/`,\n method: 'GET',\n });\n\n if (!result.ok) {\n return result;\n }\n\n const bot = asRecord(result.data);\n\n if (bot === undefined) {\n return {\n ok: false,\n status: result.status,\n errorMessage: 'Recall API returned an empty bot response',\n };\n }\n\n return { ok: true, bot };\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { MetadataApiClient } from 'twenty-client-sdk/metadata';\n\nimport { CALL_RECORDING_AUDIO_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recording-audio-field-universal-identifier';\nimport { CALL_RECORDING_VIDEO_FIELD_UNIVERSAL_IDENTIFIER } from 'src/constants/call-recording-video-field-universal-identifier';\nimport { extractRecallMediaUrls } from 'src/logic-functions/recall-api/extract-recall-media-urls.util';\nimport { getRecallRecording } from 'src/logic-functions/recall-api/get-recall-recording.util';\nimport { type CallRecordingMediaFile } from 'src/logic-functions/types/call-recording-media-file.type';\nimport { type CallRecordingUpdateFields } from 'src/logic-functions/types/call-recording-update-fields.type';\n\ntype CallRecordingMediaUpdateFields = Pick<\n CallRecordingUpdateFields,\n 'audio' | 'video'\n>;\n\nconst MEDIA_DOWNLOAD_TIMEOUT_MS = 120_000;\n\nexport const ingestCallRecordingMedia = async ({\n callRecordingId,\n externalRecordingId,\n hasAudio,\n hasVideo,\n}: {\n callRecordingId: string;\n externalRecordingId: string;\n hasAudio: boolean;\n hasVideo: boolean;\n}): Promise<CallRecordingMediaUpdateFields> => {\n if (hasAudio && hasVideo) {\n return {};\n }\n\n const recordingResult = await getRecallRecording({ externalRecordingId });\n\n if (!recordingResult.ok) {\n console.warn(\n `[call-recorder] failed to fetch Recall recording ${externalRecordingId} while ingesting media for call recording ${callRecordingId}: ${recordingResult.errorMessage}`,\n );\n\n return {};\n }\n\n const mediaUrls = extractRecallMediaUrls(recordingResult.recording);\n const metadataClient = new MetadataApiClient();\n const updateFields: CallRecordingMediaUpdateFields = {};\n\n if (!hasVideo && !isUndefined(mediaUrls.videoUrl)) {\n const video = await ingestMediaArtifact({\n callRecordingId,\n metadataClient,\n url: mediaUrls.videoUrl,\n fileName: 'video.mp4',\n fieldMetadataUniversalIdentifier:\n CALL_RECORDING_VIDEO_FIELD_UNIVERSAL_IDENTIFIER,\n });\n\n if (!isUndefined(video)) {\n updateFields.video = video;\n }\n }\n\n if (!hasAudio && !isUndefined(mediaUrls.audioUrl)) {\n const audio = await ingestMediaArtifact({\n callRecordingId,\n metadataClient,\n url: mediaUrls.audioUrl,\n fileName: 'audio.mp3',\n fieldMetadataUniversalIdentifier:\n CALL_RECORDING_AUDIO_FIELD_UNIVERSAL_IDENTIFIER,\n });\n\n if (!isUndefined(audio)) {\n updateFields.audio = audio;\n }\n }\n\n return updateFields;\n};\n\nconst ingestMediaArtifact = async ({\n callRecordingId,\n metadataClient,\n url,\n fileName,\n fieldMetadataUniversalIdentifier,\n}: {\n callRecordingId: string;\n metadataClient: InstanceType<typeof MetadataApiClient>;\n url: string;\n fileName: string;\n fieldMetadataUniversalIdentifier: string;\n}): Promise<CallRecordingMediaFile[] | undefined> => {\n try {\n const { buffer, contentType } = await downloadMediaFile(url);\n const uploadedFile = await metadataClient.uploadFile(\n buffer,\n fileName,\n contentType,\n fieldMetadataUniversalIdentifier,\n );\n\n return [{ fileId: uploadedFile.id, label: fileName }];\n } catch (error) {\n console.warn(\n `[call-recorder] failed to ingest ${fileName} for call recording ${callRecordingId}: ${error instanceof Error ? error.message : String(error)}`,\n );\n\n return undefined;\n }\n};\n\nconst downloadMediaFile = async (\n url: string,\n): Promise<{ buffer: Buffer; contentType: string }> => {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(MEDIA_DOWNLOAD_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n throw new Error(`download failed with status ${response.status}`);\n }\n\n return {\n buffer: Buffer.from(await response.arrayBuffer()),\n contentType:\n response.headers.get('content-type') ?? 'application/octet-stream',\n };\n};\n", "export const CALL_RECORDING_AUDIO_FIELD_UNIVERSAL_IDENTIFIER =\n '2eafc2d0-8fec-430c-a939-65ca5fbc0f08';\n", "export const CALL_RECORDING_VIDEO_FIELD_UNIVERSAL_IDENTIFIER =\n 'bb9523d3-457e-4f4b-8c79-27a77afb87da';\n", "import { asRecord } from 'src/logic-functions/utils/as-record.util';\n\nexport const getRecordAtPath = (\n record: Record<string, unknown> | undefined,\n path: string[],\n): unknown =>\n path.reduce<unknown>(\n (currentValue, pathPart) => asRecord(currentValue)?.[pathPart],\n record,\n );\n", "import { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getRecordAtPath } from 'src/logic-functions/utils/get-record-at-path.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\n\nexport type RecallMediaUrls = {\n videoUrl: string | undefined;\n audioUrl: string | undefined;\n};\n\n// Pre-signed URLs expire within hours; always re-extract from a fresh GET /recording.\nexport const extractRecallMediaUrls = (\n recording: Record<string, unknown>,\n): RecallMediaUrls => {\n const mediaShortcuts = asRecord(recording.media_shortcuts);\n\n return {\n videoUrl: extractArtifactDownloadUrl(mediaShortcuts, 'video_mixed'),\n audioUrl: extractArtifactDownloadUrl(mediaShortcuts, 'audio_mixed'),\n };\n};\n\n// v1.11 exposes download_url flat on the artifact; older artifacts nest it under data.\nconst extractArtifactDownloadUrl = (\n mediaShortcuts: Record<string, unknown> | undefined,\n artifactKey: string,\n): string | undefined =>\n getString(getRecordAtPath(mediaShortcuts, [artifactKey, 'download_url'])) ??\n getString(\n getRecordAtPath(mediaShortcuts, [artifactKey, 'data', 'download_url']),\n );\n", "import { type RecallBotOperationFailure } 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\ntype GetRecallRecordingResult =\n | { ok: true; recording: Record<string, unknown> }\n | RecallBotOperationFailure;\n\nexport const getRecallRecording = async ({\n externalRecordingId,\n}: {\n externalRecordingId: string;\n}): Promise<GetRecallRecordingResult> => {\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<Record<string, unknown>>({\n config: configResult.config,\n path: `/recording/${externalRecordingId}/`,\n method: 'GET',\n });\n\n if (!result.ok) {\n return result;\n }\n\n return { ok: true, recording: result.data ?? {} };\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\n\n// Deliveries are unordered; a late event must never move status backwards.\nconst CALL_RECORDING_STATUS_PROGRESSION: Record<CallRecordingStatus, number> = {\n [CallRecordingStatus.SCHEDULED]: 0,\n [CallRecordingStatus.JOINING]: 1,\n [CallRecordingStatus.RECORDING]: 2,\n [CallRecordingStatus.PROCESSING]: 3,\n [CallRecordingStatus.FAILED]: 4,\n [CallRecordingStatus.COMPLETED]: 5,\n};\n\nconst getCallRecordingStatusRank = (status: string): number | undefined =>\n status in CALL_RECORDING_STATUS_PROGRESSION\n ? CALL_RECORDING_STATUS_PROGRESSION[status as CallRecordingStatus]\n : undefined;\n\nexport const isCallRecordingStatusDowngrade = ({\n fromStatus,\n toStatus,\n}: {\n fromStatus: string | undefined;\n toStatus: string;\n}): boolean => {\n const fromRank = isUndefined(fromStatus)\n ? undefined\n : getCallRecordingStatusRank(fromStatus);\n const toRank = getCallRecordingStatusRank(toStatus);\n\n if (isUndefined(fromRank) || isUndefined(toRank)) {\n return false;\n }\n\n return toRank < fromRank;\n};\n", "export const isRecallRecordingDoneSignal = ({\n event,\n statusCode,\n}: {\n event: string;\n statusCode: string | undefined;\n}): boolean => {\n return (\n event === 'recording.done' ||\n event === 'recording.failed' ||\n statusCode === 'done'\n );\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { getRecallWebhookBotMetadata } from 'src/logic-functions/recall-api/get-recall-webhook-bot-metadata.util';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getRecordAtPath } from 'src/logic-functions/utils/get-record-at-path.util';\nimport { getString } from 'src/logic-functions/utils/get-string.util';\nimport { normalizeRecallTimestamp } from 'src/logic-functions/recall-api/normalize-recall-timestamp.util';\n\nexport type RecallWebhookBody = {\n event?: unknown;\n type?: unknown;\n data?: unknown;\n bot?: unknown;\n};\n\nexport type RecallWebhookEvent = {\n event: string;\n statusCode: string | undefined;\n statusTimestamp: string | undefined;\n externalBotId: string | undefined;\n externalRecordingId: string | undefined;\n callRecordingIdFromMetadata: string | undefined;\n recordingStartedAt: string | undefined;\n recordingEndedAt: string | undefined;\n transcriptId: string | undefined;\n transcriptFailureSubCode: string | undefined;\n};\n\n// The only reader of raw webhook payloads; Recall delivers several body shapes per event family.\nexport const parseRecallWebhookEvent = (\n body: RecallWebhookBody,\n): RecallWebhookEvent | undefined => {\n const event = getString(body.event) ?? getString(body.type);\n\n if (isUndefined(event)) {\n return undefined;\n }\n\n const data = asRecord(body.data);\n const bot = asRecord(body.bot);\n\n return {\n event,\n statusCode:\n getString(getRecordAtPath(data, ['status', 'code'])) ??\n getString(getRecordAtPath(data, ['data', 'code'])) ??\n getString(getRecordAtPath(bot, ['status', 'code'])) ??\n getStatusCodeFromEventName(event),\n statusTimestamp: normalizeRecallTimestamp(\n getString(getRecordAtPath(data, ['status', 'created_at'])) ??\n getString(getRecordAtPath(data, ['data', 'updated_at'])) ??\n getString(getRecordAtPath(bot, ['status', 'created_at'])),\n ),\n externalBotId:\n getString(data?.bot_id) ??\n getString(getRecordAtPath(data, ['bot', 'id'])) ??\n getString(getRecordAtPath(data, ['recording', 'bot_id'])) ??\n getString(getRecordAtPath(data, ['recording', 'bot', 'id'])) ??\n getString(bot?.id),\n externalRecordingId:\n getString(getRecordAtPath(data, ['status', 'recording_id'])) ??\n getString(getRecordAtPath(data, ['recording', 'id'])) ??\n getString(data?.recording_id),\n callRecordingIdFromMetadata: getString(\n getRecallWebhookBotMetadata(body)?.twentyCallRecordingId,\n ),\n recordingStartedAt: normalizeRecallTimestamp(\n getString(getRecordAtPath(data, ['recording', 'started_at'])),\n ),\n recordingEndedAt: normalizeRecallTimestamp(\n getString(getRecordAtPath(data, ['recording', 'completed_at'])),\n ),\n transcriptId: getString(getRecordAtPath(data, ['transcript', 'id'])),\n transcriptFailureSubCode: getString(\n getRecordAtPath(data, ['status', 'sub_code']),\n ),\n };\n};\n\nconst getStatusCodeFromEventName = (event: string): string | undefined => {\n if (!event.startsWith('bot.')) {\n return undefined;\n }\n\n const statusCode = event.slice('bot.'.length);\n\n return statusCode === 'status_change' ? undefined : statusCode;\n};\n", "import { type RecallWebhookBody } from 'src/logic-functions/recall-api/parse-recall-webhook-event.util';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getRecordAtPath } from 'src/logic-functions/utils/get-record-at-path.util';\n\n// Recall delivers bot metadata under several body shapes per event family; this is the single reader of all of them.\nexport const getRecallWebhookBotMetadata = (\n body: RecallWebhookBody,\n): Record<string, unknown> | undefined => {\n const data = asRecord(body.data);\n const bot = asRecord(body.bot);\n\n return (\n asRecord(bot?.metadata) ??\n asRecord(getRecordAtPath(data, ['bot', 'metadata'])) ??\n asRecord(getRecordAtPath(data, ['recording', 'metadata'])) ??\n asRecord(data?.metadata)\n );\n};\n", "import { isString, isUndefined } from '@sniptt/guards';\n\nimport { type TranscriptMarker } from 'src/logic-functions/types/transcript-marker.type';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\n\nexport const parseTranscriptMarker = (\n transcript: unknown,\n): TranscriptMarker | undefined => {\n const candidate = asRecord(transcript);\n\n if (isUndefined(candidate)) {\n return undefined;\n }\n\n if (candidate.status !== 'PENDING' && candidate.status !== 'FAILED') {\n return undefined;\n }\n\n return {\n recallTranscriptId: isString(candidate.recallTranscriptId)\n ? candidate.recallTranscriptId\n : null,\n status: candidate.status,\n ...(isString(candidate.requestedAt)\n ? { requestedAt: candidate.requestedAt }\n : {}),\n ...(isString(candidate.subCode) ? { subCode: candidate.subCode } : {}),\n };\n};\n", "import { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\n\nexport const NON_TERMINAL_CALL_RECORDING_STATUSES = [\n CallRecordingStatus.SCHEDULED,\n CallRecordingStatus.JOINING,\n CallRecordingStatus.RECORDING,\n CallRecordingStatus.PROCESSING,\n] satisfies CallRecordingStatus[];\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { NON_TERMINAL_CALL_RECORDING_STATUSES } from 'src/logic-functions/constants/non-terminal-call-recording-statuses';\n\nexport const completeCallRecordingIngestion = async (\n client: CoreApiClient,\n { id }: { id: string },\n): Promise<boolean> => {\n const result = await client.mutation({\n updateCallRecordings: {\n __args: {\n filter: {\n id: { eq: id },\n status: { in: NON_TERMINAL_CALL_RECORDING_STATUSES },\n },\n data: { status: CallRecordingStatus.COMPLETED },\n },\n id: true,\n },\n });\n\n return (result.updateCallRecordings ?? []).length > 0;\n};\n", "import { isUndefined } from '@sniptt/guards';\nimport { chargeCredits } from 'twenty-sdk/billing';\n\nimport { computeCallRecordingCharge } from 'src/logic-functions/domain/compute-call-recording-charge.util';\n\nexport const chargeCompletedCallRecording = async ({\n callRecordingId,\n startedAt,\n endedAt,\n}: {\n callRecordingId: string;\n startedAt: string | undefined;\n endedAt: string | undefined;\n}): Promise<void> => {\n const charge = computeCallRecordingCharge({ startedAt, endedAt });\n\n if (isUndefined(charge)) {\n console.warn(\n `[call-recorder] call recording ${callRecordingId} completed without usable recording timestamps; it will not be billed`,\n );\n\n return;\n }\n\n await chargeCredits({\n creditsUsedMicro: charge.creditsUsedMicro,\n quantity: charge.quantityMinutes,\n operationType: 'CALL_RECORDING',\n resourceContext: 'recall',\n });\n};\n", "//#region src/types/ViewKey.ts\nvar e = /* @__PURE__ */ function(e) {\n\treturn e.INDEX = \"INDEX\", e;\n}({});\n//#endregion\nexport { e as t };\n", "import { t as e } from \"./ViewKey-Dib-Wyry.mjs\";\nimport { v5 as t } from \"uuid\";\n//#region src/application/constants/AssetDirectory.ts\nvar n = \"public\", r = \"TWENTY_API_KEY\", i = \"TWENTY_API_URL\", a = \"TWENTY_APP_ACCESS_TOKEN\", o = \"TWENTY_FUNCTIONS_URL\", s = \"generated\", c = { js: \"import { createRequire as __createRequire } from 'module';\\nconst require = __createRequire(import.meta.url);\" }, l = \".twenty/output\", u = \"Standard\", d = \"20202020-64aa-4b6f-b003-9c74b97cee20\", f = ({ entityNamespace: e, value: n, applicationUniversalIdentifier: r }) => t(`${e}:${n}`, r), p = ({ applicationUniversalIdentifier: e, name: t }) => f({\n\tentityNamespace: \"agent\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), m = ({ applicationUniversalIdentifier: e, key: t }) => f({\n\tentityNamespace: \"applicationVariable\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), h = \"navigation\", g = ({ applicationUniversalIdentifier: e, engineComponentKey: t }) => f({\n\tentityNamespace: \"commandMenuItem\",\n\tvalue: `GLOBAL:${t}`,\n\tapplicationUniversalIdentifier: e\n}), _ = ({ applicationUniversalIdentifier: e, engineComponentKey: t }) => f({\n\tentityNamespace: \"commandMenuItem\",\n\tvalue: `GLOBAL_OBJECT_CONTEXT:${t}`,\n\tapplicationUniversalIdentifier: e\n}), v = ({ applicationUniversalIdentifier: e, engineComponentKey: t, objectUniversalIdentifier: n }) => f({\n\tentityNamespace: \"commandMenuItem\",\n\tvalue: `RECORD_SELECTION:${t}:${n ?? \"\"}`,\n\tapplicationUniversalIdentifier: e\n}), y = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t }) => f({\n\tentityNamespace: \"commandMenuItem\",\n\tvalue: `${t}:${h}`,\n\tapplicationUniversalIdentifier: e\n}), b = ({ applicationUniversalIdentifier: e, name: t }) => f({\n\tentityNamespace: \"connectionProvider\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), x = ({ applicationUniversalIdentifier: e, roleUniversalIdentifier: t, fieldUniversalIdentifier: n }) => f({\n\tentityNamespace: \"fieldPermission\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), S = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t, name: n }) => f({\n\tentityNamespace: \"fieldMetadata\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), C = ({ applicationUniversalIdentifier: e, componentName: t }) => f({\n\tentityNamespace: \"frontComponent\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), w = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t, name: n }) => f({\n\tentityNamespace: \"index\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), T = ({ applicationUniversalIdentifier: e, name: t }) => f({\n\tentityNamespace: \"logicFunction\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), E = ({ applicationUniversalIdentifier: e, name: t }) => f({\n\tentityNamespace: \"navigationMenuItem\",\n\tvalue: `FOLDER:${t}`,\n\tapplicationUniversalIdentifier: e\n}), D = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t }) => f({\n\tentityNamespace: \"navigationMenuItem\",\n\tvalue: `OBJECT:${t}`,\n\tapplicationUniversalIdentifier: e\n}), O = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t }) => f({\n\tentityNamespace: \"navigationMenuItem\",\n\tvalue: `VIEW:${t}`,\n\tapplicationUniversalIdentifier: e\n}), k = ({ applicationUniversalIdentifier: e, link: t }) => f({\n\tentityNamespace: \"navigationMenuItem\",\n\tvalue: `LINK:${t}`,\n\tapplicationUniversalIdentifier: e\n}), A = ({ applicationUniversalIdentifier: e, roleUniversalIdentifier: t, objectUniversalIdentifier: n }) => f({\n\tentityNamespace: \"objectPermission\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), j = ({ applicationUniversalIdentifier: e, nameSingular: t }) => f({\n\tentityNamespace: \"objectMetadata\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), M = ({ applicationUniversalIdentifier: e, pageLayoutUniversalIdentifier: t, title: n }) => f({\n\tentityNamespace: \"pageLayoutTab\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), N = \"RECORD_PAGE\", P = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t, name: n }) => f({\n\tentityNamespace: \"pageLayout\",\n\tvalue: t ? `${t}:${n}` : n,\n\tapplicationUniversalIdentifier: e\n}), F = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t }) => f({\n\tentityNamespace: \"pageLayout\",\n\tvalue: `${t}:${N}`,\n\tapplicationUniversalIdentifier: e\n}), I = ({ applicationUniversalIdentifier: e, pageLayoutTabUniversalIdentifier: t, title: n }) => f({\n\tentityNamespace: \"pageLayoutWidget\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), L = ({ applicationUniversalIdentifier: e, key: t }) => f({\n\tentityNamespace: \"permissionFlag\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), R = ({ applicationUniversalIdentifier: e, roleUniversalIdentifier: t, permissionFlagUniversalIdentifier: n }) => f({\n\tentityNamespace: \"rolePermissionFlag\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), z = ({ applicationUniversalIdentifier: e, label: t }) => f({\n\tentityNamespace: \"role\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), B = ({ applicationUniversalIdentifier: e, fieldMetadataUniversalIdentifier: t }) => f({\n\tentityNamespace: \"searchFieldMetadata\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), V = ({ applicationUniversalIdentifier: e, fieldUniversalIdentifier: t, value: n }) => f({\n\tentityNamespace: \"selectOption\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), H = ({ applicationUniversalIdentifier: e, name: t }) => f({\n\tentityNamespace: \"skill\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), U = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t, name: n }) => f({\n\tentityNamespace: \"viewFieldGroup\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), W = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t, fieldMetadataUniversalIdentifier: n }) => f({\n\tentityNamespace: \"viewField\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), G = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t, fieldMetadataUniversalIdentifier: n, operand: r, subFieldName: i }) => f({\n\tentityNamespace: \"viewFilter\",\n\tvalue: `${t}:${n}:${r}:${i ?? \"\"}`,\n\tapplicationUniversalIdentifier: e\n}), K = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t, fieldValue: n }) => f({\n\tentityNamespace: \"viewGroup\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), q = ({ applicationUniversalIdentifier: e, viewUniversalIdentifier: t, fieldMetadataUniversalIdentifier: n }) => f({\n\tentityNamespace: \"viewSort\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), J = ({ applicationUniversalIdentifier: e, objectUniversalIdentifier: t, name: n }) => f({\n\tentityNamespace: \"view\",\n\tvalue: `${t}:${n}`,\n\tapplicationUniversalIdentifier: e\n}), Y = ({ applicationUniversalIdentifier: t, objectUniversalIdentifier: n }) => f({\n\tentityNamespace: \"view\",\n\tvalue: `${n}:${e.INDEX}`,\n\tapplicationUniversalIdentifier: t\n}), X = ({ applicationUniversalIdentifier: e, pageLayoutWidgetUniversalIdentifier: t }) => f({\n\tentityNamespace: \"view\",\n\tvalue: t,\n\tapplicationUniversalIdentifier: e\n}), Z = /* @__PURE__ */ function(e) {\n\treturn e.Object = \"object\", e.Field = \"field\", e.LogicFunction = \"logicFunction\", e.FrontComponent = \"frontComponent\", e.Role = \"role\", e.Skill = \"skill\", e.Agent = \"agent\", e.ConnectionProvider = \"connectionProvider\", e.View = \"view\", e.ViewField = \"viewField\", e.NavigationMenuItem = \"navigationMenuItem\", e.PageLayout = \"pageLayout\", e.PageLayoutTab = \"pageLayoutTab\", e.CommandMenuItem = \"commandMenuItem\", e;\n}({});\n//#endregion\nexport { n as ASSETS_DIR, r as DEFAULT_API_KEY_NAME, i as DEFAULT_API_URL_NAME, a as DEFAULT_APP_ACCESS_TOKEN_NAME, o as DEFAULT_FUNCTIONS_URL_NAME, s as GENERATED_DIR, c as NODE_ESM_CJS_BANNER, l as OUTPUT_DIR, Z as SyncableEntity, u as TWENTY_STANDARD_APPLICATION_NAME, d as TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER, f as computeDeterministicUuid, p as getAgentUniversalIdentifier, m as getApplicationVariableUniversalIdentifier, b as getConnectionProviderUniversalIdentifier, x as getFieldPermissionUniversalIdentifier, S as getFieldUniversalIdentifier, X as getFieldsWidgetViewUniversalIdentifier, E as getFolderNavigationMenuItemUniversalIdentifier, C as getFrontComponentUniversalIdentifier, g as getGlobalCommandMenuItemUniversalIdentifier, _ as getGlobalObjectContextCommandMenuItemUniversalIdentifier, w as getIndexUniversalIdentifier, Y as getIndexViewUniversalIdentifier, k as getLinkNavigationMenuItemUniversalIdentifier, T as getLogicFunctionUniversalIdentifier, y as getNavigationCommandUniversalIdentifier, D as getObjectNavigationMenuItemUniversalIdentifier, A as getObjectPermissionUniversalIdentifier, j as getObjectUniversalIdentifier, M as getPageLayoutTabUniversalIdentifier, P as getPageLayoutUniversalIdentifier, I as getPageLayoutWidgetUniversalIdentifier, L as getPermissionFlagUniversalIdentifier, F as getRecordPageLayoutUniversalIdentifier, v as getRecordSelectionCommandMenuItemUniversalIdentifier, R as getRolePermissionFlagUniversalIdentifier, z as getRoleUniversalIdentifier, B as getSearchFieldUniversalIdentifier, V as getSelectOptionUniversalIdentifier, H as getSkillUniversalIdentifier, U as getViewFieldGroupUniversalIdentifier, W as getViewFieldUniversalIdentifier, G as getViewFilterUniversalIdentifier, K as getViewGroupUniversalIdentifier, O as getViewNavigationMenuItemUniversalIdentifier, q as getViewSortUniversalIdentifier, J as getViewUniversalIdentifier };\n", "import {\n DEFAULT_API_URL_NAME,\n DEFAULT_APP_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application';\n\nconst BILLING_CHARGE_TIMEOUT_MS = 5_000;\n\nexport type ChargeCreditsParams = {\n creditsUsedMicro: number;\n operationType: string;\n quantity?: number;\n resourceContext?: string;\n};\n\n// Records credit usage against the running application via the Twenty\n// server's `/app/billing/charge` endpoint. Reads `TWENTY_API_URL` and\n// `TWENTY_APP_ACCESS_TOKEN` from the execution env (injected by the\n// logic-function runtime). No-ops silently when either is missing so\n// local/test runs don't crash. Failures are non-fatal — a billing error\n// never surfaces as a tool failure.\nexport const chargeCredits = async ({\n creditsUsedMicro,\n operationType,\n quantity = 1,\n resourceContext,\n}: ChargeCreditsParams): Promise<void> => {\n const apiUrl = process.env[DEFAULT_API_URL_NAME];\n const token = process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n\n if (!apiUrl || !token) {\n return;\n }\n\n try {\n const response = await fetch(\n `${apiUrl.replace(/\\/$/, '')}/app/billing/charge`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n creditsUsedMicro,\n quantity,\n operationType,\n resourceContext,\n }),\n signal: AbortSignal.timeout(BILLING_CHARGE_TIMEOUT_MS),\n },\n );\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n\n console.error(\n `chargeCredits: ${response.status} ${response.statusText}: ${body}`,\n );\n }\n } catch (error) {\n console.error(\n `chargeCredits: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n", "import { isUndefined } from '@sniptt/guards';\n\nimport { CALL_RECORDING_MICRO_CREDITS_PER_HOUR } from 'src/logic-functions/constants/call-recording-micro-credits-per-hour';\nimport { MILLISECONDS_PER_MINUTE } from 'src/logic-functions/constants/milliseconds-per-minute';\n\nconst MILLISECONDS_PER_HOUR = 3_600_000;\n\nexport type CallRecordingCharge = {\n creditsUsedMicro: number;\n quantityMinutes: number;\n};\n\nexport const computeCallRecordingCharge = ({\n startedAt,\n endedAt,\n}: {\n startedAt: string | undefined;\n endedAt: string | undefined;\n}): CallRecordingCharge | undefined => {\n if (isUndefined(startedAt) || isUndefined(endedAt)) {\n return undefined;\n }\n\n const durationMilliseconds =\n new Date(endedAt).getTime() - new Date(startedAt).getTime();\n\n if (!Number.isFinite(durationMilliseconds) || durationMilliseconds <= 0) {\n return undefined;\n }\n\n return {\n creditsUsedMicro: Math.round(\n (durationMilliseconds / MILLISECONDS_PER_HOUR) *\n CALL_RECORDING_MICRO_CREDITS_PER_HOUR,\n ),\n quantityMinutes: Math.max(\n 1,\n Math.round(durationMilliseconds / MILLISECONDS_PER_MINUTE),\n ),\n };\n};\n", "export const CALL_RECORDING_MICRO_CREDITS_PER_HOUR = 1_000_000;\n", "export const MILLISECONDS_PER_MINUTE = 60_000;\n", "import { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { completeCallRecordingIngestion } from 'src/logic-functions/data/complete-call-recording-ingestion.util';\nimport { chargeCompletedCallRecording } from 'src/logic-functions/flows/charge-completed-call-recording.util';\n\nexport const completeAndChargeCallRecording = async (\n client: CoreApiClient,\n {\n id,\n startedAt,\n endedAt,\n }: {\n id: string;\n startedAt: string | undefined;\n endedAt: string | undefined;\n },\n): Promise<boolean> => {\n const claimed = await completeCallRecordingIngestion(client, { id });\n\n if (claimed) {\n await chargeCompletedCallRecording({\n callRecordingId: id,\n startedAt,\n endedAt,\n });\n }\n\n return claimed;\n};\n", "import { isNonEmptyArray, isNull, isUndefined } from '@sniptt/guards';\n\nimport { type FilesFieldValue } from 'src/logic-functions/types/files-field-value.type';\nimport { parseTranscriptMarker } from 'src/logic-functions/domain/parse-transcript-marker.util';\n\nexport const isCallRecordingIngestionComplete = ({\n transcript,\n audio,\n video,\n}: {\n transcript: unknown;\n audio: FilesFieldValue | undefined;\n video: FilesFieldValue | undefined;\n}): boolean =>\n !isNull(transcript) &&\n !isUndefined(transcript) &&\n isUndefined(parseTranscriptMarker(transcript)) &&\n isNonEmptyArray(audio) &&\n isNonEmptyArray(video);\n", "import { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { type FilesFieldValue } from 'src/logic-functions/types/files-field-value.type';\nimport { computeCallRecordingCharge } from 'src/logic-functions/domain/compute-call-recording-charge.util';\nimport { isCallRecordingIngestionComplete } from 'src/logic-functions/domain/is-call-recording-ingestion-complete.util';\nimport { type CallRecordingUpdateFields } from 'src/logic-functions/types/call-recording-update-fields.type';\n\nexport const shouldCompleteCallRecordingIngestion = ({\n current,\n updateData,\n}: {\n current: {\n status?: string;\n startedAt?: string;\n endedAt?: string;\n transcript?: unknown;\n audio?: FilesFieldValue;\n video?: FilesFieldValue;\n };\n updateData: CallRecordingUpdateFields;\n}): boolean =>\n current.status !== CallRecordingStatus.COMPLETED &&\n current.status !== CallRecordingStatus.FAILED &&\n updateData.status !== CallRecordingStatus.FAILED &&\n computeCallRecordingCharge({\n startedAt: updateData.startedAt ?? current.startedAt,\n endedAt: updateData.endedAt ?? current.endedAt,\n }) !== undefined &&\n isCallRecordingIngestionComplete({\n transcript: updateData.transcript ?? current.transcript,\n audio: updateData.audio ?? current.audio,\n video: updateData.video ?? current.video,\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 { type CoreApiClient } from 'twenty-client-sdk/core';\n\nimport { type FilesFieldValue } from 'src/logic-functions/types/files-field-value.type';\nimport { completeAndChargeCallRecording } from 'src/logic-functions/flows/complete-and-charge-call-recording.util';\nimport { shouldCompleteCallRecordingIngestion } from 'src/logic-functions/domain/should-complete-call-recording-ingestion.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\ntype PersistCallRecordingProgressCurrent = {\n status?: string;\n startedAt?: string;\n endedAt?: string;\n transcript?: unknown;\n audio?: FilesFieldValue;\n video?: FilesFieldValue;\n};\n\nexport const persistCallRecordingProgress = async (\n client: CoreApiClient,\n {\n id,\n current,\n updateData,\n }: {\n id: string;\n current: PersistCallRecordingProgressCurrent;\n updateData: CallRecordingUpdateFields;\n },\n): Promise<{ completesIngestion: boolean }> => {\n const completesIngestion = shouldCompleteCallRecordingIngestion({\n current,\n updateData,\n });\n\n if (!completesIngestion) {\n await updateCallRecording(client, { id, data: updateData });\n\n return { completesIngestion: false };\n }\n\n // Strip status so COMPLETED is written only by the atomic claim \u2014 its single winner bills once.\n const nonStatusUpdate: CallRecordingUpdateFields = { ...updateData };\n\n delete nonStatusUpdate.status;\n delete nonStatusUpdate.callRecorderFailureReason;\n\n if (Object.keys(nonStatusUpdate).length > 0) {\n await updateCallRecording(client, { id, data: nonStatusUpdate });\n }\n\n await completeAndChargeCallRecording(client, {\n id,\n startedAt: updateData.startedAt ?? current.startedAt,\n endedAt: updateData.endedAt ?? current.endedAt,\n });\n\n return { completesIngestion: true };\n};\n", "import { isNull, isUndefined } from '@sniptt/guards';\n\nimport { CallRecordingStatus } from 'src/logic-functions/constants/call-recording-status';\nimport { buildFailedTranscriptMarker } from 'src/logic-functions/domain/build-failed-transcript-marker.util';\nimport { buildPendingTranscriptMarker } from 'src/logic-functions/domain/build-pending-transcript-marker.util';\nimport { buildTranscriptFailureReason } from 'src/logic-functions/domain/build-transcript-failure-reason.util';\nimport { isCallRecordingStatusDowngrade } from 'src/logic-functions/domain/is-call-recording-status-downgrade.util';\nimport { parseTranscriptMarker } from 'src/logic-functions/domain/parse-transcript-marker.util';\nimport { createAsyncRecallTranscript } from 'src/logic-functions/recall-api/create-async-recall-transcript.util';\nimport { listRecallTranscripts } from 'src/logic-functions/recall-api/list-recall-transcripts.util';\nimport { type RecallTranscriptSummary } from 'src/logic-functions/recall-api/recall-transcript-summary.type';\nimport { downloadTranscript } from 'src/logic-functions/flows/download-transcript.util';\nimport { type ReconcileCallRecordingTranscriptArtifactResult } from 'src/logic-functions/flows/reconcile-call-recording-transcript-artifact-result.type';\n\ntype CallRecordingTranscriptArtifactUpdateFields =\n ReconcileCallRecordingTranscriptArtifactResult['updateData'];\n\nexport const reconcileCallRecordingTranscriptArtifact = async ({\n callRecordingId,\n currentStatus,\n externalRecordingId,\n requestedAt,\n transcript,\n}: {\n callRecordingId: string;\n currentStatus: string | undefined;\n externalRecordingId: string;\n requestedAt: string;\n transcript: unknown;\n}): Promise<ReconcileCallRecordingTranscriptArtifactResult> => {\n const existingTranscriptMarker = parseTranscriptMarker(transcript);\n\n if (\n !isNull(transcript) &&\n !isUndefined(transcript) &&\n isUndefined(existingTranscriptMarker)\n ) {\n return buildEmptyTranscriptArtifactResult();\n }\n\n if (existingTranscriptMarker?.status === 'FAILED') {\n return buildEmptyTranscriptArtifactResult();\n }\n\n const listResult = await listRecallTranscripts({ externalRecordingId });\n\n if (!listResult.ok) {\n console.warn(\n `[call-recorder] failed to list Recall transcripts for recording ${externalRecordingId}: ${listResult.errorMessage}`,\n );\n\n return buildEmptyTranscriptArtifactResult();\n }\n\n const transcriptArtifact = selectRecallTranscriptArtifact(\n listResult.transcripts,\n );\n const pendingTranscriptMarkerRecallTranscriptId =\n existingTranscriptMarker?.status === 'PENDING'\n ? (existingTranscriptMarker.recallTranscriptId ?? undefined)\n : undefined;\n const transcriptIdToDownload =\n transcriptArtifact?.id ?? pendingTranscriptMarkerRecallTranscriptId;\n\n if (\n isUndefined(transcriptArtifact) &&\n isUndefined(pendingTranscriptMarkerRecallTranscriptId)\n ) {\n const createResult = await createAsyncRecallTranscript({\n externalRecordingId,\n });\n\n if (!createResult.ok) {\n console.warn(\n `[call-recorder] failed to request transcript for Recall recording ${externalRecordingId}: ${createResult.errorMessage}`,\n );\n\n return buildEmptyTranscriptArtifactResult();\n }\n\n return {\n updateData: {\n transcript: buildPendingTranscriptMarker({\n recallTranscriptId: createResult.transcriptId,\n requestedAt,\n }),\n },\n requestedTranscript: true,\n };\n }\n\n if (\n !isUndefined(transcriptArtifact) &&\n (transcriptArtifact.statusCode === 'failed' ||\n transcriptArtifact.statusCode === 'error')\n ) {\n return {\n updateData: buildTranscriptFailureUpdate({\n currentStatus,\n transcriptId: transcriptArtifact.id,\n subCode: transcriptArtifact.statusSubCode ?? null,\n }),\n requestedTranscript: false,\n };\n }\n\n if (\n !isUndefined(transcriptArtifact) &&\n transcriptArtifact.statusCode !== 'done'\n ) {\n return buildEmptyTranscriptArtifactResult();\n }\n\n if (isUndefined(transcriptIdToDownload)) {\n return buildEmptyTranscriptArtifactResult();\n }\n\n const downloadResult = await downloadTranscript({\n transcriptId: transcriptIdToDownload,\n });\n\n if (downloadResult.outcome === 'filled') {\n return {\n updateData: {\n transcript: downloadResult.content as Record<string, unknown>,\n },\n requestedTranscript: false,\n };\n }\n\n if (downloadResult.outcome === 'failed') {\n return {\n updateData: buildTranscriptFailureUpdate({\n currentStatus,\n transcriptId: transcriptIdToDownload,\n subCode: downloadResult.subCode,\n }),\n requestedTranscript: false,\n };\n }\n\n if (downloadResult.outcome === 'error') {\n console.warn(\n `[call-recorder] could not fill transcript for call recording ${callRecordingId}: ${downloadResult.errorMessage}`,\n );\n }\n\n return buildEmptyTranscriptArtifactResult();\n};\n\nconst buildEmptyTranscriptArtifactResult =\n (): ReconcileCallRecordingTranscriptArtifactResult => ({\n updateData: {},\n requestedTranscript: false,\n });\n\nconst selectRecallTranscriptArtifact = (\n transcripts: RecallTranscriptSummary[],\n): RecallTranscriptSummary | undefined =>\n transcripts.find((transcript) => transcript.statusCode !== 'deleted');\n\nconst buildTranscriptFailureUpdate = ({\n currentStatus,\n transcriptId,\n subCode,\n}: {\n currentStatus: string | undefined;\n transcriptId: string;\n subCode: string | null;\n}): CallRecordingTranscriptArtifactUpdateFields => ({\n transcript: buildFailedTranscriptMarker({\n recallTranscriptId: transcriptId,\n subCode,\n }),\n callRecorderFailureReason: buildTranscriptFailureReason(subCode),\n ...(isCallRecordingStatusDowngrade({\n fromStatus: currentStatus,\n toStatus: CallRecordingStatus.FAILED,\n })\n ? {}\n : { status: CallRecordingStatus.FAILED }),\n});\n", "import { type TranscriptMarker } from 'src/logic-functions/types/transcript-marker.type';\n\nexport const buildPendingTranscriptMarker = ({\n recallTranscriptId,\n requestedAt,\n}: {\n recallTranscriptId: string;\n requestedAt: string;\n}): TranscriptMarker => ({\n recallTranscriptId,\n status: 'PENDING',\n requestedAt,\n});\n", "import { isString } from '@sniptt/guards';\n\nimport { type RecallBotOperationFailure } 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\ntype CreateAsyncRecallTranscriptResult =\n | { ok: true; transcriptId: string }\n | RecallBotOperationFailure;\n\nexport const createAsyncRecallTranscript = async ({\n externalRecordingId,\n}: {\n externalRecordingId: string;\n}): Promise<CreateAsyncRecallTranscriptResult> => {\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<{ id?: unknown }>({\n config: configResult.config,\n path: `/recording/${externalRecordingId}/create_transcript/`,\n method: 'POST',\n body: {\n provider: { recallai_async: { language_code: 'auto' } },\n diarization: { use_separate_streams_when_available: true },\n },\n maxAttempts: 1,\n });\n\n if (!result.ok) {\n return result;\n }\n\n if (!isString(result.data?.id)) {\n return {\n ok: false,\n status: null,\n errorMessage:\n 'Recall API created a transcript but the response did not include a transcript id',\n };\n }\n\n return { ok: true, transcriptId: result.data.id };\n};\n", "import { isArray, isUndefined } from '@sniptt/guards';\n\nimport { type RecallBotOperationFailure } from 'src/logic-functions/types/recall-bot-operation-result.type';\nimport { asRecord } from 'src/logic-functions/utils/as-record.util';\nimport { getString } from 'src/logic-functions/utils/get-string.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 RecallTranscriptSummary } from 'src/logic-functions/recall-api/recall-transcript-summary.type';\n\ntype ListRecallTranscriptsResult =\n | { ok: true; transcripts: RecallTranscriptSummary[] }\n | RecallBotOperationFailure;\n\ntype RecallTranscriptListResponse = {\n next?: unknown;\n results?: unknown;\n};\n\nconst RECALL_TRANSCRIPT_LIST_MAX_PAGES = 10;\n\nexport const listRecallTranscripts = async ({\n externalRecordingId,\n}: {\n externalRecordingId: string;\n}): Promise<ListRecallTranscriptsResult> => {\n const configResult = getRecallApiConfig();\n\n if (!configResult.success) {\n return { ok: false, status: null, errorMessage: configResult.error };\n }\n\n const transcripts: RecallTranscriptSummary[] = [];\n let path: string | undefined = buildListRecallTranscriptsPath({\n externalRecordingId,\n });\n\n for (\n let pageIndex = 0;\n !isUndefined(path) && pageIndex < RECALL_TRANSCRIPT_LIST_MAX_PAGES;\n pageIndex++\n ) {\n const result = await recallBotApiRequest<RecallTranscriptListResponse>({\n config: configResult.config,\n path,\n method: 'GET',\n });\n\n if (!result.ok) {\n return result;\n }\n\n const pageTranscripts = extractRecallTranscriptSummaries(result.data);\n\n if (isUndefined(pageTranscripts)) {\n return {\n ok: false,\n status: result.status,\n errorMessage: 'Recall API returned malformed transcript list',\n };\n }\n\n transcripts.push(...pageTranscripts);\n path = extractNextPath(result.data, configResult.config.baseUrl);\n }\n\n if (!isUndefined(path)) {\n return {\n ok: false,\n status: null,\n errorMessage: `Recall transcript list exceeded ${RECALL_TRANSCRIPT_LIST_MAX_PAGES} pages`,\n };\n }\n\n return { ok: true, transcripts };\n};\n\nconst buildListRecallTranscriptsPath = ({\n externalRecordingId,\n}: {\n externalRecordingId: string;\n}): string => {\n const searchParams = new URLSearchParams({\n recording_id: externalRecordingId,\n });\n\n return `/transcript/?${searchParams.toString()}`;\n};\n\nconst extractRecallTranscriptSummaries = (\n response: RecallTranscriptListResponse | undefined,\n): RecallTranscriptSummary[] | undefined => {\n if (!isArray(response?.results)) {\n return undefined;\n }\n\n const transcripts: RecallTranscriptSummary[] = [];\n\n for (const result of response.results) {\n const transcript = extractRecallTranscriptSummary(result);\n\n if (isUndefined(transcript)) {\n return undefined;\n }\n\n transcripts.push(transcript);\n }\n\n return transcripts;\n};\n\nconst extractRecallTranscriptSummary = (\n transcript: unknown,\n): RecallTranscriptSummary | undefined => {\n const transcriptRecord = asRecord(transcript);\n const transcriptId = getString(transcriptRecord?.id);\n\n if (isUndefined(transcriptRecord) || isUndefined(transcriptId)) {\n return undefined;\n }\n\n const status = asRecord(transcriptRecord.status);\n\n return {\n id: transcriptId,\n statusCode: getString(status?.code),\n statusSubCode: getString(status?.sub_code),\n };\n};\n\nconst extractNextPath = (\n response: RecallTranscriptListResponse | undefined,\n baseUrl: string,\n): string | undefined => {\n const nextPage = getString(response?.next);\n\n if (isUndefined(nextPage) || !nextPage.startsWith(baseUrl)) {\n return undefined;\n }\n\n return nextPage.slice(baseUrl.length);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["isUndefined", "isString", "isNull", "isObject", "isArray", "isNonEmptyArray", "isNonEmptyString", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards", "r", "e", "t", "import_guards", "import_guards", "import_guards", "import_guards", "import_guards"]
7
+ }