@bcrumbs.net/inbox 0.0.74 → 0.0.76

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 (36) hide show
  1. package/assets/ar/inbox.json +17 -0
  2. package/assets/en/inbox.json +9 -0
  3. package/e2e/qa/qa.api.d.ts +22 -0
  4. package/e2e/qa/qa.flows.d.ts +46 -0
  5. package/e2e/support/cleanup.d.ts +1 -0
  6. package/e2e/support/config.d.ts +2 -0
  7. package/e2e/support/index.d.ts +2 -2
  8. package/index.cjs.js +987 -284
  9. package/index.esm.js +988 -285
  10. package/package.json +3 -3
  11. package/src/app/ai/components/qa/QaEmptyState.d.ts +5 -0
  12. package/src/app/ai/components/qa/QaFormDialog.d.ts +16 -0
  13. package/src/app/ai/components/qa/QaLinkToastTitle.d.ts +8 -0
  14. package/src/app/ai/components/qa/QaTable.d.ts +10 -0
  15. package/src/app/ai/components/qa/SavedAsQaToastTitle.d.ts +6 -0
  16. package/src/app/ai/hooks/useOpenQaFromLink.d.ts +6 -0
  17. package/src/app/ai/hooks/useQaActions.d.ts +10 -0
  18. package/src/app/ai/hooks/useQaColumns.d.ts +15 -0
  19. package/src/app/ai/hooks/useQaDuplicateCheck.d.ts +8 -0
  20. package/src/app/ai/hooks/useSaveMessageAsQa.d.ts +17 -0
  21. package/src/app/ai/pages/QaPage.d.ts +2 -0
  22. package/src/app/ai/types/index.d.ts +9 -0
  23. package/src/app/ai/utils/crumbyChatTransport.d.ts +6 -0
  24. package/src/app/ai/utils/qa.d.ts +3 -0
  25. package/src/app/ai/utils/qaLink.d.ts +3 -0
  26. package/src/app/ai/utils/toolInputDeltaGuard.d.ts +10 -0
  27. package/src/app/auth/pages/CheckAuth.d.ts +2 -1
  28. package/src/app/gatewayHome/hooks/useGatewaySetup.d.ts +2 -0
  29. package/src/app/inbox/components/Chat/ChatContent.d.ts +1 -0
  30. package/src/app/inbox/components/NewConvList/ConvLimitNotice.d.ts +6 -0
  31. package/src/app/inbox/components/NewConvList/HeaderSection.d.ts +4 -1
  32. package/src/app/inbox/components/NewConvList/index.d.ts +3 -1
  33. package/src/app/inbox/hooks/useConvLimitToast.d.ts +6 -0
  34. package/src/app/inbox/hooks/useConversationsPerodicFetch.d.ts +2 -0
  35. package/src/assets/locales/translations.d.ts +64 -0
  36. package/src/graphql.autogenerated.d.ts +51 -11
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bcrumbs.net/inbox",
3
3
  "description": "Inbox widget for Bread Crumbs portals",
4
- "version": "0.0.74",
4
+ "version": "0.0.76",
5
5
  "keyword": [
6
6
  "bcrumbs",
7
7
  "bc-ui",
@@ -24,8 +24,8 @@
24
24
  "graphql": "^15.4.0"
25
25
  },
26
26
  "dependencies": {
27
- "@bcrumbs.net/bc-shared": "^0.0.11",
28
- "@bcrumbs.net/bc-ui": "^0.0.17",
27
+ "@bcrumbs.net/bc-shared": "^0.0.12",
28
+ "@bcrumbs.net/bc-ui": "^0.0.18",
29
29
  "@bcrumbs.net/bc-api": "^0.0.49",
30
30
  "@azure/storage-blob": "^12.25.0"
31
31
  },
@@ -0,0 +1,5 @@
1
+ type QaEmptyStateProps = {
2
+ onAdd: () => void;
3
+ };
4
+ declare const QaEmptyState: ({ onAdd }: QaEmptyStateProps) => import("@emotion/react/jsx-runtime").JSX.Element;
5
+ export default QaEmptyState;
@@ -0,0 +1,16 @@
1
+ import { QaEntry } from '../../../../graphql.autogenerated';
2
+ import { QaFormValues } from '../../types';
3
+ type QaFormDialogProps = {
4
+ isOpen: boolean;
5
+ qa?: QaEntry | null;
6
+ /** Pre-fills the Question field when adding a new entry (e.g. a customer message from the Inbox) */
7
+ initialQuestion?: string;
8
+ /** Hides the Publish switch: the entry is published when it has an answer, otherwise saved as Draft */
9
+ autoPublish?: boolean;
10
+ title?: string;
11
+ saving: boolean;
12
+ onClose: () => void;
13
+ onSubmit: (values: QaFormValues) => void;
14
+ };
15
+ declare const QaFormDialog: ({ isOpen, qa, initialQuestion, autoPublish, title, saving, onClose, onSubmit, }: QaFormDialogProps) => import("@emotion/react/jsx-runtime").JSX.Element;
16
+ export default QaFormDialog;
@@ -0,0 +1,8 @@
1
+ type QaLinkToastTitleProps = {
2
+ /** Text shown before the "Q&A" link, e.g. "Question saved successfully as a". */
3
+ text: string;
4
+ onOpenQa: () => void;
5
+ };
6
+ /** Toast title ending with a clickable "Q&A" link. */
7
+ declare const QaLinkToastTitle: ({ text, onOpenQa }: QaLinkToastTitleProps) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ export default QaLinkToastTitle;
@@ -0,0 +1,10 @@
1
+ import { QaEntry } from '../../../../graphql.autogenerated';
2
+ type QaTableProps = {
3
+ qaEntries: QaEntry[];
4
+ loading: boolean;
5
+ onEdit: (qa: QaEntry) => void;
6
+ onTogglePublish: (qa: QaEntry, publish: boolean) => void;
7
+ onDelete: (qa: QaEntry) => void;
8
+ };
9
+ declare const QaTable: ({ qaEntries, loading, onEdit, onTogglePublish, onDelete }: QaTableProps) => import("@emotion/react/jsx-runtime").JSX.Element;
10
+ export default QaTable;
@@ -0,0 +1,6 @@
1
+ type SavedAsQaToastTitleProps = {
2
+ onOpenQa: () => void;
3
+ };
4
+ /** Toast title for a question saved as a draft: "Question saved successfully as a Q&A" (Q&A is a link). */
5
+ declare const SavedAsQaToastTitle: ({ onOpenQa }: SavedAsQaToastTitleProps) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ export default SavedAsQaToastTitle;
@@ -0,0 +1,6 @@
1
+ import { QaEntry } from '../../../graphql.autogenerated';
2
+ /**
3
+ * Opens the entry referenced by `?qaId=` (see `getQaEntryLink`) once the list has it,
4
+ * then drops the param so closing the dialog does not reopen it.
5
+ */
6
+ export declare const useOpenQaFromLink: (qaEntries: QaEntry[], openEdit: (qa: QaEntry) => void) => void;
@@ -0,0 +1,10 @@
1
+ import { QaEntry } from '../../../graphql.autogenerated';
2
+ import { QaFormValues } from '../types';
3
+ export declare const useQaActions: (onChanged: () => void) => {
4
+ create: any;
5
+ update: (qa: QaEntry, values: QaFormValues) => Promise<boolean>;
6
+ setPublished: (qa: QaEntry, publish: boolean) => Promise<void>;
7
+ remove: (qa: QaEntry) => Promise<void>;
8
+ saving: boolean;
9
+ deleting: boolean;
10
+ };
@@ -0,0 +1,15 @@
1
+ import { CustomColumn, TableAction } from '@bcrumbs.net/bc-ui';
2
+ import { QaEntry } from '../../../graphql.autogenerated';
3
+ type UseQaColumnsParams = {
4
+ onEdit: (qa: QaEntry) => void;
5
+ onTogglePublish: (qa: QaEntry, publish: boolean) => void;
6
+ onDelete: (qa: QaEntry) => void;
7
+ onSortChange: (field: string) => void;
8
+ currentSortField?: string;
9
+ currentSortDirection?: 'asc' | 'desc';
10
+ };
11
+ export declare const useQaColumns: ({ onEdit, onTogglePublish, onDelete, onSortChange, currentSortField, currentSortDirection, }: UseQaColumnsParams) => {
12
+ columns: CustomColumn[];
13
+ actions: TableAction[];
14
+ };
15
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Asks the bot service whether a similar question is already saved and, if so, warns the agent
3
+ * with a link to the existing entry. `excludeId` skips the entry being edited so it never matches itself.
4
+ */
5
+ export declare const useQaDuplicateCheck: () => {
6
+ isDuplicate: any;
7
+ checking: boolean;
8
+ };
@@ -0,0 +1,17 @@
1
+ export type QaMessageCandidate = {
2
+ conversationId: string;
3
+ messageId: string;
4
+ content: string;
5
+ };
6
+ /**
7
+ * Drives the "Save as Q&A" dialog in the Inbox: the customer message pre-fills the Question,
8
+ * and the entry is published when the agent writes an answer, otherwise saved as Draft.
9
+ */
10
+ export declare const useSaveMessageAsQa: () => {
11
+ isSaveAsQaOpen: boolean;
12
+ initialQuestion: string;
13
+ openSaveAsQa: (message: QaMessageCandidate) => void;
14
+ closeSaveAsQa: () => void;
15
+ submitSaveAsQa: any;
16
+ saving: boolean;
17
+ };
@@ -0,0 +1,2 @@
1
+ declare const QaPage: () => import("@emotion/react/jsx-runtime").JSX.Element;
2
+ export default QaPage;
@@ -72,3 +72,12 @@ export interface TextItem {
72
72
  export interface TextTableFilters {
73
73
  search: string;
74
74
  }
75
+ export interface QaFormValues {
76
+ question: string;
77
+ answer: string;
78
+ publish: boolean;
79
+ }
80
+ export interface QaInboxSource {
81
+ conversationId: string;
82
+ messageId: string;
83
+ }
@@ -0,0 +1,6 @@
1
+ import type { UIMessage } from 'ai';
2
+ import { AssistantChatTransport } from '@assistant-ui/react-ai-sdk';
3
+ /** Chat transport for Crumby: guards streamed tool args so the chat runtime never sees them shrink. */
4
+ export declare class CrumbyChatTransport<UI_MESSAGE extends UIMessage = UIMessage> extends AssistantChatTransport<UI_MESSAGE> {
5
+ protected processResponseStream(stream: ReadableStream<Uint8Array>): ReadableStream<import("ai").UIMessageChunk>;
6
+ }
@@ -0,0 +1,3 @@
1
+ import { QaEntry } from '../../../graphql.autogenerated';
2
+ export declare const hasAnswer: (answer?: string | null) => boolean;
3
+ export declare const filterQaEntries: (qaEntries: QaEntry[], query: string) => QaEntry[];
@@ -0,0 +1,3 @@
1
+ export declare const QA_ENTRY_QUERY_PARAM = "qaId";
2
+ /** Link to the Q&A page that opens the given entry for editing */
3
+ export declare const getQaEntryLink: (id: string) => string;
@@ -0,0 +1,10 @@
1
+ import { type UIMessageChunk } from 'ai';
2
+ /**
3
+ * Holds back tool-input deltas until the streamed args text parses again.
4
+ *
5
+ * The AI SDK re-parses the partial args after every delta and sets the input to `undefined` when the
6
+ * parse fails (e.g. a chunk ends inside a `\uXXXX` escape). assistant-ui then sees the args text
7
+ * shrink to `{` and throws "argsText can only be appended". Merging such a delta into the next one
8
+ * keeps every snapshot a prefix of the next.
9
+ */
10
+ export declare const createToolInputDeltaGuard: () => TransformStream<UIMessageChunk, UIMessageChunk>;
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Public entry from marketing pricing CTAs (?planType=...).
3
3
  * Verifies the session via currentUser, then:
4
- * - authenticated + plan intent → upgrade flow (auto Polar/Stripe checkout)
4
+ * - authenticated + Gateway intent → new workspace flow (Gateway is activated once it is named)
5
+ * - authenticated + other plan intent → upgrade flow (auto Polar/Stripe checkout)
5
6
  * - authenticated + no plan intent → inbox
6
7
  * - guest + plan intent → register with planType preserved
7
8
  * - guest + no plan intent → login
@@ -39,6 +39,8 @@ export declare function useGatewaySetup(workspaceId: number): {
39
39
  type: import("../../../graphql.autogenerated").IntegrationType;
40
40
  properties?: any;
41
41
  state: IntegrationState;
42
+ disconnectionReason?: import("../../../graphql.autogenerated").IntegrationDisconnectionReason | null | undefined;
43
+ disconnectedAt?: any;
42
44
  createdAt: any;
43
45
  deletedAt?: any;
44
46
  patchedAt?: any;
@@ -21,6 +21,7 @@ interface ChatContentProps {
21
21
  content: string;
22
22
  id: string;
23
23
  type: MessageType;
24
+ isAgent?: boolean;
24
25
  } | null;
25
26
  onCancelReplyMessage: () => void;
26
27
  errorMessage: string;
@@ -0,0 +1,6 @@
1
+ type ConvLimitNoticeProps = {
2
+ onSearch: () => void;
3
+ };
4
+ /** Shown at the end of the conversation list when older conversations were cut off by the fetch limit. */
5
+ declare const ConvLimitNotice: ({ onSearch }: ConvLimitNoticeProps) => import("@emotion/react/jsx-runtime").JSX.Element;
6
+ export default ConvLimitNotice;
@@ -1,5 +1,6 @@
1
1
  import { ActionItem } from '@bcrumbs.net/bc-ui';
2
2
  import { ConvsFilters } from '../../utils/convs';
3
+ import { RefObject } from 'react';
3
4
  interface HeaderSectionProps {
4
5
  agentsMenu: ActionItem[];
5
6
  lifeCycleMenu: ActionItem[];
@@ -12,6 +13,8 @@ interface HeaderSectionProps {
12
13
  isTestVariant?: boolean;
13
14
  isDrawerOpen?: boolean;
14
15
  onFilterDrawerOpen?: () => void;
16
+ /** Wraps the search box so the parent can focus its input. */
17
+ searchRef?: RefObject<HTMLDivElement>;
15
18
  }
16
- declare const HeaderSection: ({ agentsMenu, lifeCycleMenu, channelsMenu, tagsMenu, filters, onFiltersChange, setShowStartConv, canStartConversation, isTestVariant, isDrawerOpen, onFilterDrawerOpen, }: HeaderSectionProps) => import("@emotion/react/jsx-runtime").JSX.Element;
19
+ declare const HeaderSection: ({ agentsMenu, lifeCycleMenu, channelsMenu, tagsMenu, filters, onFiltersChange, setShowStartConv, canStartConversation, isTestVariant, isDrawerOpen, onFilterDrawerOpen, searchRef, }: HeaderSectionProps) => import("@emotion/react/jsx-runtime").JSX.Element;
17
20
  export default HeaderSection;
@@ -21,6 +21,8 @@ interface NewConvListProps {
21
21
  isTestVariant?: boolean;
22
22
  isDrawerOpen?: boolean;
23
23
  onFilterDrawerOpen?: () => void;
24
+ /** The fetch hit the conversations limit, so older conversations are not listed. */
25
+ showLimitNotice?: boolean;
24
26
  }
25
- declare const NewConvList: ({ agents, convStages, conversationTags, convs, loading, selectedConvId, convClicked, onConvEnd, filters, onFiltersChange, setShowStartConv, canStartConversation, aiAgents, integrations, scrollContainerRef, isTestVariant, isDrawerOpen, onFilterDrawerOpen, }: NewConvListProps) => import("@emotion/react/jsx-runtime").JSX.Element;
27
+ declare const NewConvList: ({ agents, convStages, conversationTags, convs, loading, selectedConvId, convClicked, onConvEnd, filters, onFiltersChange, setShowStartConv, canStartConversation, aiAgents, integrations, scrollContainerRef, isTestVariant, isDrawerOpen, onFilterDrawerOpen, showLimitNotice, }: NewConvListProps) => import("@emotion/react/jsx-runtime").JSX.Element;
26
28
  export default NewConvList;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shows a toast once per Inbox visit when the conversations fetch hit CONVERSATIONS_LIMIT.
3
+ * It has no timer: it stays until the user closes it.
4
+ */
5
+ declare function useConvLimitToast(hasMore: boolean): void;
6
+ export default useConvLimitToast;
@@ -106,6 +106,8 @@ declare function useConversationsPeriodicFetch(selectedConvId?: string, onSelect
106
106
  createdAt: any;
107
107
  }[] | null | undefined;
108
108
  }[] | null | undefined;
109
+ /** More conversations exist beyond CONVERSATIONS_LIMIT. */
110
+ hasMore: boolean;
109
111
  loading: boolean;
110
112
  refetch: () => void;
111
113
  };
@@ -41,6 +41,7 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
41
41
  register: string;
42
42
  loginFailed: string;
43
43
  incorrectPassword: string;
44
+ incorrectCredentials: string;
44
45
  registerFailed: string;
45
46
  invitationLinkNotExists: string;
46
47
  invitationInvalid: string;
@@ -1717,6 +1718,69 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
1717
1718
  test_numbers: string;
1718
1719
  suggested_qs: string;
1719
1720
  crumby_settings: string;
1721
+ qa_menu: string;
1722
+ qa: {
1723
+ title: string;
1724
+ subtitle: string;
1725
+ addQuestion: string;
1726
+ editQuestion: string;
1727
+ saveAsQa: string;
1728
+ searchPlaceholder: string;
1729
+ noSearchResults: string;
1730
+ loadFailed: string;
1731
+ qaLink: string;
1732
+ columns: {
1733
+ question: string;
1734
+ answer: string;
1735
+ source: string;
1736
+ status: string;
1737
+ createDate: string;
1738
+ };
1739
+ source: {
1740
+ INBOX: string;
1741
+ MANUAL: string;
1742
+ };
1743
+ status: {
1744
+ PUBLISHED: string;
1745
+ DRAFT: string;
1746
+ };
1747
+ form: {
1748
+ question: string;
1749
+ questionPlaceholder: string;
1750
+ answer: string;
1751
+ answerPlaceholder: string;
1752
+ publish: string;
1753
+ publishHint: string;
1754
+ autoPublishHint: string;
1755
+ };
1756
+ actions: {
1757
+ edit: string;
1758
+ publish: string;
1759
+ unpublish: string;
1760
+ delete: string;
1761
+ };
1762
+ delete: {
1763
+ title: string;
1764
+ description: string;
1765
+ confirm: string;
1766
+ };
1767
+ empty: {
1768
+ title: string;
1769
+ subtitle: string;
1770
+ };
1771
+ toast: {
1772
+ added: string;
1773
+ updated: string;
1774
+ published: string;
1775
+ unpublished: string;
1776
+ deleted: string;
1777
+ savedAsQa: string;
1778
+ duplicate: string;
1779
+ saveFailed: string;
1780
+ publishFailed: string;
1781
+ deleteFailed: string;
1782
+ };
1783
+ };
1720
1784
  upgrade: {
1721
1785
  cta: string;
1722
1786
  contactAdminTitle: string;
@@ -2302,6 +2302,10 @@ export type Integration = {
2302
2302
  callingEnabled?: Maybe<Scalars['Boolean']['output']>;
2303
2303
  createdAt: Scalars['DateTime']['output'];
2304
2304
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
2305
+ /** When the integration went DISCONNECTED. Null otherwise, and for channels disconnected before this was tracked. */
2306
+ disconnectedAt?: Maybe<Scalars['DateTime']['output']>;
2307
+ /** Why the integration is DISCONNECTED. Null otherwise. */
2308
+ disconnectionReason?: Maybe<IntegrationDisconnectionReason>;
2305
2309
  /** The id of the integration. */
2306
2310
  id: Scalars['ID']['output'];
2307
2311
  /** The integration identifier. */
@@ -2330,6 +2334,20 @@ export type IntegrationDeleteInput = {
2330
2334
  id: Scalars['ID']['input'];
2331
2335
  workspaceId: Scalars['Int']['input'];
2332
2336
  };
2337
+ /**
2338
+ * IntegrationDisconnectionReason explains why an integration is DISCONNECTED.
2339
+ * - TOKEN_INVALID: The access token expired or was invalidated.
2340
+ * - PERMISSION_REVOKED: The business removed the permissions granted to our app.
2341
+ * - NUMBER_UNREGISTERED: The phone number is no longer registered or reachable with this access.
2342
+ * - APP_UNSUBSCRIBED: Our app is no longer subscribed to the WhatsApp Business Account, so no webhooks arrive.
2343
+ */
2344
+ export declare const IntegrationDisconnectionReason: {
2345
+ readonly APP_UNSUBSCRIBED: "APP_UNSUBSCRIBED";
2346
+ readonly NUMBER_UNREGISTERED: "NUMBER_UNREGISTERED";
2347
+ readonly PERMISSION_REVOKED: "PERMISSION_REVOKED";
2348
+ readonly TOKEN_INVALID: "TOKEN_INVALID";
2349
+ };
2350
+ export type IntegrationDisconnectionReason = typeof IntegrationDisconnectionReason[keyof typeof IntegrationDisconnectionReason];
2333
2351
  /** IntegrationInput is an input for the integration. */
2334
2352
  export type IntegrationInput = {
2335
2353
  id: Scalars['ID']['input'];
@@ -2354,10 +2372,12 @@ export type IntegrationProperties = {
2354
2372
  * - ACTIVE: The integration is active.
2355
2373
  * - PENDING: The integration is pending.
2356
2374
  * - DELETED: The integration is deleted.
2375
+ * - DISCONNECTED: The provider (Meta) cut the channel off; see disconnectionReason. Reconnecting returns it to ACTIVE.
2357
2376
  */
2358
2377
  export declare const IntegrationState: {
2359
2378
  readonly ACTIVE: "ACTIVE";
2360
2379
  readonly DELETED: "DELETED";
2380
+ readonly DISCONNECTED: "DISCONNECTED";
2361
2381
  readonly PENDING: "PENDING";
2362
2382
  };
2363
2383
  export type IntegrationState = typeof IntegrationState[keyof typeof IntegrationState];
@@ -2387,6 +2407,8 @@ export type IntegrationWithSecrets = {
2387
2407
  __typename?: 'IntegrationWithSecrets';
2388
2408
  createdAt: Scalars['DateTime']['output'];
2389
2409
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
2410
+ disconnectedAt?: Maybe<Scalars['DateTime']['output']>;
2411
+ disconnectionReason?: Maybe<IntegrationDisconnectionReason>;
2390
2412
  id: Scalars['ID']['output'];
2391
2413
  identifier?: Maybe<Scalars['String']['output']>;
2392
2414
  integrationProperties: Scalars['JSON']['output'];
@@ -2403,6 +2425,8 @@ export type IntegrationsInput = {
2403
2425
  name?: InputMaybe<Scalars['String']['input']>;
2404
2426
  /** The state of the integration. Used for filtering. */
2405
2427
  state?: InputMaybe<IntegrationState>;
2428
+ /** Any of these states. Used for filtering; takes precedence over state. */
2429
+ states?: InputMaybe<Array<IntegrationState>>;
2406
2430
  /** The type of the integration. Used for filtering. */
2407
2431
  type?: InputMaybe<IntegrationType>;
2408
2432
  workspaceId: Scalars['Int']['input'];
@@ -3435,11 +3459,14 @@ export declare const Permission: {
3435
3459
  };
3436
3460
  export type Permission = typeof Permission[keyof typeof Permission];
3437
3461
  export type QaCreateInput = {
3438
- answer: Scalars['String']['input'];
3462
+ /** Required unless status is DRAFT. */
3463
+ answer?: InputMaybe<Scalars['String']['input']>;
3439
3464
  conversationId?: InputMaybe<Scalars['String']['input']>;
3440
3465
  messageId?: InputMaybe<Scalars['String']['input']>;
3441
3466
  origin: QaOrigin;
3442
3467
  question: Scalars['String']['input'];
3468
+ /** Defaults to PUBLISHED. */
3469
+ status?: InputMaybe<QaStatus>;
3443
3470
  workspaceId: Scalars['Int']['input'];
3444
3471
  };
3445
3472
  export type QaEntriesInput = {
@@ -3453,7 +3480,7 @@ export type QaEntriesPayload = {
3453
3480
  };
3454
3481
  export type QaEntry = {
3455
3482
  __typename?: 'QaEntry';
3456
- answer: Scalars['String']['output'];
3483
+ answer?: Maybe<Scalars['String']['output']>;
3457
3484
  conversationId?: Maybe<Scalars['String']['output']>;
3458
3485
  createdAt: Scalars['DateTime']['output'];
3459
3486
  id: Scalars['ID']['output'];
@@ -3479,7 +3506,8 @@ export declare const QaStatus: {
3479
3506
  };
3480
3507
  export type QaStatus = typeof QaStatus[keyof typeof QaStatus];
3481
3508
  export type QaUpdateInput = {
3482
- answer: Scalars['String']['input'];
3509
+ /** Required while the entry is PUBLISHED. */
3510
+ answer?: InputMaybe<Scalars['String']['input']>;
3483
3511
  id: Scalars['ID']['input'];
3484
3512
  question: Scalars['String']['input'];
3485
3513
  workspaceId: Scalars['Int']['input'];
@@ -4687,7 +4715,7 @@ export type QaEntryFieldsFragment = {
4687
4715
  workspaceId: number;
4688
4716
  id: string;
4689
4717
  question: string;
4690
- answer: string;
4718
+ answer?: string | null;
4691
4719
  status: QaStatus;
4692
4720
  origin: QaOrigin;
4693
4721
  messageId?: string | null;
@@ -4880,7 +4908,7 @@ export type CreateQaMutation = {
4880
4908
  workspaceId: number;
4881
4909
  id: string;
4882
4910
  question: string;
4883
- answer: string;
4911
+ answer?: string | null;
4884
4912
  status: QaStatus;
4885
4913
  origin: QaOrigin;
4886
4914
  messageId?: string | null;
@@ -4967,7 +4995,7 @@ export type DeleteQaMutation = {
4967
4995
  workspaceId: number;
4968
4996
  id: string;
4969
4997
  question: string;
4970
- answer: string;
4998
+ answer?: string | null;
4971
4999
  status: QaStatus;
4972
5000
  origin: QaOrigin;
4973
5001
  messageId?: string | null;
@@ -5069,7 +5097,7 @@ export type PublishQaMutation = {
5069
5097
  workspaceId: number;
5070
5098
  id: string;
5071
5099
  question: string;
5072
- answer: string;
5100
+ answer?: string | null;
5073
5101
  status: QaStatus;
5074
5102
  origin: QaOrigin;
5075
5103
  messageId?: string | null;
@@ -5090,7 +5118,7 @@ export type QaEntriesQuery = {
5090
5118
  workspaceId: number;
5091
5119
  id: string;
5092
5120
  question: string;
5093
- answer: string;
5121
+ answer?: string | null;
5094
5122
  status: QaStatus;
5095
5123
  origin: QaOrigin;
5096
5124
  messageId?: string | null;
@@ -5112,7 +5140,7 @@ export type SimilarQaQuery = {
5112
5140
  workspaceId: number;
5113
5141
  id: string;
5114
5142
  question: string;
5115
- answer: string;
5143
+ answer?: string | null;
5116
5144
  status: QaStatus;
5117
5145
  origin: QaOrigin;
5118
5146
  messageId?: string | null;
@@ -5196,7 +5224,7 @@ export type UnpublishQaMutation = {
5196
5224
  workspaceId: number;
5197
5225
  id: string;
5198
5226
  question: string;
5199
- answer: string;
5227
+ answer?: string | null;
5200
5228
  status: QaStatus;
5201
5229
  origin: QaOrigin;
5202
5230
  messageId?: string | null;
@@ -5215,7 +5243,7 @@ export type UpdateQaMutation = {
5215
5243
  workspaceId: number;
5216
5244
  id: string;
5217
5245
  question: string;
5218
- answer: string;
5246
+ answer?: string | null;
5219
5247
  status: QaStatus;
5220
5248
  origin: QaOrigin;
5221
5249
  messageId?: string | null;
@@ -8693,6 +8721,8 @@ export type IntegrationFragment = {
8693
8721
  type: IntegrationType;
8694
8722
  properties?: any | null;
8695
8723
  state: IntegrationState;
8724
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8725
+ disconnectedAt?: any | null;
8696
8726
  createdAt: any;
8697
8727
  deletedAt?: any | null;
8698
8728
  patchedAt?: any | null;
@@ -8780,6 +8810,8 @@ export type CreateIntegrationMutation = {
8780
8810
  type: IntegrationType;
8781
8811
  properties?: any | null;
8782
8812
  state: IntegrationState;
8813
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8814
+ disconnectedAt?: any | null;
8783
8815
  createdAt: any;
8784
8816
  deletedAt?: any | null;
8785
8817
  patchedAt?: any | null;
@@ -8845,6 +8877,8 @@ export type DeleteIntegrationMutation = {
8845
8877
  type: IntegrationType;
8846
8878
  properties?: any | null;
8847
8879
  state: IntegrationState;
8880
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8881
+ disconnectedAt?: any | null;
8848
8882
  createdAt: any;
8849
8883
  deletedAt?: any | null;
8850
8884
  patchedAt?: any | null;
@@ -8911,6 +8945,8 @@ export type IntegrationQuery = {
8911
8945
  type: IntegrationType;
8912
8946
  properties?: any | null;
8913
8947
  state: IntegrationState;
8948
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8949
+ disconnectedAt?: any | null;
8914
8950
  createdAt: any;
8915
8951
  deletedAt?: any | null;
8916
8952
  patchedAt?: any | null;
@@ -8933,6 +8969,8 @@ export type IntegrationsQuery = {
8933
8969
  type: IntegrationType;
8934
8970
  properties?: any | null;
8935
8971
  state: IntegrationState;
8972
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8973
+ disconnectedAt?: any | null;
8936
8974
  createdAt: any;
8937
8975
  deletedAt?: any | null;
8938
8976
  patchedAt?: any | null;
@@ -8954,6 +8992,8 @@ export type PatchIntegrationMutation = {
8954
8992
  type: IntegrationType;
8955
8993
  properties?: any | null;
8956
8994
  state: IntegrationState;
8995
+ disconnectionReason?: IntegrationDisconnectionReason | null;
8996
+ disconnectedAt?: any | null;
8957
8997
  createdAt: any;
8958
8998
  deletedAt?: any | null;
8959
8999
  patchedAt?: any | null;