@sentry/junior 0.96.0 → 0.97.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-5URSMY3O.js → agent-hooks-XSUIVRQS.js} +8 -6
- package/dist/{reporting → api}/conversations/activity.d.ts +1 -1
- package/dist/api/conversations/detail-projection.d.ts +10 -0
- package/dist/api/conversations/detail.d.ts +3 -0
- package/dist/api/conversations/detail.query.d.ts +3 -0
- package/dist/api/conversations/list.d.ts +3 -0
- package/dist/api/conversations/list.query.d.ts +94 -0
- package/dist/api/conversations/projection.d.ts +14 -0
- package/dist/api/conversations/schema.d.ts +683 -0
- package/dist/{reporting → api}/conversations/shared.d.ts +1 -5
- package/dist/api/conversations/stats.d.ts +3 -0
- package/dist/api/conversations/stats.query.d.ts +3 -0
- package/dist/api/conversations/subagent.d.ts +3 -0
- package/dist/{reporting → api}/conversations/transcript.d.ts +4 -4
- package/dist/api/people/list.d.ts +1 -2
- package/dist/api/people/list.query.d.ts +3 -4
- package/dist/api/people/profile.d.ts +1 -2
- package/dist/api/people/profile.query.d.ts +3 -4
- package/dist/api/people/schema.d.ts +193 -0
- package/dist/api/people/shared.d.ts +31 -9
- package/dist/api/schema.d.ts +20 -0
- package/dist/api/schema.js +50 -0
- package/dist/api-reference.d.ts +4 -3
- package/dist/api.d.ts +3 -0
- package/dist/api.js +156 -0
- package/dist/app.d.ts +1 -4
- package/dist/app.js +101 -367
- package/dist/build/virtual-config.d.ts +2 -2
- package/dist/{catalog-runtime-MSMAYYIK.js → catalog-runtime-PFHVMHDR.js} +3 -2
- package/dist/chat/agent/resume.d.ts +3 -1
- package/dist/chat/agent/tools.d.ts +2 -1
- package/dist/chat/config.d.ts +1 -8
- package/dist/chat/conversations/history.d.ts +241 -27
- package/dist/chat/conversations/legacy-advisor-session.d.ts +7 -0
- package/dist/chat/conversations/legacy-import.d.ts +2 -2
- package/dist/chat/conversations/projection.d.ts +19 -3
- package/dist/chat/conversations/sql/legacy-history-import.d.ts +1 -1
- package/dist/chat/conversations/sql/store.d.ts +15 -9
- package/dist/chat/conversations/store.d.ts +9 -4
- package/dist/chat/model-profile.d.ts +14 -0
- package/dist/chat/pi/transcript.d.ts +5 -3
- package/dist/chat/resource-events/store.d.ts +2 -2
- package/dist/chat/services/context-compaction.d.ts +15 -0
- package/dist/chat/services/turn-result.d.ts +1 -0
- package/dist/chat/services/turn-session-record.d.ts +6 -6
- package/dist/chat/state/turn-session.d.ts +16 -5
- package/dist/chat/task-execution/store.d.ts +2 -2
- package/dist/chat/tools/handoff/tool.d.ts +45 -0
- package/dist/chat/tools/types.d.ts +7 -2
- package/dist/chat/usage.d.ts +25 -25
- package/dist/{chunk-RITD7E5L.js → chunk-35BNLDOJ.js} +338 -577
- package/dist/{chunk-PMNN6ST4.js → chunk-3ECW2K2O.js} +7 -2
- package/dist/{chunk-5C6XTTFI.js → chunk-3F4OPKGF.js} +89 -55
- package/dist/chunk-3V7OFJZC.js +264 -0
- package/dist/chunk-4ZNGQH7C.js +25 -0
- package/dist/{chunk-S5KZ5LPG.js → chunk-5HLDPVYS.js} +14 -447
- package/dist/{chunk-DZENG5ML.js → chunk-6U26PYI5.js} +24 -14
- package/dist/chunk-AUUCAFDE.js +546 -0
- package/dist/{chunk-6APU57E6.js → chunk-B3IT5END.js} +41 -260
- package/dist/chunk-CEA3A3UA.js +86 -0
- package/dist/{chunk-YDT7SNCN.js → chunk-D5KZYS4T.js} +1 -1
- package/dist/{chunk-YDVEH3SB.js → chunk-EEZCY5WX.js} +78 -28
- package/dist/{chunk-2NAZZPPS.js → chunk-EOWXRY5E.js} +1 -1
- package/dist/{chunk-GQ3GK22G.js → chunk-FBHZJFHI.js} +2 -2
- package/dist/{chunk-CZEX6KIQ.js → chunk-G3E7SCME.js} +0 -23
- package/dist/chunk-GUAP3H7O.js +319 -0
- package/dist/{chunk-BYZWPRJA.js → chunk-H66UCBPW.js} +6 -4
- package/dist/{chunk-L7CDEIVJ.js → chunk-LMJPRYHP.js} +4 -2
- package/dist/chunk-LUAE4MGW.js +199 -0
- package/dist/{chunk-GY34VGP5.js → chunk-LVA4I4H7.js} +3 -1
- package/dist/chunk-LVUKF5CE.js +63 -0
- package/dist/{chunk-AAZXTVJT.js → chunk-NG2AV7IB.js} +2 -72
- package/dist/chunk-ON6YKIQ7.js +260 -0
- package/dist/chunk-PDO5BLNM.js +22 -0
- package/dist/chunk-QNVHH5PU.js +20 -0
- package/dist/{chunk-P3YFQLEN.js → chunk-T533JLM3.js} +8 -10
- package/dist/chunk-UAMKJPDF.js +11 -0
- package/dist/chunk-VFH4ZKZT.js +66 -0
- package/dist/{chunk-UKHVMPX5.js → chunk-WGXMTFNU.js} +15 -17
- package/dist/{chunk-MNTINMWR.js → chunk-WJOSZOON.js} +184 -300
- package/dist/chunk-WTYEKPXU.js +451 -0
- package/dist/{chunk-IYM2SIVG.js → chunk-XIRPQQVE.js} +605 -363
- package/dist/cli/chat.js +24 -21
- package/dist/cli/check.js +4 -3
- package/dist/cli/init.js +12 -0
- package/dist/cli/plugins.js +12 -9
- package/dist/cli/snapshot-warmup.js +8 -6
- package/dist/cli/upgrade.js +265 -137
- package/dist/db/db.d.ts +4 -0
- package/dist/db/schema/conversations.d.ts +128 -0
- package/dist/db/schema.d.ts +129 -60
- package/dist/{db-2D6RMG67.js → db-BWXYIKFQ.js} +3 -3
- package/dist/detail-GA6NXWQJ.js +43 -0
- package/dist/discovery-RMHYSRL7.js +43 -0
- package/dist/handlers/health.d.ts +3 -0
- package/dist/instrumentation.js +1 -1
- package/dist/{legacy-import-VZ2MEGP7.js → legacy-import-3NQJVGQL.js} +4 -4
- package/dist/{api/people/list.js → list-A3WFRIYX.js} +26 -16
- package/dist/list-UXJI5Q5X.js +27 -0
- package/dist/nitro.d.ts +1 -1
- package/dist/nitro.js +2 -1
- package/dist/plugin-conversations-DDNGC35A.js +36 -0
- package/dist/{api/people/profile.js → profile-4RYDXWTF.js} +33 -18
- package/dist/reporting/plugin-conversations.d.ts +3 -0
- package/dist/reporting-schema.d.ts +140 -0
- package/dist/reporting.d.ts +12 -81
- package/dist/{runner-JZBRQP4F.js → runner-JALSYH2P.js} +17 -12
- package/dist/skills-MAZXZ2KE.js +26 -0
- package/dist/stats-XKXH3PTY.js +217 -0
- package/dist/subagent-TZ55XY37.js +48 -0
- package/dist/usage-schema.d.ts +25 -0
- package/dist/{validation-6XOOQGME.js → validation-FMEAEKCY.js} +4 -3
- package/migrations/0000_initial.sql +115 -0
- package/migrations/0001_conversation_metrics.sql +4 -0
- package/migrations/README.md +12 -30
- package/migrations/meta/0000_snapshot.json +1 -33
- package/migrations/meta/0001_snapshot.json +972 -0
- package/migrations/meta/_journal.json +9 -2
- package/package.json +13 -17
- package/dist/api/people/types.d.ts +0 -85
- package/dist/chat/advisor-request.d.ts +0 -4
- package/dist/chat/conversations/sql/migrations.d.ts +0 -22
- package/dist/chat/tools/advisor/session-store.d.ts +0 -9
- package/dist/chat/tools/advisor/tool.d.ts +0 -72
- package/dist/chunk-RAIB6WSG.js +0 -142
- package/dist/chunk-WM6KHPBQ.js +0 -48
- package/dist/db/schema/migrations.d.ts +0 -58
- package/dist/reporting/conversations/context.d.ts +0 -8
- package/dist/reporting/conversations/details.d.ts +0 -6
- package/dist/reporting/conversations/index.d.ts +0 -4
- package/dist/reporting/conversations/statistics.d.ts +0 -4
- package/dist/reporting/conversations/summaries.d.ts +0 -20
- package/dist/reporting/conversations/types.d.ts +0 -191
- package/dist/reporting/conversations.d.ts +0 -1
- package/dist/reporting.js +0 -1155
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ConversationSubagentTranscriptReport } from "./schema";
|
|
2
|
+
/** Load one child-agent transcript from durable SQL conversation history. */
|
|
3
|
+
export declare function readConversationSubagent(conversationId: string, subagentId: string): Promise<ConversationSubagentTranscriptReport>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { PiMessage } from "@/chat/pi/messages";
|
|
2
|
-
import type { ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, TranscriptMessage } from "./
|
|
2
|
+
import type { ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, TranscriptMessage } from "./schema";
|
|
3
3
|
/** Normalize one provider transcript message into the reporting contract. */
|
|
4
|
-
export declare function normalizeTranscriptMessage(message: PiMessage
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
export declare function normalizeTranscriptMessage(message: PiMessage): TranscriptMessage;
|
|
5
|
+
/** Normalize a stored subagent message, including bounded legacy formats. */
|
|
6
|
+
export declare function normalizeSubagentTranscriptMessage(message: PiMessage, subagentKind: string): TranscriptMessage;
|
|
7
7
|
/** Describe a redacted payload without exposing its contents. */
|
|
8
8
|
export declare function redactedPayloadFields(prefix: "input" | "output", value: unknown): {
|
|
9
9
|
[x: string]: string | number | string[];
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ActorDirectoryReport } from "./
|
|
1
|
+
import type { ActorDirectoryReport } from "./schema";
|
|
2
2
|
/** Load the people list from verified user identities in SQL. */
|
|
3
3
|
export declare function readPeopleList(): Promise<ActorDirectoryReport>;
|
|
4
|
-
export type { ActorDirectoryReport, ActorIdentity, ActorSummaryReport, ActorTotalsReport, } from "./types";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ActorDirectoryReport } from "./
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export declare function readPeopleListFromSql(options?: PeopleApiQueryOptions): Promise<ActorDirectoryReport>;
|
|
1
|
+
import type { ActorDirectoryReport } from "./schema";
|
|
2
|
+
/** Load the people list from the configured SQL database. */
|
|
3
|
+
export declare function readPeopleListFromSql(): Promise<ActorDirectoryReport>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ActorProfileReport } from "./
|
|
1
|
+
import type { ActorProfileReport } from "./schema";
|
|
2
2
|
/** Load one person profile from verified user identities in SQL. */
|
|
3
3
|
export declare function readPeopleProfile(email: string): Promise<ActorProfileReport>;
|
|
4
|
-
export type { ConversationStatsItem, ConversationSummaryReport, PeopleConversationStatus, PeopleConversationSurface, ActorActivityDayReport, ActorIdentity, ActorProfileReport, ActorTotalsReport, } from "./types";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ActorProfileReport } from "./
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export declare function readPeopleProfileFromSql(email: string, options?: PeopleApiQueryOptions): Promise<ActorProfileReport>;
|
|
1
|
+
import type { ActorProfileReport } from "./schema";
|
|
2
|
+
/** Load one person profile from the configured SQL database. */
|
|
3
|
+
export declare function readPeopleProfileFromSql(email: string): Promise<ActorProfileReport>;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { actorIdentitySchema } from "../conversations/schema";
|
|
3
|
+
export declare const peopleConversationSummaryReportSchema: z.ZodObject<{
|
|
4
|
+
status: z.ZodEnum<{
|
|
5
|
+
active: "active";
|
|
6
|
+
completed: "completed";
|
|
7
|
+
failed: "failed";
|
|
8
|
+
hung: "hung";
|
|
9
|
+
}>;
|
|
10
|
+
surface: z.ZodEnum<{
|
|
11
|
+
api: "api";
|
|
12
|
+
internal: "internal";
|
|
13
|
+
scheduler: "scheduler";
|
|
14
|
+
slack: "slack";
|
|
15
|
+
}>;
|
|
16
|
+
displayTitle: z.ZodString;
|
|
17
|
+
cumulativeDurationMs: z.ZodNumber;
|
|
18
|
+
conversationId: z.ZodString;
|
|
19
|
+
startedAt: z.ZodString;
|
|
20
|
+
lastSeenAt: z.ZodString;
|
|
21
|
+
lastProgressAt: z.ZodString;
|
|
22
|
+
actorIdentity: z.ZodOptional<z.ZodObject<{
|
|
23
|
+
email: z.ZodOptional<z.ZodString>;
|
|
24
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
25
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
26
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strict>>;
|
|
28
|
+
channel: z.ZodOptional<z.ZodString>;
|
|
29
|
+
channelName: z.ZodOptional<z.ZodString>;
|
|
30
|
+
channelNameRedacted: z.ZodOptional<z.ZodBoolean>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export declare const peopleConversationStatsItemSchema: z.ZodObject<{
|
|
33
|
+
active: z.ZodNumber;
|
|
34
|
+
failed: z.ZodNumber;
|
|
35
|
+
hung: z.ZodNumber;
|
|
36
|
+
conversations: z.ZodNumber;
|
|
37
|
+
durationMs: z.ZodNumber;
|
|
38
|
+
label: z.ZodString;
|
|
39
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
}, z.core.$strict>;
|
|
41
|
+
export declare const actorActivityDayReportSchema: z.ZodObject<{
|
|
42
|
+
active: z.ZodNumber;
|
|
43
|
+
conversations: z.ZodNumber;
|
|
44
|
+
date: z.ZodString;
|
|
45
|
+
durationMs: z.ZodNumber;
|
|
46
|
+
failed: z.ZodNumber;
|
|
47
|
+
hung: z.ZodNumber;
|
|
48
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
49
|
+
}, z.core.$strict>;
|
|
50
|
+
export declare const actorTotalsReportSchema: z.ZodObject<{
|
|
51
|
+
active: z.ZodNumber;
|
|
52
|
+
activeDays: z.ZodNumber;
|
|
53
|
+
conversations: z.ZodNumber;
|
|
54
|
+
durationMs: z.ZodNumber;
|
|
55
|
+
failed: z.ZodNumber;
|
|
56
|
+
hung: z.ZodNumber;
|
|
57
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
58
|
+
}, z.core.$strict>;
|
|
59
|
+
export declare const identifiedActorSchema: z.ZodObject<{
|
|
60
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
61
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
62
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
63
|
+
email: z.ZodString;
|
|
64
|
+
}, z.core.$strict>;
|
|
65
|
+
export declare const actorSummaryReportSchema: z.ZodObject<{
|
|
66
|
+
active: z.ZodNumber;
|
|
67
|
+
activeDays: z.ZodNumber;
|
|
68
|
+
conversations: z.ZodNumber;
|
|
69
|
+
durationMs: z.ZodNumber;
|
|
70
|
+
failed: z.ZodNumber;
|
|
71
|
+
hung: z.ZodNumber;
|
|
72
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
73
|
+
firstSeenAt: z.ZodString;
|
|
74
|
+
lastSeenAt: z.ZodString;
|
|
75
|
+
actor: z.ZodObject<{
|
|
76
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
77
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
78
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
79
|
+
email: z.ZodString;
|
|
80
|
+
}, z.core.$strict>;
|
|
81
|
+
}, z.core.$strict>;
|
|
82
|
+
export declare const actorDirectoryReportSchema: z.ZodObject<{
|
|
83
|
+
generatedAt: z.ZodString;
|
|
84
|
+
people: z.ZodArray<z.ZodObject<{
|
|
85
|
+
active: z.ZodNumber;
|
|
86
|
+
activeDays: z.ZodNumber;
|
|
87
|
+
conversations: z.ZodNumber;
|
|
88
|
+
durationMs: z.ZodNumber;
|
|
89
|
+
failed: z.ZodNumber;
|
|
90
|
+
hung: z.ZodNumber;
|
|
91
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
92
|
+
firstSeenAt: z.ZodString;
|
|
93
|
+
lastSeenAt: z.ZodString;
|
|
94
|
+
actor: z.ZodObject<{
|
|
95
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
96
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
97
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
98
|
+
email: z.ZodString;
|
|
99
|
+
}, z.core.$strict>;
|
|
100
|
+
}, z.core.$strict>>;
|
|
101
|
+
sampleLimit: z.ZodNumber;
|
|
102
|
+
sampleSize: z.ZodNumber;
|
|
103
|
+
source: z.ZodLiteral<"conversation_index">;
|
|
104
|
+
truncated: z.ZodBoolean;
|
|
105
|
+
}, z.core.$strict>;
|
|
106
|
+
export declare const actorProfileReportSchema: z.ZodObject<{
|
|
107
|
+
activityDays: z.ZodArray<z.ZodObject<{
|
|
108
|
+
active: z.ZodNumber;
|
|
109
|
+
conversations: z.ZodNumber;
|
|
110
|
+
date: z.ZodString;
|
|
111
|
+
durationMs: z.ZodNumber;
|
|
112
|
+
failed: z.ZodNumber;
|
|
113
|
+
hung: z.ZodNumber;
|
|
114
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
115
|
+
}, z.core.$strict>>;
|
|
116
|
+
generatedAt: z.ZodString;
|
|
117
|
+
locations: z.ZodArray<z.ZodObject<{
|
|
118
|
+
active: z.ZodNumber;
|
|
119
|
+
failed: z.ZodNumber;
|
|
120
|
+
hung: z.ZodNumber;
|
|
121
|
+
conversations: z.ZodNumber;
|
|
122
|
+
durationMs: z.ZodNumber;
|
|
123
|
+
label: z.ZodString;
|
|
124
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
125
|
+
}, z.core.$strict>>;
|
|
126
|
+
recentConversations: z.ZodArray<z.ZodObject<{
|
|
127
|
+
status: z.ZodEnum<{
|
|
128
|
+
active: "active";
|
|
129
|
+
completed: "completed";
|
|
130
|
+
failed: "failed";
|
|
131
|
+
hung: "hung";
|
|
132
|
+
}>;
|
|
133
|
+
surface: z.ZodEnum<{
|
|
134
|
+
api: "api";
|
|
135
|
+
internal: "internal";
|
|
136
|
+
scheduler: "scheduler";
|
|
137
|
+
slack: "slack";
|
|
138
|
+
}>;
|
|
139
|
+
displayTitle: z.ZodString;
|
|
140
|
+
cumulativeDurationMs: z.ZodNumber;
|
|
141
|
+
conversationId: z.ZodString;
|
|
142
|
+
startedAt: z.ZodString;
|
|
143
|
+
lastSeenAt: z.ZodString;
|
|
144
|
+
lastProgressAt: z.ZodString;
|
|
145
|
+
actorIdentity: z.ZodOptional<z.ZodObject<{
|
|
146
|
+
email: z.ZodOptional<z.ZodString>;
|
|
147
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
148
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
149
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
150
|
+
}, z.core.$strict>>;
|
|
151
|
+
channel: z.ZodOptional<z.ZodString>;
|
|
152
|
+
channelName: z.ZodOptional<z.ZodString>;
|
|
153
|
+
channelNameRedacted: z.ZodOptional<z.ZodBoolean>;
|
|
154
|
+
}, z.core.$strict>>;
|
|
155
|
+
actor: z.ZodObject<{
|
|
156
|
+
fullName: z.ZodOptional<z.ZodString>;
|
|
157
|
+
slackUserId: z.ZodOptional<z.ZodString>;
|
|
158
|
+
slackUserName: z.ZodOptional<z.ZodString>;
|
|
159
|
+
email: z.ZodString;
|
|
160
|
+
}, z.core.$strict>;
|
|
161
|
+
sampleLimit: z.ZodNumber;
|
|
162
|
+
sampleSize: z.ZodNumber;
|
|
163
|
+
source: z.ZodLiteral<"conversation_index">;
|
|
164
|
+
surfaces: z.ZodArray<z.ZodObject<{
|
|
165
|
+
active: z.ZodNumber;
|
|
166
|
+
failed: z.ZodNumber;
|
|
167
|
+
hung: z.ZodNumber;
|
|
168
|
+
conversations: z.ZodNumber;
|
|
169
|
+
durationMs: z.ZodNumber;
|
|
170
|
+
label: z.ZodString;
|
|
171
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
172
|
+
}, z.core.$strict>>;
|
|
173
|
+
totals: z.ZodObject<{
|
|
174
|
+
active: z.ZodNumber;
|
|
175
|
+
activeDays: z.ZodNumber;
|
|
176
|
+
conversations: z.ZodNumber;
|
|
177
|
+
durationMs: z.ZodNumber;
|
|
178
|
+
failed: z.ZodNumber;
|
|
179
|
+
hung: z.ZodNumber;
|
|
180
|
+
tokens: z.ZodOptional<z.ZodNumber>;
|
|
181
|
+
}, z.core.$strict>;
|
|
182
|
+
truncated: z.ZodBoolean;
|
|
183
|
+
windowEnd: z.ZodString;
|
|
184
|
+
windowStart: z.ZodString;
|
|
185
|
+
}, z.core.$strict>;
|
|
186
|
+
export type ActorIdentity = z.infer<typeof actorIdentitySchema>;
|
|
187
|
+
export type ConversationSummaryReport = z.infer<typeof peopleConversationSummaryReportSchema>;
|
|
188
|
+
export type ConversationStatsItem = z.infer<typeof peopleConversationStatsItemSchema>;
|
|
189
|
+
export type ActorActivityDayReport = z.infer<typeof actorActivityDayReportSchema>;
|
|
190
|
+
export type ActorTotalsReport = z.infer<typeof actorTotalsReportSchema>;
|
|
191
|
+
export type ActorSummaryReport = z.infer<typeof actorSummaryReportSchema>;
|
|
192
|
+
export type ActorDirectoryReport = z.infer<typeof actorDirectoryReportSchema>;
|
|
193
|
+
export type ActorProfileReport = z.infer<typeof actorProfileReportSchema>;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { ConversationStatsItem, ConversationSummaryReport, ActorActivityDayReport, ActorIdentity, ActorTotalsReport } from "./schema";
|
|
2
|
+
import type { ConversationSurface } from "../conversations/schema";
|
|
3
3
|
export declare const SAMPLE_LIMIT = 5000;
|
|
4
4
|
export declare const RECENT_LIMIT = 25;
|
|
5
5
|
export declare const ACTIVITY_DAYS = 366;
|
|
6
|
-
export interface PeopleApiQueryOptions {
|
|
7
|
-
db?: JuniorDatabase;
|
|
8
|
-
}
|
|
9
6
|
/** Normalize emails before matching people API rows. */
|
|
10
7
|
export declare function normalizeEmail(email: string | undefined): string | undefined;
|
|
11
8
|
/** Parse report timestamps without throwing on malformed legacy values. */
|
|
@@ -13,7 +10,7 @@ export declare function reportTime(value: string): number | undefined;
|
|
|
13
10
|
/** Convert a report timestamp into the UTC day used for people activity. */
|
|
14
11
|
export declare function reportDate(value: string): string | undefined;
|
|
15
12
|
/** Return the dashboard label for a conversation surface. */
|
|
16
|
-
export declare function surfaceLabel(surface:
|
|
13
|
+
export declare function surfaceLabel(surface: ConversationSurface): string;
|
|
17
14
|
/** Return the dashboard-safe Slack location label for a conversation. */
|
|
18
15
|
export declare function slackLocationLabel(args: {
|
|
19
16
|
channel?: string;
|
|
@@ -22,6 +19,8 @@ export declare function slackLocationLabel(args: {
|
|
|
22
19
|
}): string | undefined;
|
|
23
20
|
/** Project one SQL conversation row into the people API conversation summary. */
|
|
24
21
|
export declare function summaryFromRow(row: PeopleConversationRow, nowMs: number): ConversationSummaryReport;
|
|
22
|
+
/** Collapse stored conversation usage into the dashboard token total. */
|
|
23
|
+
export declare function usageTokens(row: PeopleConversationRow): number | undefined;
|
|
25
24
|
/** Build a zeroed totals object for people API aggregations. */
|
|
26
25
|
export declare function emptyTotals(): ActorTotalsReport;
|
|
27
26
|
/** Build a zeroed labeled stats row for people API aggregations. */
|
|
@@ -51,14 +50,23 @@ export declare function mergeIdentity(current: ActorIdentity & {
|
|
|
51
50
|
/** Fill the fixed people profile activity window from sparse day totals. */
|
|
52
51
|
export declare function activityDays(days: Map<string, ActorActivityDayReport>, nowMs: number): ActorActivityDayReport[];
|
|
53
52
|
/** Return deterministic stats rows for people API responses. */
|
|
54
|
-
export declare function statsItems(map: Map<string, ConversationStatsItem>):
|
|
53
|
+
export declare function statsItems(map: Map<string, ConversationStatsItem>): {
|
|
54
|
+
active: number;
|
|
55
|
+
failed: number;
|
|
56
|
+
hung: number;
|
|
57
|
+
conversations: number;
|
|
58
|
+
durationMs: number;
|
|
59
|
+
label: string;
|
|
60
|
+
tokens?: number | undefined;
|
|
61
|
+
}[];
|
|
55
62
|
/** Read verified actor conversation rows directly from the SQL identity model. */
|
|
56
|
-
export declare function actorRows(
|
|
63
|
+
export declare function actorRows(email?: string): Promise<{
|
|
57
64
|
rows: {
|
|
58
65
|
channelName: string | null;
|
|
59
66
|
conversationId: string;
|
|
60
67
|
createdAt: Date;
|
|
61
68
|
destinationVisibility: import("../../db/schema/destinations").JuniorDestinationVisibility | null;
|
|
69
|
+
durationMs: number;
|
|
62
70
|
email: string;
|
|
63
71
|
executionStatus: import("../../chat/conversations/store").ConversationStatus;
|
|
64
72
|
executionUpdatedAt: Date | null;
|
|
@@ -66,10 +74,24 @@ export declare function actorRows(options?: PeopleApiQueryOptions, email?: strin
|
|
|
66
74
|
handle: string | null;
|
|
67
75
|
lastActivityAt: Date;
|
|
68
76
|
providerSubjectId: string;
|
|
69
|
-
runId: string | null;
|
|
70
77
|
source: import("../../chat/conversations/store").ConversationSource | null;
|
|
71
78
|
title: string | null;
|
|
72
79
|
updatedAt: Date;
|
|
80
|
+
usage: {
|
|
81
|
+
inputTokens?: number | undefined;
|
|
82
|
+
outputTokens?: number | undefined;
|
|
83
|
+
cachedInputTokens?: number | undefined;
|
|
84
|
+
cacheCreationTokens?: number | undefined;
|
|
85
|
+
reasoningTokens?: number | undefined;
|
|
86
|
+
totalTokens?: number | undefined;
|
|
87
|
+
cost?: {
|
|
88
|
+
input?: number | undefined;
|
|
89
|
+
output?: number | undefined;
|
|
90
|
+
cacheRead?: number | undefined;
|
|
91
|
+
cacheWrite?: number | undefined;
|
|
92
|
+
total?: number | undefined;
|
|
93
|
+
} | undefined;
|
|
94
|
+
} | null;
|
|
73
95
|
}[];
|
|
74
96
|
truncated: boolean;
|
|
75
97
|
}>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { conversationDetailReportSchema, conversationFeedSchema, conversationStatsReportSchema, conversationSubagentTranscriptReportSchema, } from "./conversations/schema";
|
|
2
|
+
export type { ActorIdentity, ConversationActivityReport, ConversationActivityStatus, ConversationCost, ConversationDetailReport, ConversationFeed, ConversationReportStatus, ConversationStatsItem, ConversationStatsReport, ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, ConversationSummaryReport, ConversationSurface, ConversationToolActivityReport, ConversationUsage, TranscriptMessage, TranscriptPart, TranscriptPartType, TranscriptRole, } from "./conversations/schema";
|
|
3
|
+
export { actorDirectoryReportSchema, actorProfileReportSchema, } from "./people/schema";
|
|
4
|
+
export type { ActorActivityDayReport, ActorDirectoryReport, ActorProfileReport, ActorSummaryReport, ActorTotalsReport, } from "./people/schema";
|
|
5
|
+
export { healthReportSchema, pluginOperationalReportFeedSchema, pluginOperationalReportSchema, pluginPackageContentItemReportSchema, pluginPackageContentReportSchema, pluginReportSchema, pluginReportsSchema, runtimeInfoReportSchema, skillReportSchema, skillReportsSchema, } from "../reporting-schema";
|
|
6
|
+
export type { HealthReport, PluginOperationalReport, PluginOperationalReportFeed, PluginPackageContentItemReport, PluginPackageContentReport, PluginReport, PluginReports, RuntimeInfoReport, SkillReport, SkillReports, } from "../reporting-schema";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export declare const conversationParamsSchema: z.ZodObject<{
|
|
9
|
+
conversationId: z.ZodString;
|
|
10
|
+
}, z.core.$strict>;
|
|
11
|
+
export declare const subagentParamsSchema: z.ZodObject<{
|
|
12
|
+
conversationId: z.ZodString;
|
|
13
|
+
subagentId: z.ZodString;
|
|
14
|
+
}, z.core.$strict>;
|
|
15
|
+
export declare const personParamsSchema: z.ZodObject<{
|
|
16
|
+
email: z.ZodString;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
export type ConversationParams = z.infer<typeof conversationParamsSchema>;
|
|
19
|
+
export type SubagentParams = z.infer<typeof subagentParamsSchema>;
|
|
20
|
+
export type PersonParams = z.infer<typeof personParamsSchema>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
conversationParamsSchema,
|
|
3
|
+
personParamsSchema,
|
|
4
|
+
subagentParamsSchema
|
|
5
|
+
} from "../chunk-UAMKJPDF.js";
|
|
6
|
+
import {
|
|
7
|
+
actorDirectoryReportSchema,
|
|
8
|
+
actorProfileReportSchema
|
|
9
|
+
} from "../chunk-VFH4ZKZT.js";
|
|
10
|
+
import {
|
|
11
|
+
conversationDetailReportSchema,
|
|
12
|
+
conversationFeedSchema,
|
|
13
|
+
conversationStatsReportSchema,
|
|
14
|
+
conversationSubagentTranscriptReportSchema
|
|
15
|
+
} from "../chunk-LUAE4MGW.js";
|
|
16
|
+
import {
|
|
17
|
+
healthReportSchema,
|
|
18
|
+
pluginOperationalReportFeedSchema,
|
|
19
|
+
pluginOperationalReportSchema,
|
|
20
|
+
pluginPackageContentItemReportSchema,
|
|
21
|
+
pluginPackageContentReportSchema,
|
|
22
|
+
pluginReportSchema,
|
|
23
|
+
pluginReportsSchema,
|
|
24
|
+
runtimeInfoReportSchema,
|
|
25
|
+
skillReportSchema,
|
|
26
|
+
skillReportsSchema
|
|
27
|
+
} from "../chunk-CEA3A3UA.js";
|
|
28
|
+
import "../chunk-PDO5BLNM.js";
|
|
29
|
+
import "../chunk-MLKGABMK.js";
|
|
30
|
+
export {
|
|
31
|
+
actorDirectoryReportSchema,
|
|
32
|
+
actorProfileReportSchema,
|
|
33
|
+
conversationDetailReportSchema,
|
|
34
|
+
conversationFeedSchema,
|
|
35
|
+
conversationParamsSchema,
|
|
36
|
+
conversationStatsReportSchema,
|
|
37
|
+
conversationSubagentTranscriptReportSchema,
|
|
38
|
+
healthReportSchema,
|
|
39
|
+
personParamsSchema,
|
|
40
|
+
pluginOperationalReportFeedSchema,
|
|
41
|
+
pluginOperationalReportSchema,
|
|
42
|
+
pluginPackageContentItemReportSchema,
|
|
43
|
+
pluginPackageContentReportSchema,
|
|
44
|
+
pluginReportSchema,
|
|
45
|
+
pluginReportsSchema,
|
|
46
|
+
runtimeInfoReportSchema,
|
|
47
|
+
skillReportSchema,
|
|
48
|
+
skillReportsSchema,
|
|
49
|
+
subagentParamsSchema
|
|
50
|
+
};
|
package/dist/api-reference.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
export { createApp } from "./app";
|
|
2
|
+
export { createJuniorApi } from "./api";
|
|
2
3
|
export type { JuniorAppOptions, JuniorDashboardOptions } from "./app";
|
|
3
4
|
export { initSentry } from "./instrumentation";
|
|
4
5
|
export { juniorNitro } from "./nitro";
|
|
5
6
|
export type { JuniorNitroDashboardOptions, JuniorNitroOptions } from "./nitro";
|
|
6
7
|
export { defineJuniorPlugins } from "./plugins";
|
|
7
8
|
export type { JuniorPluginInput, JuniorPluginSet, JuniorPluginSetOptions, } from "./plugins";
|
|
8
|
-
export type { PluginRunContext, PluginRunTranscriptEntry, PluginTaskContext, PluginTaskDefinition, PluginTasks, SubscribableResource, } from "@sentry/junior-plugin-api";
|
|
9
|
+
export type { PluginRunContext, PluginRunTranscriptEntry, PluginTaskContext, PluginTaskDefinition, PluginTasks, PluginConversationStatus, PluginConversations, PluginConversationSummary, SubscribableResource, } from "@sentry/junior-plugin-api";
|
|
9
10
|
export { definePluginTool, pluginRunContextSchema, pluginRunTranscriptEntrySchema, zodTool, } from "@sentry/junior-plugin-api";
|
|
10
|
-
export {
|
|
11
|
-
export type {
|
|
11
|
+
export { actorDirectoryReportSchema, actorProfileReportSchema, conversationDetailReportSchema, conversationFeedSchema, conversationParamsSchema, conversationStatsReportSchema, conversationSubagentTranscriptReportSchema, healthReportSchema, personParamsSchema, pluginOperationalReportFeedSchema, pluginOperationalReportSchema, pluginPackageContentItemReportSchema, pluginPackageContentReportSchema, pluginReportSchema, pluginReportsSchema, runtimeInfoReportSchema, skillReportSchema, skillReportsSchema, subagentParamsSchema, } from "./api/schema";
|
|
12
|
+
export type { ActorActivityDayReport, ActorDirectoryReport, ActorIdentity, ActorProfileReport, ActorSummaryReport, ActorTotalsReport, ConversationActivityReport, ConversationActivityStatus, ConversationCost, ConversationDetailReport, ConversationFeed, ConversationParams, ConversationReportStatus, ConversationStatsItem, ConversationStatsReport, ConversationSubagentActivityReport, ConversationSubagentTranscriptReport, ConversationSummaryReport, ConversationSurface, ConversationToolActivityReport, ConversationUsage, HealthReport, PersonParams, PluginOperationalReport, PluginOperationalReportFeed, PluginPackageContentItemReport, PluginPackageContentReport, PluginReport, PluginReports, RuntimeInfoReport, SkillReport, SkillReports, SubagentParams, TranscriptMessage, TranscriptPart, TranscriptPartType, TranscriptRole, } from "./api/schema";
|
|
12
13
|
export { juniorVercelConfig } from "./vercel";
|
|
13
14
|
export type { JuniorVercelConfigOptions } from "./vercel";
|
package/dist/api.d.ts
ADDED
package/dist/api.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import {
|
|
2
|
+
conversationParamsSchema,
|
|
3
|
+
personParamsSchema,
|
|
4
|
+
subagentParamsSchema
|
|
5
|
+
} from "./chunk-UAMKJPDF.js";
|
|
6
|
+
import "./chunk-VFH4ZKZT.js";
|
|
7
|
+
import "./chunk-LUAE4MGW.js";
|
|
8
|
+
import {
|
|
9
|
+
readHealthReport
|
|
10
|
+
} from "./chunk-QNVHH5PU.js";
|
|
11
|
+
import {
|
|
12
|
+
pluginOperationalReportFeedSchema,
|
|
13
|
+
pluginReportsSchema,
|
|
14
|
+
runtimeInfoReportSchema,
|
|
15
|
+
skillReportsSchema
|
|
16
|
+
} from "./chunk-CEA3A3UA.js";
|
|
17
|
+
import "./chunk-PDO5BLNM.js";
|
|
18
|
+
import "./chunk-MLKGABMK.js";
|
|
19
|
+
|
|
20
|
+
// src/api.ts
|
|
21
|
+
import { Hono } from "hono";
|
|
22
|
+
import { HTTPException } from "hono/http-exception";
|
|
23
|
+
|
|
24
|
+
// src/reporting.ts
|
|
25
|
+
import { readFileSync } from "fs";
|
|
26
|
+
import path from "path";
|
|
27
|
+
function readDescriptionText(home) {
|
|
28
|
+
try {
|
|
29
|
+
const raw = readFileSync(path.join(home, "DESCRIPTION.md"), "utf8").trim();
|
|
30
|
+
return raw || void 0;
|
|
31
|
+
} catch {
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function readSkillReports() {
|
|
36
|
+
const { discoverSkills } = await import("./skills-MAZXZ2KE.js");
|
|
37
|
+
const skills = await discoverSkills();
|
|
38
|
+
return skillReportsSchema.parse(
|
|
39
|
+
skills.map((skill) => ({
|
|
40
|
+
name: skill.name,
|
|
41
|
+
pluginProvider: skill.pluginProvider
|
|
42
|
+
}))
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
async function readPluginReports() {
|
|
46
|
+
const { pluginCatalogRuntime } = await import("./catalog-runtime-PFHVMHDR.js");
|
|
47
|
+
return pluginReportsSchema.parse(
|
|
48
|
+
pluginCatalogRuntime.getProviders().map((plugin) => ({
|
|
49
|
+
name: plugin.manifest.name
|
|
50
|
+
}))
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
async function readRuntimeInfoReport() {
|
|
54
|
+
const [{ homeDir }, { pluginCatalogRuntime }, plugins, skills] = await Promise.all([
|
|
55
|
+
import("./discovery-RMHYSRL7.js"),
|
|
56
|
+
import("./catalog-runtime-PFHVMHDR.js"),
|
|
57
|
+
readPluginReports(),
|
|
58
|
+
readSkillReports()
|
|
59
|
+
]);
|
|
60
|
+
const home = homeDir();
|
|
61
|
+
return runtimeInfoReportSchema.parse({
|
|
62
|
+
cwd: process.cwd(),
|
|
63
|
+
homeDir: home,
|
|
64
|
+
descriptionText: readDescriptionText(home),
|
|
65
|
+
providers: plugins.map((plugin) => plugin.name),
|
|
66
|
+
skills,
|
|
67
|
+
packagedContent: pluginCatalogRuntime.getPackageContent()
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function readPluginOperationalReportFeed() {
|
|
71
|
+
const listRecent = async (listOptions) => {
|
|
72
|
+
const { listRecentConversationSummaries } = await import("./plugin-conversations-DDNGC35A.js");
|
|
73
|
+
return listRecentConversationSummaries(listOptions?.limit);
|
|
74
|
+
};
|
|
75
|
+
const nowMs = Date.now();
|
|
76
|
+
const { getPluginOperationalReports } = await import("./agent-hooks-XSUIVRQS.js");
|
|
77
|
+
return pluginOperationalReportFeedSchema.parse({
|
|
78
|
+
source: "plugins",
|
|
79
|
+
generatedAt: new Date(nowMs).toISOString(),
|
|
80
|
+
reports: await getPluginOperationalReports(nowMs, {
|
|
81
|
+
listRecent
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/api.ts
|
|
87
|
+
function parseParams(schema, params) {
|
|
88
|
+
const result = schema.safeParse(params);
|
|
89
|
+
if (result.success) {
|
|
90
|
+
return result.data;
|
|
91
|
+
}
|
|
92
|
+
throw new HTTPException(400, {
|
|
93
|
+
cause: result.error,
|
|
94
|
+
message: "Invalid route parameters."
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function createJuniorApi() {
|
|
98
|
+
const app = new Hono();
|
|
99
|
+
app.get("/api/health", async () => {
|
|
100
|
+
return Response.json(await readHealthReport());
|
|
101
|
+
});
|
|
102
|
+
app.get("/api/runtime", async () => {
|
|
103
|
+
return Response.json(await readRuntimeInfoReport());
|
|
104
|
+
});
|
|
105
|
+
app.get("/api/plugins", async () => {
|
|
106
|
+
return Response.json(await readPluginReports());
|
|
107
|
+
});
|
|
108
|
+
app.get("/api/skills", async () => {
|
|
109
|
+
return Response.json(await readSkillReports());
|
|
110
|
+
});
|
|
111
|
+
app.get("/api/plugin-reports", async () => {
|
|
112
|
+
return Response.json(await readPluginOperationalReportFeed());
|
|
113
|
+
});
|
|
114
|
+
app.get("/api/conversations", async () => {
|
|
115
|
+
const { readConversationFeed } = await import("./list-UXJI5Q5X.js");
|
|
116
|
+
return Response.json(await readConversationFeed());
|
|
117
|
+
});
|
|
118
|
+
app.get("/api/conversations/stats", async () => {
|
|
119
|
+
const { readConversationStats } = await import("./stats-XKXH3PTY.js");
|
|
120
|
+
return Response.json(await readConversationStats());
|
|
121
|
+
});
|
|
122
|
+
app.get("/api/conversations/:conversationId", async (c) => {
|
|
123
|
+
const { readConversationDetail } = await import("./detail-GA6NXWQJ.js");
|
|
124
|
+
const { conversationId } = parseParams(
|
|
125
|
+
conversationParamsSchema,
|
|
126
|
+
c.req.param()
|
|
127
|
+
);
|
|
128
|
+
const report = await readConversationDetail(conversationId);
|
|
129
|
+
return report ? Response.json(report) : Response.json({ error: "Conversation not found." }, { status: 404 });
|
|
130
|
+
});
|
|
131
|
+
app.get(
|
|
132
|
+
"/api/conversations/:conversationId/subagents/:subagentId",
|
|
133
|
+
async (c) => {
|
|
134
|
+
const { readConversationSubagent } = await import("./subagent-TZ55XY37.js");
|
|
135
|
+
const { conversationId, subagentId } = parseParams(
|
|
136
|
+
subagentParamsSchema,
|
|
137
|
+
c.req.param()
|
|
138
|
+
);
|
|
139
|
+
const report = await readConversationSubagent(conversationId, subagentId);
|
|
140
|
+
return report.unavailableReason === "not_found" ? Response.json(report, { status: 404 }) : Response.json(report);
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
app.get("/api/people", async () => {
|
|
144
|
+
const { readPeopleList } = await import("./list-A3WFRIYX.js");
|
|
145
|
+
return Response.json(await readPeopleList());
|
|
146
|
+
});
|
|
147
|
+
app.get("/api/people/:email", async (c) => {
|
|
148
|
+
const { email } = parseParams(personParamsSchema, c.req.param());
|
|
149
|
+
const { readPeopleProfile } = await import("./profile-4RYDXWTF.js");
|
|
150
|
+
return Response.json(await readPeopleProfile(email));
|
|
151
|
+
});
|
|
152
|
+
return app;
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
createJuniorApi
|
|
156
|
+
};
|
package/dist/app.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import type { JuniorReporting } from "./reporting";
|
|
3
2
|
import { type JuniorPluginSet } from "./plugins";
|
|
4
3
|
import { type VercelConversationWorkCallbackOptions } from "@/chat/task-execution/vercel-callback";
|
|
5
4
|
import type { WaitUntilFn } from "@/handlers/types";
|
|
@@ -47,10 +46,8 @@ export interface JuniorDashboardOptions {
|
|
|
47
46
|
baseURL?: string;
|
|
48
47
|
/** Disable dashboard route mounting while preserving serializable config shape. */
|
|
49
48
|
disabled?: boolean;
|
|
50
|
-
/**
|
|
49
|
+
/** Replace conversation API responses with dashboard visual-QA fixtures. */
|
|
51
50
|
mockConversations?: boolean;
|
|
52
|
-
/** Reporting implementation used by authenticated product APIs. Defaults to core reporting. */
|
|
53
|
-
reporting?: JuniorReporting;
|
|
54
51
|
/** Browser session lifetime in seconds. */
|
|
55
52
|
sessionMaxAgeSeconds?: number;
|
|
56
53
|
/** Additional trusted origins accepted by Better Auth. */
|