rewind-mcp-server 0.1.0 → 0.3.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/README.md +77 -90
- package/dist/__tests__/helpers.test.d.ts +1 -0
- package/dist/__tests__/helpers.test.js +131 -0
- package/dist/__tests__/helpers.test.js.map +1 -0
- package/dist/__tests__/image-block.live.d.ts +1 -0
- package/dist/__tests__/image-block.live.js +41 -0
- package/dist/__tests__/image-block.live.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +1 -0
- package/dist/__tests__/server.test.js +1308 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/stdio-e2e.live.d.ts +1 -0
- package/dist/__tests__/stdio-e2e.live.js +60 -0
- package/dist/__tests__/stdio-e2e.live.js.map +1 -0
- package/dist/__tests__/ui-resource.live.d.ts +1 -0
- package/dist/__tests__/ui-resource.live.js +71 -0
- package/dist/__tests__/ui-resource.live.js.map +1 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.js +15 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/prompts.js +101 -0
- package/dist/prompts.js.map +1 -1
- package/dist/resources/ui.d.ts +33 -0
- package/dist/resources/ui.js +14 -0
- package/dist/resources/ui.js.map +1 -0
- package/dist/resources.js +128 -0
- package/dist/resources.js.map +1 -1
- package/dist/server.js +55 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/collecting.js +116 -14
- package/dist/tools/collecting.js.map +1 -1
- package/dist/tools/cross-domain.js +74 -17
- package/dist/tools/cross-domain.js.map +1 -1
- package/dist/tools/debug.d.ts +6 -0
- package/dist/tools/debug.js +26 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/helpers.d.ts +81 -5
- package/dist/tools/helpers.js +138 -4
- package/dist/tools/helpers.js.map +1 -1
- package/dist/tools/listening.js +223 -52
- package/dist/tools/listening.js.map +1 -1
- package/dist/tools/reading.js +74 -22
- package/dist/tools/reading.js.map +1 -1
- package/dist/tools/running.js +87 -43
- package/dist/tools/running.js.map +1 -1
- package/dist/tools/watching.js +199 -32
- package/dist/tools/watching.js.map +1 -1
- package/dist/ui-bundles.d.ts +3 -0
- package/dist/ui-bundles.js +8 -0
- package/dist/ui-bundles.js.map +1 -0
- package/dist/worker.d.ts +2 -1
- package/dist/worker.js +55 -30
- package/dist/worker.js.map +1 -1
- package/package.json +18 -3
package/dist/tools/listening.js
CHANGED
|
@@ -1,40 +1,92 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { withRichResponse, text, resourceLink, imageBlock, formatDate, timeAgo, fmt, READ_ONLY_ANNOTATIONS, dateFilterParams, includeImagesParam, LIST_IMAGE_PX, } from './helpers.js';
|
|
3
|
+
const TOP_N = 5;
|
|
4
|
+
const PERIOD_ENUM = [
|
|
5
|
+
'7day',
|
|
6
|
+
'1month',
|
|
7
|
+
'3month',
|
|
8
|
+
'6month',
|
|
9
|
+
'12month',
|
|
10
|
+
'overall',
|
|
11
|
+
];
|
|
3
12
|
export function registerListeningTools(server, client) {
|
|
4
|
-
// get_now_playing
|
|
5
|
-
server.tool('get_now_playing', 'Get the track currently playing on Last.fm. Returns
|
|
13
|
+
// get_now_playing ────────────────────────────────────────────────
|
|
14
|
+
server.tool('get_now_playing', 'Get the track currently playing (or most recently scrobbled) on Last.fm. Returns track + artist + album, album cover image, and Apple Music resource link.', { ...includeImagesParam }, READ_ONLY_ANNOTATIONS, async ({ include_images }) => withRichResponse(async () => {
|
|
6
15
|
const data = await client.get('/listening/now-playing');
|
|
7
16
|
if (!data.is_playing || !data.track) {
|
|
8
|
-
return
|
|
17
|
+
return {
|
|
18
|
+
content: [text('Nothing playing right now.')],
|
|
19
|
+
structuredContent: data,
|
|
20
|
+
};
|
|
9
21
|
}
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
22
|
+
const t = data.track;
|
|
23
|
+
const albumPart = t.album.name ? ` (from ${t.album.name})` : '';
|
|
24
|
+
const summary = `Now playing: "${t.name}" by ${t.artist.name}${albumPart}`;
|
|
25
|
+
const cover = include_images
|
|
26
|
+
? await imageBlock(client, t.album.image)
|
|
27
|
+
: null;
|
|
28
|
+
const links = [
|
|
29
|
+
resourceLink(t.apple_music_url, 'Apple Music -- track', {
|
|
30
|
+
mimeType: 'text/html',
|
|
31
|
+
}),
|
|
32
|
+
resourceLink(t.artist.apple_music_url, 'Apple Music -- artist', {
|
|
33
|
+
mimeType: 'text/html',
|
|
34
|
+
}),
|
|
35
|
+
resourceLink(t.url, 'Last.fm -- track', { mimeType: 'text/html' }),
|
|
36
|
+
].filter((b) => b !== null);
|
|
37
|
+
const content = [
|
|
38
|
+
text(summary),
|
|
39
|
+
...(cover ? [cover] : []),
|
|
40
|
+
...links,
|
|
41
|
+
];
|
|
42
|
+
return { content, structuredContent: data };
|
|
13
43
|
}));
|
|
14
|
-
// get_recent_listens
|
|
15
|
-
server.tool('get_recent_listens', 'Get recently scrobbled tracks from Last.fm
|
|
44
|
+
// get_recent_listens ─────────────────────────────────────────────
|
|
45
|
+
server.tool('get_recent_listens', 'Get recently scrobbled tracks from Last.fm, with top-N album covers and Apple Music resource links. Supports date filtering.', {
|
|
16
46
|
limit: z
|
|
17
47
|
.number()
|
|
18
48
|
.min(1)
|
|
19
49
|
.max(50)
|
|
20
50
|
.default(10)
|
|
21
51
|
.describe('Number of recent tracks to return (default 10, max 50)'),
|
|
52
|
+
page: z
|
|
53
|
+
.number()
|
|
54
|
+
.min(1)
|
|
55
|
+
.default(1)
|
|
56
|
+
.describe('Page number for pagination. Combine with limit to page through longer windows.'),
|
|
22
57
|
...dateFilterParams,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
58
|
+
...includeImagesParam,
|
|
59
|
+
}, READ_ONLY_ANNOTATIONS, async ({ limit, page, date, from, to, include_images }) => withRichResponse(async () => {
|
|
60
|
+
const { data } = await client.get('/listening/recent', { limit, page, date, from, to });
|
|
61
|
+
if (!data.length) {
|
|
62
|
+
return {
|
|
63
|
+
content: [text('No recent listens found.')],
|
|
64
|
+
structuredContent: { items: [] },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
27
67
|
const lines = ['Recent listens:'];
|
|
28
|
-
for (const [i, s] of data.
|
|
68
|
+
for (const [i, s] of data.entries()) {
|
|
29
69
|
const album = s.album?.name ? ` -- ${s.album.name}` : '';
|
|
30
70
|
lines.push(`${i + 1}. "${s.track.name}" by ${s.artist.name}${album} (${timeAgo(s.scrobbled_at)})`);
|
|
31
71
|
}
|
|
32
|
-
|
|
72
|
+
const topN = data.slice(0, TOP_N);
|
|
73
|
+
const images = include_images
|
|
74
|
+
? await Promise.all(topN.map((s) => imageBlock(client, s.album.image, LIST_IMAGE_PX)))
|
|
75
|
+
: [];
|
|
76
|
+
const links = topN
|
|
77
|
+
.map((s) => resourceLink(s.track.apple_music_url, `Apple Music -- ${s.track.name}`, { mimeType: 'text/html' }))
|
|
78
|
+
.filter((b) => b !== null);
|
|
79
|
+
const content = [
|
|
80
|
+
text(lines.join('\n')),
|
|
81
|
+
...images.filter((b) => b !== null),
|
|
82
|
+
...links,
|
|
83
|
+
];
|
|
84
|
+
return { content, structuredContent: { items: data } };
|
|
33
85
|
}));
|
|
34
|
-
// get_listening_stats
|
|
35
|
-
server.tool('get_listening_stats', 'Get overall listening statistics from Last.fm including total scrobbles, unique artists, albums, tracks, and daily average. Supports date filtering
|
|
86
|
+
// get_listening_stats ────────────────────────────────────────────
|
|
87
|
+
server.tool('get_listening_stats', 'Get overall listening statistics from Last.fm including total scrobbles, unique artists, albums, tracks, and daily average. Supports date filtering.', { ...dateFilterParams }, READ_ONLY_ANNOTATIONS, async ({ date, from, to }) => withRichResponse(async () => {
|
|
36
88
|
const data = await client.get('/listening/stats', { date, from, to });
|
|
37
|
-
|
|
89
|
+
const summary = [
|
|
38
90
|
'Listening Stats:',
|
|
39
91
|
`- Total scrobbles: ${fmt(data.total_scrobbles)}`,
|
|
40
92
|
`- Unique artists: ${fmt(data.unique_artists)}`,
|
|
@@ -43,11 +95,12 @@ export function registerListeningTools(server, client) {
|
|
|
43
95
|
`- Average per day: ${data.scrobbles_per_day.toFixed(1)}`,
|
|
44
96
|
`- Years tracking: ${data.years_tracking}`,
|
|
45
97
|
].join('\n');
|
|
98
|
+
return { content: [text(summary)], structuredContent: data };
|
|
46
99
|
}));
|
|
47
|
-
// get_top_artists
|
|
48
|
-
server.tool('get_top_artists', 'Get top listened-to artists from Last.fm for a given time period
|
|
100
|
+
// get_top_artists ────────────────────────────────────────────────
|
|
101
|
+
server.tool('get_top_artists', 'Get top listened-to artists from Last.fm for a given time period, with top-N artist images and Apple Music links.', {
|
|
49
102
|
period: z
|
|
50
|
-
.enum(
|
|
103
|
+
.enum(PERIOD_ENUM)
|
|
51
104
|
.default('1month')
|
|
52
105
|
.describe('Time period for rankings'),
|
|
53
106
|
limit: z
|
|
@@ -57,20 +110,39 @@ export function registerListeningTools(server, client) {
|
|
|
57
110
|
.default(10)
|
|
58
111
|
.describe('Number of artists to return'),
|
|
59
112
|
page: z.number().min(1).default(1).describe('Page number for pagination'),
|
|
60
|
-
|
|
113
|
+
...includeImagesParam,
|
|
114
|
+
}, READ_ONLY_ANNOTATIONS, async ({ period, limit, page, include_images }) => withRichResponse(async () => {
|
|
61
115
|
const data = await client.get('/listening/top/artists', { period, limit, page });
|
|
62
|
-
if (!data.data.length)
|
|
63
|
-
return
|
|
116
|
+
if (!data.data.length) {
|
|
117
|
+
return {
|
|
118
|
+
content: [text(`No top artists for period: ${period}`)],
|
|
119
|
+
structuredContent: data,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
64
122
|
const lines = [`Top Artists (${period}):`];
|
|
65
123
|
for (const a of data.data) {
|
|
66
|
-
lines.push(`${a.rank}. ${a.name} -- ${fmt(a.playcount)} plays`);
|
|
124
|
+
lines.push(`${a.rank}. [ID: ${a.id}] ${a.name} -- ${fmt(a.playcount)} plays`);
|
|
67
125
|
}
|
|
68
|
-
|
|
126
|
+
const topN = data.data.slice(0, TOP_N);
|
|
127
|
+
const images = include_images
|
|
128
|
+
? await Promise.all(topN.map((a) => imageBlock(client, a.image, LIST_IMAGE_PX)))
|
|
129
|
+
: [];
|
|
130
|
+
const links = topN
|
|
131
|
+
.map((a) => resourceLink(a.apple_music_url, `Apple Music -- ${a.name}`, {
|
|
132
|
+
mimeType: 'text/html',
|
|
133
|
+
}))
|
|
134
|
+
.filter((b) => b !== null);
|
|
135
|
+
const content = [
|
|
136
|
+
text(lines.join('\n')),
|
|
137
|
+
...images.filter((b) => b !== null),
|
|
138
|
+
...links,
|
|
139
|
+
];
|
|
140
|
+
return { content, structuredContent: data };
|
|
69
141
|
}));
|
|
70
|
-
// get_top_albums
|
|
71
|
-
server.tool('get_top_albums', 'Get top listened-to albums from Last.fm for a given time period
|
|
142
|
+
// get_top_albums ─────────────────────────────────────────────────
|
|
143
|
+
server.tool('get_top_albums', 'Get top listened-to albums from Last.fm for a given time period, with top-N covers and Apple Music links.', {
|
|
72
144
|
period: z
|
|
73
|
-
.enum(
|
|
145
|
+
.enum(PERIOD_ENUM)
|
|
74
146
|
.default('1month')
|
|
75
147
|
.describe('Time period for rankings'),
|
|
76
148
|
limit: z
|
|
@@ -80,20 +152,39 @@ export function registerListeningTools(server, client) {
|
|
|
80
152
|
.default(10)
|
|
81
153
|
.describe('Number of albums to return'),
|
|
82
154
|
page: z.number().min(1).default(1).describe('Page number for pagination'),
|
|
83
|
-
|
|
155
|
+
...includeImagesParam,
|
|
156
|
+
}, READ_ONLY_ANNOTATIONS, async ({ period, limit, page, include_images }) => withRichResponse(async () => {
|
|
84
157
|
const data = await client.get('/listening/top/albums', { period, limit, page });
|
|
85
|
-
if (!data.data.length)
|
|
86
|
-
return
|
|
158
|
+
if (!data.data.length) {
|
|
159
|
+
return {
|
|
160
|
+
content: [text(`No top albums for period: ${period}`)],
|
|
161
|
+
structuredContent: data,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
87
164
|
const lines = [`Top Albums (${period}):`];
|
|
88
165
|
for (const a of data.data) {
|
|
89
|
-
lines.push(`${a.rank}. ${a.name} by ${a.detail} -- ${fmt(a.playcount)} plays`);
|
|
166
|
+
lines.push(`${a.rank}. [ID: ${a.id}] ${a.name} by ${a.detail} -- ${fmt(a.playcount)} plays`);
|
|
90
167
|
}
|
|
91
|
-
|
|
168
|
+
const topN = data.data.slice(0, TOP_N);
|
|
169
|
+
const images = include_images
|
|
170
|
+
? await Promise.all(topN.map((a) => imageBlock(client, a.image, LIST_IMAGE_PX)))
|
|
171
|
+
: [];
|
|
172
|
+
const links = topN
|
|
173
|
+
.map((a) => resourceLink(a.apple_music_url, `Apple Music -- ${a.name}`, {
|
|
174
|
+
mimeType: 'text/html',
|
|
175
|
+
}))
|
|
176
|
+
.filter((b) => b !== null);
|
|
177
|
+
const content = [
|
|
178
|
+
text(lines.join('\n')),
|
|
179
|
+
...images.filter((b) => b !== null),
|
|
180
|
+
...links,
|
|
181
|
+
];
|
|
182
|
+
return { content, structuredContent: data };
|
|
92
183
|
}));
|
|
93
|
-
// get_top_tracks
|
|
94
|
-
server.tool('get_top_tracks', 'Get top listened-to tracks from Last.fm for a given time period
|
|
184
|
+
// get_top_tracks ─────────────────────────────────────────────────
|
|
185
|
+
server.tool('get_top_tracks', 'Get top listened-to tracks from Last.fm for a given time period, with top-N Apple Music links.', {
|
|
95
186
|
period: z
|
|
96
|
-
.enum(
|
|
187
|
+
.enum(PERIOD_ENUM)
|
|
97
188
|
.default('1month')
|
|
98
189
|
.describe('Time period for rankings'),
|
|
99
190
|
limit: z
|
|
@@ -103,20 +194,31 @@ export function registerListeningTools(server, client) {
|
|
|
103
194
|
.default(10)
|
|
104
195
|
.describe('Number of tracks to return'),
|
|
105
196
|
page: z.number().min(1).default(1).describe('Page number for pagination'),
|
|
106
|
-
}, READ_ONLY_ANNOTATIONS, async ({ period, limit, page }) =>
|
|
197
|
+
}, READ_ONLY_ANNOTATIONS, async ({ period, limit, page }) => withRichResponse(async () => {
|
|
107
198
|
const data = await client.get('/listening/top/tracks', { period, limit, page });
|
|
108
|
-
if (!data.data.length)
|
|
109
|
-
return
|
|
199
|
+
if (!data.data.length) {
|
|
200
|
+
return {
|
|
201
|
+
content: [text(`No top tracks for period: ${period}`)],
|
|
202
|
+
structuredContent: data,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
110
205
|
const lines = [`Top Tracks (${period}):`];
|
|
111
206
|
for (const t of data.data) {
|
|
112
|
-
lines.push(`${t.rank}. "${t.name}" by ${t.detail} -- ${fmt(t.playcount)} plays`);
|
|
207
|
+
lines.push(`${t.rank}. [ID: ${t.id}] "${t.name}" by ${t.detail} -- ${fmt(t.playcount)} plays`);
|
|
113
208
|
}
|
|
114
|
-
|
|
209
|
+
const topN = data.data.slice(0, TOP_N);
|
|
210
|
+
const links = topN
|
|
211
|
+
.map((t) => resourceLink(t.apple_music_url, `Apple Music -- ${t.name}`, {
|
|
212
|
+
mimeType: 'text/html',
|
|
213
|
+
}))
|
|
214
|
+
.filter((b) => b !== null);
|
|
215
|
+
const content = [text(lines.join('\n')), ...links];
|
|
216
|
+
return { content, structuredContent: data };
|
|
115
217
|
}));
|
|
116
|
-
// get_listening_streaks
|
|
117
|
-
server.tool('get_listening_streaks', 'Get listening streak data from Last.fm -- current consecutive days with scrobbles and the longest streak ever.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
218
|
+
// get_listening_streaks ──────────────────────────────────────────
|
|
219
|
+
server.tool('get_listening_streaks', 'Get listening streak data from Last.fm -- current consecutive days with scrobbles and the longest streak ever.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
118
220
|
const data = await client.get('/listening/streaks');
|
|
119
|
-
|
|
221
|
+
const summary = [
|
|
120
222
|
'Listening Streaks:',
|
|
121
223
|
'',
|
|
122
224
|
`Current streak: ${data.current.days} days (${fmt(data.current.total_scrobbles)} scrobbles)`,
|
|
@@ -131,12 +233,13 @@ export function registerListeningTools(server, client) {
|
|
|
131
233
|
]
|
|
132
234
|
.filter(Boolean)
|
|
133
235
|
.join('\n');
|
|
236
|
+
return { content: [text(summary)], structuredContent: data };
|
|
134
237
|
}));
|
|
135
|
-
// get_artist_details
|
|
136
|
-
server.tool('get_artist_details', 'Get detailed information about a specific artist by ID
|
|
238
|
+
// get_artist_details ─────────────────────────────────────────────
|
|
239
|
+
server.tool('get_artist_details', 'Get detailed information about a specific artist by ID: play count, top albums, top tracks, artist image, and Apple Music link.', { id: z.number().describe('Artist ID'), ...includeImagesParam }, READ_ONLY_ANNOTATIONS, async ({ id, include_images }) => withRichResponse(async () => {
|
|
137
240
|
const data = await client.get(`/listening/artists/${id}`);
|
|
138
241
|
const lines = [
|
|
139
|
-
|
|
242
|
+
data.name,
|
|
140
243
|
`Total plays: ${fmt(data.playcount)}`,
|
|
141
244
|
data.genre ? `Genre: ${data.genre}` : null,
|
|
142
245
|
'',
|
|
@@ -154,10 +257,26 @@ export function registerListeningTools(server, client) {
|
|
|
154
257
|
lines.push(` - "${t.name}" (${fmt(t.scrobble_count)} plays)`);
|
|
155
258
|
}
|
|
156
259
|
}
|
|
157
|
-
|
|
260
|
+
const artistImage = include_images
|
|
261
|
+
? await imageBlock(client, data.image)
|
|
262
|
+
: null;
|
|
263
|
+
const links = [
|
|
264
|
+
resourceLink(data.apple_music_url, 'Apple Music -- artist', {
|
|
265
|
+
mimeType: 'text/html',
|
|
266
|
+
}),
|
|
267
|
+
resourceLink(data.url, 'Last.fm -- artist', {
|
|
268
|
+
mimeType: 'text/html',
|
|
269
|
+
}),
|
|
270
|
+
].filter((b) => b !== null);
|
|
271
|
+
const content = [
|
|
272
|
+
text(lines.join('\n')),
|
|
273
|
+
...(artistImage ? [artistImage] : []),
|
|
274
|
+
...links,
|
|
275
|
+
];
|
|
276
|
+
return { content, structuredContent: data };
|
|
158
277
|
}));
|
|
159
|
-
// get_album_details
|
|
160
|
-
server.tool('get_album_details', 'Get detailed information about a specific album by ID
|
|
278
|
+
// get_album_details ──────────────────────────────────────────────
|
|
279
|
+
server.tool('get_album_details', 'Get detailed information about a specific album by ID: artist, play count, track listing, cover art, and Apple Music link.', { id: z.number().describe('Album ID'), ...includeImagesParam }, READ_ONLY_ANNOTATIONS, async ({ id, include_images }) => withRichResponse(async () => {
|
|
161
280
|
const data = await client.get(`/listening/albums/${id}`);
|
|
162
281
|
const lines = [
|
|
163
282
|
`${data.name} by ${data.artist.name}`,
|
|
@@ -170,7 +289,59 @@ export function registerListeningTools(server, client) {
|
|
|
170
289
|
lines.push(` ${i + 1}. "${t.name}" (${fmt(t.scrobble_count)} plays)`);
|
|
171
290
|
}
|
|
172
291
|
}
|
|
173
|
-
|
|
292
|
+
const cover = include_images
|
|
293
|
+
? await imageBlock(client, data.image)
|
|
294
|
+
: null;
|
|
295
|
+
const links = [
|
|
296
|
+
resourceLink(data.apple_music_url, 'Apple Music -- album', {
|
|
297
|
+
mimeType: 'text/html',
|
|
298
|
+
}),
|
|
299
|
+
resourceLink(data.url, 'Last.fm -- album', { mimeType: 'text/html' }),
|
|
300
|
+
].filter((b) => b !== null);
|
|
301
|
+
const content = [
|
|
302
|
+
text(lines.join('\n')),
|
|
303
|
+
...(cover ? [cover] : []),
|
|
304
|
+
...links,
|
|
305
|
+
];
|
|
306
|
+
return { content, structuredContent: data };
|
|
307
|
+
}));
|
|
308
|
+
// get_listening_genres ───────────────────────────────────────────
|
|
309
|
+
server.tool('get_listening_genres', 'Get genre breakdown over time from Last.fm listening history, grouped by week/month/year. Designed for stacked chart visualization.', {
|
|
310
|
+
group_by: z
|
|
311
|
+
.enum(['week', 'month', 'year'])
|
|
312
|
+
.default('month')
|
|
313
|
+
.describe('Grouping period (default: month)'),
|
|
314
|
+
limit: z
|
|
315
|
+
.number()
|
|
316
|
+
.min(1)
|
|
317
|
+
.max(50)
|
|
318
|
+
.default(10)
|
|
319
|
+
.describe('Max genres to return -- rest grouped as "Other" (default 10)'),
|
|
320
|
+
...dateFilterParams,
|
|
321
|
+
}, READ_ONLY_ANNOTATIONS, async ({ group_by, limit, date, from, to }) => withRichResponse(async () => {
|
|
322
|
+
const { data } = await client.get('/listening/genres', { group_by, limit, date, from, to });
|
|
323
|
+
if (!data.length) {
|
|
324
|
+
return {
|
|
325
|
+
content: [text('No genre data available.')],
|
|
326
|
+
structuredContent: {
|
|
327
|
+
items: [],
|
|
328
|
+
group_by,
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const lines = [`Genre breakdown by ${group_by}:`];
|
|
333
|
+
for (const row of data) {
|
|
334
|
+
const top = Object.entries(row.genres)
|
|
335
|
+
.sort(([, a], [, b]) => b - a)
|
|
336
|
+
.slice(0, 3)
|
|
337
|
+
.map(([name, count]) => `${name}=${count}`)
|
|
338
|
+
.join(', ');
|
|
339
|
+
lines.push(` ${row.period}: total ${fmt(row.total)}; top: ${top}`);
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
content: [text(lines.join('\n'))],
|
|
343
|
+
structuredContent: { items: data, group_by },
|
|
344
|
+
};
|
|
174
345
|
}));
|
|
175
346
|
}
|
|
176
347
|
//# sourceMappingURL=listening.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listening.js","sourceRoot":"","sources":["../../src/tools/listening.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"listening.js","sourceRoot":"","sources":["../../src/tools/listening.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,GAAG,EACH,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GAEd,MAAM,cAAc,CAAC;AAEtB,MAAM,KAAK,GAAG,CAAC,CAAC;AA4FhB,MAAM,WAAW,GAAG;IAClB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;CACD,CAAC;AAEX,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAoB;IAEpB,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4JAA4J,EAC5J,EAAE,GAAG,kBAAkB,EAAE,EACzB,qBAAqB,EACrB,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAC3B,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,wBAAwB,CAAC,CAAC;QAEpE,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC7C,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;QAE3E,MAAM,KAAK,GAAG,cAAc;YAC1B,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,KAAK,GAAG;YACZ,YAAY,CAAC,CAAC,CAAC,eAAe,EAAE,sBAAsB,EAAE;gBACtD,QAAQ,EAAE,WAAW;aACtB,CAAC;YACF,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,uBAAuB,EAAE;gBAC9D,QAAQ,EAAE,WAAW;aACtB,CAAC;YACF,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;SACnE,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAExD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,OAAO,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,8HAA8H,EAC9H;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,wDAAwD,CAAC;QACrE,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CACP,gFAAgF,CACjF;QACH,GAAG,gBAAgB;QACnB,GAAG,kBAAkB;KACtB,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CACxD,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,mBAAmB,EACnB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAChC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC3C,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aACjC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CACvF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAClE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,YAAY,CACV,CAAC,CAAC,KAAK,CAAC,eAAe,EACvB,kBAAkB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAChC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAC1B,CACF;aACA,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAC/D,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,sJAAsJ,EACtJ,EAAE,GAAG,gBAAgB,EAAE,EACvB,qBAAqB,EACrB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAC3B,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAQ1B,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG;YACd,kBAAkB;YAClB,sBAAsB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YACjD,qBAAqB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YAC/C,oBAAoB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC7C,oBAAoB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC7C,sBAAsB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACzD,qBAAqB,IAAI,CAAC,cAAc,EAAE;SAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,mHAAmH,EACnH;QACE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,WAAW,CAAC;aACjB,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,0BAA0B,CAAC;QACvC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,GAAG,kBAAkB;KACtB,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAChD,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,wBAAwB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CACxB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;gBACvD,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,gBAAgB,MAAM,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAClE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAC5D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,YAAY,CAAC,CAAC,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1D,QAAQ,EAAE,WAAW;SACtB,CAAC,CACH;aACA,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAC/D,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,2GAA2G,EAC3G;QACE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,WAAW,CAAC;aACjB,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,0BAA0B,CAAC;QACvC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,4BAA4B,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,GAAG,kBAAkB;KACtB,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAChD,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,uBAAuB,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CACxB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;gBACtD,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,eAAe,MAAM,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CACjF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAC5D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,YAAY,CAAC,CAAC,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1D,QAAQ,EAAE,WAAW;SACtB,CAAC,CACH;aACA,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAC/D,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gGAAgG,EAChG;QACE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,WAAW,CAAC;aACjB,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,0BAA0B,CAAC;QACvC,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,4BAA4B,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KAC1E,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAChC,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,uBAAuB,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CACxB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;gBACtD,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,eAAe,MAAM,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CACnF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,YAAY,CAAC,CAAC,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1D,QAAQ,EAAE,WAAW;SACtB,CAAC,CACH;aACA,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QAEnE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,gHAAgH,EAChH,EAAE,EACF,qBAAqB,EACrB,KAAK,IAAI,EAAE,CACT,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAY1B,oBAAoB,CAAC,CAAC;QAEzB,MAAM,OAAO,GAAG;YACd,oBAAoB;YACpB,EAAE;YACF,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa;YAC5F,IAAI,CAAC,OAAO,CAAC,UAAU;gBACrB,CAAC,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;gBACrD,CAAC,CAAC,EAAE;YACN,EAAE;YACF,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa;YAC5F,IAAI,CAAC,OAAO,CAAC,UAAU;gBACrB,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACpF,CAAC,CAAC,EAAE;SACP;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iIAAiI,EACjI,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,kBAAkB,EAAE,EAC/D,qBAAqB,EACrB,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAC/B,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,IAAI;YACT,gBAAgB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACrC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;YAC1C,EAAE;SACH,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC1D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,cAAc;YAChC,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,KAAK,GAAG;YACZ,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,uBAAuB,EAAE;gBAC1D,QAAQ,EAAE,WAAW;aACtB,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,EAAE;gBAC1C,QAAQ,EAAE,WAAW;aACtB,CAAC;SACH,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAExD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,4HAA4H,EAC5H,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,GAAG,kBAAkB,EAAE,EAC9D,qBAAqB,EACrB,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAC/B,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG;YACZ,GAAG,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACrC,gBAAgB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACrC,EAAE;SACH,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,cAAc;YAC1B,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,KAAK,GAAG;YACZ,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE;gBACzD,QAAQ,EAAE,WAAW;aACtB,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;SACtE,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAExD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,qIAAqI,EACrI;QACE,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;aAC/B,OAAO,CAAC,OAAO,CAAC;aAChB,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CACP,8DAA8D,CAC/D;QACH,GAAG,gBAAgB;KACpB,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAC5C,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAM1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,mBAAmB,EACnB,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACpC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC3C,iBAAiB,EAAE;oBACjB,KAAK,EAAE,EAAmB;oBAC1B,QAAQ;iBACT;aACF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;iBACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;iBAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC7C,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
package/dist/tools/reading.js
CHANGED
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { withRichResponse, text, resourceLink, imageBlock, formatDate, timeAgo, fmt, READ_ONLY_ANNOTATIONS, dateFilterParams, includeImagesParam, LIST_IMAGE_PX, } from './helpers.js';
|
|
3
|
+
const TOP_N = 5;
|
|
3
4
|
export function registerReadingTools(server, client) {
|
|
4
|
-
// get_recent_reads
|
|
5
|
-
server.tool('get_recent_reads', 'Get recently saved articles from Instapaper. Returns
|
|
5
|
+
// get_recent_reads ───────────────────────────────────────────────
|
|
6
|
+
server.tool('get_recent_reads', 'Get recently saved articles from Instapaper. Returns title, author, domain, read time, status, top-N site images where available, and article URLs as resource links.', {
|
|
6
7
|
limit: z
|
|
7
8
|
.number()
|
|
8
9
|
.min(1)
|
|
9
10
|
.max(50)
|
|
10
11
|
.default(10)
|
|
11
|
-
.describe('Number of recent articles to return'),
|
|
12
|
+
.describe('Number of recent articles to return (max 50)'),
|
|
13
|
+
page: z
|
|
14
|
+
.number()
|
|
15
|
+
.min(1)
|
|
16
|
+
.default(1)
|
|
17
|
+
.describe('Page number for pagination. Combine with limit to page through longer windows.'),
|
|
12
18
|
...dateFilterParams,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
...includeImagesParam,
|
|
20
|
+
}, READ_ONLY_ANNOTATIONS, async ({ limit, page, date, from, to, include_images }) => withRichResponse(async () => {
|
|
21
|
+
const { data } = await client.get('/reading/recent', { limit, page, date, from, to });
|
|
22
|
+
if (!data.length) {
|
|
23
|
+
return {
|
|
24
|
+
content: [text('No recent articles found.')],
|
|
25
|
+
structuredContent: { items: [] },
|
|
26
|
+
};
|
|
27
|
+
}
|
|
17
28
|
const lines = ['Recent reads:'];
|
|
18
29
|
for (const [i, a] of data.entries()) {
|
|
19
30
|
const author = a.author ? ` by ${a.author}` : '';
|
|
@@ -26,12 +37,26 @@ export function registerReadingTools(server, client) {
|
|
|
26
37
|
: a.status === 'archived'
|
|
27
38
|
? ' [finished]'
|
|
28
39
|
: '';
|
|
29
|
-
lines.push(`${i + 1}. ${a.title}${author}${domain}${readTime}${status} (${timeAgo(a.saved_at)})`);
|
|
40
|
+
lines.push(`${i + 1}. [ID: ${a.id}] ${a.title}${author}${domain}${readTime}${status} (${timeAgo(a.saved_at)})`);
|
|
30
41
|
}
|
|
31
|
-
|
|
42
|
+
const topN = data.slice(0, TOP_N);
|
|
43
|
+
const images = include_images
|
|
44
|
+
? await Promise.all(topN.map((a) => imageBlock(client, a.image, LIST_IMAGE_PX)))
|
|
45
|
+
: [];
|
|
46
|
+
const links = topN
|
|
47
|
+
.map((a) => resourceLink(a.url, `Article -- ${a.title}`, {
|
|
48
|
+
mimeType: 'text/html',
|
|
49
|
+
}))
|
|
50
|
+
.filter((b) => b !== null);
|
|
51
|
+
const content = [
|
|
52
|
+
text(lines.join('\n')),
|
|
53
|
+
...images.filter((b) => b !== null),
|
|
54
|
+
...links,
|
|
55
|
+
];
|
|
56
|
+
return { content, structuredContent: { items: data } };
|
|
32
57
|
}));
|
|
33
|
-
// get_reading_highlights
|
|
34
|
-
server.tool('get_reading_highlights', 'Get saved highlights from Instapaper articles. Returns the highlighted text,
|
|
58
|
+
// get_reading_highlights ─────────────────────────────────────────
|
|
59
|
+
server.tool('get_reading_highlights', 'Get saved highlights from Instapaper articles. Returns the highlighted text, notes, source article, and article URLs as resource links.', {
|
|
35
60
|
limit: z
|
|
36
61
|
.number()
|
|
37
62
|
.min(1)
|
|
@@ -39,10 +64,14 @@ export function registerReadingTools(server, client) {
|
|
|
39
64
|
.default(10)
|
|
40
65
|
.describe('Number of highlights to return'),
|
|
41
66
|
page: z.number().min(1).default(1).describe('Page number'),
|
|
42
|
-
}, READ_ONLY_ANNOTATIONS, async ({ limit, page }) =>
|
|
67
|
+
}, READ_ONLY_ANNOTATIONS, async ({ limit, page }) => withRichResponse(async () => {
|
|
43
68
|
const data = await client.get('/reading/highlights', { limit, page });
|
|
44
|
-
if (!data.data.length)
|
|
45
|
-
return
|
|
69
|
+
if (!data.data.length) {
|
|
70
|
+
return {
|
|
71
|
+
content: [text('No highlights found.')],
|
|
72
|
+
structuredContent: { items: [], pagination: data.pagination },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
46
75
|
const lines = [`Highlights (${fmt(data.pagination.total)} total):`];
|
|
47
76
|
for (const h of data.data) {
|
|
48
77
|
const source = h.article.author
|
|
@@ -54,10 +83,27 @@ export function registerReadingTools(server, client) {
|
|
|
54
83
|
lines.push(` Note: ${h.note}`);
|
|
55
84
|
lines.push(` -- ${source} (${formatDate(h.created_at)})`);
|
|
56
85
|
}
|
|
57
|
-
|
|
86
|
+
// Deduplicate article URLs before emitting as resource_links
|
|
87
|
+
const seen = new Set();
|
|
88
|
+
const links = data.data
|
|
89
|
+
.map((h) => {
|
|
90
|
+
const url = h.article.url ?? null;
|
|
91
|
+
if (!url || seen.has(url))
|
|
92
|
+
return null;
|
|
93
|
+
seen.add(url);
|
|
94
|
+
return resourceLink(url, `Article -- ${h.article.title}`, {
|
|
95
|
+
mimeType: 'text/html',
|
|
96
|
+
});
|
|
97
|
+
})
|
|
98
|
+
.filter((b) => b !== null);
|
|
99
|
+
const content = [text(lines.join('\n')), ...links];
|
|
100
|
+
return {
|
|
101
|
+
content,
|
|
102
|
+
structuredContent: { items: data.data, pagination: data.pagination },
|
|
103
|
+
};
|
|
58
104
|
}));
|
|
59
|
-
// get_random_highlight
|
|
60
|
-
server.tool('get_random_highlight', 'Get a single random highlight from saved Instapaper articles. Great for daily inspiration or reflection.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
105
|
+
// get_random_highlight ───────────────────────────────────────────
|
|
106
|
+
server.tool('get_random_highlight', 'Get a single random highlight from saved Instapaper articles. Great for daily inspiration or reflection.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
61
107
|
const data = await client.get('/reading/highlights/random');
|
|
62
108
|
const source = data.article.author
|
|
63
109
|
? `${data.article.title} by ${data.article.author}`
|
|
@@ -66,12 +112,17 @@ export function registerReadingTools(server, client) {
|
|
|
66
112
|
if (data.note)
|
|
67
113
|
lines.push(`Note: ${data.note}`);
|
|
68
114
|
lines.push(`-- ${source}`);
|
|
69
|
-
|
|
115
|
+
const link = resourceLink(data.article.url ?? null, `Article -- ${data.article.title}`, { mimeType: 'text/html' });
|
|
116
|
+
const content = [
|
|
117
|
+
text(lines.join('\n')),
|
|
118
|
+
...(link ? [link] : []),
|
|
119
|
+
];
|
|
120
|
+
return { content, structuredContent: data };
|
|
70
121
|
}));
|
|
71
|
-
// get_reading_stats
|
|
72
|
-
server.tool('get_reading_stats', 'Get overall reading statistics from Instapaper including total articles, finished count, currently reading, highlights, and word count.', {}, READ_ONLY_ANNOTATIONS, async () =>
|
|
122
|
+
// get_reading_stats ──────────────────────────────────────────────
|
|
123
|
+
server.tool('get_reading_stats', 'Get overall reading statistics from Instapaper including total articles, finished count, currently reading, highlights, and word count.', {}, READ_ONLY_ANNOTATIONS, async () => withRichResponse(async () => {
|
|
73
124
|
const data = await client.get('/reading/stats');
|
|
74
|
-
|
|
125
|
+
const summary = [
|
|
75
126
|
'Reading Stats:',
|
|
76
127
|
`- Total articles: ${fmt(data.total_articles)}`,
|
|
77
128
|
`- Finished: ${fmt(data.finished_count)}`,
|
|
@@ -80,6 +131,7 @@ export function registerReadingTools(server, client) {
|
|
|
80
131
|
`- Total words read: ${fmt(data.total_word_count)}`,
|
|
81
132
|
`- Average read time: ${Math.round(data.avg_estimated_read_min)} min`,
|
|
82
133
|
].join('\n');
|
|
134
|
+
return { content: [text(summary)], structuredContent: data };
|
|
83
135
|
}));
|
|
84
136
|
}
|
|
85
137
|
//# sourceMappingURL=reading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reading.js","sourceRoot":"","sources":["../../src/tools/reading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reading.js","sourceRoot":"","sources":["../../src/tools/reading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,GAAG,EACH,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GAEd,MAAM,cAAc,CAAC;AAEtB,MAAM,KAAK,GAAG,CAAC,CAAC;AAoChB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAoB;IAEpB,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uKAAuK,EACvK;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CACP,gFAAgF,CACjF;QACH,GAAG,gBAAgB;QACnB,GAAG,kBAAkB;KACtB,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CACxD,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,iBAAiB,EACjB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAChC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBAC5C,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;aACjC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,kBAAkB;gBACnC,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,WAAW;gBACxC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,MAAM,GACV,CAAC,CAAC,MAAM,KAAK,SAAS;gBACpB,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI;gBACvC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU;oBACvB,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CACpG,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAC5D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3C,QAAQ,EAAE,WAAW;SACtB,CAAC,CACH;aACA,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAC/D,GAAG,KAAK;SACT,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,yIAAyI,EACzI;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC3D,EACD,qBAAqB,EACrB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CACxB,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAG1B,qBAAqB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACvC,iBAAiB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;aAC9D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM;gBAC7B,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC7C,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,6DAA6D;QAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;YAClC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE;gBACxD,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QAEnE,OAAO;YACL,OAAO;YACP,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;SACrE,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,0GAA0G,EAC1G,EAAE,EACF,qBAAqB,EACrB,KAAK,IAAI,EAAE,CACT,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAY,4BAA4B,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;YAChC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEvB,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAG,YAAY,CACvB,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EACxB,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAClC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAC1B,CAAC;QAEF,MAAM,OAAO,GAAmB;YAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC,CAAC,CACL,CAAC;IAEF,mEAAmE;IACnE,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,yIAAyI,EACzI,EAAE,EACF,qBAAqB,EACrB,KAAK,IAAI,EAAE,CACT,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAO1B,gBAAgB,CAAC,CAAC;QAErB,MAAM,OAAO,GAAG;YACd,gBAAgB;YAChB,qBAAqB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YAC/C,eAAe,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YACzC,wBAAwB,IAAI,CAAC,uBAAuB,EAAE;YACtD,uBAAuB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;YACnD,uBAAuB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;YACnD,wBAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM;SACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|