@zeniai/client-epic-state 5.3.17 → 5.3.18-betaAK1

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 (45) hide show
  1. package/lib/entity/tenant/epic/fetchAllTenantsEpic.d.ts +2 -4
  2. package/lib/entity/tenant/epic/fetchAllTenantsEpic.js +45 -42
  3. package/lib/entity/tenant/tenantPayload.d.ts +17 -1
  4. package/lib/entity/tenant/tenantReducer.d.ts +2 -2
  5. package/lib/entity/tenant/tenantReducer.js +29 -18
  6. package/lib/entity/tenant/tenantSelector.d.ts +14 -6
  7. package/lib/entity/tenant/tenantSelector.js +98 -97
  8. package/lib/entity/tenant/tenantState.d.ts +10 -0
  9. package/lib/epic.d.ts +2 -1
  10. package/lib/epic.js +2 -0
  11. package/lib/esm/entity/tenant/epic/fetchAllTenantsEpic.js +49 -46
  12. package/lib/esm/entity/tenant/tenantReducer.js +28 -17
  13. package/lib/esm/entity/tenant/tenantSelector.js +94 -96
  14. package/lib/esm/epic.js +2 -0
  15. package/lib/esm/index.js +6 -6
  16. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +65 -3
  17. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +25 -0
  18. package/lib/esm/view/aiCfoView/epics/transcribeAudioEpic.js +60 -0
  19. package/lib/esm/view/dashboard/dashboardEpic.js +0 -4
  20. package/lib/esm/view/dashboard/dashboardSelector.js +2 -3
  21. package/lib/esm/view/financeStatement/financeStatementEpic.js +1 -5
  22. package/lib/esm/view/people/peoplePageEpic.js +0 -4
  23. package/lib/esm/view/transactionDetail/createTransaction/createTransactionPayload.js +19 -3
  24. package/lib/esm/view/transactionDetail/createTransaction/createTransactionState.js +2 -0
  25. package/lib/index.d.ts +7 -7
  26. package/lib/index.js +54 -46
  27. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +20 -0
  28. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +2 -2
  29. package/lib/view/aiCfoView/aiCfoViewReducer.js +66 -4
  30. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +8 -1
  31. package/lib/view/aiCfoView/aiCfoViewSelector.js +27 -0
  32. package/lib/view/aiCfoView/aiCfoViewState.d.ts +9 -0
  33. package/lib/view/aiCfoView/epics/transcribeAudioEpic.d.ts +19 -0
  34. package/lib/view/aiCfoView/epics/transcribeAudioEpic.js +64 -0
  35. package/lib/view/dashboard/dashboardEpic.js +0 -4
  36. package/lib/view/dashboard/dashboardSelector.d.ts +0 -2
  37. package/lib/view/dashboard/dashboardSelector.js +1 -2
  38. package/lib/view/financeStatement/financeStatementEpic.js +1 -5
  39. package/lib/view/people/peoplePageEpic.js +0 -4
  40. package/lib/view/transactionDetail/createTransaction/createTransactionPayload.d.ts +6 -3
  41. package/lib/view/transactionDetail/createTransaction/createTransactionPayload.js +19 -3
  42. package/lib/view/transactionDetail/createTransaction/createTransactionState.d.ts +7 -2
  43. package/lib/view/transactionDetail/createTransaction/createTransactionState.js +2 -0
  44. package/lib/view/transactionDetail/transactionDetailReducer.d.ts +20 -20
  45. package/package.json +1 -1
package/lib/esm/index.js CHANGED
@@ -73,7 +73,7 @@ import { getSnackbar } from './entity/snackbar/snackbarSelector';
73
73
  import { ALL_WEEK_DAYS, toDayOfWeek, toPriorityCodeType, toTaskStatusCodeType, } from './entity/task/taskState';
74
74
  import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
75
75
  import { deleteConnection, doMagicLinkSignIn, doSignIn, doSignOut, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, initEmailConnectOAuth, resendVerifyDeviceOTP, resetSignInState, saveAPIKeyConnection, saveConnectorCredentials, saveExternalConnection as saveExternalConnectionForTenant, saveOAuthConnection, sendEmailMagicLinkToUser, sendSessionHeartbeat, toExternalIntegrationType, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA, } from './entity/tenant/tenantReducer';
76
- import { DEFAULT_RECEIPTS_EMAIL, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView, } from './entity/tenant/tenantSelector';
76
+ import { DEFAULT_RECEIPTS_EMAIL, getCurrentTenant, getCurrentTenantId, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isCurrentTenantLoaded, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantLoaded, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView, } from './entity/tenant/tenantSelector';
77
77
  import { toExternalSupportedTool } from './entity/tenant/tenantTypes';
78
78
  import { pushToastNotification } from './entity/toastNotification/toastNotificationReducer';
79
79
  import { getLastNotificationTime, getNotifications, } from './entity/toastNotification/toastNotificationSelector';
@@ -332,7 +332,7 @@ import { clearInternationalWire, createPaymentInstrument, createPaymentInstrumen
332
332
  import { getInternationalWireView, } from './view/spendManagement/billPay/internationalWire/internationalWireSelector';
333
333
  import { fetchInternationalVerificationForm, submitInternationalVerificationForm, updateVerificationFormLocalData, } from './view/spendManagement/billPay/internationalWireVerification/internationalWireVerificationReducer';
334
334
  import { getIntlWireVerificationView, } from './view/spendManagement/billPay/internationalWireVerification/internationalWireVerificationSelector';
335
- import { fetchBillAttachment, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, fetchMagicLinkTenant, saveBankAccount, saveMagicLinkAddressInLocalStore, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, } from './view/spendManagement/billPay/magicLinkView/magicLinkViewReducer';
335
+ import { fetchBillAttachment, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, fetchMagicLinkTenant, saveBankAccount, saveMagicLinkAddressInLocalStore, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, updateMagicLinkTenantFailure, updateMagicLinkTenantSuccess, } from './view/spendManagement/billPay/magicLinkView/magicLinkViewReducer';
336
336
  import { getMagicLinkBankAccountView, getMagicLinkCurrentAddressState, getMagicLinkView, } from './view/spendManagement/billPay/magicLinkView/magicLinkViewSelector';
337
337
  import { fetchWiseRedirectStatus } from './view/spendManagement/billPay/wiseRedirectView/wiseRedirectReducer';
338
338
  import { getWiseRedirect } from './view/spendManagement/billPay/wiseRedirectView/wiseRedirectSelector';
@@ -509,7 +509,7 @@ export { toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsolute
509
509
  export { toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorSpendTrendFilterTabType';
510
510
  export { getNumberOfPeriods };
511
511
  export { SCHEDULE_DAYS_OF_MONTH, toScheduleDaysOfMonth, toMonth, toMonthStrict, toQuarter, toQuarterStrict, };
512
- export { getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, doSignOut, sendSessionHeartbeat, resetSignInState, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
512
+ export { getTenantBaseById, getCurrentTenant, getCurrentTenantId, isCurrentTenantLoaded, isTenantLoaded, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, doSignOut, sendSessionHeartbeat, resetSignInState, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
513
513
  export { toAccountType, toAccountGroupType, getAccountGroupKey, getAllAccounts, getTransactionFilterAccountOptions, };
514
514
  export { getAllClasses, getClassById, getClassFilterOptions, } from './entity/class/classSelector';
515
515
  export { getForecast };
@@ -661,7 +661,7 @@ export { isZeniClearingAccountReport, ZENI_CLEARING_ACCOUNT, isZeniClearingAccou
661
661
  export { fetchOnboardingCustomerView, fetchOnboardingCustomerSetupView, getOnboardingPlaidLinkToken, establishOnboardingPlaidConnection, updateOnboardingCustomerViewAccountDetails, updateOnboardingCustomerViewCompleteStatus, updateOnboardingCustomerViewDashboardLoaded, updateOnboardingPaymentAccountLoginStatus, updateOnboardingPaymentAccountStatus, updateOnboardingCustomerView, updateOnboardingCustomerViewLocalStoreData, updateCurrentStep, updateCurrentSubStep, updateOnboardingCustomerViewUIState, saveOnboardingCompnayOfficerPhoneInLocalStore, saveOnboardingCustomerViewDataInLocalStore, clearOnboardingCustomerViewDataInLocalStore, applyKycDocumentAutofillForOnboarding, applyKybDocumentAutofillForOnboarding, clearKycKybAutofillForOnboarding, acknowledgeOnboardingAiActivationViewed, acknowledgeOnboardingAiFinanceTeam, fetchAiAgentsActivationStatus, aiAgentsActivationCountsUpdated, aiAgentsActivationPhaseChanged, getAiAgentsActivationCounts, getAiAgentsActivationPhases, getAiAgentsActivationSubview, getOnboardingCustomerView, getProductSettingsString, ALL_ONBOARDING_STEPS, ALL_ONBOARDING_SUB_STEPS, toOnboardingStepType, toOnboardingSubStepType, };
662
662
  export { saveAccountMapping, saveAccountMappingLocalData, clearAccountMappingLocalData, getAccountMappingView, initializeAccountMappingView, };
663
663
  export { getMagicLinkView, getMagicLinkBankAccountView, getMagicLinkCurrentAddressState, };
664
- export { fetchMagicLinkTenant, fetchBillAttachment, saveBankAccount, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, saveMagicLinkAddressInLocalStore, };
664
+ export { fetchMagicLinkTenant, updateMagicLinkTenantSuccess, updateMagicLinkTenantFailure, fetchBillAttachment, saveBankAccount, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, saveMagicLinkAddressInLocalStore, };
665
665
  export { getWiseRedirect, fetchWiseRedirectStatus };
666
666
  export { getInternationalWireView, initializeInternationalWireLocalData, updateInternationalWireLocalStoreData, initializeDynamicForm, fetchInternationalWireDynamicForm, createPaymentInstrument, createPaymentInstrumentUpdateStatus, deletePaymentInstrument, clearInternationalWire, };
667
667
  export { fetchUserRoleConfig, getUserRoleConfig };
@@ -705,8 +705,8 @@ export { updateAiAccountantCustomers, updateAiAccountantCustomer, updateAiAccoun
705
705
  export { getAiAccountantCustomers, getAiAccountantJobsByTenantId, } from './entity/aiAccountantCustomer/aiAccountantCustomerSelector';
706
706
  export { cancelAiAccountantOnboarding, fetchAiAccountantCustomers, fetchAiAccountantJobs, setSelectedTenantIdsForJobTrigger, triggerAiAccountantJob, updateAiAccountantUIState, } from './view/aiAccountantView/aiAccountantViewReducer';
707
707
  export { getAiAccountantCockpitView, } from './view/aiAccountantView/aiAccountantViewSelector';
708
- export { acceptMasterTOS, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, deleteChatSession, deleteRoutine, deleteSkill, fetchChatHistory, fetchChatSessionsForUser, fetchRoutineRuns, fetchRoutines, fetchSkillDetail, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersions, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, openRoutinesBrowser, openSkillsBrowser, runRoutine, saveRoutine, saveSkill, setRoutineEnabled, setSession, setSkillVisibility, stopSubmit, stopSubmitQuestion, submitFeedback, submitQuestion, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } from './view/aiCfoView/aiCfoViewReducer';
709
- export { canCreateRoutine, getAiCfoView, getRoutineMutation, getRoutineRuns, getRoutines, getRoutinesEnabled, getSkillDetail, getSkillMutation, getSkills, getSkillsEnabled, getSkillVersionBody, getSkillVersions, getSuggestedQuestionsForPageContext, } from './view/aiCfoView/aiCfoViewSelector';
708
+ export { acceptMasterTOS, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, deleteChatSession, deleteRoutine, deleteSkill, fetchChatHistory, fetchChatSessionsForUser, fetchRoutineRuns, fetchRoutines, fetchSkillDetail, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersions, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, openRoutinesBrowser, openSkillsBrowser, runRoutine, saveRoutine, saveSkill, setRoutineEnabled, setSession, setSkillVisibility, stopSubmit, stopSubmitQuestion, submitFeedback, submitQuestion, transcribeAudio, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } from './view/aiCfoView/aiCfoViewReducer';
709
+ export { canCreateRoutine, getAiCfoView, getIsTranscribing, getRoutineMutation, getRoutineRuns, getRoutines, getRoutinesEnabled, getSkillDetail, getSkillMutation, getSkills, getSkillsEnabled, getSkillVersionBody, getSkillVersions, getSuggestedQuestionsForPageContext, getTranscriptionFailed, } from './view/aiCfoView/aiCfoViewSelector';
710
710
  export { setNewSession, setSessions, updateAiCfoAnswerCardPolicyWizardPlan, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearSession, toAiCfoExports, toAiCfoVisualization, appendSyntheticAiCfoAnswer, updateSyntheticAiCfoAnswer, removeSyntheticAiCfoAnswer, } from './entity/aiCfo/aiCfoReducer';
711
711
  export { getAllQuestionAnswersForChatSession, getQuestionAnswerByIdForChatSession, getAllQuestionsForChatSession, getAiCfoSelectorView, getSyntheticAiCfoAnswersForChatSession, getSyntheticAiCfoAnswerByQuestionAnswerId, } from './entity/aiCfo/aiCfoSelector';
712
712
  export { ALL_AI_CFO_CHARTS_TYPES, ALL_AI_CFO_VISUALIZATION_TYPES, ALL_AI_CFO_ANSWER_STATE_TYPES, ALL_AI_CFO_ANSWER_RESPONSE_TYPES, ALL_INTERACTIVE_FORM_TYPES, toAiCfoVisualizationType, toAiCfoVisualizationTypeStrict, toAiCfoChartType, toAiCfoChartTypeStrict, toAiCfoAnswerStateType, toAiCfoAnswerStateTypeStrict, toAiCfoAnswerResponseType, toAiCfoAnswerResponseTypeStrict, toInteractiveFormType, toInteractiveFormTypeStrict, ALL_SYNTHETIC_AI_CFO_ANSWER_KINDS, toMessageSender, toMessageType, } from './entity/aiCfo/aiCfoState';
@@ -47,6 +47,8 @@ export const initialAiCfoViewState = {
47
47
  fetchChatSessionHistoryByChatSessionId: {},
48
48
  responseStateByChatSessionId: {},
49
49
  stopSubmitStateByChatSessionId: {},
50
+ transcriptionState: { fetchState: 'Not-Started', error: undefined },
51
+ transcribingChatSessionId: undefined,
50
52
  suggestedQuestionsByPageContext: {},
51
53
  skillDetail: {
52
54
  fetchState: 'Not-Started',
@@ -147,6 +149,19 @@ function closeSkillsBrowserState(draft) {
147
149
  draft.uiState.isSkillsBrowserOpen = false;
148
150
  clearOpenSkillState(draft);
149
151
  }
152
+ /**
153
+ * Clear a finished dictation attempt when the conversation moves on, so a failed one
154
+ * stops showing "Could not transcribe that recording" in every later chat. A running
155
+ * take keeps its state — the composer is showing a live "Transcribing…" for it.
156
+ */
157
+ function resetFinishedTranscription(draft) {
158
+ if (draft.transcriptionState.fetchState === 'In-Progress') {
159
+ return;
160
+ }
161
+ draft.transcriptionState.fetchState = 'Not-Started';
162
+ draft.transcriptionState.error = undefined;
163
+ draft.transcribingChatSessionId = undefined;
164
+ }
150
165
  const aiCfoView = createSlice({
151
166
  name: 'aiCfoView',
152
167
  initialState: initialAiCfoViewState,
@@ -154,6 +169,7 @@ const aiCfoView = createSlice({
154
169
  submitQuestion: {
155
170
  reducer(draft, action) {
156
171
  const { sessionId } = action.payload;
172
+ resetFinishedTranscription(draft);
157
173
  // A turn is being sent, so the chat body has to be what the user sees. Doing this
158
174
  // here rather than at each call site is deliberate: the composer, the sample
159
175
  // chips, Run, and the `/` menu all submit, and every one of them was a separate
@@ -299,6 +315,7 @@ const aiCfoView = createSlice({
299
315
  setSession(draft, action) {
300
316
  draft.uiState.currentChatSessionId = action.payload.sessionId;
301
317
  draft.uiState.agentId = action.payload.agentId;
318
+ resetFinishedTranscription(draft);
302
319
  // Picking a session means wanting to see that chat, so the browser cannot stay over
303
320
  // it. In the reducer because there are six dispatch sites across three separate
304
321
  // rails, and covering them one at a time missed half of them.
@@ -351,6 +368,7 @@ const aiCfoView = createSlice({
351
368
  createSessionAndSubmit: {
352
369
  reducer(draft, action) {
353
370
  draft.uiState.agentId = action.payload.agentId;
371
+ resetFinishedTranscription(draft);
354
372
  draft.createSessionAndSubmitState.fetchState = 'In-Progress';
355
373
  draft.createSessionAndSubmitState.error = undefined;
356
374
  },
@@ -551,7 +569,49 @@ const aiCfoView = createSlice({
551
569
  return { payload: { chatMessageId, error } };
552
570
  },
553
571
  },
572
+ transcribeAudio: {
573
+ reducer(draft, action) {
574
+ draft.transcriptionState.fetchState = 'In-Progress';
575
+ draft.transcriptionState.error = undefined;
576
+ draft.transcribingChatSessionId = action.payload.chatSessionId;
577
+ },
578
+ prepare(audio, language, chatSessionId) {
579
+ return { payload: { audio, chatSessionId, language } };
580
+ },
581
+ },
582
+ transcribeAudioSuccess: {
583
+ reducer(draft, action) {
584
+ draft.transcriptionState.fetchState = 'Completed';
585
+ draft.transcriptionState.error = undefined;
586
+ // The user moved to another session while this was in flight — dropping it
587
+ // is the only safe option, since appending would put their words in a
588
+ // conversation they did not dictate into.
589
+ if (action.payload.chatSessionId !== draft.uiState.currentChatSessionId) {
590
+ return;
591
+ }
592
+ const transcript = action.payload.transcript.trim();
593
+ if (transcript === '') {
594
+ // Silence, not a failure: leave the composer untouched so the user can
595
+ // simply speak again rather than hunting for what went wrong.
596
+ return;
597
+ }
598
+ // Append to whatever is in the box now rather than to a snapshot taken when
599
+ // recording began — a take produces exactly one result, so there is nothing
600
+ // to reconcile, and anything typed while transcribing survives.
601
+ const existing = draft.uiState.currentInput.trim();
602
+ draft.uiState.currentInput =
603
+ existing === '' ? transcript : `${existing} ${transcript}`;
604
+ },
605
+ prepare(transcript, chatSessionId) {
606
+ return { payload: { chatSessionId, transcript } };
607
+ },
608
+ },
609
+ transcribeAudioFailure(draft, action) {
610
+ draft.transcriptionState.fetchState = 'Error';
611
+ draft.transcriptionState.error = action.payload;
612
+ },
554
613
  clearCurrentSessionId(draft) {
614
+ resetFinishedTranscription(draft);
555
615
  // New Chat: the empty composer is the point, so the browser cannot stay over it.
556
616
  if (draft.uiState.isSkillsBrowserOpen === true) {
557
617
  closeSkillsBrowserState(draft);
@@ -835,7 +895,8 @@ const aiCfoView = createSlice({
835
895
  // The server has it. Nothing it sends from here on will contain this row,
836
896
  // so the tombstone has done its job and holding it any longer is what
837
897
  // makes a routine recreated under the same id invisible forever.
838
- draft.routines.deletedScheduleIds = draft.routines.deletedScheduleIds.filter((id) => id !== action.payload.scheduleId);
898
+ draft.routines.deletedScheduleIds =
899
+ draft.routines.deletedScheduleIds.filter((id) => id !== action.payload.scheduleId);
839
900
  draft.routineMutation = {
840
901
  fetchState: 'Completed',
841
902
  error: undefined,
@@ -847,7 +908,8 @@ const aiCfoView = createSlice({
847
908
  // is what lets the refetch put the row back — leaving it hidden would
848
909
  // tell the user they had stopped something they had not, which is the
849
910
  // worst outcome this list can produce.
850
- draft.routines.deletedScheduleIds = draft.routines.deletedScheduleIds.filter((id) => id !== action.payload.scheduleId);
911
+ draft.routines.deletedScheduleIds =
912
+ draft.routines.deletedScheduleIds.filter((id) => id !== action.payload.scheduleId);
851
913
  // Its own slice: the refetch that puts the row back would otherwise wipe
852
914
  // this error, leaving the row silently reappearing with no explanation.
853
915
  draft.routineMutation = {
@@ -1183,5 +1245,5 @@ const aiCfoView = createSlice({
1183
1245
  });
1184
1246
  },
1185
1247
  });
1186
- export const { acceptMasterTOS, acceptMasterTOSFailure, acceptMasterTOSSuccess, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, createSessionAndSubmitFailure, createSessionAndSubmitSuccess, createSessionFailure, createSessionSuccess, deleteChatSession, deleteChatSessionFailure, deleteChatSessionSuccess, deleteRoutine, deleteRoutineFailure, deleteRoutineSuccess, deleteSkill, deleteSkillFailure, deleteSkillSuccess, fetchChatHistory, fetchChatHistoryFailure, fetchChatHistorySuccess, fetchChatSessionsForUser, fetchChatSessionsForUserFailure, fetchChatSessionsForUserSuccess, fetchRoutineRuns, fetchRoutineRunsFailure, fetchRoutineRunsSuccess, fetchRoutines, fetchRoutinesFailure, fetchRoutinesSuccess, fetchSkillDetail, fetchSkillDetailFailure, fetchSkillDetailSuccess, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersionBodyFailure, fetchSkillVersionBodySuccess, fetchSkillVersions, fetchSkillVersionsFailure, fetchSkillVersionsSuccess, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, initializeNewSessionState, openRoutinesBrowser, openSkillsBrowser, runRoutine, runRoutineFailure, runRoutineSuccess, saveRoutine, saveRoutineFailure, saveRoutineSuccess, saveSkill, saveSkillFailure, saveSkillSuccess, setRoutineEnabled, setSession, setSkillVisibility, setSkillVisibilityFailure, setSkillVisibilitySuccess, stopSubmit, stopSubmitFailure, stopSubmitQuestion, stopSubmitQuestionFailure, stopSubmitQuestionSuccess, stopSubmitSuccess, submitFeedback, submitFeedbackFailure, submitFeedbackSuccess, submitQuestion, submitQuestionFailure, submitQuestionSuccess, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } = aiCfoView.actions;
1248
+ export const { acceptMasterTOS, acceptMasterTOSFailure, acceptMasterTOSSuccess, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, createSessionAndSubmitFailure, createSessionAndSubmitSuccess, createSessionFailure, createSessionSuccess, deleteChatSession, deleteChatSessionFailure, deleteChatSessionSuccess, deleteRoutine, deleteRoutineFailure, deleteRoutineSuccess, deleteSkill, deleteSkillFailure, deleteSkillSuccess, fetchChatHistory, fetchChatHistoryFailure, fetchChatHistorySuccess, fetchChatSessionsForUser, fetchChatSessionsForUserFailure, fetchChatSessionsForUserSuccess, fetchRoutineRuns, fetchRoutineRunsFailure, fetchRoutineRunsSuccess, fetchRoutines, fetchRoutinesFailure, fetchRoutinesSuccess, fetchSkillDetail, fetchSkillDetailFailure, fetchSkillDetailSuccess, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersionBodyFailure, fetchSkillVersionBodySuccess, fetchSkillVersions, fetchSkillVersionsFailure, fetchSkillVersionsSuccess, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, initializeNewSessionState, openRoutinesBrowser, openSkillsBrowser, runRoutine, runRoutineFailure, runRoutineSuccess, saveRoutine, saveRoutineFailure, saveRoutineSuccess, saveSkill, saveSkillFailure, saveSkillSuccess, setRoutineEnabled, setSession, setSkillVisibility, setSkillVisibilityFailure, setSkillVisibilitySuccess, stopSubmit, stopSubmitFailure, stopSubmitQuestion, stopSubmitQuestionFailure, stopSubmitQuestionSuccess, stopSubmitSuccess, submitFeedback, submitFeedbackFailure, submitFeedbackSuccess, submitQuestion, submitQuestionFailure, submitQuestionSuccess, transcribeAudio, transcribeAudioFailure, transcribeAudioSuccess, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } = aiCfoView.actions;
1187
1249
  export default aiCfoView.reducer;
@@ -133,3 +133,28 @@ export function getSkillMutation(state) {
133
133
  export function getSkillsEnabled(state) {
134
134
  return getSkills(state).skillsEnabled;
135
135
  }
136
+ /** True while a finished voice recording is being transcribed server-side. */
137
+ /**
138
+ * A take belongs to the chat it was dictated into. A new chat has no session id yet on
139
+ * either side, which is a match rather than a mismatch.
140
+ */
141
+ function isTranscribingCurrentSession(state) {
142
+ if (state.aiCfoViewState == null) {
143
+ return false;
144
+ }
145
+ return (state.aiCfoViewState.transcribingChatSessionId ===
146
+ state.aiCfoViewState.uiState.currentChatSessionId);
147
+ }
148
+ export function getIsTranscribing(state) {
149
+ return (state.aiCfoViewState?.transcriptionState?.fetchState === 'In-Progress' &&
150
+ isTranscribingCurrentSession(state));
151
+ }
152
+ /**
153
+ * Set when a transcription request failed. Without surfacing this the composer
154
+ * would just drop the "Transcribing…" label and sit there silently, leaving the
155
+ * user with no sign their recording went nowhere.
156
+ */
157
+ export function getTranscriptionFailed(state) {
158
+ return (state.aiCfoViewState?.transcriptionState?.fetchState === 'Error' &&
159
+ isTranscribingCurrentSession(state));
160
+ }
@@ -0,0 +1,60 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, finalize, map, switchMap, takeUntil, timeout, } from 'rxjs/operators';
3
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../responsePayload';
4
+ import { clearAll } from '../../../rootActions';
5
+ import { transcribeAudio, transcribeAudioFailure, transcribeAudioSuccess, } from '../aiCfoViewReducer';
6
+ const AUDIO_FIELD = 'audio';
7
+ const LANGUAGE_FIELD = 'language';
8
+ /** Extension only has to match the recorded format; the server reads the part's MIME type. */
9
+ const AUDIO_FILE_NAME = 'dictation.wav';
10
+ /**
11
+ * A hung request would otherwise pin `isTranscribing` true forever, and the composer
12
+ * gates both submit and the mic on it — leaving the user unable to send even typed
13
+ * text until something else resolved it.
14
+ */
15
+ const TRANSCRIPTION_TIMEOUT_MS = 30000;
16
+ /**
17
+ * Voice dictation for the AI CFO composer. Dispatch `transcribeAudio(blob, language)` with a
18
+ * finished recording to POST it to the AI CFO micro-service `/1.0/transcriptions` endpoint;
19
+ * on success the transcript is appended to the composer input for the user to edit and send.
20
+ *
21
+ * `switchMap` (not `mergeMap`): a newer recording supersedes an older in-flight one, so a
22
+ * slow response can never append a stale transcript after a fresh one has already landed.
23
+ * The AbortController makes that cancellation real — `fetch` wrapped in a promise ignores
24
+ * an RxJS unsubscribe, so without the signal the superseded request would run to completion
25
+ * and still bill a transcription call whose result nothing wants.
26
+ */
27
+ export const transcribeAudioEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(transcribeAudio.match), switchMap((action) => {
28
+ const { audio, chatSessionId, language } = action.payload;
29
+ const abortController = new AbortController();
30
+ const formData = new FormData();
31
+ formData.append(AUDIO_FIELD, audio, AUDIO_FILE_NAME);
32
+ if (language != null && language !== '') {
33
+ formData.append(LANGUAGE_FIELD, language);
34
+ }
35
+ return zeniAPI
36
+ .postFormData(`${zeniAPI.apiEndPoints.aiCfoMicroServiceBaseUrl}/1.0/transcriptions`, formData, abortController.signal)
37
+ .pipe(timeout(TRANSCRIPTION_TIMEOUT_MS),
38
+ // A tenant switch clears the store; a transcript still in flight must not
39
+ // land in the next tenant's composer (both sessions can be `undefined`, so
40
+ // the reducer's session guard would let it through).
41
+ takeUntil(actions$.pipe(filter(clearAll.match))), map((response) => {
42
+ if (!isSuccessResponse(response)) {
43
+ return transcribeAudioFailure(response.status);
44
+ }
45
+ // An EMPTY transcript is a success (the mic caught silence) and the
46
+ // reducer leaves the composer alone. A MISSING one breaks the response
47
+ // contract, so it surfaces as an error rather than being coerced to
48
+ // silence the user cannot distinguish from a quiet room.
49
+ if (response.data?.transcript == null) {
50
+ return transcribeAudioFailure(createZeniAPIStatus('Transcription succeeded but the response carried no transcript', 'Unexpected Error'));
51
+ }
52
+ // The session id rides along so a transcript that lands after the user
53
+ // switched sessions is dropped rather than misfiled.
54
+ return transcribeAudioSuccess(response.data.transcript, chatSessionId);
55
+ }), finalize(() => abortController.abort()), catchError((error) => of(transcribeAudioFailure(createZeniAPIStatus(
56
+ // message (detailed) first, then the short title — per createZeniAPIStatus(message, title).
57
+ // JSON.stringify(Error) drops the (non-enumerable) message — extract it explicitly.
58
+ 'Transcription REST API call errored out: ' +
59
+ (error instanceof Error ? error.message : String(error)), 'Unexpected Error')))));
60
+ }));
@@ -88,10 +88,6 @@ export const fetchDashboardEpic = (actions$, state$) => actions$.pipe(filter(fet
88
88
  const revenueState = getRevenueReportFetchState(state.revenueState.uiState.selectedForecast?.id, state.revenueState);
89
89
  const opExState = getOperatingExpensesReportFetchState(state.opExState.uiState.selectedForecast?.id, state.opExState);
90
90
  const netBurnOrIncomeReportFetchState = getNetBurnOrIncomeReportFetchState(state.netBurnOrIncomeState.uiState.selectedForecast?.id, state.netBurnOrIncomeState);
91
- if (state.tenantState.fetchState !== 'In-Progress' &&
92
- !state.tenantState.hasValidState()) {
93
- fetchActions.push(fetchAllTenants(userId));
94
- }
95
91
  if (state.cardBalanceState.fetchState !== 'In-Progress' &&
96
92
  !state.cardBalanceState.hasValidState()) {
97
93
  fetchActions.push(fetchCardBalance());
@@ -1,7 +1,7 @@
1
1
  import { createSelector } from '@reduxjs/toolkit';
2
2
  import { newBalancesFilter } from '../../commonStateTypes/coaBalance/coaBalancesFilter';
3
3
  import { reduceFetchState } from '../../commonStateTypes/reduceFetchState';
4
- import { getCurrentTenant, getTenantsByCheckInDateSelector, } from '../../entity/tenant/tenantSelector';
4
+ import { getCurrentTenant } from '../../entity/tenant/tenantSelector';
5
5
  import { hasAdminLevelAccess, hasInvestorBankerLevelAccess, } from '../../entity/userRole/userRoleType';
6
6
  import { getApAgingReport } from '../apAgingView/apAgingReport/apAgingSelector';
7
7
  import { getArAgingReport } from '../arAgingView/arAgingReport/arAgingSelector';
@@ -34,8 +34,7 @@ const getCashInCashOutLast4Periods = (state) => getCashInCashOut(state.accountSt
34
34
  const getNetBurnOrIncomeStoryCard = (state) => getNetBurnOrIncomeStoryCardReport(state);
35
35
  const apAgingSelector = (state) => getApAgingReport(state);
36
36
  const arAgingSelector = (state) => getArAgingReport(state);
37
- const tenantSelector = createSelector(getTenantsByCheckInDateSelector, getCurrentTenant, (tenantsOrdered, currentTenant) => ({
38
- tenantsOrdered,
37
+ const tenantSelector = createSelector(getCurrentTenant, (currentTenant) => ({
39
38
  currentTenant,
40
39
  }));
41
40
  export const getDashboard = createSelector(tenantSelector, getCardBalance, getCashBalance, getOperatingExpensesForLast5Periods, getRevenueForLast4Periods, getTop6Expenses, getNetBurnOrIncomeForLast4Periods, getNetBurnOrIncomeStoryCard, getCashPositionLast5Periods, getCashInCashOutLast4Periods, getInsights, getCompanyPassportView, getTasksCardReport, getBillPayCardReport, getReimbursementCardReport, apAgingSelector, arAgingSelector, getRewardsPlanCard, getDashboardCardsOrdered, (state) => {
@@ -15,12 +15,8 @@ export const fetchFinanceStatementEpic = (actions$, state$) => actions$.pipe(fil
15
15
  return of(fetchAllTenants(userId), fetchProfitAndLoss(), fetchBalanceSheet(), fetchCashFlow());
16
16
  }
17
17
  else {
18
- const { tenantState, financeStatementState } = state;
18
+ const { financeStatementState } = state;
19
19
  const fetchActions = [];
20
- if (tenantState.fetchState !== 'In-Progress' &&
21
- !tenantState.hasValidState()) {
22
- fetchActions.push(fetchAllTenants(userId));
23
- }
24
20
  const pandLFetchState = getPandLReportFetchState(undefined, state.profitAndLossState);
25
21
  const balanceSheetFetchState = getBalanceSheetFetchState(state.balanceSheetState);
26
22
  const cashFlowFetchState = getCashFlowReportFetchState(state.cashFlowState);
@@ -10,10 +10,6 @@ export const fetchPeoplePageEpic = (actions$, state$) => actions$.pipe(filter(fe
10
10
  else {
11
11
  const state = state$.value;
12
12
  const fetchActions = [];
13
- if (state.tenantState.fetchState !== 'In-Progress' &&
14
- !state.tenantState.hasValidState()) {
15
- fetchActions.push(fetchAllTenants(userId));
16
- }
17
13
  if (state.peopleState.fetchState != 'In-Progress' &&
18
14
  !state.peopleState.hasValidState()) {
19
15
  fetchActions.push(fetchPeople());
@@ -131,13 +131,29 @@ export const prepareCreateTransactionPayload = (state, localData) => {
131
131
  };
132
132
  }
133
133
  const lines = localData.lines.map((line) => toLinePayload(state, line, transactionType));
134
+ const documentIdField = localData.documentNumber != null && localData.documentNumber !== ''
135
+ ? { document_id: localData.documentNumber }
136
+ : {};
134
137
  if (transactionType === 'journal_entry') {
138
+ return { ...base, ...documentIdField, lines };
139
+ }
140
+ // Both post to accounts payable, so they carry no header account or payment type.
141
+ if (transactionType === 'vendor_credit') {
142
+ return {
143
+ ...base,
144
+ vendor_id: toQboVendorId(state, localData.vendorId),
145
+ ...documentIdField,
146
+ lines,
147
+ };
148
+ }
149
+ if (transactionType === 'bill') {
135
150
  return {
136
151
  ...base,
137
- ...(localData.documentNumber != null &&
138
- localData.documentNumber !== '' && {
139
- document_id: localData.documentNumber,
152
+ vendor_id: toQboVendorId(state, localData.vendorId),
153
+ ...(localData.dueDate != null && {
154
+ due_date: localData.dueDate.format(DEFAULT_DATE_FORMAT),
140
155
  }),
156
+ ...documentIdField,
141
157
  lines,
142
158
  };
143
159
  }
@@ -8,4 +8,6 @@ export const ALL_CREATABLE_TRANSACTION_TYPES = [
8
8
  'credit_card_credit',
9
9
  'transfer',
10
10
  'journal_entry',
11
+ 'bill',
12
+ 'vendor_credit',
11
13
  ];
package/lib/index.d.ts CHANGED
@@ -147,7 +147,7 @@ import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
147
147
  import { TaskGroupState } from './entity/taskGroup/taskGroupState';
148
148
  import { TaskGroupTemplate } from './entity/taskGroupTemplate/taskGroupTemplateState';
149
149
  import { DoSignInPayload, deleteConnection, doMagicLinkSignIn, doSignIn, doSignOut, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, initEmailConnectOAuth, resendVerifyDeviceOTP, resetSignInState, saveAPIKeyConnection, saveConnectorCredentials, saveExternalConnection as saveExternalConnectionForTenant, saveOAuthConnection, sendEmailMagicLinkToUser, sendSessionHeartbeat, toExternalIntegrationType, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
150
- import { CurrentTenant, DEFAULT_RECEIPTS_EMAIL, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, TenantsOrdered, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
150
+ import { CurrentTenant, DEFAULT_RECEIPTS_EMAIL, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, getCurrentTenant, getCurrentTenantId, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getReceiptsEmail, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isCurrentTenantLoaded, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantLoaded, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
151
151
  import { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Connection, LoggedInUser, RoleResource, Tenant, TenantProductSettings } from './entity/tenant/tenantState';
152
152
  import { toExternalSupportedTool } from './entity/tenant/tenantTypes';
153
153
  import { ToastNotificationPayload } from './entity/toastNotification/toastNotificationPayload';
@@ -512,7 +512,7 @@ import { InternationalWireSelectorView, getInternationalWireView } from './view/
512
512
  import { fetchInternationalVerificationForm, submitInternationalVerificationForm, updateVerificationFormLocalData } from './view/spendManagement/billPay/internationalWireVerification/internationalWireVerificationReducer';
513
513
  import { InternationalWireVerificationView, getIntlWireVerificationView } from './view/spendManagement/billPay/internationalWireVerification/internationalWireVerificationSelector';
514
514
  import { FieldValueType, InternationalWireVerificationState, VerificationFormField, VerificationFormLocalData } from './view/spendManagement/billPay/internationalWireVerification/internationalWireVerificationState';
515
- import { fetchBillAttachment, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, fetchMagicLinkTenant, saveBankAccount, saveMagicLinkAddressInLocalStore, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData } from './view/spendManagement/billPay/magicLinkView/magicLinkViewReducer';
515
+ import { fetchBillAttachment, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, fetchMagicLinkTenant, saveBankAccount, saveMagicLinkAddressInLocalStore, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, updateMagicLinkTenantFailure, updateMagicLinkTenantSuccess } from './view/spendManagement/billPay/magicLinkView/magicLinkViewReducer';
516
516
  import { MagicLinkView, getMagicLinkBankAccountView, getMagicLinkCurrentAddressState, getMagicLinkView } from './view/spendManagement/billPay/magicLinkView/magicLinkViewSelector';
517
517
  import { PreviousBillsSelectorView } from './view/spendManagement/billPay/previousBills/previousBillsSelector';
518
518
  import { fetchWiseRedirectStatus } from './view/spendManagement/billPay/wiseRedirectView/wiseRedirectReducer';
@@ -754,7 +754,7 @@ export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePerio
754
754
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorSpendTrendFilterTabType';
755
755
  export { getNumberOfPeriods };
756
756
  export { SCHEDULE_DAYS_OF_MONTH, ScheduleDaysOfMonth, toScheduleDaysOfMonth, Day, Month, toMonth, toMonthStrict, Quarter, toQuarter, toQuarterStrict, AbsoluteDay, TimePeriod, };
757
- export { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantsOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
757
+ export { CapitalizableAccount, CapitalizableAccounts, CapitalizableClassificationType, CapitalizableMatchPattern, Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getCurrentTenantId, isCurrentTenantLoaded, isTenantLoaded, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getIsAutoReviewIncomeWithoutCustomerEnabled, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveConnectorCredentials, saveOAuthConnection, initEmailConnectOAuth, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, DEFAULT_RECEIPTS_EMAIL, getReceiptsEmail, };
758
758
  export { Account, AccountType, AccountBase, StatementCloseDay, toAccountType, AccountReport, NestedAccountReport, AccountWithBalanceReport, AccountGroup, AccountGroupReportV2, AccountGroupType, toAccountGroupType, AccountGroupReport, getAccountGroupKey, AccountGroupKey, RecommendedAccountBase, AccountFilterOption, getAllAccounts, getTransactionFilterAccountOptions, };
759
759
  export { Class, ClassBase, RecommendedClassBase, } from './entity/class/classState';
760
760
  export { ClassFilterOption, getAllClasses, getClassById, getClassFilterOptions, } from './entity/class/classSelector';
@@ -952,7 +952,7 @@ export { isZeniClearingAccountReport, ZENI_CLEARING_ACCOUNT, isZeniClearingAccou
952
952
  export { fetchOnboardingCustomerView, fetchOnboardingCustomerSetupView, getOnboardingPlaidLinkToken, establishOnboardingPlaidConnection, updateOnboardingCustomerViewAccountDetails, updateOnboardingCustomerViewCompleteStatus, updateOnboardingCustomerViewDashboardLoaded, updateOnboardingPaymentAccountLoginStatus, updateOnboardingPaymentAccountStatus, updateOnboardingCustomerView, updateOnboardingCustomerViewLocalStoreData, updateCurrentStep, updateCurrentSubStep, updateOnboardingCustomerViewUIState, saveOnboardingCompnayOfficerPhoneInLocalStore, saveOnboardingCustomerViewDataInLocalStore, clearOnboardingCustomerViewDataInLocalStore, applyKycDocumentAutofillForOnboarding, applyKybDocumentAutofillForOnboarding, clearKycKybAutofillForOnboarding, acknowledgeOnboardingAiActivationViewed, acknowledgeOnboardingAiFinanceTeam, fetchAiAgentsActivationStatus, aiAgentsActivationCountsUpdated, aiAgentsActivationPhaseChanged, getAiAgentsActivationCounts, getAiAgentsActivationPhases, getAiAgentsActivationSubview, getOnboardingCustomerView, getProductSettingsString, OnboardingCustomerView, OnboardingStep, OnboardingSubStep, ALL_ONBOARDING_STEPS, ALL_ONBOARDING_SUB_STEPS, toOnboardingStepType, toOnboardingSubStepType, OnboardingCustomerViewUIState, OnboardingCustomerViewLocalData, OnboardingBusinessProfileUpdate, AiAgentsActivationCounts, AiAgentsActivationPhase, AiAgentsActivationPhaseStatus, AiAgentsActivationSubview, };
953
953
  export { saveAccountMapping, saveAccountMappingLocalData, clearAccountMappingLocalData, AccountMappingLocalData, AccountMappingView, VendorAccountMappingView, getAccountMappingView, initializeAccountMappingView, ExpenseCategory1099Filing, };
954
954
  export { MagicLinkView, getMagicLinkView, getMagicLinkBankAccountView, getMagicLinkCurrentAddressState, };
955
- export { fetchMagicLinkTenant, fetchBillAttachment, saveBankAccount, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, saveMagicLinkAddressInLocalStore, };
955
+ export { fetchMagicLinkTenant, updateMagicLinkTenantSuccess, updateMagicLinkTenantFailure, fetchBillAttachment, saveBankAccount, updateMagicLinkBankAccountLocalStoreData, updateMagicLinkInternationalBankAccountLocalStoreData, fetchMagicLinkBankNameByRouting, fetchMagicLinkBankNameBySwift, saveMagicLinkAddressInLocalStore, };
956
956
  export { getWiseRedirect, fetchWiseRedirectStatus };
957
957
  export { getInternationalWireView, InternationalWireSelectorView, DynamicFormField, CreateInternationalWireDetailsLocalData, SupportedAccountType, VendorCurrency, initializeInternationalWireLocalData, updateInternationalWireLocalStoreData, initializeDynamicForm, fetchInternationalWireDynamicForm, createPaymentInstrument, createPaymentInstrumentUpdateStatus, deletePaymentInstrument, clearInternationalWire, };
958
958
  export { fetchUserRoleConfig, getUserRoleConfig };
@@ -1002,12 +1002,12 @@ export { AiAccountantCustomerViewState, AiAccountantSortKey, AiAccountantUIState
1002
1002
  export { AiAccountantFilterCategoryField } from './view/companyView/types/cockpitTypes';
1003
1003
  export { cancelAiAccountantOnboarding, fetchAiAccountantCustomers, fetchAiAccountantJobs, setSelectedTenantIdsForJobTrigger, triggerAiAccountantJob, updateAiAccountantUIState, } from './view/aiAccountantView/aiAccountantViewReducer';
1004
1004
  export { AiAccountantCockpitView, getAiAccountantCockpitView, } from './view/aiAccountantView/aiAccountantViewSelector';
1005
- export { acceptMasterTOS, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, deleteChatSession, deleteRoutine, deleteSkill, fetchChatHistory, fetchChatSessionsForUser, fetchRoutineRuns, fetchRoutines, fetchSkillDetail, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersions, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, openRoutinesBrowser, openSkillsBrowser, runRoutine, saveRoutine, saveSkill, setRoutineEnabled, setSession, setSkillVisibility, stopSubmit, stopSubmitQuestion, submitFeedback, submitQuestion, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } from './view/aiCfoView/aiCfoViewReducer';
1005
+ export { acceptMasterTOS, applyAiCfoSidePanelHostPageTransition, clearAiCfoSidePanelHostPageContext, clearCurrentSessionId, clearDeleteChatSessionStatus, clearLastContextMessage, clearSkillDetail, clearSkillMutation, closeRoutineRuns, closeRoutinesBrowser, closeSkillsBrowser, createSession, createSessionAndSubmit, deleteChatSession, deleteRoutine, deleteSkill, fetchChatHistory, fetchChatSessionsForUser, fetchRoutineRuns, fetchRoutines, fetchSkillDetail, fetchSkills, fetchSkillsFailure, fetchSkillsSuccess, fetchSkillVersionBody, fetchSkillVersions, fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess, openRoutinesBrowser, openSkillsBrowser, runRoutine, saveRoutine, saveSkill, setRoutineEnabled, setSession, setSkillVisibility, stopSubmit, stopSubmitQuestion, submitFeedback, submitQuestion, transcribeAudio, updateAiCfoViewScrollPosition, updateCotCollapsedState, updateCurrentInput, updateResponseState, } from './view/aiCfoView/aiCfoViewReducer';
1006
1006
  export { AiCfoViewState, AiCfoViewUIState, Routine, RoutineDraft, RoutineMutationState, RoutineRecurrence, RoutineRun, RoutineRunsState, RoutineRunStatus, RoutinesState, RoutineStatus, Skill, SkillDetail, SkillDetailState, SkillDraft, SkillMutationState, SkillsState, SkillVersion, SkillVersionBodyState, SkillVersionsState, SkillVisibility, SuggestedQuestionsForPageContext, } from './view/aiCfoView/aiCfoViewState';
1007
1007
  export { FetchSuggestedQuestionsResponse, SuggestedQuestionsDataPayload, FetchSkillsResponse, SkillSummaryPayload, SkillListDataPayload, } from './view/aiCfoView/aiCfoViewPayload';
1008
- export type { FeedbackType, SubmitFeedbackPayload, } from './view/aiCfoView/aiCfoViewPayload';
1008
+ export type { FeedbackType, SubmitFeedbackPayload, TranscribeAudioPayload, TranscriptionResponseData, } from './view/aiCfoView/aiCfoViewPayload';
1009
1009
  export type { AiCfoSuggestedQuestionsPageContext } from './common/aiCfo/aiCfoSuggestedQuestionsPageContext';
1010
- export { AiCfoViewSelector, canCreateRoutine, getAiCfoView, getRoutineMutation, getRoutineRuns, getRoutines, getRoutinesEnabled, getSkillDetail, getSkillMutation, getSkills, getSkillsEnabled, getSkillVersionBody, getSkillVersions, getSuggestedQuestionsForPageContext, } from './view/aiCfoView/aiCfoViewSelector';
1010
+ export { AiCfoViewSelector, canCreateRoutine, getAiCfoView, getIsTranscribing, getRoutineMutation, getRoutineRuns, getRoutines, getRoutinesEnabled, getSkillDetail, getSkillMutation, getSkills, getSkillsEnabled, getSkillVersionBody, getSkillVersions, getSuggestedQuestionsForPageContext, getTranscriptionFailed, } from './view/aiCfoView/aiCfoViewSelector';
1011
1011
  export { MessagePayload, ChatSessionPayload, AiCfoAnswerPayload, } from './entity/aiCfo/aiCfoPayload';
1012
1012
  export { setNewSession, setSessions, updateAiCfoAnswerCardPolicyWizardPlan, upsertAnswerPayload, upsertOrAddQuestionAnswerPayload, addQuestionPayload, clearSession, toAiCfoExports, toAiCfoVisualization, appendSyntheticAiCfoAnswer, updateSyntheticAiCfoAnswer, removeSyntheticAiCfoAnswer, } from './entity/aiCfo/aiCfoReducer';
1013
1013
  export { AiCfoSelectorView, getAllQuestionAnswersForChatSession, getQuestionAnswerByIdForChatSession, getAllQuestionsForChatSession, getAiCfoSelectorView, getSyntheticAiCfoAnswersForChatSession, getSyntheticAiCfoAnswerByQuestionAnswerId, ChatSessionWithOrderedQuestionAnswers, } from './entity/aiCfo/aiCfoSelector';