sfdx-hardis 6.16.1-beta202512161830.0 → 6.17.1

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 (38) hide show
  1. package/README.md +18 -6
  2. package/lib/commands/hardis/datacloud/extract/agentforce-conversations.d.ts +14 -0
  3. package/lib/commands/hardis/datacloud/extract/agentforce-conversations.js +369 -0
  4. package/lib/commands/hardis/datacloud/extract/agentforce-conversations.js.map +1 -0
  5. package/lib/commands/hardis/datacloud/extract/agentforce-feedback.d.ts +14 -0
  6. package/lib/commands/hardis/datacloud/extract/agentforce-feedback.js +333 -0
  7. package/lib/commands/hardis/datacloud/extract/agentforce-feedback.js.map +1 -0
  8. package/lib/commands/hardis/datacloud/sql-query.d.ts +14 -0
  9. package/lib/commands/hardis/datacloud/sql-query.js +145 -0
  10. package/lib/commands/hardis/datacloud/sql-query.js.map +1 -0
  11. package/lib/commands/hardis/org/select.js +1 -1
  12. package/lib/commands/hardis/org/select.js.map +1 -1
  13. package/lib/common/notifProvider/emailProvider.js +6 -1
  14. package/lib/common/notifProvider/emailProvider.js.map +1 -1
  15. package/lib/common/notifProvider/index.d.ts +2 -1
  16. package/lib/common/notifProvider/index.js +2 -2
  17. package/lib/common/notifProvider/index.js.map +1 -1
  18. package/lib/common/notifProvider/notifProviderRoot.js +3 -0
  19. package/lib/common/notifProvider/notifProviderRoot.js.map +1 -1
  20. package/lib/common/utils/agentforceQueryUtils.d.ts +48 -0
  21. package/lib/common/utils/agentforceQueryUtils.js +373 -0
  22. package/lib/common/utils/agentforceQueryUtils.js.map +1 -0
  23. package/lib/common/utils/authUtils.js +16 -3
  24. package/lib/common/utils/authUtils.js.map +1 -1
  25. package/lib/common/utils/dataCloudUtils.d.ts +39 -0
  26. package/lib/common/utils/dataCloudUtils.js +279 -0
  27. package/lib/common/utils/dataCloudUtils.js.map +1 -0
  28. package/lib/common/utils/filesUtils.d.ts +12 -13
  29. package/lib/common/utils/filesUtils.js +114 -43
  30. package/lib/common/utils/filesUtils.js.map +1 -1
  31. package/lib/common/utils/orgUtils.js +5 -1
  32. package/lib/common/utils/orgUtils.js.map +1 -1
  33. package/lib/common/utils/utilsAgentforceQuery.d.ts +1 -0
  34. package/lib/common/utils/utilsAgentforceQuery.js +2 -0
  35. package/lib/common/utils/utilsAgentforceQuery.js.map +1 -0
  36. package/oclif.lock +697 -697
  37. package/oclif.manifest.json +1405 -1020
  38. package/package.json +5 -5
package/README.md CHANGED
@@ -49,6 +49,10 @@ ___
49
49
 
50
50
  ___
51
51
 
52
+ _Featured on SalesforceBen_
53
+
54
+ [![SalesforceBen Interview](https://github.com/hardisgroupcom/sfdx-hardis/raw/main/docs/assets/images/sfben-sfdx-hardis.jpg)](https://www.youtube.com/watch?v=vtWx_IWoL9k)
55
+
52
56
  _See Dreamforce presentation_
53
57
 
54
58
  [![See Dreamforce presentation](https://github.com/hardisgroupcom/sfdx-hardis/raw/main/docs/assets/images/play-dreamforce-session.png)](https://www.youtube.com/watch?v=o0Mm9F07UFs)
@@ -144,17 +148,21 @@ sf hardis:<COMMAND> <OPTIONS>
144
148
 
145
149
  <!-- events.md start -->
146
150
 
147
- ### Coming soon: DevOps Dreamin '25, London
151
+ ### French Touch Dreamin '25
152
+
153
+ Refresh your full sandboxes without needing to reconfigure everything — with [Mehdi Abdennasser](https://www.linkedin.com/in/mehdi-abdennasser/)
148
154
 
149
- [Why you don't need DevOps vendors tools](https://devopsdreamin.com/agenda/)
155
+ Paris, France 02/12/2025
150
156
 
151
- <img width="1320" height="370" alt="image" src="https://github.com/user-attachments/assets/bc1e3831-9e89-4098-bedd-40cafbba3cfd" />
157
+ <img width="1920" height="1080" alt="Untitled design (14)" src="https://github.com/user-attachments/assets/853b9d66-973e-43ef-bfcf-fe044d1d4d94" />
152
158
 
153
- ### Coming soon: French Touch Dreamin '25, Paris
159
+ ### DevOps Dreamin
154
160
 
155
- [Refresh your full sandboxes without needing to reconfigure everything](https://frenchtouchdreamin.com/index.php/sessions/refresh-your-full-sandboxes-without-needing-to-reconfigure-everything/), with [Mehdi Abdennasser](https://www.linkedin.com/in/mehdi-abdennasser/)
161
+ Why you don't need DevOps vendors tools
156
162
 
157
- <img width="1901" height="661" alt="image" src="https://github.com/user-attachments/assets/7b01704b-5dd5-463e-914b-71c867632ea5" />
163
+ London, UK 20/11/2025
164
+
165
+ <img width="1920" height="1080" alt="Untitled design (13)" src="https://github.com/user-attachments/assets/d626363c-64af-43fb-b0a0-d2f0afcb9c1d" />
158
166
 
159
167
  ### Trailblazer User Group '25, Casablanca
160
168
 
@@ -271,6 +279,10 @@ Here are some articles about [sfdx-hardis](https://sfdx-hardis.cloudity.com/)
271
279
 
272
280
  ### Podcasts
273
281
 
282
+ - SalesforceBen Deep Dives with Peter Chittum, 2025: _**Simplify Salesforce Deployment with SFDX Hardis**_
283
+
284
+ [![Video](https://github.com/user-attachments/assets/383f6e9a-8102-42bc-be24-42663e9959d4)](https://www.youtube.com/watch?v=vtWx_IWoL9k)
285
+
274
286
  - Apex Hours 2025 - Org monitoring with Grafana + AI generated doc
275
287
 
276
288
  [![Apex Hours 2025: Org monitoring with Grafana + AI generated doc](https://img.youtube.com/vi/oDaCh66pRcI/0.jpg)](https://www.youtube.com/watch?v=oDaCh66pRcI){target=blank}
@@ -0,0 +1,14 @@
1
+ import { SfCommand } from "@salesforce/sf-plugins-core";
2
+ import { AnyJson } from "@salesforce/ts-types";
3
+ export default class DataCloudExtractAgentforceConversations extends SfCommand<any> {
4
+ static title: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: any;
8
+ static requiresProject: boolean;
9
+ protected debugMode: boolean;
10
+ protected queryString: string;
11
+ protected outputFile: any;
12
+ protected outputFilesRes: any;
13
+ run(): Promise<AnyJson>;
14
+ }
@@ -0,0 +1,369 @@
1
+ import { Messages } from "@salesforce/core";
2
+ import { Flags, requiredOrgFlagWithDeprecations, SfCommand } from "@salesforce/sf-plugins-core";
3
+ import { dataCloudSqlQuery } from "../../../../common/utils/dataCloudUtils.js";
4
+ import { uxLog } from "../../../../common/utils/index.js";
5
+ import { generateCsvFile, generateReportPath } from "../../../../common/utils/filesUtils.js";
6
+ import { NotifProvider } from "../../../../common/notifProvider/index.js";
7
+ import { setConnectionVariables } from "../../../../common/utils/orgUtils.js";
8
+ import c from "chalk";
9
+ import { buildConversation, buildConversationUrl, buildDateFilterClause, buildExcludedSessionFilter, extractSessionIds, extractSpeakerSegment, fetchConversationTranscripts, normalizeKeys, pickFirstMeaningfulValue, resolveConversationLinkDomain, resolveDateFilterOptions, resolveExcludedConversationIds, sanitizePlaceholderValue, stringValue, } from "../../../../common/utils/agentforceQueryUtils.js";
10
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
11
+ const messages = Messages.loadMessages('sfdx-hardis', 'org');
12
+ export default class DataCloudExtractAgentforceConversations extends SfCommand {
13
+ static title = 'Extract Agentforce Conversations Data from Data Cloud';
14
+ static description = `
15
+ ## Command Behavior
16
+
17
+ **Extracts Agentforce conversations data from Data Cloud and generates a detailed report.**
18
+
19
+ This command allows you to retrieve and analyze conversations between users and Agentforce agents. It fetches conversation details, including transcripts, user utterances, agent responses, and any associated feedback.
20
+
21
+ Key functionalities:
22
+
23
+ - **Data Extraction:** Queries Data Cloud for Agentforce conversation records.
24
+ - **Transcript Retrieval:** Fetches full conversation transcripts associated with the sessions.
25
+ - **Filtering:** Supports filtering by date range (from/to) or a rolling window (last N days).
26
+ - **Report Generation:** Creates a CSV and XLSX report containing:
27
+ - User information
28
+ - Date and time
29
+ - Full conversation transcript
30
+ - Feedback sentiment and message (if available)
31
+ - Direct link to the conversation in Salesforce
32
+ - **Link Generation:** Generates clickable URLs to view the conversation in the Agentforce Analytics dashboard.
33
+
34
+ <details markdown="1">
35
+ <summary>Technical explanations</summary>
36
+
37
+ The command's technical implementation involves:
38
+
39
+ - **Data Cloud Query:** Executes a SQL query against Data Cloud tables (\`GenAIGeneration__dlm\`, \`GenAIGatewayRequest__dlm\`, etc.) to retrieve conversation metadata and individual turns.
40
+ - **Session Management:** Extracts session IDs from the initial query results.
41
+ - **Transcript Fetching:** Asynchronously fetches full conversation transcripts for the identified sessions in chunks to handle large volumes efficiently.
42
+ - **Data Merging:** Combines the SQL query results with the fetched transcripts, prioritizing full transcripts over individual turn data when available.
43
+ - **URL Construction:** dynamically builds deep links to the Salesforce Lightning Experience for each conversation based on the org's instance URL and conversation ID.
44
+ - **File Output:** Uses \`generateCsvFile\` to output the processed data into CSV and XLSX formats with custom column widths and formatting.
45
+ - **Exclusion Filters:** Supports excluding specific conversations or sessions via environment variables \`AGENTFORCE_FEEDBACK_EXCLUDED_CONV_IDS\` and \`AGENTFORCE_EXCLUDED_SESSION_IDS\` (comma-separated IDs).
46
+ </details>
47
+ `;
48
+ static examples = [
49
+ '$ sf hardis:datacloud:extract:agentforce-conversations',
50
+ ];
51
+ static flags = {
52
+ outputfile: Flags.string({
53
+ char: 'f',
54
+ description: 'Force the path and name of output report file. Must end with .csv',
55
+ }),
56
+ debug: Flags.boolean({
57
+ char: 'd',
58
+ default: false,
59
+ description: messages.getMessage('debugMode'),
60
+ }),
61
+ 'date-from': Flags.string({
62
+ description: 'Optional ISO-8601 timestamp (UTC) to include conversations starting from this date',
63
+ }),
64
+ 'date-to': Flags.string({
65
+ description: 'Optional ISO-8601 timestamp (UTC) to include conversations up to this date',
66
+ }),
67
+ 'last-n-days': Flags.integer({
68
+ description: 'Optional rolling window (days) to include only the most recent conversations',
69
+ }),
70
+ websocket: Flags.string({
71
+ description: messages.getMessage('websocket'),
72
+ }),
73
+ skipauth: Flags.boolean({
74
+ description: 'Skip authentication check when a default username is required',
75
+ }),
76
+ 'target-org': requiredOrgFlagWithDeprecations,
77
+ };
78
+ static requiresProject = false;
79
+ debugMode = false;
80
+ queryString = '';
81
+ outputFile;
82
+ outputFilesRes = {};
83
+ /* jscpd:ignore-end */
84
+ async run() {
85
+ const { flags } = await this.parse(DataCloudExtractAgentforceConversations);
86
+ this.outputFile = flags.outputfile || null;
87
+ this.debugMode = flags.debug || false;
88
+ const conn = flags['target-org'].getConnection();
89
+ const conversationLinkDomain = resolveConversationLinkDomain(conn.instanceUrl);
90
+ const dateFilterOptions = resolveDateFilterOptions({
91
+ dateFromInput: flags['date-from'],
92
+ dateToInput: flags['date-to'],
93
+ lastNDaysInput: flags['last-n-days'],
94
+ });
95
+ this.queryString = buildConversationQuery(dateFilterOptions).trim();
96
+ uxLog("action", this, c.cyan("Querying Agentforce conversations..."));
97
+ const rawResult = await dataCloudSqlQuery(this.queryString, conn, {});
98
+ const sessionIds = extractSessionIds(rawResult.records, { sanitizer: sanitizePlaceholderValue });
99
+ uxLog("action", this, c.cyan("Fetching conversation transcripts..."));
100
+ const transcriptsBySession = await fetchConversationTranscripts(sessionIds, conn, {
101
+ chunkSize: 50,
102
+ sanitizeSessionId: sanitizePlaceholderValue,
103
+ });
104
+ uxLog("action", this, c.cyan("Building export records..."));
105
+ const exportRecords = buildConversationRecords(rawResult.records, {
106
+ conversationLinkDomain,
107
+ transcriptsBySession,
108
+ timeFilterDays: DEFAULT_CONVERSATION_TIME_FILTER_DAYS,
109
+ });
110
+ const result = { ...rawResult, records: exportRecords, returnedRows: exportRecords.length };
111
+ const { records: _records, ...resultCopy } = result;
112
+ void _records;
113
+ uxLog("other", this, JSON.stringify(resultCopy, null, 2));
114
+ this.outputFile = await generateReportPath('datacloud-agentforce-conversations', this.outputFile);
115
+ this.outputFilesRes = await generateCsvFile(exportRecords, this.outputFile, {
116
+ fileTitle: 'DataCloud Agentforce Conversations',
117
+ columnsCustomStyles: {
118
+ 'DateTime': { width: 26 },
119
+ 'Conversation transcript': { width: 90, wrap: true, maxHeight: 50 },
120
+ 'Feedback': { width: 12 },
121
+ 'Feedback message': { width: 45, wrap: true, maxHeight: 50 },
122
+ 'ConversationId': { width: 36 },
123
+ 'ConversationUrl': { width: 80, hyperlinkFromValue: true },
124
+ },
125
+ });
126
+ const conversationStats = computeConversationStats(exportRecords);
127
+ const notifText = buildConversationNotificationText(conversationStats, dateFilterOptions);
128
+ const attachedFiles = collectConversationReportFiles(this.outputFilesRes);
129
+ uxLog("action", this, c.cyan(notifText));
130
+ await setConnectionVariables(conn);
131
+ await NotifProvider.postNotifications({
132
+ type: 'AGENTFORCE_CONVERSATIONS',
133
+ text: notifText,
134
+ buttons: [],
135
+ attachments: [],
136
+ severity: 'log',
137
+ attachedFiles,
138
+ logElements: [],
139
+ data: { metric: conversationStats.totalCount },
140
+ metrics: {
141
+ agentforceConversationCount: conversationStats.totalCount,
142
+ agentforceConversationFeedbackCount: conversationStats.withFeedback,
143
+ agentforceConversationFeedbackBad: conversationStats.feedbackBad,
144
+ agentforceConversationFeedbackGood: conversationStats.feedbackGood,
145
+ },
146
+ alwaysSend: true,
147
+ });
148
+ return {
149
+ result: JSON.parse(JSON.stringify(result)),
150
+ csvLogFile: this.outputFile,
151
+ xlsxLogFile: this.outputFilesRes?.xlsxFile,
152
+ conversationCount: exportRecords.length
153
+ };
154
+ }
155
+ }
156
+ const DEFAULT_CONVERSATION_TIME_FILTER_DAYS = 365;
157
+ function buildConversationQuery(filters = {}) {
158
+ const dateFilterClause = buildDateFilterClause(filters);
159
+ const excludedConversationClause = buildExcludedConversationFilter();
160
+ const excludedSessionClause = buildExcludedSessionFilter();
161
+ return `
162
+ WITH conversation_base AS (
163
+ SELECT
164
+ COALESCE(usr.ssot__username__c, gar.userId__c) AS userName,
165
+ ggn.timestamp__c AS conversationDate,
166
+ gar.generationGroupId__c AS conversationId,
167
+ gar.gatewayRequestId__c AS gatewayRequestId,
168
+ gat.tagValue__c AS userUtterance,
169
+ ggn.responseText__c AS agentResponse,
170
+ ROW_NUMBER() OVER (
171
+ PARTITION BY gar.generationGroupId__c
172
+ ORDER BY ggn.timestamp__c DESC,
173
+ gar.gatewayRequestId__c DESC
174
+ ) AS rowNum
175
+ FROM GenAIGeneration__dlm ggn
176
+ JOIN GenAIGatewayResponse__dlm grs ON ggn.generationResponseId__c = grs.generationResponseId__c
177
+ JOIN GenAIGatewayRequest__dlm gar ON grs.generationRequestId__c = gar.gatewayRequestId__c
178
+ LEFT JOIN GenAIGatewayRequestTag__dlm gat ON gar.gatewayRequestId__c = gat.parent__c AND gat.tag__c = 'user_utterance'
179
+ LEFT JOIN ssot__User__dlm usr ON usr.ssot__Id__c = gar.userId__c
180
+ WHERE gar.generationGroupId__c IS NOT NULL${excludedConversationClause}${dateFilterClause}
181
+ ), session_lookup AS (
182
+ SELECT
183
+ ais.ssot__GenAiGatewayRequestId__c AS gatewayRequestId,
184
+ ai.ssot__AiAgentSessionId__c AS sessionId,
185
+ ROW_NUMBER() OVER (
186
+ PARTITION BY ais.ssot__GenAiGatewayRequestId__c
187
+ ORDER BY ais.ssot__StartTimestamp__c DESC
188
+ ) AS rowNum
189
+ FROM ssot__AiAgentInteractionStep__dlm ais
190
+ JOIN ssot__AiAgentInteraction__dlm ai ON ai.ssot__Id__c = ais.ssot__AiAgentInteractionId__c
191
+ ), session_agent_info AS (
192
+ SELECT
193
+ part.ssot__AiAgentSessionId__c AS sessionId,
194
+ MAX(part.ssot__AiAgentApiName__c) AS agentApiName
195
+ FROM ssot__AiAgentSessionParticipant__dlm part
196
+ WHERE part.ssot__AiAgentApiName__c IS NOT NULL
197
+ GROUP BY part.ssot__AiAgentSessionId__c
198
+ ), latest_feedback AS (
199
+ SELECT
200
+ gaf.generationGroupId__c AS conversationId,
201
+ gaf.feedback__c AS feedbackSentiment,
202
+ gfd.feedbackText__c AS feedbackMessage,
203
+ COALESCE(
204
+ gaf.timestamp__c,
205
+ TIMESTAMP '1900-01-01 00:00:00Z'
206
+ ) AS feedbackTimestamp,
207
+ ROW_NUMBER() OVER (
208
+ PARTITION BY gaf.generationGroupId__c
209
+ ORDER BY COALESCE(
210
+ gaf.timestamp__c,
211
+ TIMESTAMP '1900-01-01 00:00:00Z'
212
+ ) DESC,
213
+ gaf.feedbackId__c DESC
214
+ ) AS rowNum
215
+ FROM GenAIFeedback__dlm gaf
216
+ LEFT JOIN GenAIFeedbackDetail__dlm gfd ON gaf.feedbackId__c = gfd.parent__c
217
+ ), conversation_primary AS (
218
+ SELECT *
219
+ FROM conversation_base
220
+ WHERE rowNum = 1
221
+ )
222
+ SELECT
223
+ base.userName,
224
+ base.conversationDate,
225
+ base.conversationId,
226
+ base.gatewayRequestId,
227
+ sess.sessionId,
228
+ agent.agentApiName,
229
+ base.userUtterance,
230
+ base.agentResponse,
231
+ fb.feedbackSentiment,
232
+ fb.feedbackMessage
233
+ FROM conversation_primary base
234
+ LEFT JOIN (SELECT gatewayRequestId, sessionId FROM session_lookup WHERE rowNum = 1) sess ON sess.gatewayRequestId = base.gatewayRequestId
235
+ LEFT JOIN session_agent_info agent ON agent.sessionId = sess.sessionId
236
+ LEFT JOIN (
237
+ SELECT conversationId, feedbackSentiment, feedbackMessage
238
+ FROM latest_feedback
239
+ WHERE rowNum = 1
240
+ ) fb ON fb.conversationId = base.conversationId
241
+ ${excludedSessionClause}
242
+ ORDER BY base.conversationDate DESC
243
+ ;
244
+ `;
245
+ }
246
+ function buildConversationRecords(records, options) {
247
+ const safeRecords = Array.isArray(records) ? records : [];
248
+ const safeOptions = options || {
249
+ conversationLinkDomain: null,
250
+ transcriptsBySession: new Map(),
251
+ timeFilterDays: DEFAULT_CONVERSATION_TIME_FILTER_DAYS,
252
+ };
253
+ const dedupMap = new Map();
254
+ safeRecords.forEach((record) => {
255
+ const normalized = normalizeKeys(record);
256
+ const conversationDate = stringValue(normalized["conversationdate"] ?? normalized["timestamp__c"]);
257
+ const userName = sanitizePlaceholderValue(stringValue(normalized["username"] ?? normalized["userid"]));
258
+ const rawSessionId = stringValue(normalized["sessionid"] ?? normalized["ssot__aiagentsessionid__c"]);
259
+ const sessionId = sanitizePlaceholderValue(rawSessionId);
260
+ const agentApiName = sanitizePlaceholderValue(stringValue(normalized["agentapiname"] ?? normalized["ssot__aiagentapiname__c"]));
261
+ const conversationId = sanitizePlaceholderValue(stringValue(normalized["conversationid"] ?? normalized["generationgroupid__c"]));
262
+ const baseUserUtterance = stringValue(normalized["userutterance"] ?? normalized["tagvalue__c"]);
263
+ const baseAgentResponse = stringValue(normalized["agentresponse"] ?? normalized["responsetext"]);
264
+ const feedbackValueRaw = sanitizePlaceholderValue(stringValue(normalized["feedbacksentiment"] ?? normalized["feedback__c"]));
265
+ const feedbackValue = feedbackValueRaw ? feedbackValueRaw.toUpperCase() : '';
266
+ const feedbackMessage = sanitizePlaceholderValue(stringValue(normalized["feedbackmessage"] ?? normalized["feedbacktext__c"]));
267
+ const transcript = sessionId ? safeOptions.transcriptsBySession.get(sessionId) || '' : '';
268
+ const transcriptUserUtterance = extractSpeakerSegment(transcript, 'USER');
269
+ const transcriptAgentResponse = extractSpeakerSegment(transcript, 'AGENT');
270
+ const resolvedUserUtterance = pickFirstMeaningfulValue([baseUserUtterance, transcriptUserUtterance]);
271
+ const resolvedAgentResponse = pickFirstMeaningfulValue([baseAgentResponse, transcriptAgentResponse]);
272
+ const conversation = transcript || buildConversation(resolvedUserUtterance, resolvedAgentResponse);
273
+ const conversationUrl = buildConversationUrl({
274
+ domain: safeOptions.conversationLinkDomain,
275
+ conversationId,
276
+ sessionId,
277
+ agentApiName,
278
+ timeFilterDays: safeOptions.timeFilterDays,
279
+ });
280
+ if (!conversationId || !conversationUrl) {
281
+ return;
282
+ }
283
+ const exportRecord = {
284
+ "User": userName,
285
+ "DateTime": conversationDate,
286
+ "Conversation transcript": conversation,
287
+ "Feedback": feedbackValue,
288
+ "Feedback message": feedbackMessage,
289
+ "ConversationId": conversationId,
290
+ "ConversationUrl": conversationUrl,
291
+ };
292
+ const dedupKey = sessionId || conversationId || conversationUrl;
293
+ const existing = dedupMap.get(dedupKey);
294
+ if (!existing || isNewer(conversationDate, existing.conversationDate)) {
295
+ dedupMap.set(dedupKey, { record: exportRecord, conversationDate });
296
+ }
297
+ });
298
+ return Array.from(dedupMap.values()).map((entry) => entry.record);
299
+ }
300
+ function isNewer(candidateDate, existingDate) {
301
+ if (!candidateDate) {
302
+ return false;
303
+ }
304
+ if (!existingDate) {
305
+ return true;
306
+ }
307
+ const candidateTime = Date.parse(candidateDate);
308
+ const existingTime = Date.parse(existingDate);
309
+ if (Number.isNaN(candidateTime)) {
310
+ return false;
311
+ }
312
+ if (Number.isNaN(existingTime)) {
313
+ return true;
314
+ }
315
+ return candidateTime >= existingTime;
316
+ }
317
+ function computeConversationStats(records) {
318
+ let withFeedback = 0;
319
+ let feedbackBad = 0;
320
+ let feedbackGood = 0;
321
+ records.forEach((record) => {
322
+ const feedback = (record["Feedback"] || "").trim().toUpperCase();
323
+ if (feedback) {
324
+ withFeedback += 1;
325
+ if (feedback === "BAD") {
326
+ feedbackBad += 1;
327
+ }
328
+ else if (feedback === "GOOD") {
329
+ feedbackGood += 1;
330
+ }
331
+ }
332
+ });
333
+ return {
334
+ totalCount: records.length,
335
+ withFeedback,
336
+ feedbackBad,
337
+ feedbackGood,
338
+ };
339
+ }
340
+ function buildConversationNotificationText(stats, filters) {
341
+ const lines = [
342
+ `Agentforce conversations exported: ${stats.totalCount} (with feedback: ${stats.withFeedback}, GOOD: ${stats.feedbackGood}, BAD: ${stats.feedbackBad}).`,
343
+ ];
344
+ if (filters.dateFrom && filters.dateTo) {
345
+ lines.push(`Window: ${filters.dateFrom} → ${filters.dateTo}`);
346
+ }
347
+ else if (filters.dateFrom) {
348
+ lines.push(`Window starting ${filters.dateFrom}`);
349
+ }
350
+ else if (filters.dateTo) {
351
+ lines.push(`Window until ${filters.dateTo}`);
352
+ }
353
+ return lines.join('\n');
354
+ }
355
+ function collectConversationReportFiles(outputFilesRes) {
356
+ const files = [];
357
+ if (outputFilesRes?.xlsxFile) {
358
+ files.push(outputFilesRes.xlsxFile);
359
+ }
360
+ return files;
361
+ }
362
+ function buildExcludedConversationFilter() {
363
+ const excludedConversationIds = resolveExcludedConversationIds();
364
+ if (!excludedConversationIds.length) {
365
+ return '';
366
+ }
367
+ return ` AND gar.generationGroupId__c NOT IN (${excludedConversationIds.map((id) => `'${id}'`).join(', ')})`;
368
+ }
369
+ //# sourceMappingURL=agentforce-conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentforce-conversations.js","sourceRoot":"","sources":["../../../../../src/commands/hardis/datacloud/extract/agentforce-conversations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { SfCommand } from "@salesforce/sf-plugins-core";
2
+ import { AnyJson } from "@salesforce/ts-types";
3
+ export default class DataCloudExtractAgentforceFeedback extends SfCommand<any> {
4
+ static title: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: any;
8
+ static requiresProject: boolean;
9
+ protected debugMode: boolean;
10
+ protected queryString: string;
11
+ protected outputFile: any;
12
+ protected outputFilesRes: any;
13
+ run(): Promise<AnyJson>;
14
+ }