@sentry/junior 0.86.0 → 0.88.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.
- package/dist/{agent-hooks-NWOUB3UR.js → agent-hooks-RIJ5TSWP.js} +8 -8
- package/dist/api/people/list.d.ts +4 -0
- package/dist/api/people/list.js +83 -0
- package/dist/api/people/list.query.d.ts +4 -0
- package/dist/api/people/profile.d.ts +4 -0
- package/dist/api/people/profile.js +131 -0
- package/dist/api/people/profile.query.d.ts +4 -0
- package/dist/api/people/shared.d.ts +76 -0
- package/dist/api/people/types.d.ts +85 -0
- package/dist/app.js +45 -74
- package/dist/{catalog-runtime-XOD7YPRS.js → catalog-runtime-MW7XERSU.js} +3 -3
- package/dist/chat/conversations/sql/migrations.d.ts +1 -1
- package/dist/chat/conversations/sql/schema/identities.d.ts +54 -3
- package/dist/chat/conversations/sql/schema/users.d.ts +109 -0
- package/dist/chat/conversations/sql/schema.d.ts +164 -3
- package/dist/chat/conversations/sql/store.d.ts +0 -1
- package/dist/chat/identities/identity.d.ts +18 -0
- package/dist/chat/identities/sql.d.ts +4 -0
- package/dist/chat/no-reply.d.ts +7 -0
- package/dist/chat/runtime/processing-reaction.d.ts +2 -1
- package/dist/chat/runtime/slack-resume.d.ts +3 -2
- package/dist/chat/runtime/thread-context.d.ts +3 -1
- package/dist/chat/runtime/turn-user-message.d.ts +2 -1
- package/dist/chat/services/conversation-memory.d.ts +3 -1
- package/dist/chat/services/reply-delivery-plan.d.ts +0 -4
- package/dist/chat/slack/message.d.ts +2 -1
- package/dist/chat/slack/outbound.d.ts +5 -4
- package/dist/chat/slack/timestamp.d.ts +6 -0
- package/dist/chat/sql/schema.d.ts +163 -3
- package/dist/chat/tools/slack/context.d.ts +2 -1
- package/dist/{chunk-ENPSU7L7.js → chunk-2DPZRS3B.js} +4 -4
- package/dist/{chunk-6I6HBOQM.js → chunk-4IXHIV37.js} +413 -157
- package/dist/{chunk-JRXCSSSU.js → chunk-6UPQ5GTJ.js} +3 -3
- package/dist/{chunk-64ACM6AP.js → chunk-7ES37H6U.js} +2 -2
- package/dist/{chunk-GGD6WK6V.js → chunk-AHLSXMOU.js} +2 -2
- package/dist/{chunk-2TAIGJPQ.js → chunk-C5NCV3OB.js} +1 -1
- package/dist/{chunk-6O5UI3RG.js → chunk-F22AM3OW.js} +1 -1
- package/dist/{chunk-BRSQQRG6.js → chunk-IATAYWFU.js} +2 -2
- package/dist/{chunk-BQ3ITJA6.js → chunk-KBFQXJL4.js} +2 -2
- package/dist/{chunk-37B2R2QJ.js → chunk-KBSLCOGE.js} +28 -15
- package/dist/{chunk-IXTBFABZ.js → chunk-KQKIA4CU.js} +1 -1
- package/dist/{chunk-FPHA6GCQ.js → chunk-NYJLQI42.js} +95 -92
- package/dist/chunk-PBV4ZIVM.js +261 -0
- package/dist/{chunk-ZU2ALUVQ.js → chunk-S35CPNPT.js} +1 -1
- package/dist/{chunk-RIB3M6YA.js → chunk-V6XDCS3X.js} +4 -4
- package/dist/{chunk-KF7522P3.js → chunk-VMBZFPZM.js} +11 -1
- package/dist/{chunk-2NFV5FMB.js → chunk-XS6NLQPA.js} +21 -12
- package/dist/{chunk-GB5DFM4D.js → chunk-YPAE5RH3.js} +1 -1
- package/dist/cli/chat.js +6 -6
- package/dist/cli/check.js +4 -4
- package/dist/cli/plugins.js +11 -11
- package/dist/cli/snapshot-warmup.js +6 -6
- package/dist/cli/upgrade.js +12 -12
- package/dist/{db-SZVUU7RB.js → db-37HOGLI7.js} +5 -5
- package/dist/nitro.js +4 -4
- package/dist/reporting/conversations.d.ts +0 -56
- package/dist/reporting.d.ts +2 -8
- package/dist/reporting.js +14 -290
- package/dist/{runner-HEBRPNN2.js → runner-BCRF2FCI.js} +13 -13
- package/dist/{validation-MBNJKWPQ.js → validation-FMJO3L5P.js} +4 -4
- package/package.json +14 -6
|
@@ -164,62 +164,6 @@ export interface ConversationStatsReport {
|
|
|
164
164
|
windowEnd: string;
|
|
165
165
|
windowStart: string;
|
|
166
166
|
}
|
|
167
|
-
export interface RequesterActivityDayReport {
|
|
168
|
-
active: number;
|
|
169
|
-
conversations: number;
|
|
170
|
-
date: string;
|
|
171
|
-
durationMs: number;
|
|
172
|
-
failed: number;
|
|
173
|
-
hung: number;
|
|
174
|
-
runs: number;
|
|
175
|
-
tokens?: number;
|
|
176
|
-
}
|
|
177
|
-
export interface RequesterTotalsReport {
|
|
178
|
-
active: number;
|
|
179
|
-
activeDays: number;
|
|
180
|
-
conversations: number;
|
|
181
|
-
durationMs: number;
|
|
182
|
-
failed: number;
|
|
183
|
-
hung: number;
|
|
184
|
-
runs: number;
|
|
185
|
-
tokens?: number;
|
|
186
|
-
}
|
|
187
|
-
export interface RequesterSummaryReport extends RequesterTotalsReport {
|
|
188
|
-
firstSeenAt: string;
|
|
189
|
-
lastSeenAt: string;
|
|
190
|
-
requester: RequesterIdentity & {
|
|
191
|
-
email: string;
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
export interface RequesterDirectoryReport {
|
|
195
|
-
generatedAt: string;
|
|
196
|
-
people: RequesterSummaryReport[];
|
|
197
|
-
sampleLimit: number;
|
|
198
|
-
sampleSize: number;
|
|
199
|
-
source: "conversation_index";
|
|
200
|
-
truncated: boolean;
|
|
201
|
-
}
|
|
202
|
-
export interface RequesterProfileReport {
|
|
203
|
-
activityDays: RequesterActivityDayReport[];
|
|
204
|
-
generatedAt: string;
|
|
205
|
-
locations: ConversationStatsItem[];
|
|
206
|
-
recentConversations: ConversationSummaryReport[];
|
|
207
|
-
requester: RequesterIdentity & {
|
|
208
|
-
email: string;
|
|
209
|
-
};
|
|
210
|
-
sampleLimit: number;
|
|
211
|
-
sampleSize: number;
|
|
212
|
-
source: "conversation_index";
|
|
213
|
-
surfaces: ConversationStatsItem[];
|
|
214
|
-
totals: RequesterTotalsReport;
|
|
215
|
-
truncated: boolean;
|
|
216
|
-
windowEnd: string;
|
|
217
|
-
windowStart: string;
|
|
218
|
-
}
|
|
219
|
-
/** Read the requester directory from durable conversation metadata. */
|
|
220
|
-
export declare function readRequesterDirectoryReport(options?: ConversationReaderOptions): Promise<RequesterDirectoryReport>;
|
|
221
|
-
/** Read one requester profile without exposing transcript payloads. */
|
|
222
|
-
export declare function readRequesterProfileReport(email: string, options?: ConversationReaderOptions): Promise<RequesterProfileReport>;
|
|
223
167
|
/** Read the recent conversation feed for reporting consumers. */
|
|
224
168
|
export declare function readConversationFeed(options?: ConversationReaderOptions): Promise<ConversationFeed>;
|
|
225
169
|
/** Read aggregate conversation statistics for reporting consumers. */
|
package/dist/reporting.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PluginOperationalReport } from "@sentry/junior-plugin-api";
|
|
2
|
-
import { type ConversationFeed, type PluginConversationSummary, type ConversationReport, type ConversationSubagentTranscriptReport, type ConversationStatsReport
|
|
3
|
-
export type { PluginConversationStatus, PluginConversations, PluginConversationSummary, ConversationActivityReport, ConversationActivityStatus, ConversationFeed, ConversationReport, ConversationReportStatus, ConversationRunReport, ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, ConversationStatsItem, ConversationStatsReport, ConversationSummaryReport, ConversationSurface, ConversationToolActivityReport, ConversationUsage,
|
|
2
|
+
import { type ConversationFeed, type PluginConversationSummary, type ConversationReport, type ConversationSubagentTranscriptReport, type ConversationStatsReport } from "./reporting/conversations";
|
|
3
|
+
export type { PluginConversationStatus, PluginConversations, PluginConversationSummary, ConversationActivityReport, ConversationActivityStatus, ConversationFeed, ConversationReport, ConversationReportStatus, ConversationRunReport, ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, ConversationStatsItem, ConversationStatsReport, ConversationSummaryReport, ConversationSurface, ConversationToolActivityReport, ConversationUsage, RequesterIdentity, TranscriptMessage, TranscriptPart, TranscriptPartType, TranscriptRole, } from "./reporting/conversations";
|
|
4
4
|
export interface HealthReport {
|
|
5
5
|
status: "ok";
|
|
6
6
|
service: string;
|
|
@@ -53,10 +53,6 @@ export interface JuniorReporting {
|
|
|
53
53
|
listConversations(): Promise<ConversationFeed>;
|
|
54
54
|
/** Read aggregate conversation stats for reporting consumers. */
|
|
55
55
|
getConversationStats?(): Promise<ConversationStatsReport>;
|
|
56
|
-
/** List requester profiles derived from trusted conversation requester emails. */
|
|
57
|
-
listRequesters?(): Promise<RequesterDirectoryReport>;
|
|
58
|
-
/** Read one requester profile derived from trusted conversation requester emails. */
|
|
59
|
-
getRequesterProfile?(email: string): Promise<RequesterProfileReport>;
|
|
60
56
|
/** Read recent conversation summaries without transcript payloads. */
|
|
61
57
|
listRecentConversations?(options?: {
|
|
62
58
|
limit?: number;
|
|
@@ -77,8 +73,6 @@ export interface JuniorReporting {
|
|
|
77
73
|
/** Create the read-only reporting boundary used by plugins and other consumers. */
|
|
78
74
|
export declare function createJuniorReporting(): JuniorReporting & {
|
|
79
75
|
getConversationStats(): Promise<ConversationStatsReport>;
|
|
80
|
-
listRequesters(): Promise<RequesterDirectoryReport>;
|
|
81
|
-
getRequesterProfile(email: string): Promise<RequesterProfileReport>;
|
|
82
76
|
listRecentConversations(options?: {
|
|
83
77
|
limit?: number;
|
|
84
78
|
}): Promise<PluginConversationSummary[]>;
|
package/dist/reporting.js
CHANGED
|
@@ -6,28 +6,28 @@ import {
|
|
|
6
6
|
getConversationDetails,
|
|
7
7
|
getConversationDetailsForIds,
|
|
8
8
|
resolveSlackConversationContextFromThreadId
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-6UPQ5GTJ.js";
|
|
10
10
|
import {
|
|
11
11
|
buildSystemPrompt,
|
|
12
12
|
getAgentTurnSessionRecord,
|
|
13
13
|
listAgentTurnSessionSummariesForConversation,
|
|
14
14
|
loadActivityEntries
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-KBSLCOGE.js";
|
|
16
16
|
import {
|
|
17
17
|
getPluginOperationalReports
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import {
|
|
21
|
-
getConversationStore
|
|
22
|
-
} from "./chunk-6I6HBOQM.js";
|
|
18
|
+
} from "./chunk-XS6NLQPA.js";
|
|
19
|
+
import "./chunk-IATAYWFU.js";
|
|
23
20
|
import "./chunk-G3E7SCME.js";
|
|
24
21
|
import {
|
|
25
22
|
getStateAdapter
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import
|
|
23
|
+
} from "./chunk-YPAE5RH3.js";
|
|
24
|
+
import {
|
|
25
|
+
getConversationStore
|
|
26
|
+
} from "./chunk-4IXHIV37.js";
|
|
27
|
+
import "./chunk-AHLSXMOU.js";
|
|
28
28
|
import {
|
|
29
29
|
unwrapCurrentInstruction
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-S35CPNPT.js";
|
|
31
31
|
import {
|
|
32
32
|
canExposeConversationPayload,
|
|
33
33
|
parseSlackThreadId,
|
|
@@ -35,17 +35,17 @@ import {
|
|
|
35
35
|
} from "./chunk-L7OHKDOX.js";
|
|
36
36
|
import {
|
|
37
37
|
discoverSkills
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-7ES37H6U.js";
|
|
39
39
|
import {
|
|
40
40
|
pluginCatalogRuntime
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-KBFQXJL4.js";
|
|
42
42
|
import {
|
|
43
43
|
toStoredSlackRequester
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-KQKIA4CU.js";
|
|
45
45
|
import {
|
|
46
46
|
homeDir
|
|
47
47
|
} from "./chunk-6APU57E6.js";
|
|
48
|
-
import "./chunk-
|
|
48
|
+
import "./chunk-VMBZFPZM.js";
|
|
49
49
|
import {
|
|
50
50
|
isRecord
|
|
51
51
|
} from "./chunk-FTMXFBDC.js";
|
|
@@ -63,9 +63,6 @@ var SAFE_METADATA_KEY_LIMIT = 20;
|
|
|
63
63
|
var PRIVATE_CONVERSATION_LABEL = "Private Conversation";
|
|
64
64
|
var CONVERSATION_FEED_LIMIT = 50;
|
|
65
65
|
var CONVERSATION_STATS_LIMIT = 5e3;
|
|
66
|
-
var REQUESTER_PROFILE_SAMPLE_LIMIT = 5e3;
|
|
67
|
-
var REQUESTER_PROFILE_RECENT_LIMIT = 25;
|
|
68
|
-
var REQUESTER_PROFILE_ACTIVITY_DAYS = 366;
|
|
69
66
|
var RECENT_CONVERSATION_STATS_WINDOW_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
70
67
|
function privateConversationLabel(slackConversation) {
|
|
71
68
|
if (!slackConversation) {
|
|
@@ -533,277 +530,6 @@ function buildConversationStatsReport(args) {
|
|
|
533
530
|
).toISOString()
|
|
534
531
|
};
|
|
535
532
|
}
|
|
536
|
-
function normalizeRequesterEmail(email) {
|
|
537
|
-
const normalized = email?.trim().toLowerCase();
|
|
538
|
-
return normalized || void 0;
|
|
539
|
-
}
|
|
540
|
-
function requesterIdentityWithEmail(requester) {
|
|
541
|
-
const email = normalizeRequesterEmail(requester?.email);
|
|
542
|
-
if (!email) return void 0;
|
|
543
|
-
return {
|
|
544
|
-
email,
|
|
545
|
-
...requester?.fullName ? { fullName: requester.fullName } : {},
|
|
546
|
-
...requester?.slackUserId ? { slackUserId: requester.slackUserId } : {},
|
|
547
|
-
...requester?.slackUserName ? { slackUserName: requester.slackUserName } : {}
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
function mergeRequesterIdentity(current, next) {
|
|
551
|
-
return {
|
|
552
|
-
email: current.email,
|
|
553
|
-
...current.fullName ?? next.fullName ? { fullName: current.fullName ?? next.fullName } : {},
|
|
554
|
-
...current.slackUserId ?? next.slackUserId ? { slackUserId: current.slackUserId ?? next.slackUserId } : {},
|
|
555
|
-
...current.slackUserName ?? next.slackUserName ? { slackUserName: current.slackUserName ?? next.slackUserName } : {}
|
|
556
|
-
};
|
|
557
|
-
}
|
|
558
|
-
function reportDate(value) {
|
|
559
|
-
const time = reportTime(value);
|
|
560
|
-
if (time === void 0) return void 0;
|
|
561
|
-
return new Date(time).toISOString().slice(0, 10);
|
|
562
|
-
}
|
|
563
|
-
function emptyRequesterTotals() {
|
|
564
|
-
return {
|
|
565
|
-
active: 0,
|
|
566
|
-
activeDays: 0,
|
|
567
|
-
conversations: 0,
|
|
568
|
-
durationMs: 0,
|
|
569
|
-
failed: 0,
|
|
570
|
-
hung: 0,
|
|
571
|
-
runs: 0
|
|
572
|
-
};
|
|
573
|
-
}
|
|
574
|
-
function addRequesterTokens(target, tokens) {
|
|
575
|
-
if (tokens !== void 0) {
|
|
576
|
-
target.tokens = (target.tokens ?? 0) + tokens;
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
function addStatsSignals(item, signals) {
|
|
580
|
-
item.active += signals.active ? 1 : 0;
|
|
581
|
-
item.failed += signals.failed ? 1 : 0;
|
|
582
|
-
item.hung += signals.hung ? 1 : 0;
|
|
583
|
-
}
|
|
584
|
-
function addConversationSignals(target, signals) {
|
|
585
|
-
target.active += signals.active ? 1 : 0;
|
|
586
|
-
target.failed += signals.failed ? 1 : 0;
|
|
587
|
-
target.hung += signals.hung ? 1 : 0;
|
|
588
|
-
}
|
|
589
|
-
function directoryItem(accumulator) {
|
|
590
|
-
return {
|
|
591
|
-
active: accumulator.active,
|
|
592
|
-
activeDays: accumulator.activeDates.size,
|
|
593
|
-
conversations: accumulator.conversations,
|
|
594
|
-
durationMs: accumulator.durationMs,
|
|
595
|
-
failed: accumulator.failed,
|
|
596
|
-
firstSeenAt: new Date(accumulator.firstSeenMs).toISOString(),
|
|
597
|
-
hung: accumulator.hung,
|
|
598
|
-
lastSeenAt: new Date(accumulator.lastSeenMs).toISOString(),
|
|
599
|
-
requester: accumulator.requester,
|
|
600
|
-
runs: accumulator.runs,
|
|
601
|
-
...accumulator.tokens !== void 0 ? { tokens: accumulator.tokens } : {}
|
|
602
|
-
};
|
|
603
|
-
}
|
|
604
|
-
function emptyRequesterActivityDay(date) {
|
|
605
|
-
return {
|
|
606
|
-
active: 0,
|
|
607
|
-
conversations: 0,
|
|
608
|
-
date,
|
|
609
|
-
durationMs: 0,
|
|
610
|
-
failed: 0,
|
|
611
|
-
hung: 0,
|
|
612
|
-
runs: 0
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
function requesterActivityDays(args) {
|
|
616
|
-
const items = [];
|
|
617
|
-
const end = new Date(args.nowMs);
|
|
618
|
-
end.setUTCHours(0, 0, 0, 0);
|
|
619
|
-
const start = new Date(end);
|
|
620
|
-
start.setUTCDate(start.getUTCDate() - (REQUESTER_PROFILE_ACTIVITY_DAYS - 1));
|
|
621
|
-
for (const cursor = new Date(start); cursor.getTime() <= end.getTime(); cursor.setUTCDate(cursor.getUTCDate() + 1)) {
|
|
622
|
-
const date = cursor.toISOString().slice(0, 10);
|
|
623
|
-
items.push(args.days.get(date) ?? emptyRequesterActivityDay(date));
|
|
624
|
-
}
|
|
625
|
-
return items;
|
|
626
|
-
}
|
|
627
|
-
async function requesterSample(options = {}) {
|
|
628
|
-
const conversations = await conversationStore(options).listByActivity({
|
|
629
|
-
limit: REQUESTER_PROFILE_SAMPLE_LIMIT + 1
|
|
630
|
-
});
|
|
631
|
-
return {
|
|
632
|
-
conversations: conversations.slice(0, REQUESTER_PROFILE_SAMPLE_LIMIT),
|
|
633
|
-
truncated: conversations.length > REQUESTER_PROFILE_SAMPLE_LIMIT
|
|
634
|
-
};
|
|
635
|
-
}
|
|
636
|
-
async function readRequesterDirectoryReport(options = {}) {
|
|
637
|
-
const nowMs = Date.now();
|
|
638
|
-
const { conversations, truncated } = await requesterSample(options);
|
|
639
|
-
const detailsByConversationId = await getConversationDetailsForIds(
|
|
640
|
-
conversations.map((conversation) => conversation.conversationId)
|
|
641
|
-
);
|
|
642
|
-
const reportsByConversation = await reportsFromConversations({
|
|
643
|
-
conversations,
|
|
644
|
-
detailsByConversationId,
|
|
645
|
-
nowMs
|
|
646
|
-
});
|
|
647
|
-
const people = /* @__PURE__ */ new Map();
|
|
648
|
-
for (const conversation of conversations) {
|
|
649
|
-
const reports = [
|
|
650
|
-
...reportsByConversation.get(conversation.conversationId) ?? [
|
|
651
|
-
sessionReportFromConversation(
|
|
652
|
-
conversation,
|
|
653
|
-
nowMs,
|
|
654
|
-
detailsByConversationId.get(conversation.conversationId)
|
|
655
|
-
)
|
|
656
|
-
]
|
|
657
|
-
].sort(
|
|
658
|
-
(left, right) => (reportTime(left.startedAt) ?? 0) - (reportTime(right.startedAt) ?? 0) || left.id.localeCompare(right.id)
|
|
659
|
-
);
|
|
660
|
-
const newest = newestRun(reports);
|
|
661
|
-
const requester = requesterIdentityWithEmail(newest.requesterIdentity);
|
|
662
|
-
if (!requester) continue;
|
|
663
|
-
const lastSeenMs = reportTime(newest.lastSeenAt) ?? conversation.lastActivityAtMs;
|
|
664
|
-
const firstSeenMs = reportTime(reports[0]?.startedAt ?? newest.startedAt) ?? conversation.createdAtMs;
|
|
665
|
-
const contributions = runContributions(reports);
|
|
666
|
-
const signals = statusSignals(reports);
|
|
667
|
-
const date = reportDate(newest.lastSeenAt);
|
|
668
|
-
const email = requester.email;
|
|
669
|
-
const accumulator = people.get(email) ?? {
|
|
670
|
-
...emptyRequesterTotals(),
|
|
671
|
-
activeDates: /* @__PURE__ */ new Set(),
|
|
672
|
-
firstSeenMs,
|
|
673
|
-
lastSeenMs,
|
|
674
|
-
requester
|
|
675
|
-
};
|
|
676
|
-
accumulator.requester = mergeRequesterIdentity(
|
|
677
|
-
accumulator.requester,
|
|
678
|
-
requester
|
|
679
|
-
);
|
|
680
|
-
accumulator.conversations += 1;
|
|
681
|
-
accumulator.runs += reports.length;
|
|
682
|
-
accumulator.durationMs += contributionDurationTotal(contributions);
|
|
683
|
-
addRequesterTokens(accumulator, contributionTokenTotal(contributions));
|
|
684
|
-
addConversationSignals(accumulator, signals);
|
|
685
|
-
accumulator.firstSeenMs = Math.min(accumulator.firstSeenMs, firstSeenMs);
|
|
686
|
-
accumulator.lastSeenMs = Math.max(accumulator.lastSeenMs, lastSeenMs);
|
|
687
|
-
if (date) accumulator.activeDates.add(date);
|
|
688
|
-
people.set(email, accumulator);
|
|
689
|
-
}
|
|
690
|
-
return {
|
|
691
|
-
generatedAt: new Date(nowMs).toISOString(),
|
|
692
|
-
people: [...people.values()].map(directoryItem).sort(
|
|
693
|
-
(left, right) => (reportTime(right.lastSeenAt) ?? 0) - (reportTime(left.lastSeenAt) ?? 0) || right.conversations - left.conversations || left.requester.email.localeCompare(right.requester.email)
|
|
694
|
-
),
|
|
695
|
-
sampleLimit: REQUESTER_PROFILE_SAMPLE_LIMIT,
|
|
696
|
-
sampleSize: conversations.length,
|
|
697
|
-
source: "conversation_index",
|
|
698
|
-
truncated
|
|
699
|
-
};
|
|
700
|
-
}
|
|
701
|
-
async function readRequesterProfileReport(email, options = {}) {
|
|
702
|
-
const nowMs = Date.now();
|
|
703
|
-
const normalizedEmail = normalizeRequesterEmail(email) ?? email;
|
|
704
|
-
const { conversations, truncated } = await requesterSample(options);
|
|
705
|
-
const detailsByConversationId = await getConversationDetailsForIds(
|
|
706
|
-
conversations.map((conversation) => conversation.conversationId)
|
|
707
|
-
);
|
|
708
|
-
const reportsByConversation = await reportsFromConversations({
|
|
709
|
-
conversations,
|
|
710
|
-
detailsByConversationId,
|
|
711
|
-
nowMs
|
|
712
|
-
});
|
|
713
|
-
const matchingConversations = conversations.filter((conversation) => {
|
|
714
|
-
const reports = reportsByConversation.get(conversation.conversationId) ?? [];
|
|
715
|
-
const report = reports.length > 0 ? newestRun(reports) : sessionReportFromConversation(
|
|
716
|
-
conversation,
|
|
717
|
-
nowMs,
|
|
718
|
-
detailsByConversationId.get(conversation.conversationId)
|
|
719
|
-
);
|
|
720
|
-
return requesterIdentityWithEmail(report.requesterIdentity)?.email === normalizedEmail;
|
|
721
|
-
});
|
|
722
|
-
let requester;
|
|
723
|
-
const totals = emptyRequesterTotals();
|
|
724
|
-
const activeDates = /* @__PURE__ */ new Set();
|
|
725
|
-
const activityDays = /* @__PURE__ */ new Map();
|
|
726
|
-
const locations = /* @__PURE__ */ new Map();
|
|
727
|
-
const surfaces = /* @__PURE__ */ new Map();
|
|
728
|
-
const recentConversations = [];
|
|
729
|
-
for (const conversation of matchingConversations) {
|
|
730
|
-
const reports = [
|
|
731
|
-
...reportsByConversation.get(conversation.conversationId) ?? [
|
|
732
|
-
sessionReportFromConversation(
|
|
733
|
-
conversation,
|
|
734
|
-
nowMs,
|
|
735
|
-
detailsByConversationId.get(conversation.conversationId)
|
|
736
|
-
)
|
|
737
|
-
]
|
|
738
|
-
].sort(
|
|
739
|
-
(left, right) => (reportTime(left.startedAt) ?? 0) - (reportTime(right.startedAt) ?? 0) || left.id.localeCompare(right.id)
|
|
740
|
-
);
|
|
741
|
-
const newest = newestRun(reports);
|
|
742
|
-
const identity = requesterIdentityWithEmail(newest.requesterIdentity);
|
|
743
|
-
if (identity) {
|
|
744
|
-
requester = requester ? mergeRequesterIdentity(requester, identity) : identity;
|
|
745
|
-
}
|
|
746
|
-
recentConversations.push(newest);
|
|
747
|
-
const contributions = runContributions(reports);
|
|
748
|
-
const signals = statusSignals(reports);
|
|
749
|
-
const durationMs = contributionDurationTotal(contributions);
|
|
750
|
-
const tokens = contributionTokenTotal(contributions);
|
|
751
|
-
const date = reportDate(newest.lastSeenAt);
|
|
752
|
-
totals.conversations += 1;
|
|
753
|
-
totals.runs += reports.length;
|
|
754
|
-
totals.durationMs += durationMs;
|
|
755
|
-
addRequesterTokens(totals, tokens);
|
|
756
|
-
addConversationSignals(totals, signals);
|
|
757
|
-
if (date) {
|
|
758
|
-
activeDates.add(date);
|
|
759
|
-
const day = activityDays.get(date) ?? emptyRequesterActivityDay(date);
|
|
760
|
-
day.conversations += 1;
|
|
761
|
-
day.runs += reports.length;
|
|
762
|
-
day.durationMs += durationMs;
|
|
763
|
-
addRequesterTokens(day, tokens);
|
|
764
|
-
addConversationSignals(day, signals);
|
|
765
|
-
activityDays.set(date, day);
|
|
766
|
-
}
|
|
767
|
-
const location = locationLabel(newest);
|
|
768
|
-
const locationItem = locations.get(location) ?? emptyStatsItem(location);
|
|
769
|
-
locationItem.conversations += 1;
|
|
770
|
-
locationItem.runs += reports.length;
|
|
771
|
-
locationItem.durationMs += durationMs;
|
|
772
|
-
addItemTokens(locationItem, tokens);
|
|
773
|
-
addStatsSignals(locationItem, signals);
|
|
774
|
-
locations.set(location, locationItem);
|
|
775
|
-
const surface = surfaceFallbackLabel(newest.surface);
|
|
776
|
-
const surfaceItem = surfaces.get(surface) ?? emptyStatsItem(surface);
|
|
777
|
-
surfaceItem.conversations += 1;
|
|
778
|
-
surfaceItem.runs += reports.length;
|
|
779
|
-
surfaceItem.durationMs += durationMs;
|
|
780
|
-
addItemTokens(surfaceItem, tokens);
|
|
781
|
-
addStatsSignals(surfaceItem, signals);
|
|
782
|
-
surfaces.set(surface, surfaceItem);
|
|
783
|
-
}
|
|
784
|
-
totals.activeDays = activeDates.size;
|
|
785
|
-
const end = new Date(nowMs);
|
|
786
|
-
end.setUTCHours(0, 0, 0, 0);
|
|
787
|
-
const start = new Date(end);
|
|
788
|
-
start.setUTCDate(start.getUTCDate() - (REQUESTER_PROFILE_ACTIVITY_DAYS - 1));
|
|
789
|
-
return {
|
|
790
|
-
activityDays: requesterActivityDays({ days: activityDays, nowMs }),
|
|
791
|
-
generatedAt: new Date(nowMs).toISOString(),
|
|
792
|
-
locations: statsItems(locations),
|
|
793
|
-
recentConversations: recentConversations.sort(
|
|
794
|
-
(left, right) => (reportTime(right.lastSeenAt) ?? 0) - (reportTime(left.lastSeenAt) ?? 0) || right.conversationId.localeCompare(left.conversationId)
|
|
795
|
-
).slice(0, REQUESTER_PROFILE_RECENT_LIMIT),
|
|
796
|
-
requester: requester ?? { email: normalizedEmail },
|
|
797
|
-
sampleLimit: REQUESTER_PROFILE_SAMPLE_LIMIT,
|
|
798
|
-
sampleSize: conversations.length,
|
|
799
|
-
source: "conversation_index",
|
|
800
|
-
surfaces: statsItems(surfaces),
|
|
801
|
-
totals,
|
|
802
|
-
truncated,
|
|
803
|
-
windowEnd: end.toISOString(),
|
|
804
|
-
windowStart: start.toISOString()
|
|
805
|
-
};
|
|
806
|
-
}
|
|
807
533
|
function canExposeConversationTranscript(summary, visibility) {
|
|
808
534
|
return canExposeConversationPayload({
|
|
809
535
|
conversationId: summary.conversationId,
|
|
@@ -1543,8 +1269,6 @@ function createJuniorReporting() {
|
|
|
1543
1269
|
getSkills: readSkills,
|
|
1544
1270
|
listConversations: () => readConversationFeed({ conversationStore: conversationStore2 }),
|
|
1545
1271
|
getConversationStats: () => readConversationStatsReport({ conversationStore: conversationStore2 }),
|
|
1546
|
-
listRequesters: () => readRequesterDirectoryReport({ conversationStore: conversationStore2 }),
|
|
1547
|
-
getRequesterProfile: (email) => readRequesterProfileReport(email, { conversationStore: conversationStore2 }),
|
|
1548
1272
|
listRecentConversations: listRecent,
|
|
1549
1273
|
getPluginOperationalReports: async () => {
|
|
1550
1274
|
const nowMs = Date.now();
|
|
@@ -16,34 +16,34 @@ import {
|
|
|
16
16
|
startActiveTurn,
|
|
17
17
|
updateConversationStats,
|
|
18
18
|
upsertConversationMessage
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-NYJLQI42.js";
|
|
20
20
|
import {
|
|
21
21
|
coerceThreadConversationState
|
|
22
22
|
} from "./chunk-66NX7MNW.js";
|
|
23
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-V6XDCS3X.js";
|
|
24
24
|
import "./chunk-KNFROR7R.js";
|
|
25
25
|
import {
|
|
26
26
|
commitMessages,
|
|
27
27
|
loadProjection
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-6I6HBOQM.js";
|
|
28
|
+
} from "./chunk-KBSLCOGE.js";
|
|
29
|
+
import "./chunk-XS6NLQPA.js";
|
|
30
|
+
import "./chunk-IATAYWFU.js";
|
|
32
31
|
import "./chunk-G3E7SCME.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-YPAE5RH3.js";
|
|
33
|
+
import "./chunk-4IXHIV37.js";
|
|
34
|
+
import "./chunk-AHLSXMOU.js";
|
|
35
35
|
import {
|
|
36
36
|
stripRuntimeTurnContext,
|
|
37
37
|
trimTrailingAssistantMessages
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-S35CPNPT.js";
|
|
39
39
|
import "./chunk-L7OHKDOX.js";
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
40
|
+
import "./chunk-7ES37H6U.js";
|
|
41
|
+
import "./chunk-KBFQXJL4.js";
|
|
42
|
+
import "./chunk-KQKIA4CU.js";
|
|
43
43
|
import "./chunk-6APU57E6.js";
|
|
44
44
|
import {
|
|
45
45
|
logException
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-VMBZFPZM.js";
|
|
47
47
|
import "./chunk-FTMXFBDC.js";
|
|
48
48
|
import "./chunk-3DA7X2U3.js";
|
|
49
49
|
import "./chunk-MLKGABMK.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
validatePluginEgressCredentialHooks,
|
|
3
3
|
validatePluginRegistrations
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-C5NCV3OB.js";
|
|
5
|
+
import "./chunk-KBFQXJL4.js";
|
|
6
|
+
import "./chunk-KQKIA4CU.js";
|
|
7
7
|
import "./chunk-6APU57E6.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-VMBZFPZM.js";
|
|
9
9
|
import "./chunk-FTMXFBDC.js";
|
|
10
10
|
import "./chunk-3DA7X2U3.js";
|
|
11
11
|
import "./chunk-MLKGABMK.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/junior",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.88.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -28,6 +28,14 @@
|
|
|
28
28
|
"types": "./dist/nitro.d.ts",
|
|
29
29
|
"default": "./dist/nitro.js"
|
|
30
30
|
},
|
|
31
|
+
"./api/people/list": {
|
|
32
|
+
"types": "./dist/api/people/list.d.ts",
|
|
33
|
+
"default": "./dist/api/people/list.js"
|
|
34
|
+
},
|
|
35
|
+
"./api/people/profile": {
|
|
36
|
+
"types": "./dist/api/people/profile.d.ts",
|
|
37
|
+
"default": "./dist/api/people/profile.js"
|
|
38
|
+
},
|
|
31
39
|
"./reporting": {
|
|
32
40
|
"types": "./dist/reporting.d.ts",
|
|
33
41
|
"default": "./dist/reporting.js"
|
|
@@ -70,7 +78,7 @@
|
|
|
70
78
|
"pg": "^8.16.3",
|
|
71
79
|
"yaml": "^2.9.0",
|
|
72
80
|
"zod": "^4.4.3",
|
|
73
|
-
"@sentry/junior-plugin-api": "0.
|
|
81
|
+
"@sentry/junior-plugin-api": "0.88.0"
|
|
74
82
|
},
|
|
75
83
|
"devDependencies": {
|
|
76
84
|
"@emnapi/core": "^1.10.0",
|
|
@@ -86,10 +94,10 @@
|
|
|
86
94
|
"typescript": "^6.0.3",
|
|
87
95
|
"vercel": "^54.4.0",
|
|
88
96
|
"vitest": "^4.1.7",
|
|
89
|
-
"@sentry/junior-github": "0.
|
|
90
|
-
"@sentry/junior-memory": "0.
|
|
91
|
-
"@sentry/junior-
|
|
92
|
-
"@sentry/junior-
|
|
97
|
+
"@sentry/junior-github": "0.88.0",
|
|
98
|
+
"@sentry/junior-memory": "0.88.0",
|
|
99
|
+
"@sentry/junior-scheduler": "0.88.0",
|
|
100
|
+
"@sentry/junior-testing": "0.0.0"
|
|
93
101
|
},
|
|
94
102
|
"scripts": {
|
|
95
103
|
"build": "tsup && tsc -p tsconfig.build.json --emitDeclarationOnly",
|