@zeniai/client-epic-state 4.19.86 → 4.19.87-beta1AD

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 (39) hide show
  1. package/lib/entity/aiCfo/aiCfoSelector.d.ts +1 -2
  2. package/lib/epic.d.ts +2 -1
  3. package/lib/epic.js +2 -1
  4. package/lib/esm/epic.js +2 -1
  5. package/lib/esm/index.js +2 -2
  6. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +83 -1
  7. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +5 -1
  8. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +26 -0
  9. package/lib/esm/view/spendManagement/billPay/billList/billListSelector.js +10 -0
  10. package/lib/esm/view/spendManagement/billPay/billList/billListState.js +1 -0
  11. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +1 -0
  12. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +2 -0
  13. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListSelector.js +12 -0
  14. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListState.js +1 -0
  15. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
  16. package/lib/index.d.ts +5 -3
  17. package/lib/index.js +8 -2
  18. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  19. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +11 -0
  20. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +15 -1
  21. package/lib/view/aiCfoView/aiCfoViewReducer.js +84 -2
  22. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +4 -1
  23. package/lib/view/aiCfoView/aiCfoViewSelector.js +6 -1
  24. package/lib/view/aiCfoView/aiCfoViewState.d.ts +22 -0
  25. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +8 -0
  26. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +30 -0
  27. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  28. package/lib/view/spendManagement/billPay/billList/billListSelector.js +10 -0
  29. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  30. package/lib/view/spendManagement/billPay/billList/billListState.js +1 -0
  31. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  32. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +1 -0
  33. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +2 -0
  34. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.d.ts +1 -0
  35. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.js +12 -0
  36. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +1 -1
  37. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.js +1 -0
  38. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +2 -2
  39. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { AiCfoAnswerPayload, ChatSessionPayload } from '../../entity/aiCfo/aiCfoPayload';
2
2
  import { UserRolePayload } from '../../entity/userRole/userRolePayload';
3
3
  import { ZeniAPIResponse } from '../../responsePayload';
4
+ import { AiCfoSuggestedQuestionsPageContext } from './aiCfoViewState';
4
5
  export type ContextStatus = 'NONE' | 'NOT_FOUND' | 'PERMISSION_DENIED' | 'SUCCESS';
5
6
  export interface CreateSessionResponseData {
6
7
  chat_session_id: string;
@@ -23,4 +24,14 @@ interface AcceptMasterTOSPayload {
23
24
  user_roles: UserRolePayload[];
24
25
  }
25
26
  export type AcceptMasterTOSResponse = ZeniAPIResponse<AcceptMasterTOSPayload>;
27
+ /**
28
+ * Payload returned in `data` for GET .../suggested-questions?page_context=...
29
+ * Field names match the REST API (snake_case).
30
+ */
31
+ export interface SuggestedQuestionsDataPayload {
32
+ generated_at: string;
33
+ page_context: AiCfoSuggestedQuestionsPageContext;
34
+ suggested_questions: string[];
35
+ }
36
+ export type FetchSuggestedQuestionsResponse = ZeniAPIResponse<SuggestedQuestionsDataPayload>;
26
37
  export {};
@@ -4,6 +4,7 @@ import { ChatSessionPayload } from '../../entity/aiCfo/aiCfoPayload';
4
4
  import { AiCfoAnswerResponseType } from '../../entity/aiCfo/aiCfoState';
5
5
  import { ZeniAPIStatus } from '../../responsePayload';
6
6
  import { ContextStatus } from './aiCfoViewPayload';
7
+ import { AiCfoSuggestedQuestionsPageContext } from './aiCfoViewState';
7
8
  import { AiCfoViewState } from './aiCfoViewState';
8
9
  export declare const initialAiCfoViewState: AiCfoViewState;
9
10
  export declare const submitQuestion: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[sessionId: string, questionAnswerId: string, userId: string, questionId: string, createdAt: import("dayjs").Dayjs, question: string, files?: File[] | undefined], {
@@ -89,6 +90,19 @@ export declare const submitQuestion: import("@reduxjs/toolkit").ActionCreatorWit
89
90
  }, "aiCfoView/clearDeleteChatSessionStatus">, clearAiCfoView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"aiCfoView/clearAiCfoView">, updateCotCollapsedState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
90
91
  isCollapsed: boolean;
91
92
  questionAnswerId: ID;
92
- }, "aiCfoView/updateCotCollapsedState">;
93
+ }, "aiCfoView/updateCotCollapsedState">, fetchSuggestedQuestions: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
94
+ pageContext: AiCfoSuggestedQuestionsPageContext;
95
+ }, "aiCfoView/fetchSuggestedQuestions">, fetchSuggestedQuestionsSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
96
+ generatedAt: string;
97
+ pageContext: AiCfoSuggestedQuestionsPageContext;
98
+ suggestedQuestions: string[];
99
+ }, "aiCfoView/fetchSuggestedQuestionsSuccess">, fetchSuggestedQuestionsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
100
+ error: ZeniAPIStatus;
101
+ pageContext: AiCfoSuggestedQuestionsPageContext;
102
+ }, "aiCfoView/fetchSuggestedQuestionsFailure">, applyEmbeddingPageTransition: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
103
+ newPageKey: string;
104
+ /** When omitted or null, clears the active session (empty / suggested questions). */
105
+ nextCurrentChatSessionId?: ID | null;
106
+ }, "aiCfoView/applyEmbeddingPageTransition">, clearEmbeddingPageContext: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"aiCfoView/clearEmbeddingPageContext">;
93
107
  declare const _default: import("redux").Reducer<AiCfoViewState>;
94
108
  export default _default;
@@ -1,8 +1,23 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.updateCotCollapsedState = exports.clearAiCfoView = exports.clearDeleteChatSessionStatus = exports.deleteChatSessionFailure = exports.deleteChatSessionSuccess = exports.deleteChatSession = exports.acceptMasterTOSFailure = exports.acceptMasterTOSSuccess = exports.acceptMasterTOS = exports.stopSubmitQuestionFailure = exports.stopSubmitQuestionSuccess = exports.stopSubmitQuestion = exports.stopSubmitFailure = exports.stopSubmitSuccess = exports.stopSubmit = exports.clearLastContextMessage = exports.clearCurrentSessionId = exports.fetchChatHistoryFailure = exports.fetchChatHistorySuccess = exports.fetchChatHistory = exports.fetchChatSessionsForUserFailure = exports.fetchChatSessionsForUserSuccess = exports.fetchChatSessionsForUser = exports.createSessionAndSubmitFailure = exports.createSessionAndSubmitSuccess = exports.initializeNewSessionState = exports.createSessionAndSubmit = exports.createSessionFailure = exports.createSessionSuccess = exports.createSession = exports.setSession = exports.clearInput = exports.updateCurrentInput = exports.updateAiCfoViewScrollPosition = exports.updateResponseState = exports.submitQuestionFailure = exports.submitQuestionSuccess = exports.submitQuestion = exports.initialAiCfoViewState = void 0;
4
+ exports.clearEmbeddingPageContext = exports.applyEmbeddingPageTransition = exports.fetchSuggestedQuestionsFailure = exports.fetchSuggestedQuestionsSuccess = exports.fetchSuggestedQuestions = exports.updateCotCollapsedState = exports.clearAiCfoView = exports.clearDeleteChatSessionStatus = exports.deleteChatSessionFailure = exports.deleteChatSessionSuccess = exports.deleteChatSession = exports.acceptMasterTOSFailure = exports.acceptMasterTOSSuccess = exports.acceptMasterTOS = exports.stopSubmitQuestionFailure = exports.stopSubmitQuestionSuccess = exports.stopSubmitQuestion = exports.stopSubmitFailure = exports.stopSubmitSuccess = exports.stopSubmit = exports.clearLastContextMessage = exports.clearCurrentSessionId = exports.fetchChatHistoryFailure = exports.fetchChatHistorySuccess = exports.fetchChatHistory = exports.fetchChatSessionsForUserFailure = exports.fetchChatSessionsForUserSuccess = exports.fetchChatSessionsForUser = exports.createSessionAndSubmitFailure = exports.createSessionAndSubmitSuccess = exports.initializeNewSessionState = exports.createSessionAndSubmit = exports.createSessionFailure = exports.createSessionSuccess = exports.createSession = exports.setSession = exports.clearInput = exports.updateCurrentInput = exports.updateAiCfoViewScrollPosition = exports.updateResponseState = exports.submitQuestionFailure = exports.submitQuestionSuccess = exports.submitQuestion = exports.initialAiCfoViewState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
+ function removeSessionIdFromPageKeyMap(draft, sessionId) {
7
+ const map = draft.uiState.chatSessionIdByPageKey;
8
+ for (const key of Object.keys(map)) {
9
+ if (map[key] === sessionId) {
10
+ delete map[key];
11
+ }
12
+ }
13
+ }
14
+ function mirrorCurrentSessionToPageKeyMapIfActive(draft) {
15
+ const key = draft.uiState.embeddingActivePageKey;
16
+ const sessionId = draft.uiState.currentChatSessionId;
17
+ if (key != null && sessionId != null) {
18
+ draft.uiState.chatSessionIdByPageKey[key] = sessionId;
19
+ }
20
+ }
6
21
  exports.initialAiCfoViewState = {
7
22
  fetchState: 'Not-Started',
8
23
  error: undefined,
@@ -10,6 +25,8 @@ exports.initialAiCfoViewState = {
10
25
  currentInput: '',
11
26
  scrollPositionByChatSessionId: {},
12
27
  currentChatSessionId: undefined,
28
+ embeddingActivePageKey: undefined,
29
+ chatSessionIdByPageKey: {},
13
30
  agentId: undefined,
14
31
  chatHistoryNextPageToken: {},
15
32
  chatSessionsNextPageToken: { nextPageToken: null, hasMore: false },
@@ -33,6 +50,7 @@ exports.initialAiCfoViewState = {
33
50
  fetchChatSessionHistoryByChatSessionId: {},
34
51
  responseStateByChatSessionId: {},
35
52
  stopSubmitStateByChatSessionId: {},
53
+ suggestedQuestionsByPageContext: {},
36
54
  };
37
55
  const aiCfoView = (0, toolkit_1.createSlice)({
38
56
  name: 'aiCfoView',
@@ -166,6 +184,7 @@ const aiCfoView = (0, toolkit_1.createSlice)({
166
184
  setSession(draft, action) {
167
185
  draft.uiState.currentChatSessionId = action.payload.sessionId;
168
186
  draft.uiState.agentId = action.payload.agentId;
187
+ mirrorCurrentSessionToPageKeyMapIfActive(draft);
169
188
  },
170
189
  createSession: {
171
190
  reducer(draft, action) {
@@ -189,6 +208,7 @@ const aiCfoView = (0, toolkit_1.createSlice)({
189
208
  nextPageToken: null,
190
209
  hasMore: false,
191
210
  };
211
+ mirrorCurrentSessionToPageKeyMapIfActive(draft);
192
212
  },
193
213
  createSessionFailure(draft, action) {
194
214
  draft.createSessionState.fetchState = 'Error';
@@ -226,6 +246,7 @@ const aiCfoView = (0, toolkit_1.createSlice)({
226
246
  nextPageToken: null,
227
247
  hasMore: false,
228
248
  };
249
+ mirrorCurrentSessionToPageKeyMapIfActive(draft);
229
250
  },
230
251
  createSessionAndSubmitSuccess(draft) {
231
252
  // Note: currentChatSessionId, agentId, and chatHistoryNextPageToken are set by initializeNewSessionState
@@ -342,6 +363,7 @@ const aiCfoView = (0, toolkit_1.createSlice)({
342
363
  draft.uiState.currentChatSessionId = undefined;
343
364
  draft.uiState.agentId = undefined;
344
365
  }
366
+ removeSessionIdFromPageKeyMap(draft, chatSessionId);
345
367
  delete draft.uiState.chatHistoryNextPageToken[chatSessionId];
346
368
  delete draft.uiState.scrollPositionByChatSessionId[chatSessionId];
347
369
  delete draft.fetchChatSessionHistoryByChatSessionId[chatSessionId];
@@ -364,6 +386,66 @@ const aiCfoView = (0, toolkit_1.createSlice)({
364
386
  },
365
387
  clearCurrentSessionId(draft) {
366
388
  draft.uiState.currentChatSessionId = undefined;
389
+ const key = draft.uiState.embeddingActivePageKey;
390
+ if (key != null) {
391
+ delete draft.uiState.chatSessionIdByPageKey[key];
392
+ }
393
+ },
394
+ applyEmbeddingPageTransition(draft, action) {
395
+ const { newPageKey, nextCurrentChatSessionId } = action.payload;
396
+ const prevKey = draft.uiState.embeddingActivePageKey;
397
+ const curId = draft.uiState.currentChatSessionId;
398
+ if (prevKey != null && prevKey !== newPageKey && curId != null) {
399
+ draft.uiState.chatSessionIdByPageKey[prevKey] = curId;
400
+ }
401
+ draft.uiState.embeddingActivePageKey = newPageKey;
402
+ if (nextCurrentChatSessionId == null) {
403
+ draft.uiState.currentChatSessionId = undefined;
404
+ }
405
+ else {
406
+ draft.uiState.currentChatSessionId = nextCurrentChatSessionId;
407
+ }
408
+ draft.uiState.currentInput = '';
409
+ },
410
+ clearEmbeddingPageContext(draft) {
411
+ const key = draft.uiState.embeddingActivePageKey;
412
+ const curId = draft.uiState.currentChatSessionId;
413
+ if (key != null && curId != null) {
414
+ draft.uiState.chatSessionIdByPageKey[key] = curId;
415
+ }
416
+ draft.uiState.embeddingActivePageKey = undefined;
417
+ },
418
+ fetchSuggestedQuestions(draft, action) {
419
+ const { pageContext } = action.payload;
420
+ const prev = draft.suggestedQuestionsByPageContext[pageContext];
421
+ draft.suggestedQuestionsByPageContext[pageContext] = {
422
+ fetchState: 'In-Progress',
423
+ pageContext,
424
+ suggestedQuestions: prev?.suggestedQuestions ?? [],
425
+ generatedAt: prev?.generatedAt,
426
+ error: undefined,
427
+ };
428
+ },
429
+ fetchSuggestedQuestionsSuccess(draft, action) {
430
+ const { pageContext, generatedAt, suggestedQuestions } = action.payload;
431
+ draft.suggestedQuestionsByPageContext[pageContext] = {
432
+ fetchState: 'Completed',
433
+ pageContext,
434
+ generatedAt,
435
+ suggestedQuestions,
436
+ error: undefined,
437
+ };
438
+ },
439
+ fetchSuggestedQuestionsFailure(draft, action) {
440
+ const { pageContext, error } = action.payload;
441
+ const prev = draft.suggestedQuestionsByPageContext[pageContext];
442
+ draft.suggestedQuestionsByPageContext[pageContext] = {
443
+ fetchState: 'Error',
444
+ pageContext,
445
+ suggestedQuestions: prev?.suggestedQuestions ?? [],
446
+ generatedAt: prev?.generatedAt,
447
+ error,
448
+ };
367
449
  },
368
450
  clearAiCfoView(draft) {
369
451
  Object.assign(draft, exports.initialAiCfoViewState);
@@ -375,5 +457,5 @@ const aiCfoView = (0, toolkit_1.createSlice)({
375
457
  },
376
458
  },
377
459
  });
378
- _a = aiCfoView.actions, exports.submitQuestion = _a.submitQuestion, exports.submitQuestionSuccess = _a.submitQuestionSuccess, exports.submitQuestionFailure = _a.submitQuestionFailure, exports.updateResponseState = _a.updateResponseState, exports.updateAiCfoViewScrollPosition = _a.updateAiCfoViewScrollPosition, exports.updateCurrentInput = _a.updateCurrentInput, exports.clearInput = _a.clearInput, exports.setSession = _a.setSession, exports.createSession = _a.createSession, exports.createSessionSuccess = _a.createSessionSuccess, exports.createSessionFailure = _a.createSessionFailure, exports.createSessionAndSubmit = _a.createSessionAndSubmit, exports.initializeNewSessionState = _a.initializeNewSessionState, exports.createSessionAndSubmitSuccess = _a.createSessionAndSubmitSuccess, exports.createSessionAndSubmitFailure = _a.createSessionAndSubmitFailure, exports.fetchChatSessionsForUser = _a.fetchChatSessionsForUser, exports.fetchChatSessionsForUserSuccess = _a.fetchChatSessionsForUserSuccess, exports.fetchChatSessionsForUserFailure = _a.fetchChatSessionsForUserFailure, exports.fetchChatHistory = _a.fetchChatHistory, exports.fetchChatHistorySuccess = _a.fetchChatHistorySuccess, exports.fetchChatHistoryFailure = _a.fetchChatHistoryFailure, exports.clearCurrentSessionId = _a.clearCurrentSessionId, exports.clearLastContextMessage = _a.clearLastContextMessage, exports.stopSubmit = _a.stopSubmit, exports.stopSubmitSuccess = _a.stopSubmitSuccess, exports.stopSubmitFailure = _a.stopSubmitFailure, exports.stopSubmitQuestion = _a.stopSubmitQuestion, exports.stopSubmitQuestionSuccess = _a.stopSubmitQuestionSuccess, exports.stopSubmitQuestionFailure = _a.stopSubmitQuestionFailure, exports.acceptMasterTOS = _a.acceptMasterTOS, exports.acceptMasterTOSSuccess = _a.acceptMasterTOSSuccess, exports.acceptMasterTOSFailure = _a.acceptMasterTOSFailure, exports.deleteChatSession = _a.deleteChatSession, exports.deleteChatSessionSuccess = _a.deleteChatSessionSuccess, exports.deleteChatSessionFailure = _a.deleteChatSessionFailure, exports.clearDeleteChatSessionStatus = _a.clearDeleteChatSessionStatus, exports.clearAiCfoView = _a.clearAiCfoView, exports.updateCotCollapsedState = _a.updateCotCollapsedState;
460
+ _a = aiCfoView.actions, exports.submitQuestion = _a.submitQuestion, exports.submitQuestionSuccess = _a.submitQuestionSuccess, exports.submitQuestionFailure = _a.submitQuestionFailure, exports.updateResponseState = _a.updateResponseState, exports.updateAiCfoViewScrollPosition = _a.updateAiCfoViewScrollPosition, exports.updateCurrentInput = _a.updateCurrentInput, exports.clearInput = _a.clearInput, exports.setSession = _a.setSession, exports.createSession = _a.createSession, exports.createSessionSuccess = _a.createSessionSuccess, exports.createSessionFailure = _a.createSessionFailure, exports.createSessionAndSubmit = _a.createSessionAndSubmit, exports.initializeNewSessionState = _a.initializeNewSessionState, exports.createSessionAndSubmitSuccess = _a.createSessionAndSubmitSuccess, exports.createSessionAndSubmitFailure = _a.createSessionAndSubmitFailure, exports.fetchChatSessionsForUser = _a.fetchChatSessionsForUser, exports.fetchChatSessionsForUserSuccess = _a.fetchChatSessionsForUserSuccess, exports.fetchChatSessionsForUserFailure = _a.fetchChatSessionsForUserFailure, exports.fetchChatHistory = _a.fetchChatHistory, exports.fetchChatHistorySuccess = _a.fetchChatHistorySuccess, exports.fetchChatHistoryFailure = _a.fetchChatHistoryFailure, exports.clearCurrentSessionId = _a.clearCurrentSessionId, exports.clearLastContextMessage = _a.clearLastContextMessage, exports.stopSubmit = _a.stopSubmit, exports.stopSubmitSuccess = _a.stopSubmitSuccess, exports.stopSubmitFailure = _a.stopSubmitFailure, exports.stopSubmitQuestion = _a.stopSubmitQuestion, exports.stopSubmitQuestionSuccess = _a.stopSubmitQuestionSuccess, exports.stopSubmitQuestionFailure = _a.stopSubmitQuestionFailure, exports.acceptMasterTOS = _a.acceptMasterTOS, exports.acceptMasterTOSSuccess = _a.acceptMasterTOSSuccess, exports.acceptMasterTOSFailure = _a.acceptMasterTOSFailure, exports.deleteChatSession = _a.deleteChatSession, exports.deleteChatSessionSuccess = _a.deleteChatSessionSuccess, exports.deleteChatSessionFailure = _a.deleteChatSessionFailure, exports.clearDeleteChatSessionStatus = _a.clearDeleteChatSessionStatus, exports.clearAiCfoView = _a.clearAiCfoView, exports.updateCotCollapsedState = _a.updateCotCollapsedState, exports.fetchSuggestedQuestions = _a.fetchSuggestedQuestions, exports.fetchSuggestedQuestionsSuccess = _a.fetchSuggestedQuestionsSuccess, exports.fetchSuggestedQuestionsFailure = _a.fetchSuggestedQuestionsFailure, exports.applyEmbeddingPageTransition = _a.applyEmbeddingPageTransition, exports.clearEmbeddingPageContext = _a.clearEmbeddingPageContext;
379
461
  exports.default = aiCfoView.reducer;
@@ -3,7 +3,8 @@ import { FetchStateAndError } from '../../commonStateTypes/common';
3
3
  import { SelectorView } from '../../commonStateTypes/viewAndReport/viewAndReport';
4
4
  import { AiCfoSelectorView } from '../../entity/aiCfo/aiCfoSelector';
5
5
  import { RootState } from '../../reducer';
6
- import { AiCfoViewUIState } from './aiCfoViewState';
6
+ import { AiCfoSuggestedQuestionsPageContext } from './aiCfoViewState';
7
+ import { AiCfoViewUIState, SuggestedQuestionsForPageContext } from './aiCfoViewState';
7
8
  export interface AiCfoViewSelector extends SelectorView, AiCfoSelectorView {
8
9
  createSessionAndSubmitState: FetchStateAndError;
9
10
  createSessionState: FetchStateAndError;
@@ -17,6 +18,8 @@ export interface AiCfoViewSelector extends SelectorView, AiCfoSelectorView {
17
18
  thought: FetchStateAndError;
18
19
  }>;
19
20
  stopSubmitStateByChatSessionId: Record<ID, FetchStateAndError>;
21
+ suggestedQuestionsByPageContext: Partial<Record<AiCfoSuggestedQuestionsPageContext, SuggestedQuestionsForPageContext>>;
20
22
  uiState: AiCfoViewUIState;
21
23
  }
22
24
  export declare const getAiCfoView: (state: RootState) => AiCfoViewSelector;
25
+ export declare function getSuggestedQuestionsForPageContext(state: RootState, pageContext: AiCfoSuggestedQuestionsPageContext): SuggestedQuestionsForPageContext | undefined;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAiCfoView = void 0;
4
+ exports.getSuggestedQuestionsForPageContext = getSuggestedQuestionsForPageContext;
4
5
  const aiCfoSelector_1 = require("../../entity/aiCfo/aiCfoSelector");
5
6
  const getAiCfoView = (state) => {
6
- const { fetchState, error, uiState, createSessionState, createSessionAndSubmitState, deleteChatSessionStateByChatSessionId, stopSubmitStateByChatSessionId, responseStateByChatSessionId, fetchChatSessionHistoryByChatSessionId, masterTOSAcceptanceState, } = state.aiCfoViewState;
7
+ const { fetchState, error, uiState, createSessionState, createSessionAndSubmitState, deleteChatSessionStateByChatSessionId, stopSubmitStateByChatSessionId, responseStateByChatSessionId, fetchChatSessionHistoryByChatSessionId, masterTOSAcceptanceState, suggestedQuestionsByPageContext, } = state.aiCfoViewState;
7
8
  return {
8
9
  fetchState,
9
10
  error,
@@ -15,8 +16,12 @@ const getAiCfoView = (state) => {
15
16
  uiState,
16
17
  fetchChatSessionHistoryByChatSessionId,
17
18
  masterTOSAcceptanceState,
19
+ suggestedQuestionsByPageContext,
18
20
  ...(0, aiCfoSelector_1.getAiCfoSelectorView)(state.aiCfoState),
19
21
  version: 1,
20
22
  };
21
23
  };
22
24
  exports.getAiCfoView = getAiCfoView;
25
+ function getSuggestedQuestionsForPageContext(state, pageContext) {
26
+ return state.aiCfoViewState.suggestedQuestionsByPageContext[pageContext];
27
+ }
@@ -9,6 +9,8 @@ export interface AiCfoViewUIState {
9
9
  chatHistoryNextPageToken: {
10
10
  [chatSessionId: ID]: PageTokenState;
11
11
  };
12
+ /** Last focused chat session id per embedded page key (e.g. `dashboard`, `reports:profit_loss`). */
13
+ chatSessionIdByPageKey: Partial<Record<string, ID>>;
12
14
  chatSessionsFirstPageFetched: boolean;
13
15
  chatSessionsNextPageToken: PageTokenState;
14
16
  cotCollapsedByQuestionAnswerId: {
@@ -22,9 +24,27 @@ export interface AiCfoViewUIState {
22
24
  };
23
25
  agentId?: ID;
24
26
  currentChatSessionId?: ID;
27
+ /**
28
+ * When set, the embedded panel (e.g. dashboard/reports) is scoped to this **page key**;
29
+ * session ids are mirrored into {@link chatSessionIdByPageKey}. Full `/ai-cfo/...` should clear this.
30
+ */
31
+ embeddingActivePageKey?: string;
25
32
  lastContextMessage?: string;
26
33
  lastContextStatus?: ContextStatus;
27
34
  }
35
+ /**
36
+ * Supported `page_context` values for GET .../suggested-questions and related UI state.
37
+ */
38
+ export type AiCfoSuggestedQuestionsPageContext = 'balance_sheet' | 'profit_loss' | 'vendors' | 'transactions' | 'cash_flow' | 'accounts_receivable' | 'accounts_payable' | 'transaction_details';
39
+ /**
40
+ * Suggested starter questions for AI CFO for a given page slug (e.g. balance_sheet).
41
+ * Populated by {@link fetchSuggestedQuestionsEpic}; UI may fall back to Statsig defaults.
42
+ */
43
+ export interface SuggestedQuestionsForPageContext extends FetchStateAndError {
44
+ pageContext: AiCfoSuggestedQuestionsPageContext;
45
+ suggestedQuestions: string[];
46
+ generatedAt?: string;
47
+ }
28
48
  export interface AiCfoViewState extends FetchStateAndError {
29
49
  allChatSessionIds: ID[];
30
50
  createSessionAndSubmitState: FetchStateAndError;
@@ -39,5 +59,7 @@ export interface AiCfoViewState extends FetchStateAndError {
39
59
  thought: FetchStateAndError;
40
60
  }>;
41
61
  stopSubmitStateByChatSessionId: Record<ID, FetchStateAndError>;
62
+ /** Keyed by `page_context` query value (e.g. balance_sheet). */
63
+ suggestedQuestionsByPageContext: Partial<Record<AiCfoSuggestedQuestionsPageContext, SuggestedQuestionsForPageContext>>;
42
64
  uiState: AiCfoViewUIState;
43
65
  }
@@ -0,0 +1,8 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { RootState } from '../../../reducer';
4
+ import { ZeniAPI } from '../../../zeniAPI';
5
+ import { fetchSuggestedQuestions, fetchSuggestedQuestionsFailure, fetchSuggestedQuestionsSuccess } from '../aiCfoViewReducer';
6
+ export type ActionType = ReturnType<typeof fetchSuggestedQuestions> | ReturnType<typeof fetchSuggestedQuestionsSuccess> | ReturnType<typeof fetchSuggestedQuestionsFailure>;
7
+ /** GET {aiCfoMicroServiceBaseUrl}/1.0/suggested-questions?page_context=... */
8
+ export declare const fetchSuggestedQuestionsEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchSuggestedQuestionsEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../responsePayload");
7
+ const aiCfoViewReducer_1 = require("../aiCfoViewReducer");
8
+ /** GET {aiCfoMicroServiceBaseUrl}/1.0/suggested-questions?page_context=... */
9
+ const fetchSuggestedQuestionsEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(aiCfoViewReducer_1.fetchSuggestedQuestions.match), (0, operators_1.switchMap)((action) => {
10
+ const { pageContext } = action.payload;
11
+ const query = new URLSearchParams({ page_context: pageContext });
12
+ const url = `${zeniAPI.apiEndPoints.aiCfoMicroServiceBaseUrl}/1.0/suggested-questions?${query.toString()}`;
13
+ return zeniAPI.getJSON(url).pipe((0, operators_1.mergeMap)((response) => {
14
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
15
+ return (0, rxjs_1.of)((0, aiCfoViewReducer_1.fetchSuggestedQuestionsSuccess)({
16
+ pageContext: response.data.page_context,
17
+ generatedAt: response.data.generated_at,
18
+ suggestedQuestions: response.data.suggested_questions,
19
+ }));
20
+ }
21
+ return (0, rxjs_1.of)((0, aiCfoViewReducer_1.fetchSuggestedQuestionsFailure)({
22
+ pageContext,
23
+ error: response.status,
24
+ }));
25
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, aiCfoViewReducer_1.fetchSuggestedQuestionsFailure)({
26
+ pageContext,
27
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch suggested questions REST API call failed', error instanceof Error ? { message: error.message } : undefined),
28
+ }))));
29
+ }));
30
+ exports.fetchSuggestedQuestionsEpic = fetchSuggestedQuestionsEpic;
@@ -3,7 +3,7 @@ import { Status } from '../../commonStateTypes/status';
3
3
  import { View } from '../../commonStateTypes/viewAndReport/viewAndReport';
4
4
  import { ZeniDate } from '../../zeniDayJS';
5
5
  import { AuditSummary } from '../reviewCompanyView/reviewCompanyViewState';
6
- export declare const toAuditRuleEntityType: (v: string) => "dashboard" | "reports" | "transactions";
6
+ export declare const toAuditRuleEntityType: (v: string) => "dashboard" | "transactions" | "reports";
7
7
  export type AuditRuleEntityType = ReturnType<typeof toAuditRuleEntityType>;
8
8
  declare const toAuditRuleEntityIdType: (v: string) => "cash_balance" | "card_balance" | "expense_automation_card" | "operating_expenses" | "operating_expenses_by_classes" | "revenue" | "revenue_by_classes" | "net_burn_or_income" | "net_burn_or_income_story_card" | "net_burn_or_income_by_classes" | "cash_position" | "top_expenses" | "profit_and_loss" | "profit_and_loss_by_classes" | "balance_sheet" | "cash_flow" | "dashboard" | "finance_statement" | "transaction_list_of_account" | "transaction_list_missing_receipt" | "transaction_list_of_account_by_class" | "transaction_detail" | "cash_in_cash_out" | "insights_dashboard" | "company_details" | "class_list" | "account_list" | "account_list_by_type" | "vendor" | "task_card" | "bill_pay" | "reimbursement" | "bill_pay_card" | "reimbursement_card" | "bill_pay_promo_card" | "zeni_accounts" | "zeni_accounts_promo_card" | "zeni_treasury" | "charge_cards" | "other_connection" | "reimbursement_promo_card" | "onboarding" | "operating_expenses_by_vendor" | "operating_expenses_by_vendor_summary" | "vendors_tab" | "accounts_payable_aging" | "accounts_receivable_aging" | "vendor_global_review" | "prepaid_expenses" | "fixed_assets" | "notification" | "rewards_card" | "billing" | "flux_analysis_operating_expense" | "account_reconciliation" | "zeni_credit_promo_card" | "treasury_promo_card" | "uncategorized-expense" | "uncategorized-income";
9
9
  export type AuditRuleEntityIdType = ReturnType<typeof toAuditRuleEntityIdType>;
@@ -424,6 +424,14 @@ const getBillListOnSort = (sortKey, sortOrder, currentTab, transactions) => {
424
424
  transactionsWithNoSortKeyValue.push(transaction);
425
425
  }
426
426
  break;
427
+ case 'invoiceNumber':
428
+ if (transaction.documentId != null) {
429
+ transactionsWithSortKeyValue.push(transaction);
430
+ }
431
+ else {
432
+ transactionsWithNoSortKeyValue.push(transaction);
433
+ }
434
+ break;
427
435
  case 'dueDate':
428
436
  if (currentTab === 'draft') {
429
437
  if (Boolean(transaction.dueDate) === true) {
@@ -526,6 +534,8 @@ const getBillListOnSort = (sortKey, sortOrder, currentTab, transactions) => {
526
534
  return transaction.totalAmountInUSD?.amount ?? 0;
527
535
  case 'paymentMethod':
528
536
  return transaction.billPayInfo.billPaymentMethodType.name;
537
+ case 'invoiceNumber':
538
+ return transaction.documentId;
529
539
  }
530
540
  }, getColumnWiseSortOrder(sortOrder));
531
541
  return [
@@ -37,7 +37,7 @@ declare const toBillTabType: (v: string) => "paid" | "pending_approval" | "sched
37
37
  export type BillTab = ReturnType<typeof toBillTabType>;
38
38
  declare const toBillsSubTabType: (v: string) => "rejected" | "failed" | "ach" | "wire" | "cancelled" | "deleted" | "overdue" | "all" | "awaiting_approval" | "awaiting_my_approval" | "offline";
39
39
  export type BillsSubTabType = ReturnType<typeof toBillsSubTabType>;
40
- declare const toBillPaySortKeyType: (v: string) => "amount" | "status" | "name" | "dueDate" | "paymentMethod" | "invoiceDate";
40
+ declare const toBillPaySortKeyType: (v: string) => "amount" | "status" | "name" | "dueDate" | "paymentMethod" | "invoiceNumber" | "invoiceDate";
41
41
  export declare type BillPayViewSortKey = ReturnType<typeof toBillPaySortKeyType>;
42
42
  export interface BillPayFilters {
43
43
  categories: BillPayFilterCategory[];
@@ -47,6 +47,7 @@ const ALL_BILL_PAY_SORT_KEYS = [
47
47
  'invoiceDate',
48
48
  'name',
49
49
  'paymentMethod',
50
+ 'invoiceNumber',
50
51
  ];
51
52
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
52
53
  const toBillPaySortKeyType = (v) => (0, stringToUnion_1.stringToUnion)(v, ALL_BILL_PAY_SORT_KEYS);
@@ -61,7 +61,7 @@ export declare const initialCreditAcc: CreditAccount;
61
61
  export declare const initialDebitCardSummaries: DebitCardSummaries;
62
62
  export declare const initialResendRevokeCardInvite: ResendRevokeCardInvite;
63
63
  export declare const initialCreditAccountRepayment: CreditAccountRepayment;
64
- export declare const toChargeCardSortKeyType: (v: string) => "status" | "owner" | "cardName" | "limit" | "department" | "cardType" | "utilisation";
64
+ export declare const toChargeCardSortKeyType: (v: string) => "status" | "accountType" | "owner" | "cardName" | "limit" | "department" | "cardType" | "utilisation";
65
65
  export declare type ChargeCardViewSortKey = ReturnType<typeof toChargeCardSortKeyType>;
66
66
  export declare const ALL_CASHBACK_SORT_KEYS: readonly ["month", "cashback"];
67
67
  export declare const toCashbackSortKeyType: (v: string) => "month" | "cashback";
@@ -78,6 +78,7 @@ const ALL_CHARGE_CARD_SORT_KEYS = [
78
78
  'cardName',
79
79
  'department',
80
80
  'cardType',
81
+ 'accountType',
81
82
  'status',
82
83
  'utilisation',
83
84
  'limit',
@@ -233,6 +233,8 @@ const getCardsBySortKey = (card, sortKey) => {
233
233
  return card.cardName.toLowerCase();
234
234
  case 'cardType':
235
235
  return card.type.code;
236
+ case 'accountType':
237
+ return card.type.code.includes('credit') ? 'credit' : 'debit';
236
238
  case 'status':
237
239
  return card.status.code;
238
240
  case 'utilisation':
@@ -42,6 +42,7 @@ export interface ReimbursementView extends Reimbursement {
42
42
  approvers: Approvers;
43
43
  submittedBy: User | undefined;
44
44
  bulkSelectInfo?: RemiBulkSelectInfo;
45
+ createdByUser?: User;
45
46
  }
46
47
  export declare const getRemiList: (state: RootState, currentTimePeriod: TimePeriod, isBulkActionFeatureEnabled: boolean) => RemiListReport;
47
48
  export declare const getApproversOrRejectors: (reimbursement: Reimbursement, entityApprovalStatusState: EntityApprovalStatusState, userState: UserState) => Approvers;
@@ -51,6 +51,7 @@ const getRemiList = (state, currentTimePeriod, isBulkActionFeatureEnabled) => {
51
51
  return {
52
52
  ...reimbursement,
53
53
  submittedBy: (0, userSelector_1.getUserByUserId)(userState, reimbursement.reimburseeUserId),
54
+ createdByUser: (0, userSelector_1.getUserByUserId)(userState, reimbursement.createdBy),
54
55
  approvers: approvers,
55
56
  };
56
57
  });
@@ -423,6 +424,14 @@ const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements) => {
423
424
  reimbursementsWithNoSortKeyValue.push(reimbursement);
424
425
  }
425
426
  break;
427
+ case 'createdBy':
428
+ if (reimbursement.createdByUser != null) {
429
+ reimbursementsWithSortKeyValue.push(reimbursement);
430
+ }
431
+ else {
432
+ reimbursementsWithNoSortKeyValue.push(reimbursement);
433
+ }
434
+ break;
426
435
  }
427
436
  });
428
437
  const getColumnWiseSortOrder = (sortOrder) => {
@@ -430,6 +439,7 @@ const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements) => {
430
439
  case 'reportName':
431
440
  case 'type':
432
441
  case 'status':
442
+ case 'createdBy':
433
443
  return sortOrder === 'ascending' ? 'asc' : 'desc';
434
444
  default:
435
445
  return sortOrder === 'ascending' ? 'desc' : 'asc';
@@ -449,6 +459,8 @@ const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements) => {
449
459
  return getStatusPerTab(reimbursement);
450
460
  case 'amount':
451
461
  return reimbursement.amount.amount ?? 0;
462
+ case 'createdBy':
463
+ return `${reimbursement.createdByUser?.firstName ?? ''} ${reimbursement.createdByUser?.lastName ?? ''}`.toLowerCase();
452
464
  }
453
465
  }, getColumnWiseSortOrder(sortOrder));
454
466
  return [
@@ -38,7 +38,7 @@ export declare const toRemiSubTabTypeStrict: (v: string) => "rejected" | "failed
38
38
  export type RemiSubTabType = ReturnType<typeof toRemiSubTabType>;
39
39
  export declare const toRemiSubTabUnderScoreType: (v: string) => "rejected" | "failed" | "ach" | "wire" | "cancelled" | "deleted" | "overdue" | "all" | "awaiting_approval" | "awaiting_my_approval" | "my_drafts" | "awaiting_all_approval";
40
40
  export type RemiSubTabUnderScoreType = ReturnType<typeof toRemiSubTabUnderScoreType>;
41
- declare const toReimbursementSortKeyType: (v: string) => "amount" | "status" | "type" | "submittedOn" | "reportName";
41
+ declare const toReimbursementSortKeyType: (v: string) => "amount" | "status" | "type" | "createdBy" | "submittedOn" | "reportName";
42
42
  export type ReimbursementViewSortKey = ReturnType<typeof toReimbursementSortKeyType>;
43
43
  export interface ReimbursementFilters {
44
44
  categories: ReimbursementFilterCategory[];
@@ -64,6 +64,7 @@ exports.toRemiSubTabUnderScoreType = toRemiSubTabUnderScoreType;
64
64
  const ALL_REIMBURSEMENT_SORT_KEYS = [
65
65
  'reportName',
66
66
  'submittedOn',
67
+ 'createdBy',
67
68
  'type',
68
69
  'status',
69
70
  'amount',
@@ -98,11 +98,11 @@ exports.allTaskStatus = [
98
98
  },
99
99
  {
100
100
  code: 'done',
101
- name: 'Done',
101
+ name: 'In Review',
102
102
  },
103
103
  {
104
104
  code: 'resolved',
105
- name: 'Resolved',
105
+ name: 'Complete',
106
106
  },
107
107
  ];
108
108
  exports.allTaskPriority = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "4.19.86",
3
+ "version": "4.19.87-beta1AD",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",