@ikatec/digisac-api-sdk 4.5.0 → 4.6.0

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 (123) hide show
  1. package/README.md +5 -3
  2. package/dist/apis/answers/AnswersApi.cjs +38 -0
  3. package/dist/apis/answers/AnswersApi.cjs.map +1 -1
  4. package/dist/apis/answers/AnswersApi.d.ts +33 -2
  5. package/dist/apis/answers/AnswersApi.d.ts.map +1 -1
  6. package/dist/apis/answers/AnswersApi.mjs +38 -0
  7. package/dist/apis/answers/AnswersApi.mjs.map +1 -1
  8. package/dist/apis/answers/types.d.ts +64 -1
  9. package/dist/apis/answers/types.d.ts.map +1 -1
  10. package/dist/apis/botSimulators/BotSimulatorsApi.cjs +42 -0
  11. package/dist/apis/botSimulators/BotSimulatorsApi.cjs.map +1 -0
  12. package/dist/apis/botSimulators/BotSimulatorsApi.d.ts +31 -0
  13. package/dist/apis/botSimulators/BotSimulatorsApi.d.ts.map +1 -0
  14. package/dist/apis/botSimulators/BotSimulatorsApi.mjs +41 -0
  15. package/dist/apis/botSimulators/BotSimulatorsApi.mjs.map +1 -0
  16. package/dist/apis/botSimulators/index.cjs +4 -0
  17. package/dist/apis/botSimulators/index.d.ts +3 -0
  18. package/dist/apis/botSimulators/index.d.ts.map +1 -0
  19. package/dist/apis/botSimulators/index.mjs +3 -0
  20. package/dist/apis/botSimulators/types.cjs +0 -0
  21. package/dist/apis/botSimulators/types.d.ts +73 -0
  22. package/dist/apis/botSimulators/types.d.ts.map +1 -0
  23. package/dist/apis/botSimulators/types.mjs +0 -0
  24. package/dist/apis/botVersions/BotVersionsApi.cjs +25 -0
  25. package/dist/apis/botVersions/BotVersionsApi.cjs.map +1 -1
  26. package/dist/apis/botVersions/BotVersionsApi.d.ts +18 -0
  27. package/dist/apis/botVersions/BotVersionsApi.d.ts.map +1 -1
  28. package/dist/apis/botVersions/BotVersionsApi.mjs +25 -0
  29. package/dist/apis/botVersions/BotVersionsApi.mjs.map +1 -1
  30. package/dist/apis/botVersions/types.d.ts +4 -0
  31. package/dist/apis/botVersions/types.d.ts.map +1 -1
  32. package/dist/apis/bots/BotsApi.cjs +99 -4
  33. package/dist/apis/bots/BotsApi.cjs.map +1 -1
  34. package/dist/apis/bots/BotsApi.d.ts +78 -5
  35. package/dist/apis/bots/BotsApi.d.ts.map +1 -1
  36. package/dist/apis/bots/BotsApi.mjs +99 -4
  37. package/dist/apis/bots/BotsApi.mjs.map +1 -1
  38. package/dist/apis/bots/types.d.ts +266 -16
  39. package/dist/apis/bots/types.d.ts.map +1 -1
  40. package/dist/apis/index.cjs +3 -0
  41. package/dist/apis/index.d.ts +1 -0
  42. package/dist/apis/index.d.ts.map +1 -1
  43. package/dist/apis/index.mjs +3 -1
  44. package/dist/apis/permissions/types.d.ts +1 -1
  45. package/dist/apis/permissions/types.d.ts.map +1 -1
  46. package/dist/apis/questions/QuestionsApi.cjs +15 -0
  47. package/dist/apis/questions/QuestionsApi.cjs.map +1 -1
  48. package/dist/apis/questions/QuestionsApi.d.ts +15 -1
  49. package/dist/apis/questions/QuestionsApi.d.ts.map +1 -1
  50. package/dist/apis/questions/QuestionsApi.mjs +15 -0
  51. package/dist/apis/questions/QuestionsApi.mjs.map +1 -1
  52. package/dist/apis/questions/types.d.ts +25 -5
  53. package/dist/apis/questions/types.d.ts.map +1 -1
  54. package/dist/apis/quickReplies/QuickRepliesApi.cjs +16 -0
  55. package/dist/apis/quickReplies/QuickRepliesApi.cjs.map +1 -1
  56. package/dist/apis/quickReplies/QuickRepliesApi.d.ts +15 -2
  57. package/dist/apis/quickReplies/QuickRepliesApi.d.ts.map +1 -1
  58. package/dist/apis/quickReplies/QuickRepliesApi.mjs +16 -0
  59. package/dist/apis/quickReplies/QuickRepliesApi.mjs.map +1 -1
  60. package/dist/apis/quickReplies/types.d.ts +30 -2
  61. package/dist/apis/quickReplies/types.d.ts.map +1 -1
  62. package/dist/apis/schedule/ScheduleApi.cjs +37 -2
  63. package/dist/apis/schedule/ScheduleApi.cjs.map +1 -1
  64. package/dist/apis/schedule/ScheduleApi.d.ts +30 -3
  65. package/dist/apis/schedule/ScheduleApi.d.ts.map +1 -1
  66. package/dist/apis/schedule/ScheduleApi.mjs +37 -2
  67. package/dist/apis/schedule/ScheduleApi.mjs.map +1 -1
  68. package/dist/apis/schedule/types.d.ts +58 -11
  69. package/dist/apis/schedule/types.d.ts.map +1 -1
  70. package/dist/apis/ticketTopics/TicketTopicsApi.cjs +25 -2
  71. package/dist/apis/ticketTopics/TicketTopicsApi.cjs.map +1 -1
  72. package/dist/apis/ticketTopics/TicketTopicsApi.d.ts +18 -4
  73. package/dist/apis/ticketTopics/TicketTopicsApi.d.ts.map +1 -1
  74. package/dist/apis/ticketTopics/TicketTopicsApi.mjs +25 -2
  75. package/dist/apis/ticketTopics/TicketTopicsApi.mjs.map +1 -1
  76. package/dist/apis/ticketTopics/types.d.ts +22 -1
  77. package/dist/apis/ticketTopics/types.d.ts.map +1 -1
  78. package/dist/apis/tickets/types.d.ts +37 -1
  79. package/dist/apis/tickets/types.d.ts.map +1 -1
  80. package/dist/core/BaseCrudApi.cjs +5 -2
  81. package/dist/core/BaseCrudApi.cjs.map +1 -1
  82. package/dist/core/BaseCrudApi.d.ts +7 -4
  83. package/dist/core/BaseCrudApi.d.ts.map +1 -1
  84. package/dist/core/BaseCrudApi.mjs +5 -2
  85. package/dist/core/BaseCrudApi.mjs.map +1 -1
  86. package/dist/core/types.d.ts +1 -1
  87. package/dist/core/types.d.ts.map +1 -1
  88. package/dist/incommingWebhooks/index.d.ts +7 -7
  89. package/dist/incommingWebhooks/index.d.ts.map +1 -1
  90. package/package.json +1 -1
  91. package/src/apis/answers/AnswersApi.test.ts +67 -0
  92. package/src/apis/answers/AnswersApi.ts +66 -2
  93. package/src/apis/answers/types.ts +64 -2
  94. package/src/apis/botSimulators/BotSimulatorsApi.test.ts +58 -0
  95. package/src/apis/botSimulators/BotSimulatorsApi.ts +57 -0
  96. package/src/apis/botSimulators/index.ts +2 -0
  97. package/src/apis/botSimulators/types.ts +72 -0
  98. package/src/apis/botVersions/BotVersionsApi.test.ts +51 -0
  99. package/src/apis/botVersions/BotVersionsApi.ts +41 -0
  100. package/src/apis/botVersions/types.ts +4 -0
  101. package/src/apis/bots/BotsApi.test.ts +177 -0
  102. package/src/apis/bots/BotsApi.ts +162 -6
  103. package/src/apis/bots/types.ts +267 -15
  104. package/src/apis/index.ts +1 -0
  105. package/src/apis/payloads.test-d.ts +171 -1
  106. package/src/apis/permissions/types.ts +10 -4
  107. package/src/apis/questions/QuestionsApi.test.ts +49 -0
  108. package/src/apis/questions/QuestionsApi.ts +20 -1
  109. package/src/apis/questions/types.ts +25 -6
  110. package/src/apis/quickReplies/QuickRepliesApi.test.ts +69 -0
  111. package/src/apis/quickReplies/QuickRepliesApi.ts +35 -2
  112. package/src/apis/quickReplies/types.ts +34 -2
  113. package/src/apis/schedule/ScheduleApi.test.ts +80 -0
  114. package/src/apis/schedule/ScheduleApi.ts +59 -6
  115. package/src/apis/schedule/types.ts +66 -11
  116. package/src/apis/ticketTopics/TicketTopicsApi.test.ts +40 -0
  117. package/src/apis/ticketTopics/TicketTopicsApi.ts +35 -4
  118. package/src/apis/ticketTopics/types.ts +26 -1
  119. package/src/apis/tickets/types.ts +40 -1
  120. package/src/core/BaseCrudApi.ts +9 -5
  121. package/src/core/types.ts +2 -1
  122. package/src/incommingWebhooks/index.test-d.ts +9 -0
  123. package/src/incommingWebhooks/index.ts +7 -7
package/README.md CHANGED
@@ -82,7 +82,8 @@ Available resources:
82
82
  | Activity Log | `ActivityLogApi` | `/activity-log` |
83
83
  | Answers | `AnswersApi` | `/answers` |
84
84
  | Auth History (read-only) | `AuthHistoryApi` | `/auth-history` |
85
- | Bot Versions | `BotVersionsApi` | `/bot-versions` |
85
+ | Bot Simulators | `BotSimulatorsApi` | `/bot-simulators` |
86
+ | Bot Versions (read-only; the write methods are deprecated) | `BotVersionsApi` | `/bot-versions` |
86
87
  | Bots | `BotsApi` | `/bots` |
87
88
  | Campaigns | `CampaignsApi` | `/campaigns` |
88
89
  | Cards | `CardsApi` | `/cards` |
@@ -119,7 +120,7 @@ Available resources:
119
120
  | Questions | `QuestionsApi` | `/questions` |
120
121
  | Quick Replies | `QuickRepliesApi` | `/quick-replies` |
121
122
  | Roles | `RolesApi` | `/roles` |
122
- | Schedules | `ScheduleApi` | `/schedules` |
123
+ | Schedules | `ScheduleApi` | `/schedule` |
123
124
  | Service Access Management | `ServiceAccessManagementApi` | `/service-access-management` |
124
125
  | Service Events | `ServiceEventsApi` | `/service-events` |
125
126
  | Services | `ServicesApi` | `/services` |
@@ -327,7 +328,8 @@ function handleMessageCreated(payload: WebhookPayload<'message.created'>) {
327
328
  | `people.*` | `Omit<Person, PersonRelationships>` |
328
329
  | `organization.*` | `Omit<Organization, OrganizationRelationships>` |
329
330
  | `role.*` | `Omit<Role, RoleRelationships>` |
330
- | `bot.created` / `bot.updated` / `bot.destroyed` / `bot.enter-context` / `bot.leave-context` / `bot.api-signal` | `Omit<Bot, BotRelationships>` |
331
+ | `bot.created` / `bot.updated` / `bot.destroyed` / `bot.enter-context` / `bot.leave-context` | `BotRecord` |
332
+ | `bot.api-signal` | `BotApiSignalData` |
331
333
  | `bot.command` | `BotCommandData` |
332
334
  | `quickReplies.*` | `Omit<QuickReply, QuickReplyRelationships>` |
333
335
  | `tag.*` | `Omit<Tag, TagRelationships>` |
@@ -2,10 +2,48 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_core_BaseCrudApi = require('../../core/BaseCrudApi.cjs');
3
3
 
4
4
  //#region src/apis/answers/AnswersApi.ts
5
+ /**
6
+ * Answers of the evaluation questions. They are written by the bot flow (`SEND_QUESTION`); the
7
+ * CRUD routes exist but validate nothing.
8
+ *
9
+ * Permissions: `evaluation.view` to read, `evaluation.create`/`update`/`destroy` to write.
10
+ */
5
11
  var AnswersApi = class extends require_core_BaseCrudApi.BaseCrudApi {
6
12
  constructor(client) {
7
13
  super(client, "/answers");
8
14
  }
15
+ /**
16
+ * Deletes an answer (soft delete). Resolves to `'OK'`.
17
+ * @permissions evaluation.destroy
18
+ */
19
+ deleteById(id, headers) {
20
+ return super.deleteById(id, headers);
21
+ }
22
+ /**
23
+ * Counts the NPS and CSAT answers of closed tickets. An error answers 500 with a string body.
24
+ * @permissions overview.evaluation.view
25
+ */
26
+ overview(query, headers) {
27
+ return this.client.get(`${this.basePath}/overview${this.toQueryString(query)}`, headers);
28
+ }
29
+ /**
30
+ * Exports the answers as CSV (`,`, header in the language of the user, dates in the timezone of
31
+ * the account), sent as the attachment `evaluation-reports.csv`. An unknown `type` answers 400
32
+ * `{ error: 'Tipo de consulta inválido' }`.
33
+ * @permissions overview.evaluation.view
34
+ */
35
+ exportCsv(query, headers) {
36
+ return this.client.get(`${this.basePath}/exportation-csv${this.toQueryString(query)}`, headers);
37
+ }
38
+ /**
39
+ * Exports the answers as text, one block per answer and the count of unanswered ones at the
40
+ * end, sent as the attachment `evaluation-reports.txt` (Content-Type `plain/text`). An unknown
41
+ * `type` answers 400 `{ error: 'Tipo de consulta inválido' }`.
42
+ * @permissions overview.evaluation.view
43
+ */
44
+ exportTxt(query, headers) {
45
+ return this.client.get(`${this.basePath}/exportation-txt${this.toQueryString(query)}`, headers);
46
+ }
9
47
  };
10
48
 
11
49
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AnswersApi.cjs","names":["BaseCrudApi"],"sources":["../../../src/apis/answers/AnswersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { Answer, CreateAnswerPayload, UpdateAnswerPayload } from './types'\n\nexport class AnswersApi extends BaseCrudApi<Answer, CreateAnswerPayload, UpdateAnswerPayload> {\n constructor(client: ApiClient) {\n super(client, '/answers')\n }\n}\n"],"mappings":";;;;AAIA,IAAa,aAAb,cAAgCA,qCAA8D;CAC5F,YAAY,QAAmB;AAC7B,QAAM,QAAQ,WAAW"}
1
+ {"version":3,"file":"AnswersApi.cjs","names":["BaseCrudApi"],"sources":["../../../src/apis/answers/AnswersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { ListQuery } from '../../core/types'\nimport type {\n Answer,\n AnswersOverview,\n AnswersReportQuery,\n CreateAnswerPayload,\n UpdateAnswerPayload,\n} from './types'\n\n/**\n * Answers of the evaluation questions. They are written by the bot flow (`SEND_QUESTION`); the\n * CRUD routes exist but validate nothing.\n *\n * Permissions: `evaluation.view` to read, `evaluation.create`/`update`/`destroy` to write.\n */\nexport class AnswersApi extends BaseCrudApi<\n Answer,\n CreateAnswerPayload,\n UpdateAnswerPayload,\n ListQuery<Answer>,\n 'OK'\n> {\n constructor(client: ApiClient) {\n super(client, '/answers')\n }\n\n /**\n * Deletes an answer (soft delete). Resolves to `'OK'`.\n * @permissions evaluation.destroy\n */\n override deleteById(id: string, headers?: Record<string, string>): Promise<'OK'> {\n return super.deleteById(id, headers)\n }\n\n /**\n * Counts the NPS and CSAT answers of closed tickets. An error answers 500 with a string body.\n * @permissions overview.evaluation.view\n */\n overview(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<AnswersOverview> {\n return this.client.get<AnswersOverview>(\n `${this.basePath}/overview${this.toQueryString(query)}`,\n headers,\n )\n }\n\n /**\n * Exports the answers as CSV (`,`, header in the language of the user, dates in the timezone of\n * the account), sent as the attachment `evaluation-reports.csv`. An unknown `type` answers 400\n * `{ error: 'Tipo de consulta inválido' }`.\n * @permissions overview.evaluation.view\n */\n exportCsv(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string> {\n return this.client.get<string>(\n `${this.basePath}/exportation-csv${this.toQueryString(query)}`,\n headers,\n )\n }\n\n /**\n * Exports the answers as text, one block per answer and the count of unanswered ones at the\n * end, sent as the attachment `evaluation-reports.txt` (Content-Type `plain/text`). An unknown\n * `type` answers 400 `{ error: 'Tipo de consulta inválido' }`.\n * @permissions overview.evaluation.view\n */\n exportTxt(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string> {\n return this.client.get<string>(\n `${this.basePath}/exportation-txt${this.toQueryString(query)}`,\n headers,\n )\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,aAAb,cAAgCA,qCAM9B;CACA,YAAY,QAAmB;AAC7B,QAAM,QAAQ,WAAW;;;;;;CAO3B,AAAS,WAAW,IAAY,SAAiD;AAC/E,SAAO,MAAM,WAAW,IAAI,QAAQ;;;;;;CAOtC,SAAS,OAA4B,SAA4D;AAC/F,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,WAAW,KAAK,cAAc,MAAM,IACrD,QACD;;;;;;;;CASH,UAAU,OAA4B,SAAmD;AACvF,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,kBAAkB,KAAK,cAAc,MAAM,IAC5D,QACD;;;;;;;;CASH,UAAU,OAA4B,SAAmD;AACvF,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,kBAAkB,KAAK,cAAc,MAAM,IAC5D,QACD"}
@@ -1,7 +1,38 @@
1
1
  import type { ApiClient } from '../../core/ApiClient';
2
2
  import { BaseCrudApi } from '../../core/BaseCrudApi';
3
- import type { Answer, CreateAnswerPayload, UpdateAnswerPayload } from './types';
4
- export declare class AnswersApi extends BaseCrudApi<Answer, CreateAnswerPayload, UpdateAnswerPayload> {
3
+ import type { ListQuery } from '../../core/types';
4
+ import type { Answer, AnswersOverview, AnswersReportQuery, CreateAnswerPayload, UpdateAnswerPayload } from './types';
5
+ /**
6
+ * Answers of the evaluation questions. They are written by the bot flow (`SEND_QUESTION`); the
7
+ * CRUD routes exist but validate nothing.
8
+ *
9
+ * Permissions: `evaluation.view` to read, `evaluation.create`/`update`/`destroy` to write.
10
+ */
11
+ export declare class AnswersApi extends BaseCrudApi<Answer, CreateAnswerPayload, UpdateAnswerPayload, ListQuery<Answer>, 'OK'> {
5
12
  constructor(client: ApiClient);
13
+ /**
14
+ * Deletes an answer (soft delete). Resolves to `'OK'`.
15
+ * @permissions evaluation.destroy
16
+ */
17
+ deleteById(id: string, headers?: Record<string, string>): Promise<'OK'>;
18
+ /**
19
+ * Counts the NPS and CSAT answers of closed tickets. An error answers 500 with a string body.
20
+ * @permissions overview.evaluation.view
21
+ */
22
+ overview(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<AnswersOverview>;
23
+ /**
24
+ * Exports the answers as CSV (`,`, header in the language of the user, dates in the timezone of
25
+ * the account), sent as the attachment `evaluation-reports.csv`. An unknown `type` answers 400
26
+ * `{ error: 'Tipo de consulta inválido' }`.
27
+ * @permissions overview.evaluation.view
28
+ */
29
+ exportCsv(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string>;
30
+ /**
31
+ * Exports the answers as text, one block per answer and the count of unanswered ones at the
32
+ * end, sent as the attachment `evaluation-reports.txt` (Content-Type `plain/text`). An unknown
33
+ * `type` answers 400 `{ error: 'Tipo de consulta inválido' }`.
34
+ * @permissions overview.evaluation.view
35
+ */
36
+ exportTxt(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string>;
6
37
  }
7
38
  //# sourceMappingURL=AnswersApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnswersApi.d.ts","sourceRoot":"","sources":["../../../src/apis/answers/AnswersApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE/E,qBAAa,UAAW,SAAQ,WAAW,CAAC,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;gBAC/E,MAAM,EAAE,SAAS;CAG9B"}
1
+ {"version":3,"file":"AnswersApi.d.ts","sourceRoot":"","sources":["../../../src/apis/answers/AnswersApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB;;;;;GAKG;AACH,qBAAa,UAAW,SAAQ,WAAW,CACzC,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,CAAC,MAAM,CAAC,EACjB,IAAI,CACL;gBACa,MAAM,EAAE,SAAS;IAI7B;;;OAGG;IACM,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhF;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAOhG;;;;;OAKG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxF;;;;;OAKG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAMzF"}
@@ -1,10 +1,48 @@
1
1
  import { BaseCrudApi } from "../../core/BaseCrudApi.mjs";
2
2
 
3
3
  //#region src/apis/answers/AnswersApi.ts
4
+ /**
5
+ * Answers of the evaluation questions. They are written by the bot flow (`SEND_QUESTION`); the
6
+ * CRUD routes exist but validate nothing.
7
+ *
8
+ * Permissions: `evaluation.view` to read, `evaluation.create`/`update`/`destroy` to write.
9
+ */
4
10
  var AnswersApi = class extends BaseCrudApi {
5
11
  constructor(client) {
6
12
  super(client, "/answers");
7
13
  }
14
+ /**
15
+ * Deletes an answer (soft delete). Resolves to `'OK'`.
16
+ * @permissions evaluation.destroy
17
+ */
18
+ deleteById(id, headers) {
19
+ return super.deleteById(id, headers);
20
+ }
21
+ /**
22
+ * Counts the NPS and CSAT answers of closed tickets. An error answers 500 with a string body.
23
+ * @permissions overview.evaluation.view
24
+ */
25
+ overview(query, headers) {
26
+ return this.client.get(`${this.basePath}/overview${this.toQueryString(query)}`, headers);
27
+ }
28
+ /**
29
+ * Exports the answers as CSV (`,`, header in the language of the user, dates in the timezone of
30
+ * the account), sent as the attachment `evaluation-reports.csv`. An unknown `type` answers 400
31
+ * `{ error: 'Tipo de consulta inválido' }`.
32
+ * @permissions overview.evaluation.view
33
+ */
34
+ exportCsv(query, headers) {
35
+ return this.client.get(`${this.basePath}/exportation-csv${this.toQueryString(query)}`, headers);
36
+ }
37
+ /**
38
+ * Exports the answers as text, one block per answer and the count of unanswered ones at the
39
+ * end, sent as the attachment `evaluation-reports.txt` (Content-Type `plain/text`). An unknown
40
+ * `type` answers 400 `{ error: 'Tipo de consulta inválido' }`.
41
+ * @permissions overview.evaluation.view
42
+ */
43
+ exportTxt(query, headers) {
44
+ return this.client.get(`${this.basePath}/exportation-txt${this.toQueryString(query)}`, headers);
45
+ }
8
46
  };
9
47
 
10
48
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"AnswersApi.mjs","names":[],"sources":["../../../src/apis/answers/AnswersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { Answer, CreateAnswerPayload, UpdateAnswerPayload } from './types'\n\nexport class AnswersApi extends BaseCrudApi<Answer, CreateAnswerPayload, UpdateAnswerPayload> {\n constructor(client: ApiClient) {\n super(client, '/answers')\n }\n}\n"],"mappings":";;;AAIA,IAAa,aAAb,cAAgC,YAA8D;CAC5F,YAAY,QAAmB;AAC7B,QAAM,QAAQ,WAAW"}
1
+ {"version":3,"file":"AnswersApi.mjs","names":[],"sources":["../../../src/apis/answers/AnswersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { ListQuery } from '../../core/types'\nimport type {\n Answer,\n AnswersOverview,\n AnswersReportQuery,\n CreateAnswerPayload,\n UpdateAnswerPayload,\n} from './types'\n\n/**\n * Answers of the evaluation questions. They are written by the bot flow (`SEND_QUESTION`); the\n * CRUD routes exist but validate nothing.\n *\n * Permissions: `evaluation.view` to read, `evaluation.create`/`update`/`destroy` to write.\n */\nexport class AnswersApi extends BaseCrudApi<\n Answer,\n CreateAnswerPayload,\n UpdateAnswerPayload,\n ListQuery<Answer>,\n 'OK'\n> {\n constructor(client: ApiClient) {\n super(client, '/answers')\n }\n\n /**\n * Deletes an answer (soft delete). Resolves to `'OK'`.\n * @permissions evaluation.destroy\n */\n override deleteById(id: string, headers?: Record<string, string>): Promise<'OK'> {\n return super.deleteById(id, headers)\n }\n\n /**\n * Counts the NPS and CSAT answers of closed tickets. An error answers 500 with a string body.\n * @permissions overview.evaluation.view\n */\n overview(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<AnswersOverview> {\n return this.client.get<AnswersOverview>(\n `${this.basePath}/overview${this.toQueryString(query)}`,\n headers,\n )\n }\n\n /**\n * Exports the answers as CSV (`,`, header in the language of the user, dates in the timezone of\n * the account), sent as the attachment `evaluation-reports.csv`. An unknown `type` answers 400\n * `{ error: 'Tipo de consulta inválido' }`.\n * @permissions overview.evaluation.view\n */\n exportCsv(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string> {\n return this.client.get<string>(\n `${this.basePath}/exportation-csv${this.toQueryString(query)}`,\n headers,\n )\n }\n\n /**\n * Exports the answers as text, one block per answer and the count of unanswered ones at the\n * end, sent as the attachment `evaluation-reports.txt` (Content-Type `plain/text`). An unknown\n * `type` answers 400 `{ error: 'Tipo de consulta inválido' }`.\n * @permissions overview.evaluation.view\n */\n exportTxt(query?: AnswersReportQuery, headers?: Record<string, string>): Promise<string> {\n return this.client.get<string>(\n `${this.basePath}/exportation-txt${this.toQueryString(query)}`,\n headers,\n )\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAa,aAAb,cAAgC,YAM9B;CACA,YAAY,QAAmB;AAC7B,QAAM,QAAQ,WAAW;;;;;;CAO3B,AAAS,WAAW,IAAY,SAAiD;AAC/E,SAAO,MAAM,WAAW,IAAI,QAAQ;;;;;;CAOtC,SAAS,OAA4B,SAA4D;AAC/F,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,WAAW,KAAK,cAAc,MAAM,IACrD,QACD;;;;;;;;CASH,UAAU,OAA4B,SAAmD;AACvF,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,kBAAkB,KAAK,cAAc,MAAM,IAC5D,QACD;;;;;;;;CASH,UAAU,OAA4B,SAAmD;AACvF,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,SAAS,kBAAkB,KAAK,cAAc,MAAM,IAC5D,QACD"}
@@ -2,7 +2,11 @@ import type { Question } from '../questions/types';
2
2
  import type { Ticket } from '../tickets/types';
3
3
  export type Answer = {
4
4
  id: string;
5
- text: string;
5
+ /**
6
+ * The score (NPS 0–10, CSAT 1–5) or one of the values the system writes: `'nv'` (sent, not
7
+ * answered), `'-1'` (expired or out of tries), `'no credits'` (AI CSAT without credits).
8
+ */
9
+ text: string | null;
6
10
  reason: string | null;
7
11
  aiGenerated: boolean;
8
12
  aiText: string | null;
@@ -11,10 +15,17 @@ export type Answer = {
11
15
  createdAt: string;
12
16
  updatedAt: string;
13
17
  deletedAt: string | null;
18
+ /** @deprecated Never comes: the route drops every `include` (empty whitelist). */
14
19
  question?: Question;
20
+ /** @deprecated Never comes: the route drops every `include` (empty whitelist). */
15
21
  ticket?: Ticket;
16
22
  };
23
+ /** @deprecated The route drops every `include` (empty whitelist). */
17
24
  export type AnswerRelationships = 'question' | 'ticket';
25
+ /**
26
+ * The route validates nothing: not the question, the ticket nor their account, and the answer is
27
+ * saved even for an open ticket.
28
+ */
18
29
  export type CreateAnswerPayload = {
19
30
  text: string;
20
31
  questionId: string;
@@ -25,4 +36,56 @@ export type UpdateAnswerPayload = {
25
36
  text?: string;
26
37
  reason?: string;
27
38
  };
39
+ /**
40
+ * Filters of the overview and of the exports. Only answers of CLOSED tickets of the account
41
+ * count, and the period is the one of the ticket, not the answer date.
42
+ */
43
+ export type AnswersReportQuery = {
44
+ /** `ia-csat` is the CSAT scored by AI. Another value answers 400 in the exports and 500 in the overview. */
45
+ type?: 'nps' | 'csat' | 'ia-csat';
46
+ /** Without it, `from`/`to` are ignored. `openDate` = ticket start, `closeDate` = ticket end, `all` = either. */
47
+ periodType?: 'all' | 'openDate' | 'closeDate';
48
+ /** ISO date. */
49
+ from?: string;
50
+ /** ISO date. */
51
+ to?: string;
52
+ /** Attendant of the ticket. */
53
+ userId?: string;
54
+ /** Department of the ticket. */
55
+ departmentId?: string;
56
+ /** Connection of the contact. */
57
+ serviceId?: string;
58
+ };
59
+ export type AnswersCsatOverview = {
60
+ fullySatisfied: number;
61
+ satisfied: number;
62
+ neutral: number;
63
+ unsatisfied: number;
64
+ fullyUnsatisfied: number;
65
+ noCredits: number;
66
+ invalid: number;
67
+ /**
68
+ * Answers scored by AI. Without the `enable-smart-csat-score` flag they are counted here; with
69
+ * it they leave `csat` (this stays 0) and go to `aiCsat`.
70
+ */
71
+ ai: number;
72
+ };
73
+ /** `[promoters, neutral, detractors, invalid, ai]` — positional, empty when there is no NPS answer. */
74
+ export type AnswersNpsOverview = [number, number, number, number, number] | [];
75
+ export type AnswersOverview = {
76
+ total: {
77
+ nps: number;
78
+ csat: number;
79
+ aiCsat?: number;
80
+ };
81
+ data: {
82
+ nps: AnswersNpsOverview;
83
+ /** `{}` when no answer matches. */
84
+ csat: AnswersCsatOverview | Record<string, never>;
85
+ /** Absent when no answer matches or the account does not have the flag. */
86
+ isSmartCsatScoreEnabled?: boolean;
87
+ /** Only with the `enable-smart-csat-score` flag of the account. */
88
+ aiCsat?: AnswersCsatOverview | Record<string, never>;
89
+ };
90
+ };
28
91
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/answers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAExB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/answers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEvD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4GAA4G;IAC5G,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAA;IACjC,gHAAgH;IAChH,UAAU,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,WAAW,CAAA;IAC7C,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,uGAAuG;AACvG,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACrD,IAAI,EAAE;QACJ,GAAG,EAAE,kBAAkB,CAAA;QACvB,mCAAmC;QACnC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACjD,2EAA2E;QAC3E,uBAAuB,CAAC,EAAE,OAAO,CAAA;QACjC,mEAAmE;QACnE,MAAM,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;KACrD,CAAA;CACF,CAAA"}
@@ -0,0 +1,42 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_core_BaseApi = require('../../core/BaseApi.cjs');
3
+
4
+ //#region src/apis/botSimulators/BotSimulatorsApi.ts
5
+ /**
6
+ * The bot simulator of the bot builder. It runs the latest version of the bot (draft or
7
+ * published) against a virtual contact kept in the cache, one per user and bot — no contact,
8
+ * connection or ticket is created. The bot answers asynchronously (~0.5–1 s per bot message plus
9
+ * the queue): poll `getContactMessages` for the answers. A bot saved without `flowJson.edges`
10
+ * never answers (SD-2323).
11
+ */
12
+ var BotSimulatorsApi = class extends require_core_BaseApi.BaseApi {
13
+ basePath = "/bot-simulators";
14
+ /**
15
+ * Returns the virtual contact and its messages. The first call starts the simulator: it creates
16
+ * the contact and pushes the `select_trigger_bot` message with the `@INIT` triggers.
17
+ * @permissions bots.update
18
+ */
19
+ getContactMessages(botId, headers) {
20
+ return this.client.get(`${this.basePath}/contact-messages/${botId}`, headers);
21
+ }
22
+ /**
23
+ * Sends an event to the simulator: a message of the contact, or the pick of a trigger or of a
24
+ * condition result.
25
+ * @permissions bots.update
26
+ */
27
+ sendEvent(botId, body, headers) {
28
+ return this.client.post(`${this.basePath}/send-event/${botId}`, body, headers);
29
+ }
30
+ /**
31
+ * Clears the messages and starts over with a new virtual contact (new id, empty session) and a
32
+ * new `select_trigger_bot` message. Runs already queued in the worker are not cancelled.
33
+ * @permissions bots.update
34
+ */
35
+ restart(botId, headers) {
36
+ return this.client.post(`${this.basePath}/restart-simulator/${botId}`, {}, headers);
37
+ }
38
+ };
39
+
40
+ //#endregion
41
+ exports.BotSimulatorsApi = BotSimulatorsApi;
42
+ //# sourceMappingURL=BotSimulatorsApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotSimulatorsApi.cjs","names":["BaseApi"],"sources":["../../../src/apis/botSimulators/BotSimulatorsApi.ts"],"sourcesContent":["import { BaseApi } from '../../core/BaseApi'\nimport type {\n BotSimulatorEventPayload,\n BotSimulatorEventResult,\n BotSimulatorRestartResult,\n BotSimulatorState,\n} from './types'\n\n/**\n * The bot simulator of the bot builder. It runs the latest version of the bot (draft or\n * published) against a virtual contact kept in the cache, one per user and bot — no contact,\n * connection or ticket is created. The bot answers asynchronously (~0.5–1 s per bot message plus\n * the queue): poll `getContactMessages` for the answers. A bot saved without `flowJson.edges`\n * never answers (SD-2323).\n */\nexport class BotSimulatorsApi extends BaseApi {\n public readonly basePath = '/bot-simulators'\n\n /**\n * Returns the virtual contact and its messages. The first call starts the simulator: it creates\n * the contact and pushes the `select_trigger_bot` message with the `@INIT` triggers.\n * @permissions bots.update\n */\n getContactMessages(botId: string, headers?: Record<string, string>): Promise<BotSimulatorState> {\n return this.client.get<BotSimulatorState>(`${this.basePath}/contact-messages/${botId}`, headers)\n }\n\n /**\n * Sends an event to the simulator: a message of the contact, or the pick of a trigger or of a\n * condition result.\n * @permissions bots.update\n */\n sendEvent(\n botId: string,\n body: BotSimulatorEventPayload,\n headers?: Record<string, string>,\n ): Promise<BotSimulatorEventResult> {\n return this.client.post<BotSimulatorEventResult, BotSimulatorEventPayload>(\n `${this.basePath}/send-event/${botId}`,\n body,\n headers,\n )\n }\n\n /**\n * Clears the messages and starts over with a new virtual contact (new id, empty session) and a\n * new `select_trigger_bot` message. Runs already queued in the worker are not cancelled.\n * @permissions bots.update\n */\n restart(botId: string, headers?: Record<string, string>): Promise<BotSimulatorRestartResult> {\n return this.client.post<BotSimulatorRestartResult>(\n `${this.basePath}/restart-simulator/${botId}`,\n {},\n headers,\n )\n }\n}\n"],"mappings":";;;;;;;;;;;AAeA,IAAa,mBAAb,cAAsCA,6BAAQ;CAC5C,AAAgB,WAAW;;;;;;CAO3B,mBAAmB,OAAe,SAA8D;AAC9F,SAAO,KAAK,OAAO,IAAuB,GAAG,KAAK,SAAS,oBAAoB,SAAS,QAAQ;;;;;;;CAQlG,UACE,OACA,MACA,SACkC;AAClC,SAAO,KAAK,OAAO,KACjB,GAAG,KAAK,SAAS,cAAc,SAC/B,MACA,QACD;;;;;;;CAQH,QAAQ,OAAe,SAAsE;AAC3F,SAAO,KAAK,OAAO,KACjB,GAAG,KAAK,SAAS,qBAAqB,SACtC,EAAE,EACF,QACD"}
@@ -0,0 +1,31 @@
1
+ import { BaseApi } from '../../core/BaseApi';
2
+ import type { BotSimulatorEventPayload, BotSimulatorEventResult, BotSimulatorRestartResult, BotSimulatorState } from './types';
3
+ /**
4
+ * The bot simulator of the bot builder. It runs the latest version of the bot (draft or
5
+ * published) against a virtual contact kept in the cache, one per user and bot — no contact,
6
+ * connection or ticket is created. The bot answers asynchronously (~0.5–1 s per bot message plus
7
+ * the queue): poll `getContactMessages` for the answers. A bot saved without `flowJson.edges`
8
+ * never answers (SD-2323).
9
+ */
10
+ export declare class BotSimulatorsApi extends BaseApi {
11
+ readonly basePath = "/bot-simulators";
12
+ /**
13
+ * Returns the virtual contact and its messages. The first call starts the simulator: it creates
14
+ * the contact and pushes the `select_trigger_bot` message with the `@INIT` triggers.
15
+ * @permissions bots.update
16
+ */
17
+ getContactMessages(botId: string, headers?: Record<string, string>): Promise<BotSimulatorState>;
18
+ /**
19
+ * Sends an event to the simulator: a message of the contact, or the pick of a trigger or of a
20
+ * condition result.
21
+ * @permissions bots.update
22
+ */
23
+ sendEvent(botId: string, body: BotSimulatorEventPayload, headers?: Record<string, string>): Promise<BotSimulatorEventResult>;
24
+ /**
25
+ * Clears the messages and starts over with a new virtual contact (new id, empty session) and a
26
+ * new `select_trigger_bot` message. Runs already queued in the worker are not cancelled.
27
+ * @permissions bots.update
28
+ */
29
+ restart(botId: string, headers?: Record<string, string>): Promise<BotSimulatorRestartResult>;
30
+ }
31
+ //# sourceMappingURL=BotSimulatorsApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotSimulatorsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/botSimulators/BotSimulatorsApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,SAAS,CAAA;AAEhB;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,OAAO;IAC3C,SAAgB,QAAQ,qBAAoB;IAE5C;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI/F;;;;OAIG;IACH,SAAS,CACP,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,wBAAwB,EAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,uBAAuB,CAAC;IAQnC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAO7F"}
@@ -0,0 +1,41 @@
1
+ import { BaseApi } from "../../core/BaseApi.mjs";
2
+
3
+ //#region src/apis/botSimulators/BotSimulatorsApi.ts
4
+ /**
5
+ * The bot simulator of the bot builder. It runs the latest version of the bot (draft or
6
+ * published) against a virtual contact kept in the cache, one per user and bot — no contact,
7
+ * connection or ticket is created. The bot answers asynchronously (~0.5–1 s per bot message plus
8
+ * the queue): poll `getContactMessages` for the answers. A bot saved without `flowJson.edges`
9
+ * never answers (SD-2323).
10
+ */
11
+ var BotSimulatorsApi = class extends BaseApi {
12
+ basePath = "/bot-simulators";
13
+ /**
14
+ * Returns the virtual contact and its messages. The first call starts the simulator: it creates
15
+ * the contact and pushes the `select_trigger_bot` message with the `@INIT` triggers.
16
+ * @permissions bots.update
17
+ */
18
+ getContactMessages(botId, headers) {
19
+ return this.client.get(`${this.basePath}/contact-messages/${botId}`, headers);
20
+ }
21
+ /**
22
+ * Sends an event to the simulator: a message of the contact, or the pick of a trigger or of a
23
+ * condition result.
24
+ * @permissions bots.update
25
+ */
26
+ sendEvent(botId, body, headers) {
27
+ return this.client.post(`${this.basePath}/send-event/${botId}`, body, headers);
28
+ }
29
+ /**
30
+ * Clears the messages and starts over with a new virtual contact (new id, empty session) and a
31
+ * new `select_trigger_bot` message. Runs already queued in the worker are not cancelled.
32
+ * @permissions bots.update
33
+ */
34
+ restart(botId, headers) {
35
+ return this.client.post(`${this.basePath}/restart-simulator/${botId}`, {}, headers);
36
+ }
37
+ };
38
+
39
+ //#endregion
40
+ export { BotSimulatorsApi };
41
+ //# sourceMappingURL=BotSimulatorsApi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BotSimulatorsApi.mjs","names":[],"sources":["../../../src/apis/botSimulators/BotSimulatorsApi.ts"],"sourcesContent":["import { BaseApi } from '../../core/BaseApi'\nimport type {\n BotSimulatorEventPayload,\n BotSimulatorEventResult,\n BotSimulatorRestartResult,\n BotSimulatorState,\n} from './types'\n\n/**\n * The bot simulator of the bot builder. It runs the latest version of the bot (draft or\n * published) against a virtual contact kept in the cache, one per user and bot — no contact,\n * connection or ticket is created. The bot answers asynchronously (~0.5–1 s per bot message plus\n * the queue): poll `getContactMessages` for the answers. A bot saved without `flowJson.edges`\n * never answers (SD-2323).\n */\nexport class BotSimulatorsApi extends BaseApi {\n public readonly basePath = '/bot-simulators'\n\n /**\n * Returns the virtual contact and its messages. The first call starts the simulator: it creates\n * the contact and pushes the `select_trigger_bot` message with the `@INIT` triggers.\n * @permissions bots.update\n */\n getContactMessages(botId: string, headers?: Record<string, string>): Promise<BotSimulatorState> {\n return this.client.get<BotSimulatorState>(`${this.basePath}/contact-messages/${botId}`, headers)\n }\n\n /**\n * Sends an event to the simulator: a message of the contact, or the pick of a trigger or of a\n * condition result.\n * @permissions bots.update\n */\n sendEvent(\n botId: string,\n body: BotSimulatorEventPayload,\n headers?: Record<string, string>,\n ): Promise<BotSimulatorEventResult> {\n return this.client.post<BotSimulatorEventResult, BotSimulatorEventPayload>(\n `${this.basePath}/send-event/${botId}`,\n body,\n headers,\n )\n }\n\n /**\n * Clears the messages and starts over with a new virtual contact (new id, empty session) and a\n * new `select_trigger_bot` message. Runs already queued in the worker are not cancelled.\n * @permissions bots.update\n */\n restart(botId: string, headers?: Record<string, string>): Promise<BotSimulatorRestartResult> {\n return this.client.post<BotSimulatorRestartResult>(\n `${this.basePath}/restart-simulator/${botId}`,\n {},\n headers,\n )\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,mBAAb,cAAsC,QAAQ;CAC5C,AAAgB,WAAW;;;;;;CAO3B,mBAAmB,OAAe,SAA8D;AAC9F,SAAO,KAAK,OAAO,IAAuB,GAAG,KAAK,SAAS,oBAAoB,SAAS,QAAQ;;;;;;;CAQlG,UACE,OACA,MACA,SACkC;AAClC,SAAO,KAAK,OAAO,KACjB,GAAG,KAAK,SAAS,cAAc,SAC/B,MACA,QACD;;;;;;;CAQH,QAAQ,OAAe,SAAsE;AAC3F,SAAO,KAAK,OAAO,KACjB,GAAG,KAAK,SAAS,qBAAqB,SACtC,EAAE,EACF,QACD"}
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_apis_botSimulators_BotSimulatorsApi = require('./BotSimulatorsApi.cjs');
3
+
4
+ exports.BotSimulatorsApi = require_apis_botSimulators_BotSimulatorsApi.BotSimulatorsApi;
@@ -0,0 +1,3 @@
1
+ export { BotSimulatorsApi } from './BotSimulatorsApi';
2
+ export type * from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/apis/botSimulators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,mBAAmB,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { BotSimulatorsApi } from "./BotSimulatorsApi.mjs";
2
+
3
+ export { BotSimulatorsApi };
File without changes
@@ -0,0 +1,73 @@
1
+ import type { BotEvent } from '../bots/types';
2
+ export type BotSimulatorMessageType = 'text_bot' | 'text_interactive_bot' | 'select_trigger_bot' | 'select_condition_bot' | 'text_contact' | 'chat_event';
3
+ export type BotSimulatorMessage = {
4
+ id: string;
5
+ type: BotSimulatorMessageType;
6
+ /** Empty for the selection messages. `chat_event` carries the block name (e.g. `ADD_TAG_NODE`). */
7
+ text: string;
8
+ data: {
9
+ /** In `select_trigger_bot`: the triggers of `@INIT` to pick from. */
10
+ trigger?: {
11
+ events: BotEvent[];
12
+ };
13
+ /** In `select_condition_bot`. */
14
+ conditionNodeId?: string;
15
+ /** What `sendEvent` picked for this selection message. */
16
+ selectedValue?: string | boolean;
17
+ interactive?: unknown;
18
+ customFieldData?: {
19
+ type: string;
20
+ name: string;
21
+ id: string;
22
+ settings: unknown;
23
+ };
24
+ };
25
+ createdAt: string;
26
+ file?: {
27
+ id: string;
28
+ url: string;
29
+ publicFilename: string;
30
+ };
31
+ };
32
+ /** The virtual contact of the simulator: it lives in the cache, one per user and bot. */
33
+ export type BotSimulatorContact = {
34
+ id: string;
35
+ /** The name of the user running the simulator. */
36
+ name: string;
37
+ createdAt: string;
38
+ /** `null` in the call that starts the simulator, `''` after it, until the bot runs. */
39
+ session: {
40
+ store: {
41
+ context?: string;
42
+ contextPassCount?: number;
43
+ };
44
+ } | '' | null;
45
+ };
46
+ export type BotSimulatorState = {
47
+ contact: BotSimulatorContact;
48
+ /** Sorted by `createdAt`. */
49
+ messages: BotSimulatorMessage[];
50
+ };
51
+ export type BotSimulatorEventPayload = {
52
+ /** A message of the contact: pushed at once, the bot answers asynchronously. */
53
+ type: 'text_contact';
54
+ text: string;
55
+ } | {
56
+ /** Picks the trigger of a `select_trigger_bot` message. Only while the contact is in `@INIT`. */
57
+ type: 'select_trigger';
58
+ /** The id of the `select_trigger_bot` message. */
59
+ id: string;
60
+ selectedValue: BotEvent;
61
+ } | {
62
+ /** Forces the result of a condition block. Only while the contact is in a `CONDITION_NODE_*` context. */
63
+ type: 'select_condition';
64
+ /** The id of the `select_condition_bot` message. */
65
+ id: string;
66
+ selectedValue: boolean;
67
+ };
68
+ /** `'OK'` when the event was taken; `false` when refused (wrong context, missing id). */
69
+ export type BotSimulatorEventResult = 'OK' | false;
70
+ export type BotSimulatorRestartResult = {
71
+ restartDate: string;
72
+ };
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/botSimulators/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,GACtB,cAAc,GACd,YAAY,CAAA;AAEhB,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,uBAAuB,CAAA;IAC7B,mGAAmG;IACnG,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE;QACJ,qEAAqE;QACrE,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;SAAE,CAAA;QAChC,iCAAiC;QACjC,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,0DAA0D;QAC1D,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;QAChC,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,eAAe,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAA;KAChF,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3D,CAAA;AAED,yFAAyF;AACzF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,uFAAuF;IACvF,OAAO,EAAE;QAAE,KAAK,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,EAAE,GAAG,IAAI,CAAA;CAChF,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,mBAAmB,CAAA;IAC5B,6BAA6B;IAC7B,QAAQ,EAAE,mBAAmB,EAAE,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,wBAAwB,GAChC;IACE,gFAAgF;IAChF,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,iGAAiG;IACjG,IAAI,EAAE,gBAAgB,CAAA;IACtB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,QAAQ,CAAA;CACxB,GACD;IACE,yGAAyG;IACzG,IAAI,EAAE,kBAAkB,CAAA;IACxB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAEL,yFAAyF;AACzF,MAAM,MAAM,uBAAuB,GAAG,IAAI,GAAG,KAAK,CAAA;AAElD,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA"}
File without changes
@@ -2,10 +2,35 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_core_BaseCrudApi = require('../../core/BaseCrudApi.cjs');
3
3
 
4
4
  //#region src/apis/botVersions/BotVersionsApi.ts
5
+ /**
6
+ * Versions of the bots, with the contexts in the stored map form. The backend only serves the
7
+ * list (`getMany`/`getOne`, filter by `where.botId`; `paginate: false` is honored), under the
8
+ * `bots.view` permission: the versions are created and published by `BotsApi.create`/`updateById`.
9
+ * `include` is dropped (empty whitelist), so the relationships never come.
10
+ */
5
11
  var BotVersionsApi = class extends require_core_BaseCrudApi.BaseCrudApi {
6
12
  constructor(client) {
7
13
  super(client, "/bot-versions");
8
14
  }
15
+ /**
16
+ * @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers
17
+ * 404. Use `getOne({ where: { id } })`.
18
+ */
19
+ getById(id, query, headers) {
20
+ return super.getById(id, query, headers);
21
+ }
22
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */
23
+ create(body, headers) {
24
+ return super.create(body, headers);
25
+ }
26
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */
27
+ updateById(id, body, headers) {
28
+ return super.updateById(id, body, headers);
29
+ }
30
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. */
31
+ deleteById(id, headers) {
32
+ return super.deleteById(id, headers);
33
+ }
9
34
  };
10
35
 
11
36
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"BotVersionsApi.cjs","names":["BaseCrudApi"],"sources":["../../../src/apis/botVersions/BotVersionsApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { BotVersion, CreateBotVersionPayload, UpdateBotVersionPayload } from './types'\n\nexport class BotVersionsApi extends BaseCrudApi<\n BotVersion,\n CreateBotVersionPayload,\n UpdateBotVersionPayload\n> {\n constructor(client: ApiClient) {\n super(client, '/bot-versions')\n }\n}\n"],"mappings":";;;;AAIA,IAAa,iBAAb,cAAoCA,qCAIlC;CACA,YAAY,QAAmB;AAC7B,QAAM,QAAQ,gBAAgB"}
1
+ {"version":3,"file":"BotVersionsApi.cjs","names":["BaseCrudApi"],"sources":["../../../src/apis/botVersions/BotVersionsApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { GetByIdQuery } from '../../core/types'\nimport type { BotVersion, CreateBotVersionPayload, UpdateBotVersionPayload } from './types'\n\n/**\n * Versions of the bots, with the contexts in the stored map form. The backend only serves the\n * list (`getMany`/`getOne`, filter by `where.botId`; `paginate: false` is honored), under the\n * `bots.view` permission: the versions are created and published by `BotsApi.create`/`updateById`.\n * `include` is dropped (empty whitelist), so the relationships never come.\n */\nexport class BotVersionsApi extends BaseCrudApi<\n BotVersion,\n CreateBotVersionPayload,\n UpdateBotVersionPayload\n> {\n constructor(client: ApiClient) {\n super(client, '/bot-versions')\n }\n\n /**\n * @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers\n * 404. Use `getOne({ where: { id } })`.\n */\n override getById(\n id: string,\n query?: GetByIdQuery<BotVersion>,\n headers?: Record<string, string>,\n ): Promise<BotVersion> {\n return super.getById(id, query, headers)\n }\n\n /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */\n override create(\n body: CreateBotVersionPayload,\n headers?: Record<string, string>,\n ): Promise<BotVersion> {\n return super.create(body, headers)\n }\n\n /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */\n override updateById(\n id: string,\n body: UpdateBotVersionPayload,\n headers?: Record<string, string>,\n ): Promise<BotVersion> {\n return super.updateById(id, body, headers)\n }\n\n /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. */\n override deleteById(id: string, headers?: Record<string, string>): Promise<BotVersion> {\n return super.deleteById(id, headers)\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,iBAAb,cAAoCA,qCAIlC;CACA,YAAY,QAAmB;AAC7B,QAAM,QAAQ,gBAAgB;;;;;;CAOhC,AAAS,QACP,IACA,OACA,SACqB;AACrB,SAAO,MAAM,QAAQ,IAAI,OAAO,QAAQ;;;CAI1C,AAAS,OACP,MACA,SACqB;AACrB,SAAO,MAAM,OAAO,MAAM,QAAQ;;;CAIpC,AAAS,WACP,IACA,MACA,SACqB;AACrB,SAAO,MAAM,WAAW,IAAI,MAAM,QAAQ;;;CAI5C,AAAS,WAAW,IAAY,SAAuD;AACrF,SAAO,MAAM,WAAW,IAAI,QAAQ"}
@@ -1,7 +1,25 @@
1
1
  import type { ApiClient } from '../../core/ApiClient';
2
2
  import { BaseCrudApi } from '../../core/BaseCrudApi';
3
+ import type { GetByIdQuery } from '../../core/types';
3
4
  import type { BotVersion, CreateBotVersionPayload, UpdateBotVersionPayload } from './types';
5
+ /**
6
+ * Versions of the bots, with the contexts in the stored map form. The backend only serves the
7
+ * list (`getMany`/`getOne`, filter by `where.botId`; `paginate: false` is honored), under the
8
+ * `bots.view` permission: the versions are created and published by `BotsApi.create`/`updateById`.
9
+ * `include` is dropped (empty whitelist), so the relationships never come.
10
+ */
4
11
  export declare class BotVersionsApi extends BaseCrudApi<BotVersion, CreateBotVersionPayload, UpdateBotVersionPayload> {
5
12
  constructor(client: ApiClient);
13
+ /**
14
+ * @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers
15
+ * 404. Use `getOne({ where: { id } })`.
16
+ */
17
+ getById(id: string, query?: GetByIdQuery<BotVersion>, headers?: Record<string, string>): Promise<BotVersion>;
18
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */
19
+ create(body: CreateBotVersionPayload, headers?: Record<string, string>): Promise<BotVersion>;
20
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. Save the bot through `BotsApi`. */
21
+ updateById(id: string, body: UpdateBotVersionPayload, headers?: Record<string, string>): Promise<BotVersion>;
22
+ /** @deprecated Not served: the backend only serves GET /bot-versions (list): this route answers 404. */
23
+ deleteById(id: string, headers?: Record<string, string>): Promise<BotVersion>;
6
24
  }
7
25
  //# sourceMappingURL=BotVersionsApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotVersionsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/botVersions/BotVersionsApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAE3F,qBAAa,cAAe,SAAQ,WAAW,CAC7C,UAAU,EACV,uBAAuB,EACvB,uBAAuB,CACxB;gBACa,MAAM,EAAE,SAAS;CAG9B"}
1
+ {"version":3,"file":"BotVersionsApi.d.ts","sourceRoot":"","sources":["../../../src/apis/botVersions/BotVersionsApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAE3F;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,WAAW,CAC7C,UAAU,EACV,uBAAuB,EACvB,uBAAuB,CACxB;gBACa,MAAM,EAAE,SAAS;IAI7B;;;OAGG;IACM,OAAO,CACd,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,UAAU,CAAC;IAItB,wIAAwI;IAC/H,MAAM,CACb,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,UAAU,CAAC;IAItB,wIAAwI;IAC/H,UAAU,CACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,UAAU,CAAC;IAItB,wGAAwG;IAC/F,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAGvF"}