@tutorflow/cli 0.3.1 → 0.4.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 (101) hide show
  1. package/README.md +246 -664
  2. package/dist/client.d.ts +16 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +76 -16
  5. package/dist/client.js.map +1 -1
  6. package/dist/commands/agent.d.ts.map +1 -1
  7. package/dist/commands/agent.js +38 -23
  8. package/dist/commands/agent.js.map +1 -1
  9. package/dist/commands/auth.d.ts.map +1 -1
  10. package/dist/commands/auth.js +20 -12
  11. package/dist/commands/auth.js.map +1 -1
  12. package/dist/commands/classroom.d.ts +3 -0
  13. package/dist/commands/classroom.d.ts.map +1 -0
  14. package/dist/commands/classroom.js +27 -0
  15. package/dist/commands/classroom.js.map +1 -0
  16. package/dist/commands/config.d.ts.map +1 -1
  17. package/dist/commands/config.js +4 -4
  18. package/dist/commands/config.js.map +1 -1
  19. package/dist/commands/course.d.ts.map +1 -1
  20. package/dist/commands/course.js +25 -96
  21. package/dist/commands/course.js.map +1 -1
  22. package/dist/commands/credits.d.ts +3 -0
  23. package/dist/commands/credits.d.ts.map +1 -0
  24. package/dist/commands/credits.js +39 -0
  25. package/dist/commands/credits.js.map +1 -0
  26. package/dist/commands/evaluate.d.ts +3 -0
  27. package/dist/commands/evaluate.d.ts.map +1 -1
  28. package/dist/commands/evaluate.js +98 -57
  29. package/dist/commands/evaluate.js.map +1 -1
  30. package/dist/commands/interactive.d.ts +13 -0
  31. package/dist/commands/interactive.d.ts.map +1 -0
  32. package/dist/commands/interactive.js +100 -0
  33. package/dist/commands/interactive.js.map +1 -0
  34. package/dist/commands/learner.d.ts +4 -0
  35. package/dist/commands/learner.d.ts.map +1 -0
  36. package/dist/commands/learner.js +76 -0
  37. package/dist/commands/learner.js.map +1 -0
  38. package/dist/commands/module.d.ts.map +1 -1
  39. package/dist/commands/module.js +18 -98
  40. package/dist/commands/module.js.map +1 -1
  41. package/dist/commands/platform.d.ts.map +1 -1
  42. package/dist/commands/platform.js +10 -2
  43. package/dist/commands/platform.js.map +1 -1
  44. package/dist/commands/run.d.ts +3 -0
  45. package/dist/commands/run.d.ts.map +1 -0
  46. package/dist/commands/run.js +69 -0
  47. package/dist/commands/run.js.map +1 -0
  48. package/dist/commands/slide.d.ts.map +1 -1
  49. package/dist/commands/slide.js +25 -97
  50. package/dist/commands/slide.js.map +1 -1
  51. package/dist/commands/test.d.ts.map +1 -1
  52. package/dist/commands/test.js +38 -106
  53. package/dist/commands/test.js.map +1 -1
  54. package/dist/commands/video.d.ts.map +1 -1
  55. package/dist/commands/video.js +138 -86
  56. package/dist/commands/video.js.map +1 -1
  57. package/dist/commands/webhook.d.ts +3 -0
  58. package/dist/commands/webhook.d.ts.map +1 -0
  59. package/dist/commands/webhook.js +75 -0
  60. package/dist/commands/webhook.js.map +1 -0
  61. package/dist/config.d.ts +3 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +17 -16
  64. package/dist/config.js.map +1 -1
  65. package/dist/content/context.d.ts +26 -0
  66. package/dist/content/context.d.ts.map +1 -0
  67. package/dist/content/context.js +74 -0
  68. package/dist/content/context.js.map +1 -0
  69. package/dist/content/resource.d.ts +66 -0
  70. package/dist/content/resource.d.ts.map +1 -0
  71. package/dist/content/resource.js +181 -0
  72. package/dist/content/resource.js.map +1 -0
  73. package/dist/content/runs.d.ts +51 -0
  74. package/dist/content/runs.d.ts.map +1 -0
  75. package/dist/content/runs.js +171 -0
  76. package/dist/content/runs.js.map +1 -0
  77. package/dist/index.js +71 -21
  78. package/dist/index.js.map +1 -1
  79. package/dist/types.d.ts +15 -65
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js +4 -4
  82. package/dist/utils/args.d.ts +15 -0
  83. package/dist/utils/args.d.ts.map +1 -0
  84. package/dist/utils/args.js +91 -0
  85. package/dist/utils/args.js.map +1 -0
  86. package/dist/utils/keys.d.ts +11 -0
  87. package/dist/utils/keys.d.ts.map +1 -0
  88. package/dist/utils/keys.js +29 -0
  89. package/dist/utils/keys.js.map +1 -0
  90. package/dist/utils/output.d.ts.map +1 -1
  91. package/dist/utils/output.js +21 -6
  92. package/dist/utils/output.js.map +1 -1
  93. package/dist/utils/runtime.d.ts +14 -4
  94. package/dist/utils/runtime.d.ts.map +1 -1
  95. package/dist/utils/runtime.js +42 -7
  96. package/dist/utils/runtime.js.map +1 -1
  97. package/package.json +4 -3
  98. package/dist/utils/spinner.d.ts +0 -8
  99. package/dist/utils/spinner.d.ts.map +0 -1
  100. package/dist/utils/spinner.js +0 -26
  101. package/dist/utils/spinner.js.map +0 -1
@@ -1,119 +1,51 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.testCommand = testCommand;
7
4
  const commander_1 = require("commander");
8
- const prompts_1 = require("@clack/prompts");
9
- const open_1 = __importDefault(require("open"));
10
- const client_1 = require("../client");
11
5
  const output_1 = require("../utils/output");
12
6
  const runtime_1 = require("../utils/runtime");
7
+ const args_1 = require("../utils/args");
8
+ const context_1 = require("../content/context");
9
+ const resource_1 = require("../content/resource");
10
+ const TESTS = { path: 'tests', noun: 'test' };
13
11
  function testCommand() {
14
- const test = new commander_1.Command('test').description('Manage generated tests');
15
- test
16
- .command('create')
17
- .argument('[prompt]', 'Prompt describing the test to generate')
18
- .option('--title <title>', 'Override generated title')
19
- .option('--description <description>', 'Override generated description')
20
- .option('-l, --language <language>', 'Language code', 'en')
21
- .option('--level <level>', 'Difficulty level')
22
- .option('--subject <subject>', 'Subject area')
23
- .option('-n, --items <number>', 'Target number of test items')
24
- .option('--time-limit <minutes>', 'Time limit in minutes')
25
- .option('--classroom-id <id>', 'Classroom ID to create the test in')
26
- .option('--tier <tier>', 'Pricing tier', 'standard')
27
- .option('--mode <mode>', 'Execution mode: sync or async', 'sync')
28
- .option('--idempotency-key <key>', 'Idempotency key for safe retries')
29
- .option('--open', 'Open the preview URL in a browser when done (TTY only)')
30
- .action((0, runtime_1.command)(async (prompt, options) => {
31
- const testPrompt = await promptOrThrow(prompt, 'Describe the test to generate:', 'Pass a prompt argument: tutorflow test create "Algebra quiz"');
32
- const client = await client_1.ApiClient.createAuthenticated();
33
- const response = await client.request('POST', '/v1/platform/tests', compact({
34
- prompt: testPrompt,
35
- title: options.title,
36
- description: options.description,
37
- language: options.language,
12
+ const test = new commander_1.Command('test').description('Generate and manage classroom tests');
13
+ (0, resource_1.addGenerateCommand)(test, {
14
+ ...TESTS,
15
+ description: 'Generate a test with auto-graded items (3 credits)',
16
+ promptLabel: 'Describe the test',
17
+ example: 'tutorflow test generate "Algebra basics" --items 10 --wait',
18
+ configure: (cmd) => cmd
19
+ .option('-n, --items <number>', 'Number of items')
20
+ .option('--item-types <list>', 'Comma-separated item type per question: select, blank, open-ended, true-false, submission')
21
+ .option('--level <level>', 'Difficulty level')
22
+ .option('-l, --language <lang>', 'Language code', 'en')
23
+ .option('--instructions <text>', 'Extra instructions for the generator')
24
+ .option('--total-score <number>', 'Total score of the test'),
25
+ buildBody: (topic, options) => ({
26
+ topic,
27
+ itemCount: (0, args_1.parsePositiveInt)(options.items, '--items'),
28
+ itemTypes: (0, args_1.splitList)(options.itemTypes),
38
29
  level: options.level,
39
- subject: options.subject,
40
- itemCount: options.items ? parseInt(options.items, 10) : undefined,
41
- timeLimit: options.timeLimit ? parseInt(options.timeLimit, 10) : undefined,
42
- classroomId: options.classroomId,
43
- tier: options.tier,
44
- mode: options.mode,
45
- }), idempotencyHeaders(options.idempotencyKey));
46
- (0, output_1.printResult)(response);
47
- if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
48
- await (0, open_1.default)(response.previewUrl);
49
- (0, output_1.printStatus)('Opening in browser...', 'success');
50
- }
51
- }));
52
- test
53
- .command('list')
54
- .option('-l, --limit <number>', 'Number of results', '20')
55
- .option('-o, --offset <number>', 'Number of rows to skip', '0')
56
- .option('-s, --status <status>', 'Filter by status')
57
- .action((0, runtime_1.command)(async (options) => {
58
- const client = await client_1.ApiClient.createAuthenticated();
59
- const qs = new URLSearchParams({ limit: options.limit, offset: options.offset });
60
- if (options.status)
61
- qs.set('status', options.status);
62
- const response = await client.request('GET', `/v1/platform/tests?${qs.toString()}`);
63
- (0, output_1.printResult)(response);
64
- }));
65
- test
66
- .command('get <id>')
67
- .description('Fetch a single test by ID')
68
- .action((0, runtime_1.command)(async (id) => {
69
- const client = await client_1.ApiClient.createAuthenticated();
70
- const response = await client.request('GET', `/v1/platform/tests/${id}`);
71
- (0, output_1.printResult)(response);
72
- }));
73
- test
74
- .command('edit-token <id>')
75
- .description('Generate a fresh edit token for a test')
76
- .action((0, runtime_1.command)(async (id) => {
77
- const client = await client_1.ApiClient.createAuthenticated();
78
- const response = await client.request('POST', `/v1/platform/tests/${id}/edit-token`);
79
- (0, output_1.printResult)(response);
80
- }));
30
+ instructions: options.instructions,
31
+ totalScore: (0, args_1.parsePositiveInt)(options.totalScore, '--total-score'),
32
+ language: options.language,
33
+ }),
34
+ });
35
+ (0, resource_1.addCrudCommands)(test, TESTS);
81
36
  test
82
- .command('open <id>')
83
- .description('Open a test preview URL in the browser')
84
- .action((0, runtime_1.command)(async (id) => {
85
- const client = await client_1.ApiClient.createAuthenticated();
86
- const response = await client.request('GET', `/v1/platform/tests/${id}`);
87
- const url = response.previewUrl ?? response.publicUrl;
88
- if (!url) {
89
- throw new runtime_1.CliError('No preview URL available for this test', {
90
- code: 'ENOPREVIEW',
91
- exitCode: 1,
92
- });
93
- }
94
- if ((0, runtime_1.isInteractive)())
95
- await (0, open_1.default)(url);
96
- (0, output_1.printResult)({ previewUrl: url });
97
- (0, output_1.printStatus)('Opening in browser...', 'success');
37
+ .command('results <testId>')
38
+ .description("List learners' results of a test")
39
+ .option('-l, --limit <number>', 'Items per page', '20')
40
+ .option('--cursor <cursor>', 'meta.nextCursor from the previous page')
41
+ .action((0, runtime_1.command)(async (testId, options) => {
42
+ const limit = (0, args_1.parsePositiveInt)(options.limit, '--limit');
43
+ const ctx = await (0, context_1.resolveContentContext)();
44
+ const qs = new URLSearchParams({ limit: String(limit) });
45
+ if (options.cursor)
46
+ qs.set('cursor', options.cursor);
47
+ (0, output_1.printResult)(await ctx.client.request('GET', `${(0, resource_1.resourcePath)(ctx, TESTS, testId, '/results')}?${qs}`));
98
48
  }));
99
49
  return test;
100
50
  }
101
- async function promptOrThrow(value, message, hint) {
102
- if (value?.trim())
103
- return value.trim();
104
- (0, runtime_1.requireInteractive)(hint);
105
- const result = await (0, prompts_1.text)({ message });
106
- if (!result || typeof result === 'symbol') {
107
- throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
108
- }
109
- return result;
110
- }
111
- function compact(input) {
112
- return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== ''));
113
- }
114
- function idempotencyHeaders(key) {
115
- if (!key)
116
- return undefined;
117
- return { 'Idempotency-Key': key };
118
- }
119
51
  //# sourceMappingURL=test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":";;AAuBA,kCAgDC;AAvED,yCAAoC;AACpC,4CAA8C;AAC9C,8CAA2C;AAC3C,wCAA4D;AAC5D,gDAA2D;AAC3D,kDAK6B;AAW7B,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAE5D,SAAgB,WAAW;IACzB,MAAM,IAAI,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAEpF,IAAA,6BAAkB,EAAsB,IAAI,EAAE;QAC5C,GAAG,KAAK;QACR,WAAW,EAAE,oDAAoD;QACjE,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,4DAA4D;QACrE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CACjB,GAAG;aACA,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;aACjD,MAAM,CACL,qBAAqB,EACrB,2FAA2F,CAC5F;aACA,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;aAC7C,MAAM,CAAC,uBAAuB,EAAE,eAAe,EAAE,IAAI,CAAC;aACtD,MAAM,CAAC,uBAAuB,EAAE,sCAAsC,CAAC;aACvE,MAAM,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;QAChE,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK;YACL,SAAS,EAAE,IAAA,uBAAgB,EAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;YACrD,SAAS,EAAE,IAAA,gBAAS,EAAC,OAAO,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,UAAU,EAAE,IAAA,uBAAgB,EAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC;YACjE,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;KACH,CAAC,CAAC;IACH,IAAA,0BAAe,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE7B,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,sBAAsB,EAAE,gBAAgB,EAAE,IAAI,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;SACrE,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,EAAE,MAAc,EAAE,OAA2C,EAAE,EAAE;QAC5E,MAAM,KAAK,GAAG,IAAA,uBAAgB,EAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAqB,GAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM;YAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,IAAA,oBAAW,EACT,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,IAAA,uBAAY,EAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CACzF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IACJ,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,YAAY,IAAI,OAAO,CAiHtC"}
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,wBAAgB,YAAY,IAAI,OAAO,CAyGtC"}
@@ -1,108 +1,160 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.videoCommand = videoCommand;
7
4
  const commander_1 = require("commander");
8
- const prompts_1 = require("@clack/prompts");
9
- const open_1 = __importDefault(require("open"));
10
- const client_1 = require("../client");
11
5
  const output_1 = require("../utils/output");
12
6
  const runtime_1 = require("../utils/runtime");
7
+ const args_1 = require("../utils/args");
8
+ const context_1 = require("../content/context");
9
+ const resource_1 = require("../content/resource");
10
+ const runs_1 = require("../content/runs");
11
+ const VIDEOS = { path: 'videos', noun: 'video' };
12
+ const VISIBILITIES = ['PUBLIC', 'PRIVATE'];
13
+ const videoPath = (ctx, id, suffix = '') => (0, resource_1.resourcePath)(ctx, VIDEOS, id, suffix);
13
14
  function videoCommand() {
14
- const video = new commander_1.Command('video').description('Manage videos');
15
+ const video = new commander_1.Command('video').description('Create, script, narrate and render classroom videos');
15
16
  video
16
17
  .command('create')
17
- .argument('[prompt]', 'Prompt describing the video content')
18
- .option('-s, --scenes <number>', 'Number of scenes', '5')
19
- .option('-r, --ratio <ratio>', 'Aspect ratio (16:9, 9:16, 1:1)', '16:9')
20
- .option('-d, --duration <seconds>', 'Target duration in seconds', '60')
21
- .option('-l, --language <lang>', 'Language code', 'en')
22
- .option('--open', 'Open the result in a browser when done (TTY only)')
23
- .action((0, runtime_1.command)(async (prompt, options) => {
24
- let videoPrompt = prompt;
25
- if (!videoPrompt) {
26
- (0, runtime_1.requireInteractive)('Pass a prompt argument: tutorflow video create "Newton\'s laws"');
27
- const result = await (0, prompts_1.text)({ message: 'Describe the video content:' });
28
- if (typeof result === 'symbol') {
29
- throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
30
- }
31
- videoPrompt = result;
32
- }
33
- const client = await client_1.ApiClient.createAuthenticated();
34
- const s = (0, runtime_1.isJsonMode)() || !(0, runtime_1.isInteractive)() ? null : (0, prompts_1.spinner)();
35
- s?.start('Creating video...');
36
- let response;
37
- try {
38
- response = await client.request('POST', '/v1/platform/videos', {
39
- prompt: videoPrompt,
40
- sceneCount: parseInt(options.scenes, 10),
41
- aspectRatio: options.ratio,
42
- targetDurationSeconds: parseInt(options.duration, 10),
43
- language: options.language,
44
- mode: 'sync',
45
- });
46
- }
47
- finally {
48
- s?.stop('Done');
18
+ .description('Create a video; each --scene adds a scene with that narration script')
19
+ .requiredOption('--title <title>', 'Video title')
20
+ .option('--description <text>', 'Video description')
21
+ .option('--visibility <visibility>', 'PUBLIC or PRIVATE')
22
+ .option('--scene <script>', 'Add a scene with this script (repeatable, in order)', args_1.collect, [])
23
+ .option('--idempotency-key <key>', 'Idempotency key for safe retries of the create call')
24
+ .action((0, runtime_1.command)(async (options) => {
25
+ const visibility = (0, args_1.parseChoice)(options.visibility, '--visibility', VISIBILITIES);
26
+ const ctx = await (0, context_1.resolveContentContext)();
27
+ const created = await ctx.client.request('POST', (0, resource_1.resourcePath)(ctx, VIDEOS), (0, args_1.compact)({ title: options.title, description: options.description, visibility }), (0, args_1.idempotencyHeaders)(options.idempotencyKey));
28
+ const scripts = options.scene ?? [];
29
+ if (!scripts.length) {
30
+ (0, output_1.printResult)(created);
31
+ return;
49
32
  }
50
- (0, output_1.printResult)(response);
51
- if (options.open && response.previewUrl && (0, runtime_1.isInteractive)()) {
52
- const shouldOpen = await (0, prompts_1.confirm)({ message: 'Open in browser?' });
53
- if (shouldOpen === true)
54
- await (0, open_1.default)(response.previewUrl);
33
+ let current = created;
34
+ for (const [index, script] of scripts.entries()) {
35
+ try {
36
+ current = await addScene(ctx, current, { script });
37
+ }
38
+ catch (error) {
39
+ throw withVideoContext(error, created.id, index);
40
+ }
55
41
  }
42
+ (0, output_1.printResult)(await ctx.client.request('GET', videoPath(ctx, created.id)));
56
43
  }));
44
+ (0, resource_1.addCrudCommands)(video, VIDEOS);
45
+ video.addCommand(sceneCommand());
57
46
  video
58
- .command('list')
59
- .option('-l, --limit <number>', 'Number of results', '10')
60
- .option('-s, --status <status>', 'Filter by status')
61
- .action((0, runtime_1.command)(async (options) => {
62
- const client = await client_1.ApiClient.createAuthenticated();
63
- const qs = new URLSearchParams({ limit: options.limit });
64
- if (options.status)
65
- qs.set('status', options.status);
66
- const response = await client.request('GET', `/v1/platform/videos?${qs.toString()}`);
67
- const videos = Array.isArray(response) ? response : response.data ?? response.items ?? [];
68
- if ((0, runtime_1.isJsonMode)()) {
69
- (0, output_1.printResult)(videos);
70
- }
71
- else {
72
- (0, output_1.printResult)(videos.map((v) => ({
73
- ID: v.id,
74
- Title: v.title || 'Untitled',
75
- Status: v.status,
76
- Scenes: v.sceneCount?.toString() || '—',
77
- Created: new Date(v.createdAt).toLocaleDateString(),
78
- })));
79
- }
47
+ .command('narrate <videoId>')
48
+ .description('Generate narration for every scene without one, or for one --scene (1 credit per scene)')
49
+ .option('--scene <sceneId>', 'Narrate only this scene, from its script')
50
+ .option('--idempotency-key <key>', 'Idempotency key for safe retries')
51
+ .action((0, runtime_1.command)(async (videoId, options) => {
52
+ const ctx = await (0, context_1.resolveContentContext)();
53
+ const suffix = options.scene ? `/scenes/${(0, context_1.segment)(options.scene)}/narration` : '/narration';
54
+ (0, output_1.printResult)(await ctx.client.request('POST', videoPath(ctx, videoId, suffix), undefined, (0, args_1.idempotencyHeaders)(options.idempotencyKey)));
55
+ }));
56
+ (0, resource_1.addWaitOptions)(video
57
+ .command('render <videoId>')
58
+ .description('Render the video to mp4 (completion also arrives as the video.render.completed webhook)')
59
+ .option('--generate-missing-narration', 'Narrate scenes that have none first (1 credit per scene)'), runs_1.DEFAULT_RENDER_TIMEOUT_SECONDS).action((0, runtime_1.command)(async (videoId, options) => {
60
+ const timeoutSeconds = (0, resource_1.parseTimeout)(options);
61
+ const ctx = await (0, context_1.resolveContentContext)();
62
+ const accepted = await ctx.client.request('POST', videoPath(ctx, videoId, '/render'), (0, args_1.compact)({ generateMissingNarration: options.generateMissingNarration }));
63
+ (0, output_1.printResult)(options.wait ? await (0, runs_1.waitForRender)(ctx, videoId, timeoutSeconds) : accepted);
80
64
  }));
81
65
  video
82
- .command('get <id>')
83
- .description('Fetch a single video by ID')
84
- .action((0, runtime_1.command)(async (id) => {
85
- const client = await client_1.ApiClient.createAuthenticated();
86
- const response = await client.request('GET', `/v1/platform/videos/${id}`);
87
- (0, output_1.printResult)(response);
66
+ .command('render-status <videoId>')
67
+ .description('Show render status and, once rendered, the video URL')
68
+ .action((0, runtime_1.command)(async (videoId) => {
69
+ const ctx = await (0, context_1.resolveContentContext)();
70
+ (0, output_1.printResult)(await ctx.client.request('GET', videoPath(ctx, videoId, '/render')));
88
71
  }));
89
72
  video
90
- .command('open <id>')
91
- .description('Open a video in the browser')
92
- .action((0, runtime_1.command)(async (id) => {
93
- const client = await client_1.ApiClient.createAuthenticated();
94
- const response = await client.request('GET', `/v1/platform/videos/${id}`);
95
- if (!response.previewUrl) {
96
- throw new runtime_1.CliError('No preview URL available for this video', {
97
- code: 'ENOPREVIEW',
98
- exitCode: 1,
73
+ .command('render-cancel <videoId>')
74
+ .description('Cancel a running render')
75
+ .action((0, runtime_1.command)(async (videoId) => {
76
+ const ctx = await (0, context_1.resolveContentContext)();
77
+ (0, output_1.printResult)(await ctx.client.request('POST', videoPath(ctx, videoId, '/render/cancel')));
78
+ }));
79
+ return video;
80
+ }
81
+ function sceneCommand() {
82
+ const scene = new commander_1.Command('scene').description('Add, edit and delete video scenes');
83
+ addSceneEditOptions(scene
84
+ .command('add <videoId>')
85
+ .description('Add a scene at the end (or after --after) and set its script')
86
+ .option('--after <sceneId>', 'Insert after this scene')).action((0, runtime_1.command)(async (videoId, options) => {
87
+ const edits = sceneEdits(options);
88
+ const ctx = await (0, context_1.resolveContentContext)();
89
+ const current = await ctx.client.request('GET', videoPath(ctx, videoId));
90
+ (0, output_1.printResult)(await addScene(ctx, current, edits, options.after));
91
+ }));
92
+ addSceneEditOptions(scene.command('update <videoId> <sceneId>').description("Change a scene's script, text or duration")).action((0, runtime_1.command)(async (videoId, sceneId, options) => {
93
+ const edits = sceneEdits(options);
94
+ if (!Object.keys(edits).length) {
95
+ throw new runtime_1.CliError('Nothing to change: pass --script, --display-text or --duration', {
96
+ code: 'EINVAL',
97
+ exitCode: 2,
99
98
  });
100
99
  }
101
- if ((0, runtime_1.isInteractive)())
102
- await (0, open_1.default)(response.previewUrl);
103
- (0, output_1.printResult)({ previewUrl: response.previewUrl });
104
- (0, output_1.printStatus)('Opening in browser...', 'success');
100
+ const ctx = await (0, context_1.resolveContentContext)();
101
+ (0, output_1.printResult)(await ctx.client.request('PATCH', videoPath(ctx, videoId, `/scenes/${(0, context_1.segment)(sceneId)}`), edits));
105
102
  }));
106
- return video;
103
+ scene
104
+ .command('delete <videoId> <sceneId>')
105
+ .description('Delete a scene')
106
+ .option('-y, --yes', 'Skip the confirmation prompt (required without a TTY)')
107
+ .action((0, runtime_1.command)(async (videoId, sceneId, options) => {
108
+ await (0, args_1.confirmOrRequireYes)(options.yes, `Delete scene ${sceneId}?`);
109
+ const ctx = await (0, context_1.resolveContentContext)();
110
+ (0, output_1.printResult)(await ctx.client.request('DELETE', videoPath(ctx, videoId, `/scenes/${(0, context_1.segment)(sceneId)}`)));
111
+ }));
112
+ return scene;
113
+ }
114
+ /** The video exists even when a scene fails; keep its id in the error. */
115
+ function withVideoContext(error, videoId, sceneIndex) {
116
+ const base = error instanceof runtime_1.CliError ? error : new runtime_1.CliError(String(error));
117
+ return new runtime_1.CliError(`Video ${videoId} was created, but scene ${sceneIndex + 1} failed: ${base.message}`, {
118
+ code: base.code,
119
+ exitCode: base.exitCode,
120
+ details: {
121
+ ...base.details,
122
+ videoId,
123
+ scenesAdded: sceneIndex,
124
+ hint: `Add the remaining scenes with: tutorflow video scene add ${videoId} --script "…"`,
125
+ },
126
+ });
127
+ }
128
+ function addSceneEditOptions(cmd) {
129
+ return cmd
130
+ .option('--script <text>', 'Narration script')
131
+ .option('--display-text <text>', 'Text shown on screen')
132
+ .option('--duration <seconds>', 'Scene duration in seconds');
133
+ }
134
+ function sceneEdits(options) {
135
+ return (0, args_1.compact)({
136
+ script: options.script,
137
+ displayText: options.displayText,
138
+ duration: (0, args_1.parseNonNegativeNumber)(options.duration, '--duration'),
139
+ });
140
+ }
141
+ /**
142
+ * The scene route only appends an empty scene and answers the whole video, so
143
+ * the new scene is the id that was not there before; its script is set next.
144
+ */
145
+ async function addScene(ctx, video, edits, after) {
146
+ const before = new Set((video.scenes ?? []).map((s) => s.id));
147
+ const lastSceneId = video.scenes?.at(-1)?.id;
148
+ const updated = await ctx.client.request('POST', videoPath(ctx, video.id, '/scenes'), (0, args_1.compact)({ insertAfterSceneId: after ?? lastSceneId }));
149
+ if (!Object.keys(edits).length)
150
+ return updated;
151
+ const added = (updated.scenes ?? []).find((s) => !before.has(s.id));
152
+ if (!added) {
153
+ throw new runtime_1.CliError('The scene was added but its id was not in the answer; set its script with `video scene update`.', {
154
+ code: 'EGENERIC',
155
+ details: { videoId: video.id },
156
+ });
157
+ }
158
+ return ctx.client.request('PATCH', videoPath(ctx, video.id, `/scenes/${(0, context_1.segment)(added.id)}`), edits);
107
159
  }
108
160
  //# sourceMappingURL=video.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function webhookCommand(): Command;
3
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,cAAc,IAAI,OAAO,CA6FxC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webhookCommand = webhookCommand;
4
+ const commander_1 = require("commander");
5
+ const output_1 = require("../utils/output");
6
+ const runtime_1 = require("../utils/runtime");
7
+ const args_1 = require("../utils/args");
8
+ const context_1 = require("../content/context");
9
+ const MODES = ['live', 'test'];
10
+ const BASE = '/v1/content/webhooks';
11
+ const webhookPath = (id, suffix = '') => `${BASE}/${encodeURIComponent(id)}${suffix}`;
12
+ function webhookCommand() {
13
+ const webhook = new commander_1.Command('webhook').description('Manage Content API webhook endpoints (needs the webhooks:manage scope)');
14
+ webhook
15
+ .command('list')
16
+ .description('List webhook endpoints')
17
+ .action((0, runtime_1.command)(async () => {
18
+ const client = await (0, context_1.createContentClient)();
19
+ (0, output_1.printResult)(await client.request('GET', BASE));
20
+ }));
21
+ webhook
22
+ .command('create')
23
+ .description('Create an endpoint; the signing secret is shown once')
24
+ .requiredOption('--url <url>', 'HTTPS URL that receives events')
25
+ .option('--event <event>', 'Event to send, e.g. course.generation.completed, video.render.completed (repeatable)', args_1.collect, [])
26
+ .option('--mode <mode>', 'live or test (test endpoints receive test-key events)')
27
+ .action((0, runtime_1.command)(async (options) => {
28
+ if (!options.event.length) {
29
+ throw new runtime_1.CliError('Pass at least one --event', { code: 'EINVAL', exitCode: 2 });
30
+ }
31
+ const mode = (0, args_1.parseChoice)(options.mode, '--mode', MODES);
32
+ const client = await (0, context_1.createContentClient)();
33
+ (0, output_1.printResult)(await client.request('POST', BASE, (0, args_1.compact)({ url: options.url, events: options.event, mode })));
34
+ }));
35
+ webhook
36
+ .command('get <webhookId>')
37
+ .description('Show a webhook endpoint')
38
+ .action((0, runtime_1.command)(async (id) => {
39
+ const client = await (0, context_1.createContentClient)();
40
+ (0, output_1.printResult)(await client.request('GET', webhookPath(id)));
41
+ }));
42
+ webhook
43
+ .command('delete <webhookId>')
44
+ .description('Delete a webhook endpoint')
45
+ .option('-y, --yes', 'Skip the confirmation prompt (required without a TTY)')
46
+ .action((0, runtime_1.command)(async (id, options) => {
47
+ await (0, args_1.confirmOrRequireYes)(options.yes, `Delete webhook ${id}?`);
48
+ const client = await (0, context_1.createContentClient)();
49
+ await client.request('DELETE', webhookPath(id));
50
+ (0, output_1.printResult)({ id, deleted: true });
51
+ }));
52
+ webhook
53
+ .command('test <webhookId>')
54
+ .description('Send a webhook.ping event now')
55
+ .action((0, runtime_1.command)(async (id) => {
56
+ const client = await (0, context_1.createContentClient)();
57
+ (0, output_1.printResult)(await client.request('POST', webhookPath(id, '/test')));
58
+ }));
59
+ webhook
60
+ .command('deliveries <webhookId>')
61
+ .description('List recent deliveries, newest first')
62
+ .action((0, runtime_1.command)(async (id) => {
63
+ const client = await (0, context_1.createContentClient)();
64
+ (0, output_1.printResult)(await client.request('GET', webhookPath(id, '/deliveries')));
65
+ }));
66
+ webhook
67
+ .command('rotate-secret <webhookId>')
68
+ .description('Replace the signing secret (the new one is shown once)')
69
+ .action((0, runtime_1.command)(async (id) => {
70
+ const client = await (0, context_1.createContentClient)();
71
+ (0, output_1.printResult)(await client.request('POST', webhookPath(id, '/rotate-secret')));
72
+ }));
73
+ return webhook;
74
+ }
75
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export interface IConfig {
2
2
  apiKey?: string;
3
3
  baseUrl?: string;
4
+ /** Classroom every content command uses unless --classroom says otherwise. */
5
+ classroomId?: string;
6
+ /** Legacy field from 0.x; unused. */
4
7
  workspace?: string;
5
8
  }
6
9
  export declare function readConfig(): Promise<IConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAOnD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAQnD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD"}