@sentry/junior 0.83.0 → 0.84.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/{agent-hooks-EEWWWIS2.js → agent-hooks-TFPY6V3T.js} +7 -7
- package/dist/app.js +58 -17
- package/dist/{catalog-runtime-IVWRAPSI.js → catalog-runtime-XOD7YPRS.js} +2 -2
- package/dist/chat/config.d.ts +1 -1
- package/dist/chat/requester.d.ts +1 -1
- package/dist/chat/slack/client.d.ts +1 -1
- package/dist/chat/state/session-log.d.ts +4 -0
- package/dist/chat/task-execution/state.d.ts +1 -1
- package/dist/{chunk-FAGWUF44.js → chunk-2TAIGJPQ.js} +1 -1
- package/dist/{chunk-WCXVEQPI.js → chunk-64ACM6AP.js} +1 -1
- package/dist/{chunk-5C3RY6IZ.js → chunk-AL6ZFV7U.js} +5 -5
- package/dist/{chunk-ABRNFE3N.js → chunk-ALL7GG6U.js} +7 -6
- package/dist/{chunk-KZLRUQAA.js → chunk-BAPRSWNW.js} +4 -1
- package/dist/{chunk-TW23AT22.js → chunk-BQ3ITJA6.js} +1 -1
- package/dist/{chunk-GUO4EE7L.js → chunk-CWMMGUWM.js} +1 -1
- package/dist/{chunk-ORRLK22J.js → chunk-FPN7NYTE.js} +4 -4
- package/dist/{chunk-ZPCGQRFJ.js → chunk-IXTBFABZ.js} +4 -5
- package/dist/{chunk-GK5CITCY.js → chunk-JK7376UT.js} +12 -6
- package/dist/{chunk-3JKTVW4R.js → chunk-LSG6PQF4.js} +3 -3
- package/dist/{chunk-X2FL5ZH5.js → chunk-MJ4E2PK7.js} +1 -1
- package/dist/{chunk-QVMLDCVR.js → chunk-QWKB6NJV.js} +3 -11
- package/dist/{chunk-AK7T7XRQ.js → chunk-SBYMRDH7.js} +1 -1
- package/dist/{chunk-BFQ7IUTE.js → chunk-SVFA43LT.js} +3 -3
- package/dist/{chunk-LK53AHO5.js → chunk-T2YRJZ5A.js} +20 -13
- package/dist/cli/chat.js +6 -6
- package/dist/cli/check.js +3 -3
- package/dist/cli/plugins.js +9 -9
- package/dist/cli/snapshot-warmup.js +5 -5
- package/dist/cli/upgrade.js +18 -34
- package/dist/{db-TRIVS6BW.js → db-ELRCNB4A.js} +4 -4
- package/dist/nitro.js +3 -3
- package/dist/reporting/conversations.d.ts +77 -0
- package/dist/reporting.d.ts +10 -2
- package/dist/reporting.js +423 -13
- package/dist/{runner-KS4XDMHF.js → runner-2XU6QQND.js} +12 -12
- package/dist/{validation-TN6HMZAD.js → validation-MBNJKWPQ.js} +3 -3
- package/package.json +6 -6
package/dist/reporting.js
CHANGED
|
@@ -6,24 +6,26 @@ import {
|
|
|
6
6
|
getConversationDetails,
|
|
7
7
|
getConversationDetailsForIds,
|
|
8
8
|
resolveSlackConversationContextFromThreadId
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SVFA43LT.js";
|
|
10
10
|
import {
|
|
11
11
|
buildSystemPrompt,
|
|
12
12
|
getAgentTurnSessionRecord,
|
|
13
13
|
listAgentTurnSessionSummariesForConversation,
|
|
14
14
|
loadActivityEntries
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-JK7376UT.js";
|
|
16
16
|
import {
|
|
17
17
|
getPluginOperationalReports
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-AL6ZFV7U.js";
|
|
19
|
+
import "./chunk-CWMMGUWM.js";
|
|
20
20
|
import {
|
|
21
21
|
getConversationStore
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-QWKB6NJV.js";
|
|
23
23
|
import "./chunk-G3E7SCME.js";
|
|
24
|
-
import
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
import {
|
|
25
|
+
getStateAdapter
|
|
26
|
+
} from "./chunk-MJ4E2PK7.js";
|
|
27
|
+
import "./chunk-BAPRSWNW.js";
|
|
28
|
+
import "./chunk-ALL7GG6U.js";
|
|
27
29
|
import {
|
|
28
30
|
canExposeConversationPayload,
|
|
29
31
|
parseSlackThreadId,
|
|
@@ -31,13 +33,13 @@ import {
|
|
|
31
33
|
} from "./chunk-DR75T7J3.js";
|
|
32
34
|
import {
|
|
33
35
|
discoverSkills
|
|
34
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-64ACM6AP.js";
|
|
35
37
|
import {
|
|
36
38
|
pluginCatalogRuntime
|
|
37
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-BQ3ITJA6.js";
|
|
38
40
|
import {
|
|
39
41
|
toStoredSlackRequester
|
|
40
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-IXTBFABZ.js";
|
|
41
43
|
import {
|
|
42
44
|
homeDir
|
|
43
45
|
} from "./chunk-6APU57E6.js";
|
|
@@ -53,11 +55,15 @@ import { readFileSync } from "fs";
|
|
|
53
55
|
import path from "path";
|
|
54
56
|
|
|
55
57
|
// src/reporting/conversations.ts
|
|
58
|
+
import { z } from "zod";
|
|
56
59
|
var HUNG_TURN_PROGRESS_MS = 5 * 60 * 1e3;
|
|
57
60
|
var SAFE_METADATA_KEY_LIMIT = 20;
|
|
58
61
|
var PRIVATE_CONVERSATION_LABEL = "Private Conversation";
|
|
59
62
|
var CONVERSATION_FEED_LIMIT = 50;
|
|
60
63
|
var CONVERSATION_STATS_LIMIT = 5e3;
|
|
64
|
+
var REQUESTER_PROFILE_SAMPLE_LIMIT = 5e3;
|
|
65
|
+
var REQUESTER_PROFILE_RECENT_LIMIT = 25;
|
|
66
|
+
var REQUESTER_PROFILE_ACTIVITY_DAYS = 366;
|
|
61
67
|
var RECENT_CONVERSATION_STATS_WINDOW_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
62
68
|
function conversationStore(options = {}) {
|
|
63
69
|
return options.conversationStore ?? getConversationStore();
|
|
@@ -490,6 +496,277 @@ function buildConversationStatsReport(args) {
|
|
|
490
496
|
).toISOString()
|
|
491
497
|
};
|
|
492
498
|
}
|
|
499
|
+
function normalizeRequesterEmail(email) {
|
|
500
|
+
const normalized = email?.trim().toLowerCase();
|
|
501
|
+
return normalized || void 0;
|
|
502
|
+
}
|
|
503
|
+
function requesterIdentityWithEmail(requester) {
|
|
504
|
+
const email = normalizeRequesterEmail(requester?.email);
|
|
505
|
+
if (!email) return void 0;
|
|
506
|
+
return {
|
|
507
|
+
email,
|
|
508
|
+
...requester?.fullName ? { fullName: requester.fullName } : {},
|
|
509
|
+
...requester?.slackUserId ? { slackUserId: requester.slackUserId } : {},
|
|
510
|
+
...requester?.slackUserName ? { slackUserName: requester.slackUserName } : {}
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
function mergeRequesterIdentity(current, next) {
|
|
514
|
+
return {
|
|
515
|
+
email: current.email,
|
|
516
|
+
...current.fullName ?? next.fullName ? { fullName: current.fullName ?? next.fullName } : {},
|
|
517
|
+
...current.slackUserId ?? next.slackUserId ? { slackUserId: current.slackUserId ?? next.slackUserId } : {},
|
|
518
|
+
...current.slackUserName ?? next.slackUserName ? { slackUserName: current.slackUserName ?? next.slackUserName } : {}
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
function reportDate(value) {
|
|
522
|
+
const time = reportTime(value);
|
|
523
|
+
if (time === void 0) return void 0;
|
|
524
|
+
return new Date(time).toISOString().slice(0, 10);
|
|
525
|
+
}
|
|
526
|
+
function emptyRequesterTotals() {
|
|
527
|
+
return {
|
|
528
|
+
active: 0,
|
|
529
|
+
activeDays: 0,
|
|
530
|
+
conversations: 0,
|
|
531
|
+
durationMs: 0,
|
|
532
|
+
failed: 0,
|
|
533
|
+
hung: 0,
|
|
534
|
+
runs: 0
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
function addRequesterTokens(target, tokens) {
|
|
538
|
+
if (tokens !== void 0) {
|
|
539
|
+
target.tokens = (target.tokens ?? 0) + tokens;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function addStatsSignals(item, signals) {
|
|
543
|
+
item.active += signals.active ? 1 : 0;
|
|
544
|
+
item.failed += signals.failed ? 1 : 0;
|
|
545
|
+
item.hung += signals.hung ? 1 : 0;
|
|
546
|
+
}
|
|
547
|
+
function addConversationSignals(target, signals) {
|
|
548
|
+
target.active += signals.active ? 1 : 0;
|
|
549
|
+
target.failed += signals.failed ? 1 : 0;
|
|
550
|
+
target.hung += signals.hung ? 1 : 0;
|
|
551
|
+
}
|
|
552
|
+
function directoryItem(accumulator) {
|
|
553
|
+
return {
|
|
554
|
+
active: accumulator.active,
|
|
555
|
+
activeDays: accumulator.activeDates.size,
|
|
556
|
+
conversations: accumulator.conversations,
|
|
557
|
+
durationMs: accumulator.durationMs,
|
|
558
|
+
failed: accumulator.failed,
|
|
559
|
+
firstSeenAt: new Date(accumulator.firstSeenMs).toISOString(),
|
|
560
|
+
hung: accumulator.hung,
|
|
561
|
+
lastSeenAt: new Date(accumulator.lastSeenMs).toISOString(),
|
|
562
|
+
requester: accumulator.requester,
|
|
563
|
+
runs: accumulator.runs,
|
|
564
|
+
...accumulator.tokens !== void 0 ? { tokens: accumulator.tokens } : {}
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
function emptyRequesterActivityDay(date) {
|
|
568
|
+
return {
|
|
569
|
+
active: 0,
|
|
570
|
+
conversations: 0,
|
|
571
|
+
date,
|
|
572
|
+
durationMs: 0,
|
|
573
|
+
failed: 0,
|
|
574
|
+
hung: 0,
|
|
575
|
+
runs: 0
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
function requesterActivityDays(args) {
|
|
579
|
+
const items = [];
|
|
580
|
+
const end = new Date(args.nowMs);
|
|
581
|
+
end.setUTCHours(0, 0, 0, 0);
|
|
582
|
+
const start = new Date(end);
|
|
583
|
+
start.setUTCDate(start.getUTCDate() - (REQUESTER_PROFILE_ACTIVITY_DAYS - 1));
|
|
584
|
+
for (const cursor = new Date(start); cursor.getTime() <= end.getTime(); cursor.setUTCDate(cursor.getUTCDate() + 1)) {
|
|
585
|
+
const date = cursor.toISOString().slice(0, 10);
|
|
586
|
+
items.push(args.days.get(date) ?? emptyRequesterActivityDay(date));
|
|
587
|
+
}
|
|
588
|
+
return items;
|
|
589
|
+
}
|
|
590
|
+
async function requesterSample(options = {}) {
|
|
591
|
+
const conversations = await conversationStore(options).listByActivity({
|
|
592
|
+
limit: REQUESTER_PROFILE_SAMPLE_LIMIT + 1
|
|
593
|
+
});
|
|
594
|
+
return {
|
|
595
|
+
conversations: conversations.slice(0, REQUESTER_PROFILE_SAMPLE_LIMIT),
|
|
596
|
+
truncated: conversations.length > REQUESTER_PROFILE_SAMPLE_LIMIT
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
async function readRequesterDirectoryReport(options = {}) {
|
|
600
|
+
const nowMs = Date.now();
|
|
601
|
+
const { conversations, truncated } = await requesterSample(options);
|
|
602
|
+
const detailsByConversationId = await getConversationDetailsForIds(
|
|
603
|
+
conversations.map((conversation) => conversation.conversationId)
|
|
604
|
+
);
|
|
605
|
+
const reportsByConversation = await reportsFromConversations({
|
|
606
|
+
conversations,
|
|
607
|
+
detailsByConversationId,
|
|
608
|
+
nowMs
|
|
609
|
+
});
|
|
610
|
+
const people = /* @__PURE__ */ new Map();
|
|
611
|
+
for (const conversation of conversations) {
|
|
612
|
+
const reports = [
|
|
613
|
+
...reportsByConversation.get(conversation.conversationId) ?? [
|
|
614
|
+
sessionReportFromConversation(
|
|
615
|
+
conversation,
|
|
616
|
+
nowMs,
|
|
617
|
+
detailsByConversationId.get(conversation.conversationId)
|
|
618
|
+
)
|
|
619
|
+
]
|
|
620
|
+
].sort(
|
|
621
|
+
(left, right) => (reportTime(left.startedAt) ?? 0) - (reportTime(right.startedAt) ?? 0) || left.id.localeCompare(right.id)
|
|
622
|
+
);
|
|
623
|
+
const newest = newestRun(reports);
|
|
624
|
+
const requester = requesterIdentityWithEmail(newest.requesterIdentity);
|
|
625
|
+
if (!requester) continue;
|
|
626
|
+
const lastSeenMs = reportTime(newest.lastSeenAt) ?? conversation.lastActivityAtMs;
|
|
627
|
+
const firstSeenMs = reportTime(reports[0]?.startedAt ?? newest.startedAt) ?? conversation.createdAtMs;
|
|
628
|
+
const contributions = runContributions(reports);
|
|
629
|
+
const signals = statusSignals(reports);
|
|
630
|
+
const date = reportDate(newest.lastSeenAt);
|
|
631
|
+
const email = requester.email;
|
|
632
|
+
const accumulator = people.get(email) ?? {
|
|
633
|
+
...emptyRequesterTotals(),
|
|
634
|
+
activeDates: /* @__PURE__ */ new Set(),
|
|
635
|
+
firstSeenMs,
|
|
636
|
+
lastSeenMs,
|
|
637
|
+
requester
|
|
638
|
+
};
|
|
639
|
+
accumulator.requester = mergeRequesterIdentity(
|
|
640
|
+
accumulator.requester,
|
|
641
|
+
requester
|
|
642
|
+
);
|
|
643
|
+
accumulator.conversations += 1;
|
|
644
|
+
accumulator.runs += reports.length;
|
|
645
|
+
accumulator.durationMs += contributionDurationTotal(contributions);
|
|
646
|
+
addRequesterTokens(accumulator, contributionTokenTotal(contributions));
|
|
647
|
+
addConversationSignals(accumulator, signals);
|
|
648
|
+
accumulator.firstSeenMs = Math.min(accumulator.firstSeenMs, firstSeenMs);
|
|
649
|
+
accumulator.lastSeenMs = Math.max(accumulator.lastSeenMs, lastSeenMs);
|
|
650
|
+
if (date) accumulator.activeDates.add(date);
|
|
651
|
+
people.set(email, accumulator);
|
|
652
|
+
}
|
|
653
|
+
return {
|
|
654
|
+
generatedAt: new Date(nowMs).toISOString(),
|
|
655
|
+
people: [...people.values()].map(directoryItem).sort(
|
|
656
|
+
(left, right) => (reportTime(right.lastSeenAt) ?? 0) - (reportTime(left.lastSeenAt) ?? 0) || right.conversations - left.conversations || left.requester.email.localeCompare(right.requester.email)
|
|
657
|
+
),
|
|
658
|
+
sampleLimit: REQUESTER_PROFILE_SAMPLE_LIMIT,
|
|
659
|
+
sampleSize: conversations.length,
|
|
660
|
+
source: "conversation_index",
|
|
661
|
+
truncated
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
async function readRequesterProfileReport(email, options = {}) {
|
|
665
|
+
const nowMs = Date.now();
|
|
666
|
+
const normalizedEmail = normalizeRequesterEmail(email) ?? email;
|
|
667
|
+
const { conversations, truncated } = await requesterSample(options);
|
|
668
|
+
const detailsByConversationId = await getConversationDetailsForIds(
|
|
669
|
+
conversations.map((conversation) => conversation.conversationId)
|
|
670
|
+
);
|
|
671
|
+
const reportsByConversation = await reportsFromConversations({
|
|
672
|
+
conversations,
|
|
673
|
+
detailsByConversationId,
|
|
674
|
+
nowMs
|
|
675
|
+
});
|
|
676
|
+
const matchingConversations = conversations.filter((conversation) => {
|
|
677
|
+
const reports = reportsByConversation.get(conversation.conversationId) ?? [];
|
|
678
|
+
const report = reports.length > 0 ? newestRun(reports) : sessionReportFromConversation(
|
|
679
|
+
conversation,
|
|
680
|
+
nowMs,
|
|
681
|
+
detailsByConversationId.get(conversation.conversationId)
|
|
682
|
+
);
|
|
683
|
+
return requesterIdentityWithEmail(report.requesterIdentity)?.email === normalizedEmail;
|
|
684
|
+
});
|
|
685
|
+
let requester;
|
|
686
|
+
const totals = emptyRequesterTotals();
|
|
687
|
+
const activeDates = /* @__PURE__ */ new Set();
|
|
688
|
+
const activityDays = /* @__PURE__ */ new Map();
|
|
689
|
+
const locations = /* @__PURE__ */ new Map();
|
|
690
|
+
const surfaces = /* @__PURE__ */ new Map();
|
|
691
|
+
const recentConversations = [];
|
|
692
|
+
for (const conversation of matchingConversations) {
|
|
693
|
+
const reports = [
|
|
694
|
+
...reportsByConversation.get(conversation.conversationId) ?? [
|
|
695
|
+
sessionReportFromConversation(
|
|
696
|
+
conversation,
|
|
697
|
+
nowMs,
|
|
698
|
+
detailsByConversationId.get(conversation.conversationId)
|
|
699
|
+
)
|
|
700
|
+
]
|
|
701
|
+
].sort(
|
|
702
|
+
(left, right) => (reportTime(left.startedAt) ?? 0) - (reportTime(right.startedAt) ?? 0) || left.id.localeCompare(right.id)
|
|
703
|
+
);
|
|
704
|
+
const newest = newestRun(reports);
|
|
705
|
+
const identity = requesterIdentityWithEmail(newest.requesterIdentity);
|
|
706
|
+
if (identity) {
|
|
707
|
+
requester = requester ? mergeRequesterIdentity(requester, identity) : identity;
|
|
708
|
+
}
|
|
709
|
+
recentConversations.push(newest);
|
|
710
|
+
const contributions = runContributions(reports);
|
|
711
|
+
const signals = statusSignals(reports);
|
|
712
|
+
const durationMs = contributionDurationTotal(contributions);
|
|
713
|
+
const tokens = contributionTokenTotal(contributions);
|
|
714
|
+
const date = reportDate(newest.lastSeenAt);
|
|
715
|
+
totals.conversations += 1;
|
|
716
|
+
totals.runs += reports.length;
|
|
717
|
+
totals.durationMs += durationMs;
|
|
718
|
+
addRequesterTokens(totals, tokens);
|
|
719
|
+
addConversationSignals(totals, signals);
|
|
720
|
+
if (date) {
|
|
721
|
+
activeDates.add(date);
|
|
722
|
+
const day = activityDays.get(date) ?? emptyRequesterActivityDay(date);
|
|
723
|
+
day.conversations += 1;
|
|
724
|
+
day.runs += reports.length;
|
|
725
|
+
day.durationMs += durationMs;
|
|
726
|
+
addRequesterTokens(day, tokens);
|
|
727
|
+
addConversationSignals(day, signals);
|
|
728
|
+
activityDays.set(date, day);
|
|
729
|
+
}
|
|
730
|
+
const location = locationLabel(newest);
|
|
731
|
+
const locationItem = locations.get(location) ?? emptyStatsItem(location);
|
|
732
|
+
locationItem.conversations += 1;
|
|
733
|
+
locationItem.runs += reports.length;
|
|
734
|
+
locationItem.durationMs += durationMs;
|
|
735
|
+
addItemTokens(locationItem, tokens);
|
|
736
|
+
addStatsSignals(locationItem, signals);
|
|
737
|
+
locations.set(location, locationItem);
|
|
738
|
+
const surface = surfaceFallbackLabel(newest.surface);
|
|
739
|
+
const surfaceItem = surfaces.get(surface) ?? emptyStatsItem(surface);
|
|
740
|
+
surfaceItem.conversations += 1;
|
|
741
|
+
surfaceItem.runs += reports.length;
|
|
742
|
+
surfaceItem.durationMs += durationMs;
|
|
743
|
+
addItemTokens(surfaceItem, tokens);
|
|
744
|
+
addStatsSignals(surfaceItem, signals);
|
|
745
|
+
surfaces.set(surface, surfaceItem);
|
|
746
|
+
}
|
|
747
|
+
totals.activeDays = activeDates.size;
|
|
748
|
+
const end = new Date(nowMs);
|
|
749
|
+
end.setUTCHours(0, 0, 0, 0);
|
|
750
|
+
const start = new Date(end);
|
|
751
|
+
start.setUTCDate(start.getUTCDate() - (REQUESTER_PROFILE_ACTIVITY_DAYS - 1));
|
|
752
|
+
return {
|
|
753
|
+
activityDays: requesterActivityDays({ days: activityDays, nowMs }),
|
|
754
|
+
generatedAt: new Date(nowMs).toISOString(),
|
|
755
|
+
locations: statsItems(locations),
|
|
756
|
+
recentConversations: recentConversations.sort(
|
|
757
|
+
(left, right) => (reportTime(right.lastSeenAt) ?? 0) - (reportTime(left.lastSeenAt) ?? 0) || right.conversationId.localeCompare(left.conversationId)
|
|
758
|
+
).slice(0, REQUESTER_PROFILE_RECENT_LIMIT),
|
|
759
|
+
requester: requester ?? { email: normalizedEmail },
|
|
760
|
+
sampleLimit: REQUESTER_PROFILE_SAMPLE_LIMIT,
|
|
761
|
+
sampleSize: conversations.length,
|
|
762
|
+
source: "conversation_index",
|
|
763
|
+
surfaces: statsItems(surfaces),
|
|
764
|
+
totals,
|
|
765
|
+
truncated,
|
|
766
|
+
windowEnd: end.toISOString(),
|
|
767
|
+
windowStart: start.toISOString()
|
|
768
|
+
};
|
|
769
|
+
}
|
|
493
770
|
function canExposeConversationTranscript(summary) {
|
|
494
771
|
return canExposeConversationPayload({
|
|
495
772
|
conversationId: summary.conversationId
|
|
@@ -686,7 +963,8 @@ function subagentActivity(entry, options) {
|
|
|
686
963
|
...end ? {
|
|
687
964
|
endedAt: new Date(end.createdAtMs).toISOString(),
|
|
688
965
|
outcome: end.outcome,
|
|
689
|
-
status: end.outcome
|
|
966
|
+
status: end.outcome,
|
|
967
|
+
...options.canExposeTranscript && end.transcriptStartMessageIndex !== void 0 && end.transcriptEndMessageIndex !== void 0 ? { transcriptAvailable: true } : {}
|
|
690
968
|
} : { status: options.parentStatus ?? "running" }
|
|
691
969
|
};
|
|
692
970
|
}
|
|
@@ -706,6 +984,7 @@ function buildConversationActivity(args) {
|
|
|
706
984
|
}
|
|
707
985
|
const parentStatus = entry.parentToolCallId ? toolStatuses.get(entry.parentToolCallId) : void 0;
|
|
708
986
|
const activity = subagentActivity(entry, {
|
|
987
|
+
canExposeTranscript: args.canExposePayload,
|
|
709
988
|
end: subagentEnds.get(entry.subagentInvocationId),
|
|
710
989
|
parentStatus
|
|
711
990
|
});
|
|
@@ -802,6 +1081,62 @@ function traceIdFromTranscript(transcript) {
|
|
|
802
1081
|
}
|
|
803
1082
|
return void 0;
|
|
804
1083
|
}
|
|
1084
|
+
function subagentTranscriptReport(activity, options = {}) {
|
|
1085
|
+
return {
|
|
1086
|
+
type: "subagent",
|
|
1087
|
+
...options.subagentConversationId ? { subagentConversationId: options.subagentConversationId } : {},
|
|
1088
|
+
createdAt: activity.createdAt,
|
|
1089
|
+
id: activity.id,
|
|
1090
|
+
status: activity.status,
|
|
1091
|
+
...options.subagentSentryConversationUrl ? { subagentSentryConversationUrl: options.subagentSentryConversationUrl } : {},
|
|
1092
|
+
subagentKind: activity.subagentKind,
|
|
1093
|
+
transcript: options.transcript ?? [],
|
|
1094
|
+
transcriptAvailable: Boolean(options.transcript?.length),
|
|
1095
|
+
...activity.endedAt ? { endedAt: activity.endedAt } : {},
|
|
1096
|
+
...activity.outcome ? { outcome: activity.outcome } : {},
|
|
1097
|
+
...activity.parentToolCallId ? { parentToolCallId: activity.parentToolCallId } : {},
|
|
1098
|
+
...options.transcriptMessageCount !== void 0 ? { transcriptMessageCount: options.transcriptMessageCount } : {},
|
|
1099
|
+
...options.transcriptRedacted ? { transcriptRedacted: options.transcriptRedacted } : {},
|
|
1100
|
+
...options.transcriptRedactionReason ? { transcriptRedactionReason: options.transcriptRedactionReason } : {},
|
|
1101
|
+
...options.unavailableReason ? { unavailableReason: options.unavailableReason } : {}
|
|
1102
|
+
};
|
|
1103
|
+
}
|
|
1104
|
+
function subagentConversationFields(ref) {
|
|
1105
|
+
if (ref.type !== "advisor_session") {
|
|
1106
|
+
return {};
|
|
1107
|
+
}
|
|
1108
|
+
const subagentConversationId = ref.key;
|
|
1109
|
+
const subagentSentryConversationUrl = buildSentryConversationUrl(
|
|
1110
|
+
subagentConversationId
|
|
1111
|
+
);
|
|
1112
|
+
return {
|
|
1113
|
+
subagentConversationId,
|
|
1114
|
+
...subagentSentryConversationUrl ? { subagentSentryConversationUrl } : {}
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
var piMessageSchema = z.object({
|
|
1118
|
+
content: z.array(z.unknown()),
|
|
1119
|
+
role: z.string().min(1)
|
|
1120
|
+
}).passthrough().transform((value) => value);
|
|
1121
|
+
async function readTranscriptRefMessages(ref) {
|
|
1122
|
+
if (ref.type !== "advisor_session") {
|
|
1123
|
+
return [];
|
|
1124
|
+
}
|
|
1125
|
+
const stateAdapter = getStateAdapter();
|
|
1126
|
+
await stateAdapter.connect();
|
|
1127
|
+
const value = await stateAdapter.get(ref.key);
|
|
1128
|
+
const parsed = z.array(piMessageSchema).safeParse(value);
|
|
1129
|
+
return parsed.success ? parsed.data : [];
|
|
1130
|
+
}
|
|
1131
|
+
function transcriptSliceBounds(end) {
|
|
1132
|
+
if (end?.transcriptStartMessageIndex === void 0 || end.transcriptEndMessageIndex === void 0 || end.transcriptEndMessageIndex < end.transcriptStartMessageIndex) {
|
|
1133
|
+
return void 0;
|
|
1134
|
+
}
|
|
1135
|
+
return {
|
|
1136
|
+
end: end.transcriptEndMessageIndex,
|
|
1137
|
+
start: end.transcriptStartMessageIndex
|
|
1138
|
+
};
|
|
1139
|
+
}
|
|
805
1140
|
async function summariesByConversation(conversations) {
|
|
806
1141
|
const entries = await Promise.all(
|
|
807
1142
|
conversations.map(async (conversation) => {
|
|
@@ -1009,6 +1344,74 @@ async function readConversationReport(conversationId, options = {}) {
|
|
|
1009
1344
|
runs: effectiveRuns
|
|
1010
1345
|
};
|
|
1011
1346
|
}
|
|
1347
|
+
async function readConversationSubagentTranscriptReport(conversationId, runId, subagentId) {
|
|
1348
|
+
const summaries = await listAgentTurnSessionSummariesForConversation(conversationId);
|
|
1349
|
+
const summary = summaries.find((candidate) => candidate.sessionId === runId);
|
|
1350
|
+
if (!summary) {
|
|
1351
|
+
return {
|
|
1352
|
+
type: "subagent",
|
|
1353
|
+
createdAt: (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
1354
|
+
id: subagentId,
|
|
1355
|
+
status: "error",
|
|
1356
|
+
subagentKind: "unknown",
|
|
1357
|
+
transcript: [],
|
|
1358
|
+
transcriptAvailable: false,
|
|
1359
|
+
unavailableReason: "not_found"
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
const entries = await loadActivityEntries({
|
|
1363
|
+
conversationId,
|
|
1364
|
+
sessionId: runId
|
|
1365
|
+
});
|
|
1366
|
+
const start = entries.find(
|
|
1367
|
+
(entry) => entry.type === "subagent_started" && entry.subagentInvocationId === subagentId
|
|
1368
|
+
);
|
|
1369
|
+
const end = entries.find(
|
|
1370
|
+
(entry) => entry.type === "subagent_ended" && entry.subagentInvocationId === subagentId
|
|
1371
|
+
);
|
|
1372
|
+
if (!start) {
|
|
1373
|
+
return {
|
|
1374
|
+
type: "subagent",
|
|
1375
|
+
createdAt: (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
1376
|
+
id: subagentId,
|
|
1377
|
+
status: "error",
|
|
1378
|
+
subagentKind: "unknown",
|
|
1379
|
+
transcript: [],
|
|
1380
|
+
transcriptAvailable: false,
|
|
1381
|
+
unavailableReason: "not_found"
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
const canExposeTranscript = canExposeConversationTranscript(summary);
|
|
1385
|
+
const activity = subagentActivity(start, { canExposeTranscript, end });
|
|
1386
|
+
const conversationFields = subagentConversationFields(start.transcriptRef);
|
|
1387
|
+
if (!canExposeTranscript) {
|
|
1388
|
+
return subagentTranscriptReport(activity, {
|
|
1389
|
+
...conversationFields,
|
|
1390
|
+
transcriptRedacted: true,
|
|
1391
|
+
transcriptRedactionReason: "non_public_conversation"
|
|
1392
|
+
});
|
|
1393
|
+
}
|
|
1394
|
+
const bounds = transcriptSliceBounds(end);
|
|
1395
|
+
if (!bounds) {
|
|
1396
|
+
return subagentTranscriptReport(activity, {
|
|
1397
|
+
...conversationFields,
|
|
1398
|
+
unavailableReason: "missing_transcript_range"
|
|
1399
|
+
});
|
|
1400
|
+
}
|
|
1401
|
+
const messages = await readTranscriptRefMessages(start.transcriptRef);
|
|
1402
|
+
if (messages.length === 0) {
|
|
1403
|
+
return subagentTranscriptReport(activity, {
|
|
1404
|
+
...conversationFields,
|
|
1405
|
+
unavailableReason: "missing_transcript_ref"
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
const transcript = messages.slice(0, bounds.end).map(normalizeTranscriptMessage);
|
|
1409
|
+
return subagentTranscriptReport(activity, {
|
|
1410
|
+
...conversationFields,
|
|
1411
|
+
transcript,
|
|
1412
|
+
transcriptMessageCount: countConversationMessages(transcript)
|
|
1413
|
+
});
|
|
1414
|
+
}
|
|
1012
1415
|
|
|
1013
1416
|
// src/reporting.ts
|
|
1014
1417
|
function readDescriptionText() {
|
|
@@ -1064,6 +1467,8 @@ function createJuniorReporting() {
|
|
|
1064
1467
|
getSkills: readSkills,
|
|
1065
1468
|
listConversations: () => readConversationFeed({ conversationStore: conversationStore2 }),
|
|
1066
1469
|
getConversationStats: () => readConversationStatsReport({ conversationStore: conversationStore2 }),
|
|
1470
|
+
listRequesters: () => readRequesterDirectoryReport({ conversationStore: conversationStore2 }),
|
|
1471
|
+
getRequesterProfile: (email) => readRequesterProfileReport(email, { conversationStore: conversationStore2 }),
|
|
1067
1472
|
listRecentConversations: listRecent,
|
|
1068
1473
|
getPluginOperationalReports: async () => {
|
|
1069
1474
|
const nowMs = Date.now();
|
|
@@ -1075,7 +1480,12 @@ function createJuniorReporting() {
|
|
|
1075
1480
|
})
|
|
1076
1481
|
};
|
|
1077
1482
|
},
|
|
1078
|
-
getConversation: (conversationId) => readConversationReport(conversationId, { conversationStore: conversationStore2 })
|
|
1483
|
+
getConversation: (conversationId) => readConversationReport(conversationId, { conversationStore: conversationStore2 }),
|
|
1484
|
+
getConversationSubagentTranscript: (conversationId, runId, subagentId) => readConversationSubagentTranscriptReport(
|
|
1485
|
+
conversationId,
|
|
1486
|
+
runId,
|
|
1487
|
+
subagentId
|
|
1488
|
+
)
|
|
1079
1489
|
};
|
|
1080
1490
|
}
|
|
1081
1491
|
export {
|
|
@@ -14,30 +14,30 @@ import {
|
|
|
14
14
|
startActiveTurn,
|
|
15
15
|
updateConversationStats,
|
|
16
16
|
upsertConversationMessage
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-T2YRJZ5A.js";
|
|
18
18
|
import {
|
|
19
19
|
coerceThreadConversationState
|
|
20
20
|
} from "./chunk-66NX7MNW.js";
|
|
21
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-LSG6PQF4.js";
|
|
22
22
|
import "./chunk-KNFROR7R.js";
|
|
23
23
|
import {
|
|
24
24
|
commitMessages,
|
|
25
25
|
loadProjection
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
26
|
+
} from "./chunk-JK7376UT.js";
|
|
27
|
+
import "./chunk-AL6ZFV7U.js";
|
|
28
|
+
import "./chunk-CWMMGUWM.js";
|
|
29
|
+
import "./chunk-QWKB6NJV.js";
|
|
30
30
|
import "./chunk-G3E7SCME.js";
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-MJ4E2PK7.js";
|
|
32
|
+
import "./chunk-BAPRSWNW.js";
|
|
33
33
|
import {
|
|
34
34
|
stripRuntimeTurnContext,
|
|
35
35
|
trimTrailingAssistantMessages
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-ALL7GG6U.js";
|
|
37
37
|
import "./chunk-DR75T7J3.js";
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
38
|
+
import "./chunk-64ACM6AP.js";
|
|
39
|
+
import "./chunk-BQ3ITJA6.js";
|
|
40
|
+
import "./chunk-IXTBFABZ.js";
|
|
41
41
|
import "./chunk-6APU57E6.js";
|
|
42
42
|
import {
|
|
43
43
|
logException
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
validatePluginEgressCredentialHooks,
|
|
3
3
|
validatePluginRegistrations
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-2TAIGJPQ.js";
|
|
5
|
+
import "./chunk-BQ3ITJA6.js";
|
|
6
|
+
import "./chunk-IXTBFABZ.js";
|
|
7
7
|
import "./chunk-6APU57E6.js";
|
|
8
8
|
import "./chunk-KF7522P3.js";
|
|
9
9
|
import "./chunk-FTMXFBDC.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/junior",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.84.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"pg": "^8.16.3",
|
|
71
71
|
"yaml": "^2.9.0",
|
|
72
72
|
"zod": "^4.4.3",
|
|
73
|
-
"@sentry/junior-plugin-api": "0.
|
|
73
|
+
"@sentry/junior-plugin-api": "0.84.1"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"@emnapi/core": "^1.10.0",
|
|
@@ -86,10 +86,10 @@
|
|
|
86
86
|
"typescript": "^6.0.3",
|
|
87
87
|
"vercel": "^54.4.0",
|
|
88
88
|
"vitest": "^4.1.7",
|
|
89
|
-
"@sentry/junior-github": "0.
|
|
90
|
-
"@sentry/junior-
|
|
91
|
-
"@sentry/junior-
|
|
92
|
-
"@sentry/junior-
|
|
89
|
+
"@sentry/junior-github": "0.84.1",
|
|
90
|
+
"@sentry/junior-testing": "0.0.0",
|
|
91
|
+
"@sentry/junior-memory": "0.84.1",
|
|
92
|
+
"@sentry/junior-scheduler": "0.84.1"
|
|
93
93
|
},
|
|
94
94
|
"scripts": {
|
|
95
95
|
"build": "tsup && tsc -p tsconfig.build.json --emitDeclarationOnly",
|