@framers/agentos-ext-channel-youtube 0.1.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.
Files changed (47) hide show
  1. package/LICENSE +98 -0
  2. package/dist/YouTubeChannelAdapter.d.ts +30 -0
  3. package/dist/YouTubeChannelAdapter.d.ts.map +1 -0
  4. package/dist/YouTubeChannelAdapter.js +148 -0
  5. package/dist/YouTubeChannelAdapter.js.map +1 -0
  6. package/dist/YouTubeService.d.ts +115 -0
  7. package/dist/YouTubeService.d.ts.map +1 -0
  8. package/dist/YouTubeService.js +383 -0
  9. package/dist/YouTubeService.js.map +1 -0
  10. package/dist/index.d.ts +36 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +107 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/analytics.d.ts +41 -0
  15. package/dist/tools/analytics.d.ts.map +1 -0
  16. package/dist/tools/analytics.js +49 -0
  17. package/dist/tools/analytics.js.map +1 -0
  18. package/dist/tools/comment.d.ts +40 -0
  19. package/dist/tools/comment.d.ts.map +1 -0
  20. package/dist/tools/comment.js +39 -0
  21. package/dist/tools/comment.js.map +1 -0
  22. package/dist/tools/playlist.d.ts +67 -0
  23. package/dist/tools/playlist.d.ts.map +1 -0
  24. package/dist/tools/playlist.js +82 -0
  25. package/dist/tools/playlist.js.map +1 -0
  26. package/dist/tools/schedule.d.ts +64 -0
  27. package/dist/tools/schedule.d.ts.map +1 -0
  28. package/dist/tools/schedule.js +81 -0
  29. package/dist/tools/schedule.js.map +1 -0
  30. package/dist/tools/search.d.ts +52 -0
  31. package/dist/tools/search.d.ts.map +1 -0
  32. package/dist/tools/search.js +54 -0
  33. package/dist/tools/search.js.map +1 -0
  34. package/dist/tools/short.d.ts +55 -0
  35. package/dist/tools/short.d.ts.map +1 -0
  36. package/dist/tools/short.js +68 -0
  37. package/dist/tools/short.js.map +1 -0
  38. package/dist/tools/trending.d.ts +40 -0
  39. package/dist/tools/trending.d.ts.map +1 -0
  40. package/dist/tools/trending.js +42 -0
  41. package/dist/tools/trending.js.map +1 -0
  42. package/dist/tools/upload.d.ts +65 -0
  43. package/dist/tools/upload.d.ts.map +1 -0
  44. package/dist/tools/upload.js +71 -0
  45. package/dist/tools/upload.js.map +1 -0
  46. package/manifest.json +34 -0
  47. package/package.json +38 -0
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview YouTube Data API v3 service layer.
5
+ *
6
+ * Wraps googleapis for video upload, Shorts, comments, search,
7
+ * trending, analytics, playlists, and scheduling.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.YouTubeService = void 0;
11
+ const googleapis_1 = require("googleapis");
12
+ // ---------------------------------------------------------------------------
13
+ // Service
14
+ // ---------------------------------------------------------------------------
15
+ class YouTubeService {
16
+ constructor(config) {
17
+ this.youtube = null;
18
+ this.youtubeAuth = null;
19
+ this.running = false;
20
+ this.config = config;
21
+ }
22
+ async initialize() {
23
+ if (this.running)
24
+ return;
25
+ // Public API client (API key only — for search, trending, read ops)
26
+ this.youtube = googleapis_1.google.youtube({
27
+ version: 'v3',
28
+ auth: this.config.apiKey,
29
+ });
30
+ // Authenticated client (OAuth — for uploads, comments, playlists)
31
+ if (this.config.oauth) {
32
+ const oauth2Client = new googleapis_1.google.auth.OAuth2(this.config.oauth.clientId, this.config.oauth.clientSecret);
33
+ oauth2Client.setCredentials({
34
+ refresh_token: this.config.oauth.refreshToken,
35
+ });
36
+ this.youtubeAuth = googleapis_1.google.youtube({
37
+ version: 'v3',
38
+ auth: oauth2Client,
39
+ });
40
+ }
41
+ this.running = true;
42
+ }
43
+ async shutdown() {
44
+ this.youtube = null;
45
+ this.youtubeAuth = null;
46
+ this.running = false;
47
+ }
48
+ get isRunning() {
49
+ return this.running;
50
+ }
51
+ // ── Video Upload ──
52
+ async uploadVideo(options) {
53
+ const client = this.requireAuthClient();
54
+ const description = options.isShort
55
+ ? `${options.description}\n\n#Shorts`
56
+ : options.description;
57
+ const response = await client.videos.insert({
58
+ part: ['snippet', 'status'],
59
+ requestBody: {
60
+ snippet: {
61
+ title: options.title,
62
+ description,
63
+ tags: options.tags,
64
+ categoryId: options.categoryId ?? '22', // People & Blogs
65
+ },
66
+ status: {
67
+ privacyStatus: options.publishAt ? 'private' : (options.privacyStatus ?? 'public'),
68
+ publishAt: options.publishAt,
69
+ selfDeclaredMadeForKids: false,
70
+ },
71
+ },
72
+ media: {
73
+ mimeType: options.mimeType ?? 'video/mp4',
74
+ body: options.videoStream,
75
+ },
76
+ });
77
+ const data = response.data;
78
+ return {
79
+ id: data.id ?? '',
80
+ title: data.snippet?.title ?? options.title,
81
+ description: data.snippet?.description,
82
+ channelId: data.snippet?.channelId ?? undefined,
83
+ publishedAt: data.snippet?.publishedAt ?? undefined,
84
+ tags: data.snippet?.tags ?? undefined,
85
+ };
86
+ }
87
+ // ── Comments ──
88
+ async postComment(videoId, text, parentCommentId) {
89
+ const client = this.requireAuthClient();
90
+ if (parentCommentId) {
91
+ // Reply to existing comment
92
+ const response = await client.comments.insert({
93
+ part: ['snippet'],
94
+ requestBody: {
95
+ snippet: {
96
+ parentId: parentCommentId,
97
+ textOriginal: text,
98
+ },
99
+ },
100
+ });
101
+ const data = response.data;
102
+ return {
103
+ id: data.id ?? '',
104
+ videoId,
105
+ text: data.snippet?.textOriginal ?? text,
106
+ authorDisplayName: data.snippet?.authorDisplayName ?? undefined,
107
+ authorChannelId: data.snippet?.authorChannelId?.value ?? undefined,
108
+ publishedAt: data.snippet?.publishedAt ?? undefined,
109
+ likeCount: data.snippet?.likeCount ?? 0,
110
+ };
111
+ }
112
+ // Top-level comment
113
+ const response = await client.commentThreads.insert({
114
+ part: ['snippet'],
115
+ requestBody: {
116
+ snippet: {
117
+ videoId,
118
+ topLevelComment: {
119
+ snippet: {
120
+ textOriginal: text,
121
+ },
122
+ },
123
+ },
124
+ },
125
+ });
126
+ const data = response.data;
127
+ const comment = data.snippet?.topLevelComment;
128
+ return {
129
+ id: data.id ?? '',
130
+ videoId,
131
+ text: comment?.snippet?.textOriginal ?? text,
132
+ authorDisplayName: comment?.snippet?.authorDisplayName ?? undefined,
133
+ authorChannelId: comment?.snippet?.authorChannelId?.value ?? undefined,
134
+ publishedAt: comment?.snippet?.publishedAt ?? undefined,
135
+ likeCount: comment?.snippet?.likeCount ?? 0,
136
+ replyCount: data.snippet?.totalReplyCount ?? 0,
137
+ };
138
+ }
139
+ async getComments(videoId, maxResults = 20) {
140
+ const client = this.requirePublicClient();
141
+ const response = await client.commentThreads.list({
142
+ part: ['snippet'],
143
+ videoId,
144
+ maxResults: Math.min(maxResults, 100),
145
+ order: 'relevance',
146
+ });
147
+ return (response.data.items ?? []).map((item) => {
148
+ const comment = item.snippet?.topLevelComment;
149
+ return {
150
+ id: item.id ?? '',
151
+ videoId,
152
+ text: comment?.snippet?.textDisplay ?? '',
153
+ authorDisplayName: comment?.snippet?.authorDisplayName ?? undefined,
154
+ authorChannelId: comment?.snippet?.authorChannelId?.value ?? undefined,
155
+ publishedAt: comment?.snippet?.publishedAt ?? undefined,
156
+ likeCount: comment?.snippet?.likeCount ?? 0,
157
+ replyCount: item.snippet?.totalReplyCount ?? 0,
158
+ };
159
+ });
160
+ }
161
+ // ── Search ──
162
+ async search(query, options) {
163
+ const client = this.requirePublicClient();
164
+ const response = await client.search.list({
165
+ part: ['snippet'],
166
+ q: query,
167
+ type: [options?.type ?? 'video'],
168
+ maxResults: Math.min(options?.maxResults ?? 10, 50),
169
+ order: options?.order ?? 'relevance',
170
+ regionCode: options?.regionCode,
171
+ });
172
+ return (response.data.items ?? []).map((item) => {
173
+ let id = '';
174
+ let type = 'video';
175
+ if (item.id?.videoId) {
176
+ id = item.id.videoId;
177
+ type = 'video';
178
+ }
179
+ else if (item.id?.channelId) {
180
+ id = item.id.channelId;
181
+ type = 'channel';
182
+ }
183
+ else if (item.id?.playlistId) {
184
+ id = item.id.playlistId;
185
+ type = 'playlist';
186
+ }
187
+ return {
188
+ id,
189
+ type,
190
+ title: item.snippet?.title ?? '',
191
+ description: item.snippet?.description ?? undefined,
192
+ channelTitle: item.snippet?.channelTitle ?? undefined,
193
+ publishedAt: item.snippet?.publishedAt ?? undefined,
194
+ thumbnailUrl: item.snippet?.thumbnails?.high?.url ?? item.snippet?.thumbnails?.default?.url ?? undefined,
195
+ };
196
+ });
197
+ }
198
+ // ── Trending ──
199
+ async getTrending(regionCode = 'US', categoryId, maxResults = 20) {
200
+ const client = this.requirePublicClient();
201
+ const response = await client.videos.list({
202
+ part: ['snippet', 'statistics', 'contentDetails'],
203
+ chart: 'mostPopular',
204
+ regionCode,
205
+ videoCategoryId: categoryId,
206
+ maxResults: Math.min(maxResults, 50),
207
+ });
208
+ return (response.data.items ?? []).map((item) => this.mapVideoResult(item));
209
+ }
210
+ // ── Analytics ──
211
+ async getVideoStatistics(videoId) {
212
+ const client = this.requirePublicClient();
213
+ const response = await client.videos.list({
214
+ part: ['snippet', 'statistics', 'contentDetails'],
215
+ id: [videoId],
216
+ });
217
+ const item = response.data.items?.[0];
218
+ if (!item)
219
+ throw new Error(`Video ${videoId} not found`);
220
+ return this.mapVideoResult(item);
221
+ }
222
+ async getChannelStatistics(channelId) {
223
+ const client = this.requirePublicClient();
224
+ let targetChannelId = channelId;
225
+ if (!targetChannelId && this.youtubeAuth) {
226
+ // Get own channel
227
+ const channelResponse = await this.youtubeAuth.channels.list({
228
+ part: ['statistics'],
229
+ mine: true,
230
+ });
231
+ const channel = channelResponse.data.items?.[0];
232
+ if (channel?.statistics) {
233
+ return {
234
+ viewCount: parseInt(channel.statistics.viewCount ?? '0', 10),
235
+ subscriberCount: parseInt(channel.statistics.subscriberCount ?? '0', 10),
236
+ videoCount: parseInt(channel.statistics.videoCount ?? '0', 10),
237
+ };
238
+ }
239
+ }
240
+ if (!targetChannelId)
241
+ throw new Error('Channel ID required when OAuth is not configured');
242
+ const response = await client.channels.list({
243
+ part: ['statistics'],
244
+ id: [targetChannelId],
245
+ });
246
+ const channel = response.data.items?.[0];
247
+ if (!channel)
248
+ throw new Error(`Channel ${targetChannelId} not found`);
249
+ return {
250
+ viewCount: parseInt(channel.statistics?.viewCount ?? '0', 10),
251
+ subscriberCount: parseInt(channel.statistics?.subscriberCount ?? '0', 10),
252
+ videoCount: parseInt(channel.statistics?.videoCount ?? '0', 10),
253
+ };
254
+ }
255
+ // ── Playlists ──
256
+ async createPlaylist(title, description, privacyStatus = 'public') {
257
+ const client = this.requireAuthClient();
258
+ const response = await client.playlists.insert({
259
+ part: ['snippet', 'status'],
260
+ requestBody: {
261
+ snippet: { title, description },
262
+ status: { privacyStatus },
263
+ },
264
+ });
265
+ const data = response.data;
266
+ return {
267
+ id: data.id ?? '',
268
+ title: data.snippet?.title ?? title,
269
+ description: data.snippet?.description ?? undefined,
270
+ privacyStatus: data.status?.privacyStatus ?? undefined,
271
+ publishedAt: data.snippet?.publishedAt ?? undefined,
272
+ };
273
+ }
274
+ async addToPlaylist(playlistId, videoId) {
275
+ const client = this.requireAuthClient();
276
+ await client.playlistItems.insert({
277
+ part: ['snippet'],
278
+ requestBody: {
279
+ snippet: {
280
+ playlistId,
281
+ resourceId: {
282
+ kind: 'youtube#video',
283
+ videoId,
284
+ },
285
+ },
286
+ },
287
+ });
288
+ }
289
+ async getPlaylistItems(playlistId, maxResults = 25) {
290
+ const client = this.requirePublicClient();
291
+ const response = await client.playlistItems.list({
292
+ part: ['snippet', 'contentDetails'],
293
+ playlistId,
294
+ maxResults: Math.min(maxResults, 50),
295
+ });
296
+ return (response.data.items ?? []).map((item) => ({
297
+ id: item.contentDetails?.videoId ?? item.snippet?.resourceId?.videoId ?? '',
298
+ title: item.snippet?.title ?? '',
299
+ description: item.snippet?.description ?? undefined,
300
+ channelTitle: item.snippet?.channelTitle ?? undefined,
301
+ publishedAt: item.snippet?.publishedAt ?? undefined,
302
+ thumbnailUrl: item.snippet?.thumbnails?.high?.url ?? undefined,
303
+ }));
304
+ }
305
+ async getPlaylists(channelId, maxResults = 25) {
306
+ const client = channelId ? this.requirePublicClient() : this.requireAuthClient();
307
+ const params = {
308
+ part: ['snippet', 'contentDetails', 'status'],
309
+ maxResults: Math.min(maxResults, 50),
310
+ };
311
+ if (channelId) {
312
+ params.channelId = channelId;
313
+ }
314
+ else {
315
+ params.mine = true;
316
+ }
317
+ const response = await client.playlists.list(params);
318
+ return (response.data.items ?? []).map((item) => ({
319
+ id: item.id ?? '',
320
+ title: item.snippet?.title ?? '',
321
+ description: item.snippet?.description ?? undefined,
322
+ itemCount: item.contentDetails?.itemCount ?? 0,
323
+ privacyStatus: item.status?.privacyStatus ?? undefined,
324
+ publishedAt: item.snippet?.publishedAt ?? undefined,
325
+ thumbnailUrl: item.snippet?.thumbnails?.high?.url ?? undefined,
326
+ }));
327
+ }
328
+ async deletePlaylist(playlistId) {
329
+ const client = this.requireAuthClient();
330
+ await client.playlists.delete({ id: playlistId });
331
+ }
332
+ // ── User Info ──
333
+ async getMyChannel() {
334
+ const client = this.requireAuthClient();
335
+ const response = await client.channels.list({
336
+ part: ['snippet', 'statistics'],
337
+ mine: true,
338
+ });
339
+ const channel = response.data.items?.[0];
340
+ if (!channel)
341
+ throw new Error('Could not retrieve channel info');
342
+ return {
343
+ id: channel.id ?? '',
344
+ title: channel.snippet?.title ?? '',
345
+ description: channel.snippet?.description ?? undefined,
346
+ subscriberCount: parseInt(channel.statistics?.subscriberCount ?? '0', 10),
347
+ videoCount: parseInt(channel.statistics?.videoCount ?? '0', 10),
348
+ viewCount: parseInt(channel.statistics?.viewCount ?? '0', 10),
349
+ customUrl: channel.snippet?.customUrl ?? undefined,
350
+ thumbnailUrl: channel.snippet?.thumbnails?.high?.url ?? undefined,
351
+ };
352
+ }
353
+ // ── Internal Helpers ──
354
+ requirePublicClient() {
355
+ if (!this.youtube)
356
+ throw new Error('YouTubeService not initialized');
357
+ return this.youtube;
358
+ }
359
+ requireAuthClient() {
360
+ if (!this.youtubeAuth) {
361
+ throw new Error('YouTube OAuth credentials required. Provide youtube.oauth.clientId, youtube.oauth.clientSecret, and youtube.oauth.refreshToken.');
362
+ }
363
+ return this.youtubeAuth;
364
+ }
365
+ mapVideoResult(item) {
366
+ return {
367
+ id: item.id ?? '',
368
+ title: item.snippet?.title ?? '',
369
+ description: item.snippet?.description ?? undefined,
370
+ channelId: item.snippet?.channelId ?? undefined,
371
+ channelTitle: item.snippet?.channelTitle ?? undefined,
372
+ publishedAt: item.snippet?.publishedAt ?? undefined,
373
+ thumbnailUrl: item.snippet?.thumbnails?.high?.url ?? item.snippet?.thumbnails?.default?.url ?? undefined,
374
+ duration: item.contentDetails?.duration ?? undefined,
375
+ viewCount: parseInt(item.statistics?.viewCount ?? '0', 10),
376
+ likeCount: parseInt(item.statistics?.likeCount ?? '0', 10),
377
+ commentCount: parseInt(item.statistics?.commentCount ?? '0', 10),
378
+ tags: item.snippet?.tags ?? undefined,
379
+ };
380
+ }
381
+ }
382
+ exports.YouTubeService = YouTubeService;
383
+ //# sourceMappingURL=YouTubeService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubeService.js","sourceRoot":"","sources":["../src/YouTubeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview YouTube Channel Extension for AgentOS.
3
+ *
4
+ * Provides video publishing, content discovery, and comment interaction
5
+ * via YouTube Data API v3, plus ITool descriptors for video upload,
6
+ * Shorts, comments, search, trending, analytics, playlists, and scheduling.
7
+ *
8
+ * @module @framers/agentos-ext-channel-youtube
9
+ */
10
+ import type { ExtensionContext, ExtensionPack } from '@framers/agentos';
11
+ import { YouTubeService, type YouTubeConfig } from './YouTubeService';
12
+ import { YouTubeChannelAdapter } from './YouTubeChannelAdapter';
13
+ import { YouTubeUploadTool } from './tools/upload';
14
+ import { YouTubeShortTool } from './tools/short';
15
+ import { YouTubeCommentTool } from './tools/comment';
16
+ import { YouTubeSearchTool } from './tools/search';
17
+ import { YouTubeTrendingTool } from './tools/trending';
18
+ import { YouTubeAnalyticsTool } from './tools/analytics';
19
+ import { YouTubePlaylistTool } from './tools/playlist';
20
+ import { YouTubeScheduleTool } from './tools/schedule';
21
+ export interface YouTubeChannelOptions {
22
+ apiKey?: string;
23
+ apiKeyEnv?: string;
24
+ oauth?: {
25
+ clientId: string;
26
+ clientSecret: string;
27
+ refreshToken: string;
28
+ };
29
+ priority?: number;
30
+ }
31
+ export declare function createExtensionPack(context: ExtensionContext): ExtensionPack;
32
+ export { YouTubeService, YouTubeChannelAdapter };
33
+ export { YouTubeUploadTool, YouTubeShortTool, YouTubeCommentTool, YouTubeSearchTool, YouTubeTrendingTool, YouTubeAnalyticsTool, YouTubePlaylistTool, YouTubeScheduleTool, };
34
+ export type { YouTubeConfig };
35
+ export default createExtensionPack;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAwCD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CA6C5E;AAED,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAC;AACjD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,CAAC;AACF,YAAY,EAAE,aAAa,EAAE,CAAC;AAC9B,eAAe,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview YouTube Channel Extension for AgentOS.
5
+ *
6
+ * Provides video publishing, content discovery, and comment interaction
7
+ * via YouTube Data API v3, plus ITool descriptors for video upload,
8
+ * Shorts, comments, search, trending, analytics, playlists, and scheduling.
9
+ *
10
+ * @module @framers/agentos-ext-channel-youtube
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.YouTubeScheduleTool = exports.YouTubePlaylistTool = exports.YouTubeAnalyticsTool = exports.YouTubeTrendingTool = exports.YouTubeSearchTool = exports.YouTubeCommentTool = exports.YouTubeShortTool = exports.YouTubeUploadTool = exports.YouTubeChannelAdapter = exports.YouTubeService = void 0;
14
+ exports.createExtensionPack = createExtensionPack;
15
+ const YouTubeService_1 = require("./YouTubeService");
16
+ Object.defineProperty(exports, "YouTubeService", { enumerable: true, get: function () { return YouTubeService_1.YouTubeService; } });
17
+ const YouTubeChannelAdapter_1 = require("./YouTubeChannelAdapter");
18
+ Object.defineProperty(exports, "YouTubeChannelAdapter", { enumerable: true, get: function () { return YouTubeChannelAdapter_1.YouTubeChannelAdapter; } });
19
+ const upload_1 = require("./tools/upload");
20
+ Object.defineProperty(exports, "YouTubeUploadTool", { enumerable: true, get: function () { return upload_1.YouTubeUploadTool; } });
21
+ const short_1 = require("./tools/short");
22
+ Object.defineProperty(exports, "YouTubeShortTool", { enumerable: true, get: function () { return short_1.YouTubeShortTool; } });
23
+ const comment_1 = require("./tools/comment");
24
+ Object.defineProperty(exports, "YouTubeCommentTool", { enumerable: true, get: function () { return comment_1.YouTubeCommentTool; } });
25
+ const search_1 = require("./tools/search");
26
+ Object.defineProperty(exports, "YouTubeSearchTool", { enumerable: true, get: function () { return search_1.YouTubeSearchTool; } });
27
+ const trending_1 = require("./tools/trending");
28
+ Object.defineProperty(exports, "YouTubeTrendingTool", { enumerable: true, get: function () { return trending_1.YouTubeTrendingTool; } });
29
+ const analytics_1 = require("./tools/analytics");
30
+ Object.defineProperty(exports, "YouTubeAnalyticsTool", { enumerable: true, get: function () { return analytics_1.YouTubeAnalyticsTool; } });
31
+ const playlist_1 = require("./tools/playlist");
32
+ Object.defineProperty(exports, "YouTubePlaylistTool", { enumerable: true, get: function () { return playlist_1.YouTubePlaylistTool; } });
33
+ const schedule_1 = require("./tools/schedule");
34
+ Object.defineProperty(exports, "YouTubeScheduleTool", { enumerable: true, get: function () { return schedule_1.YouTubeScheduleTool; } });
35
+ function resolveApiKey(options, secrets) {
36
+ if (options.apiKey)
37
+ return options.apiKey;
38
+ // Check secrets map from registry
39
+ if (secrets?.['youtube.apiKey'])
40
+ return secrets['youtube.apiKey'];
41
+ // Environment variable fallback
42
+ const envName = options.apiKeyEnv ?? 'YOUTUBE_API_KEY';
43
+ const envValue = process.env[envName];
44
+ if (envValue)
45
+ return envValue;
46
+ // Common variations
47
+ for (const v of ['YOUTUBE_API_KEY', 'GOOGLE_API_KEY']) {
48
+ if (process.env[v])
49
+ return process.env[v];
50
+ }
51
+ throw new Error('YouTube API key not found. Provide via options.apiKey, secrets["youtube.apiKey"], or YOUTUBE_API_KEY env var.');
52
+ }
53
+ function resolveOAuth(options, secrets) {
54
+ if (options.oauth)
55
+ return options.oauth;
56
+ const clientId = secrets?.['youtube.oauth.clientId'] ?? process.env.YOUTUBE_OAUTH_CLIENT_ID;
57
+ const clientSecret = secrets?.['youtube.oauth.clientSecret'] ?? process.env.YOUTUBE_OAUTH_CLIENT_SECRET;
58
+ const refreshToken = secrets?.['youtube.oauth.refreshToken'] ?? process.env.YOUTUBE_OAUTH_REFRESH_TOKEN;
59
+ if (clientId && clientSecret && refreshToken) {
60
+ return { clientId, clientSecret, refreshToken };
61
+ }
62
+ return undefined;
63
+ }
64
+ function createExtensionPack(context) {
65
+ const options = (context.options ?? {});
66
+ const apiKey = resolveApiKey(options, options.secrets);
67
+ const oauth = resolveOAuth(options, options.secrets);
68
+ const config = { apiKey, oauth };
69
+ const service = new YouTubeService_1.YouTubeService(config);
70
+ const adapter = new YouTubeChannelAdapter_1.YouTubeChannelAdapter(service);
71
+ const uploadTool = new upload_1.YouTubeUploadTool(service);
72
+ const shortTool = new short_1.YouTubeShortTool(service);
73
+ const commentTool = new comment_1.YouTubeCommentTool(service);
74
+ const searchTool = new search_1.YouTubeSearchTool(service);
75
+ const trendingTool = new trending_1.YouTubeTrendingTool(service);
76
+ const analyticsTool = new analytics_1.YouTubeAnalyticsTool(service);
77
+ const playlistTool = new playlist_1.YouTubePlaylistTool(service);
78
+ const scheduleTool = new schedule_1.YouTubeScheduleTool(service);
79
+ const priority = options.priority ?? 50;
80
+ return {
81
+ name: '@framers/agentos-ext-channel-youtube',
82
+ version: '0.1.0',
83
+ descriptors: [
84
+ { id: 'youtubeUpload', kind: 'tool', priority, payload: uploadTool },
85
+ { id: 'youtubeShort', kind: 'tool', priority, payload: shortTool },
86
+ { id: 'youtubeComment', kind: 'tool', priority, payload: commentTool },
87
+ { id: 'youtubeSearch', kind: 'tool', priority, payload: searchTool },
88
+ { id: 'youtubeTrending', kind: 'tool', priority, payload: trendingTool },
89
+ { id: 'youtubeAnalytics', kind: 'tool', priority, payload: analyticsTool },
90
+ { id: 'youtubePlaylist', kind: 'tool', priority, payload: playlistTool },
91
+ { id: 'youtubeSchedule', kind: 'tool', priority, payload: scheduleTool },
92
+ { id: 'youtubeChannel', kind: 'messaging-channel', priority, payload: adapter },
93
+ ],
94
+ onActivate: async () => {
95
+ await service.initialize();
96
+ await adapter.initialize({ platform: 'youtube', credential: apiKey });
97
+ context.logger?.info('[YouTubeChannel] Extension activated');
98
+ },
99
+ onDeactivate: async () => {
100
+ await adapter.shutdown();
101
+ await service.shutdown();
102
+ context.logger?.info('[YouTubeChannel] Extension deactivated');
103
+ },
104
+ };
105
+ }
106
+ exports.default = createExtensionPack;
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview ITool for YouTube channel and video analytics.
3
+ */
4
+ import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
5
+ import type { YouTubeService } from '../YouTubeService';
6
+ export declare class YouTubeAnalyticsTool implements ITool {
7
+ private readonly service;
8
+ readonly id = "youtubeAnalytics";
9
+ readonly name = "youtubeAnalytics";
10
+ readonly displayName = "Video Analytics";
11
+ readonly description = "Get performance metrics for a YouTube video or channel (views, likes, comments, subscribers).";
12
+ readonly category = "social";
13
+ readonly version = "0.1.0";
14
+ readonly hasSideEffects = false;
15
+ readonly inputSchema: {
16
+ type: "object";
17
+ required: readonly ["type"];
18
+ properties: {
19
+ type: {
20
+ type: string;
21
+ enum: string[];
22
+ description: string;
23
+ };
24
+ videoId: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ channelId: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ };
33
+ };
34
+ constructor(service: YouTubeService);
35
+ execute(args: {
36
+ type: 'video' | 'channel';
37
+ videoId?: string;
38
+ channelId?: string;
39
+ }, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
40
+ }
41
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,qBAAa,oBAAqB,YAAW,KAAK;IAuBpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAtBpC,SAAgB,EAAE,sBAAsB;IACxC,SAAgB,IAAI,sBAAsB;IAC1C,SAAgB,WAAW,qBAAqB;IAChD,SAAgB,WAAW,mGAAmG;IAC9H,SAAgB,QAAQ,YAAY;IACpC,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,SAAS;IAEvC,SAAgB,WAAW;;;;;;;;;;;;;;;;;;MAYzB;gBAE2B,OAAO,EAAE,cAAc;IAE9C,OAAO,CACX,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EACzE,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;CAchC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview ITool for YouTube channel and video analytics.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.YouTubeAnalyticsTool = void 0;
8
+ class YouTubeAnalyticsTool {
9
+ constructor(service) {
10
+ this.service = service;
11
+ this.id = 'youtubeAnalytics';
12
+ this.name = 'youtubeAnalytics';
13
+ this.displayName = 'Video Analytics';
14
+ this.description = 'Get performance metrics for a YouTube video or channel (views, likes, comments, subscribers).';
15
+ this.category = 'social';
16
+ this.version = '0.1.0';
17
+ this.hasSideEffects = false;
18
+ this.inputSchema = {
19
+ type: 'object',
20
+ required: ['type'],
21
+ properties: {
22
+ type: {
23
+ type: 'string',
24
+ enum: ['video', 'channel'],
25
+ description: 'Whether to get analytics for a video or a channel',
26
+ },
27
+ videoId: { type: 'string', description: 'Video ID (required when type is "video")' },
28
+ channelId: { type: 'string', description: 'Channel ID (optional for type "channel" — defaults to own channel if OAuth is set up)' },
29
+ },
30
+ };
31
+ }
32
+ async execute(args, _context) {
33
+ try {
34
+ if (args.type === 'video') {
35
+ if (!args.videoId)
36
+ throw new Error('videoId is required when type is "video"');
37
+ const stats = await this.service.getVideoStatistics(args.videoId);
38
+ return { success: true, data: stats };
39
+ }
40
+ const stats = await this.service.getChannelStatistics(args.channelId);
41
+ return { success: true, data: { type: 'channel', channelId: args.channelId ?? 'self', metrics: stats } };
42
+ }
43
+ catch (error) {
44
+ return { success: false, error: error.message };
45
+ }
46
+ }
47
+ }
48
+ exports.YouTubeAnalyticsTool = YouTubeAnalyticsTool;
49
+ //# sourceMappingURL=analytics.js.map