@liorium/youtube-omni-mcp 0.1.2 → 0.2.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/CHANGELOG.md +8 -0
- package/README.md +12 -9
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +2 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/core/errors.d.ts +3 -0
- package/dist/src/core/errors.js +2 -1
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/risk.d.ts +2 -0
- package/dist/src/core/risk.js +19 -3
- package/dist/src/core/risk.js.map +1 -1
- package/dist/src/schemas/index.d.ts +2 -0
- package/dist/src/schemas/index.js +2 -0
- package/dist/src/schemas/index.js.map +1 -1
- package/dist/src/schemas/operations.d.ts +50 -0
- package/dist/src/schemas/operations.js +41 -0
- package/dist/src/schemas/operations.js.map +1 -0
- package/dist/src/schemas/research.d.ts +37 -0
- package/dist/src/schemas/research.js +28 -0
- package/dist/src/schemas/research.js.map +1 -0
- package/dist/src/server.d.ts +10 -78
- package/dist/src/server.js +105 -4
- package/dist/src/server.js.map +1 -1
- package/dist/src/tools/operations.d.ts +14 -0
- package/dist/src/tools/operations.js +38 -0
- package/dist/src/tools/operations.js.map +1 -0
- package/dist/src/tools/research.d.ts +47 -0
- package/dist/src/tools/research.js +140 -0
- package/dist/src/tools/research.js.map +1 -0
- package/dist/src/tools/safety.js +1 -1
- package/dist/src/tools/safety.js.map +1 -1
- package/docs/safety-policy.md +30 -2
- package/docs/tool-schema.md +50 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0 - 2026-05-14
|
|
4
|
+
|
|
5
|
+
- Add five Creator Research tools: outlier video discovery, hook comparison, topic angle extraction, comment pain-point summarization, and video angle matrix generation.
|
|
6
|
+
- Add governed operation tool foundations for metadata, upload, thumbnail, playlist, comment moderation, and community post workflows.
|
|
7
|
+
- Keep operation tools hidden by default and dry-run-only when explicitly gated with `YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true` and `YOUTUBE_OMNI_DRY_RUN_WRITES=true`.
|
|
8
|
+
- Add concrete MCP schemas for research and gated operation tools.
|
|
9
|
+
- Update safety policy and capability reporting for the v0.2 phase.
|
|
10
|
+
|
|
3
11
|
## 0.1.2 - 2026-05-14
|
|
4
12
|
|
|
5
13
|
- Add concrete MCP `inputSchema` definitions for all v0 tools so agents can pass required arguments reliably.
|
package/README.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
`youtube-omni` is a full-scope YouTube Creator Intelligence + Operations + Analytics + Production MCP project.
|
|
4
4
|
|
|
5
|
-
Current implementation phase: **v0
|
|
5
|
+
Current implementation phase: **v0.2 Creator Research + governed write foundation**.
|
|
6
6
|
|
|
7
|
-
## v0 boundary
|
|
7
|
+
## v0.2 default boundary
|
|
8
8
|
|
|
9
|
-
Enabled
|
|
9
|
+
Enabled by default:
|
|
10
10
|
|
|
11
11
|
- public discovery/search
|
|
12
12
|
- video details/comparison
|
|
@@ -14,6 +14,7 @@ Enabled in v0:
|
|
|
14
14
|
- transcript segments/full text/structure analysis
|
|
15
15
|
- comments read/summarize
|
|
16
16
|
- research brief drafts
|
|
17
|
+
- Creator Research synthesis tools
|
|
17
18
|
- safety/capability reporting
|
|
18
19
|
|
|
19
20
|
Locked for later phases, but part of final scope:
|
|
@@ -29,8 +30,9 @@ Locked for later phases, but part of final scope:
|
|
|
29
30
|
|
|
30
31
|
## Safety defaults
|
|
31
32
|
|
|
32
|
-
- No write tools are exposed
|
|
33
|
-
- No download tools are exposed
|
|
33
|
+
- No write tools are exposed by default.
|
|
34
|
+
- No download tools are exposed by default.
|
|
35
|
+
- Operation tools are dry-run-only stubs when `YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true` and `YOUTUBE_OMNI_DRY_RUN_WRITES=true` are both set.
|
|
34
36
|
- Secrets must be supplied via environment variables and are never committed.
|
|
35
37
|
- Write/download/destructive namespaces remain environment-gated for later phases.
|
|
36
38
|
|
|
@@ -57,6 +59,7 @@ Use this shape in an `mcp.json`-style client configuration:
|
|
|
57
59
|
"YOUTUBE_OMNI_MAX_RESULTS": "50",
|
|
58
60
|
"YOUTUBE_OMNI_ENABLE_OUTLIER": "false",
|
|
59
61
|
"YOUTUBE_OMNI_ENABLE_WRITE_TOOLS": "false",
|
|
62
|
+
"YOUTUBE_OMNI_DRY_RUN_WRITES": "false",
|
|
60
63
|
"YOUTUBE_OMNI_ENABLE_DOWNLOAD_TOOLS": "false",
|
|
61
64
|
"YOUTUBE_OMNI_ENABLE_DESTRUCTIVE_TOOLS": "false"
|
|
62
65
|
}
|
|
@@ -69,7 +72,7 @@ For local development before publishing, use a packed tarball:
|
|
|
69
72
|
|
|
70
73
|
```bash
|
|
71
74
|
npm pack
|
|
72
|
-
npx -y ./liorium-youtube-omni-mcp-0.
|
|
75
|
+
npx -y ./liorium-youtube-omni-mcp-0.2.0.tgz
|
|
73
76
|
```
|
|
74
77
|
|
|
75
78
|
## Development
|
|
@@ -93,7 +96,7 @@ All research/specification documents are under `research/`. Implementation docs
|
|
|
93
96
|
|
|
94
97
|
Key docs:
|
|
95
98
|
|
|
96
|
-
- `docs/v0-spec.md` —
|
|
97
|
-
- `docs/tool-schema.md` — v0 tool contract
|
|
99
|
+
- `docs/v0-spec.md` — original read-only foundation boundary
|
|
100
|
+
- `docs/tool-schema.md` — v0.2 default and gated tool contract
|
|
98
101
|
- `docs/safety-policy.md` — risk gates and default locks
|
|
99
|
-
- `docs/v0.2-ac-plan.md` —
|
|
102
|
+
- `docs/v0.2-ac-plan.md` — implementation plan for Creator Research + governed write foundations
|
package/dist/src/config.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface YoutubeOmniConfig {
|
|
|
4
4
|
mongoUri?: string;
|
|
5
5
|
maxResults: number;
|
|
6
6
|
enableWriteTools: boolean;
|
|
7
|
+
dryRunWrites: boolean;
|
|
8
|
+
approvalAuditPath?: string;
|
|
7
9
|
enableDownloadTools: boolean;
|
|
8
10
|
}
|
|
9
11
|
export declare function loadConfig(env?: NodeJS.ProcessEnv): YoutubeOmniConfig;
|
package/dist/src/config.js
CHANGED
|
@@ -6,6 +6,8 @@ export function loadConfig(env = process.env) {
|
|
|
6
6
|
mongoUri: env.YOUTUBE_OMNI_MONGO_URI,
|
|
7
7
|
maxResults: Number(env.YOUTUBE_OMNI_MAX_RESULTS ?? 50),
|
|
8
8
|
enableWriteTools: env.YOUTUBE_OMNI_ENABLE_WRITE_TOOLS === 'true',
|
|
9
|
+
dryRunWrites: env.YOUTUBE_OMNI_DRY_RUN_WRITES === 'true',
|
|
10
|
+
approvalAuditPath: env.YOUTUBE_OMNI_APPROVAL_AUDIT_PATH,
|
|
9
11
|
enableDownloadTools: env.YOUTUBE_OMNI_ENABLE_DOWNLOAD_TOOLS === 'true'
|
|
10
12
|
};
|
|
11
13
|
}
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAapD,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,aAAa,EAAE,GAAG,CAAC,2BAA2B,KAAK,MAAM;QACzD,QAAQ,EAAE,GAAG,CAAC,sBAAsB;QACpC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;QACtD,gBAAgB,EAAE,GAAG,CAAC,+BAA+B,KAAK,MAAM;QAChE,YAAY,EAAE,GAAG,CAAC,2BAA2B,KAAK,MAAM;QACxD,iBAAiB,EAAE,GAAG,CAAC,gCAAgC;QACvD,mBAAmB,EAAE,GAAG,CAAC,kCAAkC,KAAK,MAAM;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -35,6 +35,9 @@ export declare const YOUTUBE_OMNI_ERRORS: {
|
|
|
35
35
|
readonly SAFETY_BLOCKED: {
|
|
36
36
|
readonly retryable: false;
|
|
37
37
|
};
|
|
38
|
+
readonly APPROVAL_REQUIRED_OR_WRITE_DISABLED: {
|
|
39
|
+
readonly retryable: false;
|
|
40
|
+
};
|
|
38
41
|
};
|
|
39
42
|
export type YoutubeOmniErrorCode = keyof typeof YOUTUBE_OMNI_ERRORS;
|
|
40
43
|
export declare class YoutubeOmniError extends Error {
|
package/dist/src/core/errors.js
CHANGED
|
@@ -10,7 +10,8 @@ export const YOUTUBE_OMNI_ERRORS = {
|
|
|
10
10
|
COMMENTS_DISABLED: { retryable: false },
|
|
11
11
|
UNSUPPORTED_REGION: { retryable: false },
|
|
12
12
|
PROVIDER_ERROR: { retryable: true },
|
|
13
|
-
SAFETY_BLOCKED: { retryable: false }
|
|
13
|
+
SAFETY_BLOCKED: { retryable: false },
|
|
14
|
+
APPROVAL_REQUIRED_OR_WRITE_DISABLED: { retryable: false }
|
|
14
15
|
};
|
|
15
16
|
export class YoutubeOmniError extends Error {
|
|
16
17
|
code;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACtC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACjC,eAAe,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACrC,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,sBAAsB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5C,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACxC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACtC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACjC,eAAe,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACrC,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,sBAAsB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5C,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACvC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACxC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;IACnC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;IACpC,mCAAmC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;CACjD,CAAC;AAIX,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAuB;IAC3B,SAAS,CAAU;IAE5B,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;CACF"}
|
package/dist/src/core/risk.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare const V0_LOCKED_PATTERNS: readonly ["upload", "update_video", "delete", "set_thumbnail", "reply_to_comment", "moderate", "publish", "download_video", "clip_segment", "revenue"];
|
|
2
|
+
export type RiskLabel = 'none' | 'low' | 'medium' | 'high' | 'destructive';
|
|
2
3
|
export interface ActionRisk {
|
|
4
|
+
risk: RiskLabel;
|
|
3
5
|
riskTier: 0 | 1 | 2 | 3 | 4 | 5;
|
|
4
6
|
authTier: 'none' | 'api_key' | 'oauth_readonly' | 'oauth_write' | 'hosted' | 'experimental';
|
|
5
7
|
allowedInV0: boolean;
|
package/dist/src/core/risk.js
CHANGED
|
@@ -13,19 +13,35 @@ export const V0_LOCKED_PATTERNS = [
|
|
|
13
13
|
export function isAllowedInV0(action) {
|
|
14
14
|
return !V0_LOCKED_PATTERNS.some((pattern) => action.includes(pattern));
|
|
15
15
|
}
|
|
16
|
+
function operationRisk(action) {
|
|
17
|
+
if (!action.includes('youtube.operations.'))
|
|
18
|
+
return undefined;
|
|
19
|
+
const destructive = ['delete_video', 'delete', 'remove'].some((pattern) => action.includes(pattern));
|
|
20
|
+
return {
|
|
21
|
+
risk: destructive ? 'destructive' : 'high',
|
|
22
|
+
riskTier: destructive ? 5 : 4,
|
|
23
|
+
authTier: 'oauth_write',
|
|
24
|
+
allowedInV0: false,
|
|
25
|
+
requiredControls: destructive ? ['approval', 'double_confirmation', 'audit'] : ['approval', 'preview', 'audit', 'dry_run']
|
|
26
|
+
};
|
|
27
|
+
}
|
|
16
28
|
export function classifyActionRisk(action) {
|
|
29
|
+
const operation = operationRisk(action);
|
|
30
|
+
if (operation)
|
|
31
|
+
return operation;
|
|
17
32
|
if (!isAllowedInV0(action)) {
|
|
18
33
|
const destructive = ['delete', 'download_video', 'clip_segment', 'revenue'].some((pattern) => action.includes(pattern));
|
|
19
34
|
return {
|
|
35
|
+
risk: destructive ? 'destructive' : 'high',
|
|
20
36
|
riskTier: destructive ? 5 : 4,
|
|
21
37
|
authTier: action.includes('download') || action.includes('clip') ? 'experimental' : 'oauth_write',
|
|
22
38
|
allowedInV0: false,
|
|
23
39
|
requiredControls: destructive ? ['approval', 'double_confirmation', 'audit'] : ['approval', 'preview', 'audit']
|
|
24
40
|
};
|
|
25
41
|
}
|
|
26
|
-
if (action.includes('transcript') || action.includes('comments') || action.includes('planning')) {
|
|
27
|
-
return { riskTier: 1, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit', 'privacy_warning'] };
|
|
42
|
+
if (action.includes('transcript') || action.includes('comments') || action.includes('planning') || action.includes('research')) {
|
|
43
|
+
return { risk: 'low', riskTier: 1, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit', 'privacy_warning'] };
|
|
28
44
|
}
|
|
29
|
-
return { riskTier: 0, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit'] };
|
|
45
|
+
return { risk: 'none', riskTier: 0, authTier: 'api_key', allowedInV0: true, requiredControls: ['rate_limit'] };
|
|
30
46
|
}
|
|
31
47
|
//# sourceMappingURL=risk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/core/risk.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,SAAS;CACD,CAAC;
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../src/core/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const updateVideoMetadataSchema: z.ZodObject<{
|
|
3
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
4
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
5
|
+
videoId: z.ZodString;
|
|
6
|
+
title: z.ZodOptional<z.ZodString>;
|
|
7
|
+
description: z.ZodOptional<z.ZodString>;
|
|
8
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare const scheduleUploadSchema: z.ZodObject<{
|
|
11
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
12
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
filePath: z.ZodString;
|
|
14
|
+
title: z.ZodString;
|
|
15
|
+
scheduledAt: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export declare const updateThumbnailSchema: z.ZodObject<{
|
|
18
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
19
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
20
|
+
videoId: z.ZodString;
|
|
21
|
+
imagePath: z.ZodString;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare const updatePlaylistSchema: z.ZodObject<{
|
|
24
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
25
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
26
|
+
playlistId: z.ZodString;
|
|
27
|
+
videoId: z.ZodOptional<z.ZodString>;
|
|
28
|
+
action: z.ZodDefault<z.ZodEnum<{
|
|
29
|
+
remove: "remove";
|
|
30
|
+
add: "add";
|
|
31
|
+
reorder: "reorder";
|
|
32
|
+
}>>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export declare const moderateCommentSchema: z.ZodObject<{
|
|
35
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
36
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
37
|
+
commentId: z.ZodString;
|
|
38
|
+
action: z.ZodEnum<{
|
|
39
|
+
hold: "hold";
|
|
40
|
+
approve: "approve";
|
|
41
|
+
reject: "reject";
|
|
42
|
+
report: "report";
|
|
43
|
+
}>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export declare const createCommunityPostSchema: z.ZodObject<{
|
|
46
|
+
approvalId: z.ZodOptional<z.ZodString>;
|
|
47
|
+
dryRun: z.ZodDefault<z.ZodBoolean>;
|
|
48
|
+
channelId: z.ZodString;
|
|
49
|
+
text: z.ZodString;
|
|
50
|
+
}, z.core.$strip>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { videoIdSchema } from './common.js';
|
|
3
|
+
const governedOperationFields = {
|
|
4
|
+
approvalId: z.string().min(1).optional(),
|
|
5
|
+
dryRun: z.boolean().default(true)
|
|
6
|
+
};
|
|
7
|
+
export const updateVideoMetadataSchema = z.object({
|
|
8
|
+
videoId: videoIdSchema,
|
|
9
|
+
title: z.string().min(1).max(100).optional(),
|
|
10
|
+
description: z.string().max(5000).optional(),
|
|
11
|
+
tags: z.array(z.string().min(1)).max(50).optional(),
|
|
12
|
+
...governedOperationFields
|
|
13
|
+
});
|
|
14
|
+
export const scheduleUploadSchema = z.object({
|
|
15
|
+
filePath: z.string().min(1),
|
|
16
|
+
title: z.string().min(1).max(100),
|
|
17
|
+
scheduledAt: z.string().min(1).optional(),
|
|
18
|
+
...governedOperationFields
|
|
19
|
+
});
|
|
20
|
+
export const updateThumbnailSchema = z.object({
|
|
21
|
+
videoId: videoIdSchema,
|
|
22
|
+
imagePath: z.string().min(1),
|
|
23
|
+
...governedOperationFields
|
|
24
|
+
});
|
|
25
|
+
export const updatePlaylistSchema = z.object({
|
|
26
|
+
playlistId: z.string().min(1),
|
|
27
|
+
videoId: videoIdSchema.optional(),
|
|
28
|
+
action: z.enum(['add', 'remove', 'reorder']).default('add'),
|
|
29
|
+
...governedOperationFields
|
|
30
|
+
});
|
|
31
|
+
export const moderateCommentSchema = z.object({
|
|
32
|
+
commentId: z.string().min(1),
|
|
33
|
+
action: z.enum(['hold', 'approve', 'reject', 'report']),
|
|
34
|
+
...governedOperationFields
|
|
35
|
+
});
|
|
36
|
+
export const createCommunityPostSchema = z.object({
|
|
37
|
+
channelId: z.string().min(1),
|
|
38
|
+
text: z.string().min(1).max(5000),
|
|
39
|
+
...governedOperationFields
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/schemas/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,uBAAuB,GAAG;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,aAAa;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnD,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3D,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,GAAG,uBAAuB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,GAAG,uBAAuB;CAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const outlierVideosSchema: z.ZodObject<{
|
|
3
|
+
query: z.ZodString;
|
|
4
|
+
maxResults: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
regionCode: z.ZodDefault<z.ZodString>;
|
|
6
|
+
minViewToChannelRatio: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
recency: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
any: "any";
|
|
9
|
+
pastWeek: "pastWeek";
|
|
10
|
+
pastMonth: "pastMonth";
|
|
11
|
+
pastQuarter: "pastQuarter";
|
|
12
|
+
pastYear: "pastYear";
|
|
13
|
+
}>>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare const compareHooksSchema: z.ZodObject<{
|
|
16
|
+
videoIds: z.ZodArray<z.ZodString>;
|
|
17
|
+
lang: z.ZodDefault<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export declare const topicAnglesSchema: z.ZodObject<{
|
|
20
|
+
topic: z.ZodString;
|
|
21
|
+
regionCode: z.ZodDefault<z.ZodString>;
|
|
22
|
+
sampleSize: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const commentPainPointsSchema: z.ZodObject<{
|
|
25
|
+
videoId: z.ZodString;
|
|
26
|
+
maxComments: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const videoAngleMatrixSchema: z.ZodObject<{
|
|
29
|
+
topic: z.ZodString;
|
|
30
|
+
rows: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
regionCode: z.ZodDefault<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type OutlierVideosInput = z.infer<typeof outlierVideosSchema>;
|
|
34
|
+
export type CompareHooksInput = z.infer<typeof compareHooksSchema>;
|
|
35
|
+
export type TopicAnglesInput = z.infer<typeof topicAnglesSchema>;
|
|
36
|
+
export type CommentPainPointsInput = z.infer<typeof commentPainPointsSchema>;
|
|
37
|
+
export type VideoAngleMatrixInput = z.infer<typeof videoAngleMatrixSchema>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { maxResultsSchema, regionCodeSchema, videoIdSchema } from './common.js';
|
|
3
|
+
export const outlierVideosSchema = z.object({
|
|
4
|
+
query: z.string().min(1),
|
|
5
|
+
maxResults: maxResultsSchema,
|
|
6
|
+
regionCode: regionCodeSchema,
|
|
7
|
+
minViewToChannelRatio: z.number().min(1).max(100).default(3),
|
|
8
|
+
recency: z.enum(['any', 'pastWeek', 'pastMonth', 'pastQuarter', 'pastYear']).default('pastQuarter')
|
|
9
|
+
});
|
|
10
|
+
export const compareHooksSchema = z.object({
|
|
11
|
+
videoIds: z.array(videoIdSchema).min(2).max(10),
|
|
12
|
+
lang: z.string().default('en')
|
|
13
|
+
});
|
|
14
|
+
export const topicAnglesSchema = z.object({
|
|
15
|
+
topic: z.string().min(1),
|
|
16
|
+
regionCode: regionCodeSchema,
|
|
17
|
+
sampleSize: maxResultsSchema
|
|
18
|
+
});
|
|
19
|
+
export const commentPainPointsSchema = z.object({
|
|
20
|
+
videoId: videoIdSchema,
|
|
21
|
+
maxComments: z.number().int().min(1).max(100).default(50)
|
|
22
|
+
});
|
|
23
|
+
export const videoAngleMatrixSchema = z.object({
|
|
24
|
+
topic: z.string().min(1),
|
|
25
|
+
rows: z.number().int().min(3).max(20).default(10),
|
|
26
|
+
regionCode: regionCodeSchema
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/schemas/research.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,gBAAgB;IAC5B,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;CACpG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,gBAAgB;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,UAAU,EAAE,gBAAgB;CAC7B,CAAC,CAAC"}
|
package/dist/src/server.d.ts
CHANGED
|
@@ -1,87 +1,19 @@
|
|
|
1
|
+
import { type YoutubeOmniConfig } from './config.js';
|
|
1
2
|
import { ProviderRegistry } from './core/provider-registry.js';
|
|
2
|
-
export declare const V0_TOOL_NAMES: readonly ["youtube.discovery.search_videos", "youtube.discovery.get_video_categories", "youtube.video.get_details", "youtube.video.compare", "youtube.channel.get_statistics", "youtube.channel.get_top_videos", "youtube.transcript.get_segments", "youtube.transcript.get_full_text", "youtube.transcript.analyze_structure", "youtube.comments.get", "youtube.comments.summarize", "youtube.planning.generate_research_brief", "youtube.safety.classify_action_risk", "youtube.safety.list_capabilities"];
|
|
3
|
+
export declare const V0_TOOL_NAMES: readonly ["youtube.discovery.search_videos", "youtube.discovery.get_video_categories", "youtube.video.get_details", "youtube.video.compare", "youtube.channel.get_statistics", "youtube.channel.get_top_videos", "youtube.transcript.get_segments", "youtube.transcript.get_full_text", "youtube.transcript.analyze_structure", "youtube.comments.get", "youtube.comments.summarize", "youtube.planning.generate_research_brief", "youtube.research.find_outlier_videos", "youtube.research.compare_hooks", "youtube.research.extract_topic_angles", "youtube.research.summarize_comment_pain_points", "youtube.research.generate_video_angle_matrix", "youtube.safety.classify_action_risk", "youtube.safety.list_capabilities"];
|
|
4
|
+
export declare const OPERATION_TOOL_NAMES: readonly ["youtube.operations.update_video_metadata", "youtube.operations.schedule_upload", "youtube.operations.update_thumbnail", "youtube.operations.update_playlist", "youtube.operations.moderate_comment", "youtube.operations.create_community_post"];
|
|
3
5
|
export type V0ToolName = typeof V0_TOOL_NAMES[number];
|
|
6
|
+
export type OperationToolName = typeof OPERATION_TOOL_NAMES[number];
|
|
7
|
+
export type ToolName = V0ToolName | OperationToolName;
|
|
4
8
|
type JsonSchema = Record<string, unknown>;
|
|
5
9
|
type ToolDefinition = {
|
|
6
|
-
name:
|
|
10
|
+
name: ToolName;
|
|
7
11
|
description: string;
|
|
8
12
|
inputSchema: JsonSchema;
|
|
9
13
|
};
|
|
10
|
-
export declare const V0_TOOL_INPUT_SCHEMAS: Record<
|
|
11
|
-
export declare function
|
|
14
|
+
export declare const V0_TOOL_INPUT_SCHEMAS: Record<string, JsonSchema>;
|
|
15
|
+
export declare function getToolNames(config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): ToolName[];
|
|
16
|
+
export declare function getToolDefinitions(config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): ToolDefinition[];
|
|
12
17
|
export declare function createDefaultRegistry(): ProviderRegistry;
|
|
13
|
-
export declare function createToolHandlers(registry?: ProviderRegistry):
|
|
14
|
-
'youtube.discovery.search_videos': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
15
|
-
videos: any[];
|
|
16
|
-
}>>;
|
|
17
|
-
'youtube.discovery.get_video_categories': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
18
|
-
regionCode: string;
|
|
19
|
-
categories: any[];
|
|
20
|
-
}>>;
|
|
21
|
-
'youtube.video.get_details': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
22
|
-
videos: any[];
|
|
23
|
-
}>>;
|
|
24
|
-
'youtube.video.compare': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
25
|
-
comparison: {
|
|
26
|
-
rows: any[];
|
|
27
|
-
observations: string[];
|
|
28
|
-
};
|
|
29
|
-
}>>;
|
|
30
|
-
'youtube.channel.get_statistics': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
31
|
-
channels: any[];
|
|
32
|
-
}>>;
|
|
33
|
-
'youtube.channel.get_top_videos': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
34
|
-
channelId: string;
|
|
35
|
-
videos: any[];
|
|
36
|
-
}>>;
|
|
37
|
-
'youtube.transcript.get_segments': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
38
|
-
transcripts: any[];
|
|
39
|
-
}>>;
|
|
40
|
-
'youtube.transcript.get_full_text': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
41
|
-
videoId: string;
|
|
42
|
-
language: string;
|
|
43
|
-
text: string;
|
|
44
|
-
truncated: boolean;
|
|
45
|
-
}>>;
|
|
46
|
-
'youtube.transcript.analyze_structure': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
47
|
-
hook: string;
|
|
48
|
-
cta: string;
|
|
49
|
-
outline: string[];
|
|
50
|
-
claims: never[];
|
|
51
|
-
scriptPatterns: string[];
|
|
52
|
-
}>>;
|
|
53
|
-
'youtube.comments.get': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
54
|
-
videoId: string;
|
|
55
|
-
comments: any[];
|
|
56
|
-
}>>;
|
|
57
|
-
'youtube.comments.summarize': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
58
|
-
summary: string;
|
|
59
|
-
questions: string[];
|
|
60
|
-
contentRequests: string[];
|
|
61
|
-
sentimentSignal: {
|
|
62
|
-
positive: string;
|
|
63
|
-
negative: string;
|
|
64
|
-
mixed: boolean;
|
|
65
|
-
};
|
|
66
|
-
}>>;
|
|
67
|
-
'youtube.planning.generate_research_brief': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
68
|
-
brief: {
|
|
69
|
-
topic: string;
|
|
70
|
-
benchmarkVideos: any[];
|
|
71
|
-
benchmarkChannels: never[];
|
|
72
|
-
titlePatterns: string[];
|
|
73
|
-
hookPatterns: string[];
|
|
74
|
-
audienceQuestions: never[];
|
|
75
|
-
contentOpportunities: never[];
|
|
76
|
-
risks: string[];
|
|
77
|
-
};
|
|
78
|
-
}>>;
|
|
79
|
-
'youtube.safety.classify_action_risk': (input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<import("./core/risk.js").ActionRisk>>;
|
|
80
|
-
'youtube.safety.list_capabilities': (_input: unknown) => Promise<import("./core/envelope.js").ToolEnvelope<{
|
|
81
|
-
version: string;
|
|
82
|
-
phase: string;
|
|
83
|
-
enabledNamespaces: string[];
|
|
84
|
-
lockedNamespaces: string[];
|
|
85
|
-
}>>;
|
|
86
|
-
};
|
|
18
|
+
export declare function createToolHandlers(registry?: ProviderRegistry, config?: Pick<YoutubeOmniConfig, 'enableWriteTools' | 'dryRunWrites'>): Record<string, (input: unknown) => Promise<any>>;
|
|
87
19
|
export {};
|
package/dist/src/server.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { loadConfig } from './config.js';
|
|
1
2
|
import { ProviderRegistry } from './core/provider-registry.js';
|
|
2
3
|
import { MockYoutubeProvider } from './providers/mock-provider.js';
|
|
3
4
|
import { searchVideos, getVideoCategories } from './tools/discovery.js';
|
|
@@ -7,6 +8,8 @@ import { getTranscriptSegments, getTranscriptFullText, analyzeTranscriptStructur
|
|
|
7
8
|
import { getVideoComments, summarizeComments } from './tools/comments.js';
|
|
8
9
|
import { generateResearchBrief } from './tools/planning.js';
|
|
9
10
|
import { classifyActionRiskTool, listCapabilities } from './tools/safety.js';
|
|
11
|
+
import { compareHooks, extractTopicAngles, findOutlierVideos, generateVideoAngleMatrix, summarizeCommentPainPoints } from './tools/research.js';
|
|
12
|
+
import { createCommunityPost, moderateComment, scheduleUpload, updatePlaylist, updateThumbnail, updateVideoMetadata } from './tools/operations.js';
|
|
10
13
|
export const V0_TOOL_NAMES = [
|
|
11
14
|
'youtube.discovery.search_videos',
|
|
12
15
|
'youtube.discovery.get_video_categories',
|
|
@@ -20,9 +23,22 @@ export const V0_TOOL_NAMES = [
|
|
|
20
23
|
'youtube.comments.get',
|
|
21
24
|
'youtube.comments.summarize',
|
|
22
25
|
'youtube.planning.generate_research_brief',
|
|
26
|
+
'youtube.research.find_outlier_videos',
|
|
27
|
+
'youtube.research.compare_hooks',
|
|
28
|
+
'youtube.research.extract_topic_angles',
|
|
29
|
+
'youtube.research.summarize_comment_pain_points',
|
|
30
|
+
'youtube.research.generate_video_angle_matrix',
|
|
23
31
|
'youtube.safety.classify_action_risk',
|
|
24
32
|
'youtube.safety.list_capabilities'
|
|
25
33
|
];
|
|
34
|
+
export const OPERATION_TOOL_NAMES = [
|
|
35
|
+
'youtube.operations.update_video_metadata',
|
|
36
|
+
'youtube.operations.schedule_upload',
|
|
37
|
+
'youtube.operations.update_thumbnail',
|
|
38
|
+
'youtube.operations.update_playlist',
|
|
39
|
+
'youtube.operations.moderate_comment',
|
|
40
|
+
'youtube.operations.create_community_post'
|
|
41
|
+
];
|
|
26
42
|
const stringSchema = (description, extra = {}) => ({ type: 'string', description, ...extra });
|
|
27
43
|
const numberSchema = (description, minimum, maximum, defaultValue) => ({
|
|
28
44
|
type: 'number',
|
|
@@ -117,14 +133,85 @@ export const V0_TOOL_INPUT_SCHEMAS = {
|
|
|
117
133
|
includeTranscripts: booleanSchema('Include transcript signals where available.', true),
|
|
118
134
|
includeComments: booleanSchema('Include comment signals where available.', true)
|
|
119
135
|
}, ['topic']),
|
|
136
|
+
'youtube.research.find_outlier_videos': objectSchema({
|
|
137
|
+
query: stringSchema('Topic or niche to discover outlier videos for.', { minLength: 1 }),
|
|
138
|
+
maxResults: numberSchema('Maximum videos to inspect.', 1, 50, 10),
|
|
139
|
+
regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' }),
|
|
140
|
+
minViewToChannelRatio: numberSchema('Minimum views-to-subscriber ratio considered outlier.', 1, 100, 3),
|
|
141
|
+
recency: enumSchema('Search recency window.', ['any', 'pastWeek', 'pastMonth', 'pastQuarter', 'pastYear'], 'pastQuarter')
|
|
142
|
+
}, ['query']),
|
|
143
|
+
'youtube.research.compare_hooks': objectSchema({
|
|
144
|
+
videoIds: stringArraySchema('YouTube video IDs whose hooks should be compared.', 2, 10),
|
|
145
|
+
lang: stringSchema('Transcript language code.', { default: 'en' })
|
|
146
|
+
}, ['videoIds']),
|
|
147
|
+
'youtube.research.extract_topic_angles': objectSchema({
|
|
148
|
+
topic: stringSchema('Topic or niche to extract content angles for.', { minLength: 1 }),
|
|
149
|
+
regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' }),
|
|
150
|
+
sampleSize: numberSchema('Number of videos to sample.', 1, 50, 10)
|
|
151
|
+
}, ['topic']),
|
|
152
|
+
'youtube.research.summarize_comment_pain_points': objectSchema({
|
|
153
|
+
videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
|
|
154
|
+
maxComments: numberSchema('Maximum comments to inspect.', 1, 100, 50)
|
|
155
|
+
}, ['videoId']),
|
|
156
|
+
'youtube.research.generate_video_angle_matrix': objectSchema({
|
|
157
|
+
topic: stringSchema('Topic or niche for angle matrix generation.', { minLength: 1 }),
|
|
158
|
+
rows: numberSchema('Number of matrix rows to generate.', 3, 20, 10),
|
|
159
|
+
regionCode: stringSchema('Two-letter country code.', { pattern: '^[A-Z]{2}$', default: 'US' })
|
|
160
|
+
}, ['topic']),
|
|
161
|
+
'youtube.operations.update_video_metadata': objectSchema({
|
|
162
|
+
videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
|
|
163
|
+
title: stringSchema('Optional replacement title.', { minLength: 1, maxLength: 100 }),
|
|
164
|
+
description: stringSchema('Optional replacement description.', { maxLength: 5000 }),
|
|
165
|
+
tags: { type: 'array', description: 'Optional replacement tags.', items: { type: 'string', minLength: 1 }, maxItems: 50 },
|
|
166
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
167
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
168
|
+
}, ['videoId']),
|
|
169
|
+
'youtube.operations.schedule_upload': objectSchema({
|
|
170
|
+
filePath: stringSchema('Local path to the video file.', { minLength: 1 }),
|
|
171
|
+
title: stringSchema('Upload title.', { minLength: 1, maxLength: 100 }),
|
|
172
|
+
scheduledAt: stringSchema('Optional scheduled publish timestamp.'),
|
|
173
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
174
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
175
|
+
}, ['filePath', 'title']),
|
|
176
|
+
'youtube.operations.update_thumbnail': objectSchema({
|
|
177
|
+
videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
|
|
178
|
+
imagePath: stringSchema('Local thumbnail image path.', { minLength: 1 }),
|
|
179
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
180
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
181
|
+
}, ['videoId', 'imagePath']),
|
|
182
|
+
'youtube.operations.update_playlist': objectSchema({
|
|
183
|
+
playlistId: stringSchema('YouTube playlist ID.', { minLength: 1 }),
|
|
184
|
+
videoId: stringSchema('YouTube video ID.', { minLength: 1 }),
|
|
185
|
+
action: enumSchema('Playlist mutation action.', ['add', 'remove', 'reorder'], 'add'),
|
|
186
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
187
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
188
|
+
}, ['playlistId']),
|
|
189
|
+
'youtube.operations.moderate_comment': objectSchema({
|
|
190
|
+
commentId: stringSchema('YouTube comment ID.', { minLength: 1 }),
|
|
191
|
+
action: enumSchema('Comment moderation action.', ['hold', 'approve', 'reject', 'report']),
|
|
192
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
193
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
194
|
+
}, ['commentId', 'action']),
|
|
195
|
+
'youtube.operations.create_community_post': objectSchema({
|
|
196
|
+
channelId: stringSchema('YouTube channel ID.', { minLength: 1 }),
|
|
197
|
+
text: stringSchema('Community post text.', { minLength: 1, maxLength: 5000 }),
|
|
198
|
+
approvalId: stringSchema('Optional approval identifier.', { minLength: 1 }),
|
|
199
|
+
dryRun: booleanSchema('Dry-run flag; live writes are unavailable in v0.2.', true)
|
|
200
|
+
}, ['channelId', 'text']),
|
|
120
201
|
'youtube.safety.classify_action_risk': objectSchema({
|
|
121
202
|
action: stringSchema('Action name to classify.', { minLength: 1 }),
|
|
122
203
|
params: { type: 'object', description: 'Optional action parameters.', additionalProperties: true }
|
|
123
204
|
}, ['action']),
|
|
124
205
|
'youtube.safety.list_capabilities': objectSchema({})
|
|
125
206
|
};
|
|
126
|
-
|
|
127
|
-
return
|
|
207
|
+
function operationToolsEnabled(config) {
|
|
208
|
+
return config.enableWriteTools === true && config.dryRunWrites === true;
|
|
209
|
+
}
|
|
210
|
+
export function getToolNames(config = loadConfig()) {
|
|
211
|
+
return operationToolsEnabled(config) ? [...V0_TOOL_NAMES, ...OPERATION_TOOL_NAMES] : [...V0_TOOL_NAMES];
|
|
212
|
+
}
|
|
213
|
+
export function getToolDefinitions(config = loadConfig()) {
|
|
214
|
+
return getToolNames(config).map((name) => ({
|
|
128
215
|
name,
|
|
129
216
|
description: `YouTube Omni v0 read-only tool: ${name}`,
|
|
130
217
|
inputSchema: V0_TOOL_INPUT_SCHEMAS[name]
|
|
@@ -133,8 +220,8 @@ export function getToolDefinitions() {
|
|
|
133
220
|
export function createDefaultRegistry() {
|
|
134
221
|
return new ProviderRegistry([new MockYoutubeProvider()]);
|
|
135
222
|
}
|
|
136
|
-
export function createToolHandlers(registry = createDefaultRegistry()) {
|
|
137
|
-
|
|
223
|
+
export function createToolHandlers(registry = createDefaultRegistry(), config = loadConfig()) {
|
|
224
|
+
const handlers = {
|
|
138
225
|
'youtube.discovery.search_videos': (input) => searchVideos(input, registry),
|
|
139
226
|
'youtube.discovery.get_video_categories': (input) => getVideoCategories(input, registry),
|
|
140
227
|
'youtube.video.get_details': (input) => getVideoDetails(input, registry),
|
|
@@ -147,8 +234,22 @@ export function createToolHandlers(registry = createDefaultRegistry()) {
|
|
|
147
234
|
'youtube.comments.get': (input) => getVideoComments(input, registry),
|
|
148
235
|
'youtube.comments.summarize': (input) => summarizeComments(input, registry),
|
|
149
236
|
'youtube.planning.generate_research_brief': (input) => generateResearchBrief(input, registry),
|
|
237
|
+
'youtube.research.find_outlier_videos': (input) => findOutlierVideos(input, registry),
|
|
238
|
+
'youtube.research.compare_hooks': (input) => compareHooks(input, registry),
|
|
239
|
+
'youtube.research.extract_topic_angles': (input) => extractTopicAngles(input, registry),
|
|
240
|
+
'youtube.research.summarize_comment_pain_points': (input) => summarizeCommentPainPoints(input, registry),
|
|
241
|
+
'youtube.research.generate_video_angle_matrix': (input) => generateVideoAngleMatrix(input, registry),
|
|
150
242
|
'youtube.safety.classify_action_risk': (input) => classifyActionRiskTool(input),
|
|
151
243
|
'youtube.safety.list_capabilities': (_input) => listCapabilities({})
|
|
152
244
|
};
|
|
245
|
+
if (operationToolsEnabled(config)) {
|
|
246
|
+
handlers['youtube.operations.update_video_metadata'] = (input) => updateVideoMetadata(input);
|
|
247
|
+
handlers['youtube.operations.schedule_upload'] = (input) => scheduleUpload(input);
|
|
248
|
+
handlers['youtube.operations.update_thumbnail'] = (input) => updateThumbnail(input);
|
|
249
|
+
handlers['youtube.operations.update_playlist'] = (input) => updatePlaylist(input);
|
|
250
|
+
handlers['youtube.operations.moderate_comment'] = (input) => moderateComment(input);
|
|
251
|
+
handlers['youtube.operations.create_community_post'] = (input) => createCommunityPost(input);
|
|
252
|
+
}
|
|
253
|
+
return handlers;
|
|
153
254
|
}
|
|
154
255
|
//# sourceMappingURL=server.js.map
|
package/dist/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ToolEnvelope } from '../core/envelope.js';
|
|
2
|
+
type DryRunData = {
|
|
3
|
+
dryRun: true;
|
|
4
|
+
wouldCall: string;
|
|
5
|
+
approvalId?: string;
|
|
6
|
+
request: unknown;
|
|
7
|
+
};
|
|
8
|
+
export declare function updateVideoMetadata(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
9
|
+
export declare function scheduleUpload(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
10
|
+
export declare function updateThumbnail(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
11
|
+
export declare function updatePlaylist(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
12
|
+
export declare function moderateComment(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
13
|
+
export declare function createCommunityPost(input: unknown): Promise<ToolEnvelope<DryRunData>>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createCommunityPostSchema, moderateCommentSchema, scheduleUploadSchema, updatePlaylistSchema, updateThumbnailSchema, updateVideoMetadataSchema } from '../schemas/operations.js';
|
|
2
|
+
const MESSAGE = 'Write tools are disabled by default. Enable only with OAuth, approval, and audit configured.';
|
|
3
|
+
function operationBlockedEnvelope(tool, wouldCall, request) {
|
|
4
|
+
return {
|
|
5
|
+
ok: false,
|
|
6
|
+
tool,
|
|
7
|
+
timestamp: new Date().toISOString(),
|
|
8
|
+
source: { provider: 'core', authTier: 'oauth_write' },
|
|
9
|
+
data: { dryRun: true, wouldCall, approvalId: request.approvalId, request },
|
|
10
|
+
warnings: ['Operation tool is dry-run-only in v0.2 and never performs live YouTube writes.'],
|
|
11
|
+
error: { code: 'APPROVAL_REQUIRED_OR_WRITE_DISABLED', message: MESSAGE, retryable: false }
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export async function updateVideoMetadata(input) {
|
|
15
|
+
const parsed = updateVideoMetadataSchema.parse(input);
|
|
16
|
+
return operationBlockedEnvelope('youtube.operations.update_video_metadata', 'youtube.videos.update', parsed);
|
|
17
|
+
}
|
|
18
|
+
export async function scheduleUpload(input) {
|
|
19
|
+
const parsed = scheduleUploadSchema.parse(input);
|
|
20
|
+
return operationBlockedEnvelope('youtube.operations.schedule_upload', 'youtube.videos.insert', parsed);
|
|
21
|
+
}
|
|
22
|
+
export async function updateThumbnail(input) {
|
|
23
|
+
const parsed = updateThumbnailSchema.parse(input);
|
|
24
|
+
return operationBlockedEnvelope('youtube.operations.update_thumbnail', 'youtube.thumbnails.set', parsed);
|
|
25
|
+
}
|
|
26
|
+
export async function updatePlaylist(input) {
|
|
27
|
+
const parsed = updatePlaylistSchema.parse(input);
|
|
28
|
+
return operationBlockedEnvelope('youtube.operations.update_playlist', 'youtube.playlistItems.insert_or_delete', parsed);
|
|
29
|
+
}
|
|
30
|
+
export async function moderateComment(input) {
|
|
31
|
+
const parsed = moderateCommentSchema.parse(input);
|
|
32
|
+
return operationBlockedEnvelope('youtube.operations.moderate_comment', 'youtube.comments.setModerationStatus', parsed);
|
|
33
|
+
}
|
|
34
|
+
export async function createCommunityPost(input) {
|
|
35
|
+
const parsed = createCommunityPostSchema.parse(input);
|
|
36
|
+
return operationBlockedEnvelope('youtube.operations.create_community_post', 'youtube.communityPosts.insert', parsed);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/tools/operations.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,OAAO,GAAG,8FAA8F,CAAC;AAS/G,SAAS,wBAAwB,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAkD;IACnH,OAAO;QACL,EAAE,EAAE,KAAK;QACT,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE;QACrD,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE;QAC1E,QAAQ,EAAE,CAAC,gFAAgF,CAAC;QAC5F,KAAK,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;KAC3F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc;IACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,wBAAwB,CAAC,0CAA0C,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,wBAAwB,CAAC,oCAAoC,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,wBAAwB,CAAC,qCAAqC,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,wBAAwB,CAAC,oCAAoC,EAAE,wCAAwC,EAAE,MAAM,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,wBAAwB,CAAC,qCAAqC,EAAE,sCAAsC,EAAE,MAAM,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc;IACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,wBAAwB,CAAC,0CAA0C,EAAE,+BAA+B,EAAE,MAAM,CAAC,CAAC;AACvH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ProviderRegistry } from '../core/provider-registry.js';
|
|
2
|
+
export declare function findOutlierVideos(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
|
|
3
|
+
query: string;
|
|
4
|
+
outliers: {
|
|
5
|
+
videoId: any;
|
|
6
|
+
title: any;
|
|
7
|
+
channelId: any;
|
|
8
|
+
viewCount: number;
|
|
9
|
+
subscriberCount: number;
|
|
10
|
+
score: number;
|
|
11
|
+
reason: string;
|
|
12
|
+
}[];
|
|
13
|
+
}>>;
|
|
14
|
+
export declare function compareHooks(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
|
|
15
|
+
hooks: {
|
|
16
|
+
videoId: any;
|
|
17
|
+
hook: any;
|
|
18
|
+
pattern: string;
|
|
19
|
+
availability: any;
|
|
20
|
+
}[];
|
|
21
|
+
}>>;
|
|
22
|
+
export declare function extractTopicAngles(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
|
|
23
|
+
topic: string;
|
|
24
|
+
angles: {
|
|
25
|
+
angle: string;
|
|
26
|
+
evidence: any[];
|
|
27
|
+
sourceTitle: any;
|
|
28
|
+
channelTitle: any;
|
|
29
|
+
}[];
|
|
30
|
+
}>>;
|
|
31
|
+
export declare function summarizeCommentPainPoints(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
|
|
32
|
+
videoId: string;
|
|
33
|
+
painPoints: {
|
|
34
|
+
theme: string;
|
|
35
|
+
count: number;
|
|
36
|
+
examples: string[];
|
|
37
|
+
}[];
|
|
38
|
+
}>>;
|
|
39
|
+
export declare function generateVideoAngleMatrix(input: unknown, registry: ProviderRegistry): Promise<import("../core/envelope.js").ToolEnvelope<{
|
|
40
|
+
topic: string;
|
|
41
|
+
matrix: {
|
|
42
|
+
angle: string;
|
|
43
|
+
evidence: any[];
|
|
44
|
+
hypothesis: string;
|
|
45
|
+
suggestedHook: string;
|
|
46
|
+
}[];
|
|
47
|
+
}>>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { makeEnvelope } from '../core/envelope.js';
|
|
2
|
+
import { commentPainPointsSchema, compareHooksSchema, outlierVideosSchema, topicAnglesSchema, videoAngleMatrixSchema } from '../schemas/research.js';
|
|
3
|
+
function numberFrom(value, fallback = 0) {
|
|
4
|
+
const parsed = Number(value);
|
|
5
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
6
|
+
}
|
|
7
|
+
function patternForHook(hook) {
|
|
8
|
+
const lower = hook.toLowerCase();
|
|
9
|
+
if (lower.includes('?'))
|
|
10
|
+
return 'question';
|
|
11
|
+
if (lower.includes('secret') || lower.includes('hidden'))
|
|
12
|
+
return 'curiosity_gap';
|
|
13
|
+
if (lower.includes('mock') || lower.includes('this is'))
|
|
14
|
+
return 'direct_promise';
|
|
15
|
+
return 'statement';
|
|
16
|
+
}
|
|
17
|
+
function titleAngle(title, topic, index) {
|
|
18
|
+
const cleaned = title.replace(/\s+/g, ' ').trim();
|
|
19
|
+
if (cleaned.length > 0)
|
|
20
|
+
return cleaned;
|
|
21
|
+
return `${topic} angle ${index + 1}`;
|
|
22
|
+
}
|
|
23
|
+
function themeForComment(text) {
|
|
24
|
+
const lower = text.toLowerCase();
|
|
25
|
+
if (lower.includes('follow-up') || lower.includes('make'))
|
|
26
|
+
return 'follow-up requests';
|
|
27
|
+
if (lower.includes('?') || lower.includes('how') || lower.includes('why'))
|
|
28
|
+
return 'audience questions';
|
|
29
|
+
return 'positive feedback';
|
|
30
|
+
}
|
|
31
|
+
export async function findOutlierVideos(input, registry) {
|
|
32
|
+
const parsed = outlierVideosSchema.parse(input);
|
|
33
|
+
const searchProvider = registry.requireCapability('search');
|
|
34
|
+
const detailsProvider = registry.requireCapability('video_details');
|
|
35
|
+
const channelProvider = registry.requireCapability('channel_stats');
|
|
36
|
+
const search = await searchProvider.searchVideos({ query: parsed.query, maxResults: parsed.maxResults });
|
|
37
|
+
const videoIds = search.videos.map((video) => video.videoId).filter(Boolean);
|
|
38
|
+
const details = await detailsProvider.getVideoDetails({ videoIds, includeTags: false, descriptionDetail: 'snippet' });
|
|
39
|
+
const channelIds = [...new Set(details.videos.map((video) => video.channelId).filter(Boolean))];
|
|
40
|
+
const channels = await channelProvider.getChannelStatistics({ channelIds });
|
|
41
|
+
const subscriberByChannel = new Map(channels.channels.map((channel) => [channel.channelId, numberFrom(channel.subscriberCount, 1)]));
|
|
42
|
+
const outliers = details.videos.map((video) => {
|
|
43
|
+
const views = numberFrom(video.statistics?.viewCount);
|
|
44
|
+
const subscribers = Math.max(1, numberFrom(subscriberByChannel.get(video.channelId), 1));
|
|
45
|
+
const ratio = views / subscribers;
|
|
46
|
+
return {
|
|
47
|
+
videoId: video.videoId,
|
|
48
|
+
title: video.title,
|
|
49
|
+
channelId: video.channelId,
|
|
50
|
+
viewCount: views,
|
|
51
|
+
subscriberCount: subscribers,
|
|
52
|
+
score: Number(Math.max(ratio, ratio >= parsed.minViewToChannelRatio ? ratio * 2 : ratio).toFixed(4)),
|
|
53
|
+
reason: ratio >= parsed.minViewToChannelRatio ? 'views exceed configured channel-size ratio' : 'ranked by views-to-subscribers ratio'
|
|
54
|
+
};
|
|
55
|
+
}).sort((a, b) => b.score - a.score);
|
|
56
|
+
return makeEnvelope({
|
|
57
|
+
tool: 'youtube.research.find_outlier_videos',
|
|
58
|
+
provider: searchProvider.id,
|
|
59
|
+
authTier: searchProvider.authTier,
|
|
60
|
+
data: { query: parsed.query, outliers },
|
|
61
|
+
nextActions: ['youtube.research.compare_hooks', 'youtube.comments.summarize'],
|
|
62
|
+
quotaCost: searchProvider.authTier === 'api_key' ? 102 : 0
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function compareHooks(input, registry) {
|
|
66
|
+
const parsed = compareHooksSchema.parse(input);
|
|
67
|
+
const provider = registry.requireCapability('transcript');
|
|
68
|
+
const data = await provider.getTranscriptSegments({ videoIds: parsed.videoIds, lang: parsed.lang, format: 'key_segments' });
|
|
69
|
+
const hooks = data.transcripts.map((transcript) => {
|
|
70
|
+
const hook = transcript.intro || '';
|
|
71
|
+
return { videoId: transcript.videoId, hook, pattern: patternForHook(hook), availability: transcript.availability ?? 'unknown' };
|
|
72
|
+
});
|
|
73
|
+
return makeEnvelope({
|
|
74
|
+
tool: 'youtube.research.compare_hooks',
|
|
75
|
+
provider: provider.id,
|
|
76
|
+
authTier: provider.authTier,
|
|
77
|
+
data: { hooks },
|
|
78
|
+
nextActions: ['youtube.research.generate_video_angle_matrix']
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export async function extractTopicAngles(input, registry) {
|
|
82
|
+
const parsed = topicAnglesSchema.parse(input);
|
|
83
|
+
const provider = registry.requireCapability('search');
|
|
84
|
+
const data = await provider.searchVideos({ query: parsed.topic, maxResults: parsed.sampleSize });
|
|
85
|
+
const angles = data.videos.map((video, index) => ({
|
|
86
|
+
angle: titleAngle(video.title, parsed.topic, index),
|
|
87
|
+
evidence: [video.videoId].filter(Boolean),
|
|
88
|
+
sourceTitle: video.title,
|
|
89
|
+
channelTitle: video.channelTitle
|
|
90
|
+
}));
|
|
91
|
+
return makeEnvelope({
|
|
92
|
+
tool: 'youtube.research.extract_topic_angles',
|
|
93
|
+
provider: provider.id,
|
|
94
|
+
authTier: provider.authTier,
|
|
95
|
+
data: { topic: parsed.topic, angles },
|
|
96
|
+
nextActions: ['youtube.research.generate_video_angle_matrix']
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export async function summarizeCommentPainPoints(input, registry) {
|
|
100
|
+
const parsed = commentPainPointsSchema.parse(input);
|
|
101
|
+
const provider = registry.requireCapability('comments');
|
|
102
|
+
const data = await provider.getVideoComments({ videoId: parsed.videoId, maxResults: parsed.maxComments, maxReplies: 0 });
|
|
103
|
+
const grouped = new Map();
|
|
104
|
+
for (const comment of data.comments) {
|
|
105
|
+
const text = String(comment.text ?? '');
|
|
106
|
+
const theme = themeForComment(text);
|
|
107
|
+
const existing = grouped.get(theme) ?? { theme, count: 0, examples: [] };
|
|
108
|
+
existing.count += 1;
|
|
109
|
+
if (existing.examples.length < 3)
|
|
110
|
+
existing.examples.push(text);
|
|
111
|
+
grouped.set(theme, existing);
|
|
112
|
+
}
|
|
113
|
+
const painPoints = [...grouped.values()].sort((a, b) => b.count - a.count);
|
|
114
|
+
return makeEnvelope({
|
|
115
|
+
tool: 'youtube.research.summarize_comment_pain_points',
|
|
116
|
+
provider: provider.id,
|
|
117
|
+
authTier: provider.authTier,
|
|
118
|
+
data: { videoId: parsed.videoId, painPoints },
|
|
119
|
+
nextActions: ['youtube.research.generate_video_angle_matrix']
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export async function generateVideoAngleMatrix(input, registry) {
|
|
123
|
+
const parsed = videoAngleMatrixSchema.parse(input);
|
|
124
|
+
const provider = registry.requireCapability('search');
|
|
125
|
+
const data = await provider.searchVideos({ query: parsed.topic, maxResults: parsed.rows });
|
|
126
|
+
const matrix = data.videos.slice(0, parsed.rows).map((video, index) => ({
|
|
127
|
+
angle: titleAngle(video.title, parsed.topic, index),
|
|
128
|
+
evidence: [video.videoId].filter(Boolean),
|
|
129
|
+
hypothesis: `Use this angle to test demand for ${parsed.topic} with a clear hook and evidence-led payoff.`,
|
|
130
|
+
suggestedHook: `Why ${titleAngle(video.title, parsed.topic, index)} matters now`
|
|
131
|
+
}));
|
|
132
|
+
return makeEnvelope({
|
|
133
|
+
tool: 'youtube.research.generate_video_angle_matrix',
|
|
134
|
+
provider: provider.id,
|
|
135
|
+
authTier: provider.authTier,
|
|
136
|
+
data: { topic: parsed.topic, matrix },
|
|
137
|
+
nextActions: ['youtube.planning.generate_research_brief']
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
package/dist/src/tools/safety.js
CHANGED
|
@@ -5,6 +5,6 @@ export async function classifyActionRiskTool(input) {
|
|
|
5
5
|
return makeEnvelope({ tool: 'youtube.safety.classify_action_risk', provider: 'core', authTier: 'none', data: risk, warnings: risk.allowedInV0 ? [] : ['This action is part of the full scope but locked in v0.'] });
|
|
6
6
|
}
|
|
7
7
|
export async function listCapabilities(_input) {
|
|
8
|
-
return makeEnvelope({ tool: 'youtube.safety.list_capabilities', provider: 'core', authTier: 'none', data: { version: '0.
|
|
8
|
+
return makeEnvelope({ tool: 'youtube.safety.list_capabilities', provider: 'core', authTier: 'none', data: { version: '0.2.0', phase: 'v0.2-research-plus-governed-write-foundation', enabledNamespaces: ['discovery', 'video', 'channel', 'transcript', 'comments', 'planning', 'research', 'safety'], lockedNamespaces: ['operations', 'community-write', 'analytics-oauth', 'reporting', 'media-download', 'shorts-render', 'music-private'] }, warnings: [] });
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=safety.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/tools/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA2D;IACtG,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;AACtN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA6B;IAClE,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/tools/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAA2D;IACtG,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;AACtN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA6B;IAClE,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,8CAA8C,EAAE,iBAAiB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACpc,CAAC"}
|
package/docs/safety-policy.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Safety Policy
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Default posture
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- Discovery, video, channel, transcript, comments, planning, research, and safety tools are read-only by default.
|
|
6
|
+
- Operations, community-write, analytics OAuth, reporting, media-download, Shorts render, and private music namespaces remain locked by default.
|
|
7
|
+
- Write/download/destructive tools must not be exposed unless explicit environment gates are enabled.
|
|
8
|
+
|
|
9
|
+
## v0.2 governed write foundation
|
|
10
|
+
|
|
11
|
+
v0.2 may expose operation tools only when both flags are enabled:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
YOUTUBE_OMNI_ENABLE_WRITE_TOOLS=true
|
|
15
|
+
YOUTUBE_OMNI_DRY_RUN_WRITES=true
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Even when exposed, operation tools are dry-run stubs. They return `APPROVAL_REQUIRED_OR_WRITE_DISABLED` and a `wouldCall` field instead of calling YouTube write APIs.
|
|
19
|
+
|
|
20
|
+
Live writes require a later phase with all of these controls:
|
|
21
|
+
|
|
22
|
+
- OAuth write credentials
|
|
23
|
+
- human approval ID
|
|
24
|
+
- preview/diff for the proposed mutation
|
|
25
|
+
- audit log storage
|
|
26
|
+
- double confirmation for destructive operations
|
|
27
|
+
|
|
28
|
+
## Risk tiers
|
|
29
|
+
|
|
30
|
+
- `none` / tier 0: public metadata reads
|
|
31
|
+
- `low` / tier 1: transcript, comments, planning, research reads
|
|
32
|
+
- `high` / tier 4: upload, metadata, thumbnail, playlist, comment/community writes
|
|
33
|
+
- `destructive` / tier 5: delete/remove, download/clip, revenue/private data workflows
|
package/docs/tool-schema.md
CHANGED
|
@@ -2,4 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
Source of truth: `research/tool-schema-draft-2026-05-13.md` and full-scope schema documents under `research/`.
|
|
4
4
|
|
|
5
|
-
v0
|
|
5
|
+
## v0.2 default exposed tools
|
|
6
|
+
|
|
7
|
+
v0.2 keeps all v0 read-only tools and adds Creator Research synthesis tools. Operations/analytics/media schemas are documented for later phases and remain gated.
|
|
8
|
+
|
|
9
|
+
### Discovery
|
|
10
|
+
|
|
11
|
+
- `youtube.discovery.search_videos`
|
|
12
|
+
- `youtube.discovery.get_video_categories`
|
|
13
|
+
|
|
14
|
+
### Video
|
|
15
|
+
|
|
16
|
+
- `youtube.video.get_details`
|
|
17
|
+
- `youtube.video.compare`
|
|
18
|
+
|
|
19
|
+
### Channel
|
|
20
|
+
|
|
21
|
+
- `youtube.channel.get_statistics`
|
|
22
|
+
- `youtube.channel.get_top_videos`
|
|
23
|
+
|
|
24
|
+
### Transcript
|
|
25
|
+
|
|
26
|
+
- `youtube.transcript.get_segments`
|
|
27
|
+
- `youtube.transcript.get_full_text`
|
|
28
|
+
- `youtube.transcript.analyze_structure`
|
|
29
|
+
|
|
30
|
+
### Comments
|
|
31
|
+
|
|
32
|
+
- `youtube.comments.get`
|
|
33
|
+
- `youtube.comments.summarize`
|
|
34
|
+
|
|
35
|
+
### Planning
|
|
36
|
+
|
|
37
|
+
- `youtube.planning.generate_research_brief`
|
|
38
|
+
|
|
39
|
+
### Creator Research
|
|
40
|
+
|
|
41
|
+
- `youtube.research.find_outlier_videos` — ranks videos by simple views-to-channel-size signal.
|
|
42
|
+
- `youtube.research.compare_hooks` — compares transcript intro hooks and labels patterns.
|
|
43
|
+
- `youtube.research.extract_topic_angles` — derives content angles from discovered videos.
|
|
44
|
+
- `youtube.research.summarize_comment_pain_points` — groups audience questions/requests from comments.
|
|
45
|
+
- `youtube.research.generate_video_angle_matrix` — generates evidence-backed angle rows for planning.
|
|
46
|
+
|
|
47
|
+
### Safety
|
|
48
|
+
|
|
49
|
+
- `youtube.safety.classify_action_risk`
|
|
50
|
+
- `youtube.safety.list_capabilities`
|
|
51
|
+
|
|
52
|
+
## Gated operation tools
|
|
53
|
+
|
|
54
|
+
Operation tools are not exposed by default. v0.2 only permits dry-run operation stubs when explicit write and dry-run gates are enabled.
|