@simonfestl/husky-cli 1.3.0 → 1.3.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.
- package/dist/commands/biz/tickets.js +81 -24
- package/package.json +1 -1
|
@@ -459,21 +459,51 @@ ticketsCommand
|
|
|
459
459
|
console.log(` Searching ${options.collection}...`);
|
|
460
460
|
const results = await qdrant.search(options.collection, vector, parseInt(options.limit, 10) + 1 // +1 to exclude self
|
|
461
461
|
);
|
|
462
|
+
// Extract ticket_id from payload (handle nested metadata.ticket_id)
|
|
463
|
+
const extractTicketId = (payload) => {
|
|
464
|
+
if (!payload)
|
|
465
|
+
return null;
|
|
466
|
+
if (typeof payload.ticket_id === 'number')
|
|
467
|
+
return payload.ticket_id;
|
|
468
|
+
if (typeof payload.id === 'number')
|
|
469
|
+
return payload.id;
|
|
470
|
+
const metadata = payload.metadata;
|
|
471
|
+
if (metadata && typeof metadata.ticket_id === 'number')
|
|
472
|
+
return metadata.ticket_id;
|
|
473
|
+
return null;
|
|
474
|
+
};
|
|
462
475
|
// Filter out the same ticket
|
|
463
476
|
const filteredResults = results.filter(r => {
|
|
464
|
-
const
|
|
465
|
-
return
|
|
477
|
+
const ticketId = extractTicketId(r.payload);
|
|
478
|
+
return ticketId !== ticket.id;
|
|
466
479
|
}).slice(0, parseInt(options.limit, 10));
|
|
480
|
+
// Fetch ticket details from Zendesk for each result
|
|
481
|
+
const ticketIds = filteredResults
|
|
482
|
+
.map(r => extractTicketId(r.payload))
|
|
483
|
+
.filter((id) => id !== null);
|
|
484
|
+
const ticketDetailsMap = new Map();
|
|
485
|
+
if (ticketIds.length > 0) {
|
|
486
|
+
console.log(` Fetching ${ticketIds.length} ticket details...`);
|
|
487
|
+
const ticketDetails = await Promise.all(ticketIds.map(id => zendesk.getTicket(id).catch(() => null)));
|
|
488
|
+
ticketDetails.forEach((t, i) => {
|
|
489
|
+
if (t)
|
|
490
|
+
ticketDetailsMap.set(ticketIds[i], { subject: t.subject, status: t.status });
|
|
491
|
+
});
|
|
492
|
+
}
|
|
467
493
|
if (options.json) {
|
|
468
494
|
console.log(JSON.stringify({
|
|
469
495
|
success: true,
|
|
470
496
|
source_ticket: { id: ticket.id, subject: ticket.subject },
|
|
471
|
-
similar: filteredResults.map(r =>
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
497
|
+
similar: filteredResults.map(r => {
|
|
498
|
+
const ticketId = extractTicketId(r.payload);
|
|
499
|
+
const details = ticketId ? ticketDetailsMap.get(ticketId) : undefined;
|
|
500
|
+
return {
|
|
501
|
+
id: ticketId,
|
|
502
|
+
score: r.score,
|
|
503
|
+
subject: details?.subject,
|
|
504
|
+
status: details?.status,
|
|
505
|
+
};
|
|
506
|
+
}),
|
|
477
507
|
}, null, 2));
|
|
478
508
|
return;
|
|
479
509
|
}
|
|
@@ -483,10 +513,10 @@ ticketsCommand
|
|
|
483
513
|
return;
|
|
484
514
|
}
|
|
485
515
|
for (const result of filteredResults) {
|
|
486
|
-
const
|
|
487
|
-
const
|
|
488
|
-
const subject =
|
|
489
|
-
const status =
|
|
516
|
+
const ticketId = extractTicketId(result.payload);
|
|
517
|
+
const details = ticketId ? ticketDetailsMap.get(ticketId) : undefined;
|
|
518
|
+
const subject = details?.subject || '(no subject)';
|
|
519
|
+
const status = details?.status || '';
|
|
490
520
|
console.log(` [${(result.score * 100).toFixed(1)}%] #${ticketId} │ ${status} │ ${String(subject).slice(0, 45)}`);
|
|
491
521
|
}
|
|
492
522
|
console.log("");
|
|
@@ -505,24 +535,51 @@ ticketsCommand
|
|
|
505
535
|
.option("--json", "Output as JSON")
|
|
506
536
|
.action(async (query, options) => {
|
|
507
537
|
try {
|
|
538
|
+
const zendesk = ZendeskClient.fromConfig();
|
|
508
539
|
const embeddings = EmbeddingService.fromConfig();
|
|
509
540
|
const qdrant = QdrantClient.fromConfig();
|
|
510
|
-
// 1. Create embedding from query
|
|
511
541
|
console.log(` Generating embedding for query...`);
|
|
512
542
|
const vector = await embeddings.embed(query);
|
|
513
|
-
// 2. Search Qdrant
|
|
514
543
|
console.log(` Searching ${options.collection}...`);
|
|
515
544
|
const results = await qdrant.search(options.collection, vector, parseInt(options.limit, 10));
|
|
545
|
+
const extractTicketId = (payload) => {
|
|
546
|
+
if (!payload)
|
|
547
|
+
return null;
|
|
548
|
+
if (typeof payload.ticket_id === 'number')
|
|
549
|
+
return payload.ticket_id;
|
|
550
|
+
if (typeof payload.id === 'number')
|
|
551
|
+
return payload.id;
|
|
552
|
+
const metadata = payload.metadata;
|
|
553
|
+
if (metadata && typeof metadata.ticket_id === 'number')
|
|
554
|
+
return metadata.ticket_id;
|
|
555
|
+
return null;
|
|
556
|
+
};
|
|
557
|
+
const ticketIds = results
|
|
558
|
+
.map(r => extractTicketId(r.payload))
|
|
559
|
+
.filter((id) => id !== null);
|
|
560
|
+
const ticketDetailsMap = new Map();
|
|
561
|
+
if (ticketIds.length > 0) {
|
|
562
|
+
console.log(` Fetching ${ticketIds.length} ticket details...`);
|
|
563
|
+
const ticketDetails = await Promise.all(ticketIds.map(id => zendesk.getTicket(id).catch(() => null)));
|
|
564
|
+
ticketDetails.forEach((t, i) => {
|
|
565
|
+
if (t)
|
|
566
|
+
ticketDetailsMap.set(ticketIds[i], { subject: t.subject, status: t.status });
|
|
567
|
+
});
|
|
568
|
+
}
|
|
516
569
|
if (options.json) {
|
|
517
570
|
console.log(JSON.stringify({
|
|
518
571
|
success: true,
|
|
519
572
|
query,
|
|
520
|
-
results: results.map(r =>
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
573
|
+
results: results.map(r => {
|
|
574
|
+
const ticketId = extractTicketId(r.payload);
|
|
575
|
+
const details = ticketId ? ticketDetailsMap.get(ticketId) : undefined;
|
|
576
|
+
return {
|
|
577
|
+
id: ticketId,
|
|
578
|
+
score: r.score,
|
|
579
|
+
subject: details?.subject,
|
|
580
|
+
status: details?.status,
|
|
581
|
+
};
|
|
582
|
+
}),
|
|
526
583
|
}, null, 2));
|
|
527
584
|
return;
|
|
528
585
|
}
|
|
@@ -532,10 +589,10 @@ ticketsCommand
|
|
|
532
589
|
return;
|
|
533
590
|
}
|
|
534
591
|
for (const result of results) {
|
|
535
|
-
const
|
|
536
|
-
const
|
|
537
|
-
const subject =
|
|
538
|
-
const status =
|
|
592
|
+
const ticketId = extractTicketId(result.payload);
|
|
593
|
+
const details = ticketId ? ticketDetailsMap.get(ticketId) : undefined;
|
|
594
|
+
const subject = details?.subject || '(no subject)';
|
|
595
|
+
const status = details?.status || '';
|
|
539
596
|
console.log(` [${(result.score * 100).toFixed(1)}%] #${ticketId} │ ${status} │ ${String(subject).slice(0, 45)}`);
|
|
540
597
|
}
|
|
541
598
|
console.log("");
|