@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
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RUN_KIND_PATHS = exports.DEFAULT_RENDER_TIMEOUT_SECONDS = exports.DEFAULT_WAIT_TIMEOUT_SECONDS = void 0;
4
+ exports.waitForRun = waitForRun;
5
+ exports.fetchRunResource = fetchRunResource;
6
+ exports.waitForResourceRun = waitForResourceRun;
7
+ exports.waitForRender = waitForRender;
8
+ const client_1 = require("../client");
9
+ const runtime_1 = require("../utils/runtime");
10
+ const context_1 = require("./context");
11
+ /**
12
+ * Waiting on asynchronous Content API work: generation runs, game and
13
+ * simulation builds, and video renders. Each poll is a plain GET, so an agent
14
+ * that times out can pick up again with `tutorflow run wait <runId>`.
15
+ */
16
+ const DEFAULT_POLL_INTERVAL_MS = 3000;
17
+ /** Consecutive transient failures (5xx, 429, network) a wait rides out. */
18
+ const MAX_TRANSIENT_POLL_FAILURES = 5;
19
+ exports.DEFAULT_WAIT_TIMEOUT_SECONDS = 900;
20
+ exports.DEFAULT_RENDER_TIMEOUT_SECONDS = 1800;
21
+ /** Path segment of the resource a generation run of each kind produces. */
22
+ exports.RUN_KIND_PATHS = {
23
+ course: 'courses',
24
+ slide: 'slides',
25
+ test: 'tests',
26
+ module: 'modules',
27
+ };
28
+ function pollIntervalMs() {
29
+ const fromEnv = Number((0, client_1.envValue)('TUTORFLOW_POLL_INTERVAL_MS'));
30
+ return Number.isFinite(fromEnv) && fromEnv > 0 ? fromEnv : DEFAULT_POLL_INTERVAL_MS;
31
+ }
32
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
33
+ function isTransient(error) {
34
+ if (!(error instanceof runtime_1.CliError))
35
+ return false;
36
+ return error.code === 'ENETWORK' || error.code === 'EHTTP_429' || /^EHTTP_5\d\d$/.test(error.code);
37
+ }
38
+ async function pollUntilSettled(opts) {
39
+ const deadline = Date.now() + opts.timeoutSeconds * 1000;
40
+ let lastLine = '';
41
+ let failures = 0;
42
+ for (;;) {
43
+ let state;
44
+ try {
45
+ state = await opts.fetch();
46
+ failures = 0;
47
+ }
48
+ catch (error) {
49
+ failures += 1;
50
+ if (!isTransient(error) || failures > MAX_TRANSIENT_POLL_FAILURES || Date.now() >= deadline) {
51
+ throw error;
52
+ }
53
+ (0, runtime_1.printProgress)(`poll failed (${error.code}), retrying`);
54
+ await sleep(pollIntervalMs() * failures);
55
+ continue;
56
+ }
57
+ if (opts.isSettled(state))
58
+ return state;
59
+ const line = opts.describe(state);
60
+ if (line !== lastLine)
61
+ (0, runtime_1.printProgress)(line);
62
+ lastLine = line;
63
+ if (Date.now() >= deadline)
64
+ throw opts.timeoutError(state);
65
+ await sleep(Math.min(pollIntervalMs(), Math.max(deadline - Date.now(), 0)));
66
+ }
67
+ }
68
+ function timeoutError(message, details) {
69
+ return new runtime_1.CliError(message, { code: 'ETIMEOUT', exitCode: 1, details });
70
+ }
71
+ async function waitForRun(ctx, runId, timeoutSeconds) {
72
+ const run = await pollUntilSettled({
73
+ fetch: () => ctx.client.request('GET', (0, context_1.classroomPath)(ctx, `/runs/${(0, context_1.segment)(runId)}`)),
74
+ isSettled: (r) => r.status === 'completed' || r.status === 'failed',
75
+ describe: (r) => {
76
+ const stage = r.stage ? ` · ${r.stage}` : '';
77
+ const progress = r.progress?.total
78
+ ? ` · ${r.progress.completed}/${r.progress.total} ${r.progress.unit}s`
79
+ : '';
80
+ return `run ${runId}: ${r.status}${stage}${progress}`;
81
+ },
82
+ timeoutSeconds,
83
+ timeoutError: (r) => timeoutError(`Run ${runId} is still ${r.status} after ${timeoutSeconds}s. Keep waiting with: tutorflow run wait ${runId}`, { runId, status: r.status }),
84
+ });
85
+ if (run.status === 'failed') {
86
+ throw new runtime_1.CliError(`Run ${runId} failed: ${run.error ?? 'no reason given'}`, {
87
+ code: 'ERUNFAILED',
88
+ exitCode: 1,
89
+ details: { runId, run, hint: resumeHint(run) },
90
+ });
91
+ }
92
+ return run;
93
+ }
94
+ const CREDIT_ERROR_PATTERN = /credit/i;
95
+ function resumeHint(run) {
96
+ const creditHint = CREDIT_ERROR_PATTERN.test(run.error ?? '')
97
+ ? 'The organization ran out of AI Credits: `tutorflow credits balance`, then `tutorflow agent billing session`.'
98
+ : undefined;
99
+ const resume = run.kind === 'course' ? `Resume the unfinished lessons with: tutorflow run resume ${run.runId}` : undefined;
100
+ return [creditHint, resume].filter(Boolean).join(' ') || undefined;
101
+ }
102
+ /** Fetch what a completed run produced, or undefined when it names nothing. */
103
+ async function fetchRunResource(ctx, run) {
104
+ if (!run.resourceId || !run.kind || !exports.RUN_KIND_PATHS[run.kind])
105
+ return undefined;
106
+ return ctx.client.request('GET', (0, context_1.classroomPath)(ctx, `/${exports.RUN_KIND_PATHS[run.kind]}/${(0, context_1.segment)(run.resourceId)}`));
107
+ }
108
+ /**
109
+ * Wait for a game or simulation brief/build/revise. The resource run route
110
+ * reports an `active` step while one runs and the `last` finished one after.
111
+ */
112
+ async function waitForResourceRun(ctx, resourcePath, id, runId, timeoutSeconds) {
113
+ // Without a run id the only proof the new step ended is seeing it run first;
114
+ // otherwise `last` could be the previous step's result.
115
+ let sawActive = false;
116
+ const status = await pollUntilSettled({
117
+ fetch: async () => {
118
+ const s = await ctx.client.request('GET', (0, context_1.classroomPath)(ctx, `/${resourcePath}/${(0, context_1.segment)(id)}/run`));
119
+ if (s.active)
120
+ sawActive = true;
121
+ return s;
122
+ },
123
+ isSettled: (s) => !s.active && Boolean(s.last) && (runId ? s.last?.runId === runId : sawActive),
124
+ describe: (s) => s.active
125
+ ? `${resourcePath} ${id}: ${s.active.phase} running${s.active.stage ? ` · ${s.active.stage}` : ''}`
126
+ : `${resourcePath} ${id}: waiting for the run to report`,
127
+ timeoutSeconds,
128
+ timeoutError: () => timeoutError(`${resourcePath} ${id} is still running after ${timeoutSeconds}s. Check with: tutorflow ${resourceCommand(resourcePath)} status ${id}`, { id, runId }),
129
+ });
130
+ if (status.last?.status === 'failed') {
131
+ throw new runtime_1.CliError(`${status.last.phase} of ${id} failed: ${status.last.message ?? 'no reason given'}`, { code: 'ERUNFAILED', exitCode: 1, details: { id, runId: status.last.runId, run: status } });
132
+ }
133
+ return status;
134
+ }
135
+ function resourceCommand(resourcePath) {
136
+ return resourcePath === 'games' ? 'game' : 'simulation';
137
+ }
138
+ async function waitForRender(ctx, videoId, timeoutSeconds) {
139
+ // A render cancelled meanwhile goes back to IDLE; only trust IDLE after RENDERING.
140
+ let sawRendering = false;
141
+ const status = await pollUntilSettled({
142
+ fetch: async () => {
143
+ const s = await ctx.client.request('GET', (0, context_1.classroomPath)(ctx, `/videos/${(0, context_1.segment)(videoId)}/render`));
144
+ if (s.renderStatus === 'RENDERING')
145
+ sawRendering = true;
146
+ return s;
147
+ },
148
+ isSettled: (s) => s.renderStatus === 'COMPLETED' ||
149
+ s.renderStatus === 'FAILED' ||
150
+ (sawRendering && s.renderStatus === 'IDLE'),
151
+ describe: (s) => `video ${videoId}: ${s.renderStatus}${typeof s.progress === 'number' ? ` · ${Math.round(s.progress)}%` : ''}`,
152
+ timeoutSeconds,
153
+ timeoutError: (s) => timeoutError(`Render of ${videoId} is still ${s.renderStatus} after ${timeoutSeconds}s. Check with: tutorflow video render-status ${videoId}`, { id: videoId, renderStatus: s.renderStatus }),
154
+ });
155
+ if (status.renderStatus === 'IDLE') {
156
+ throw new runtime_1.CliError(`Render of ${videoId} stopped without finishing (cancelled?)`, {
157
+ code: 'ERUNFAILED',
158
+ exitCode: 1,
159
+ details: { id: videoId, render: status },
160
+ });
161
+ }
162
+ if (status.renderStatus === 'FAILED') {
163
+ throw new runtime_1.CliError(`Render of ${videoId} failed: ${status.renderError ?? 'no reason given'}`, {
164
+ code: 'ERUNFAILED',
165
+ exitCode: 1,
166
+ details: { id: videoId, render: status },
167
+ });
168
+ }
169
+ return status;
170
+ }
171
+ //# sourceMappingURL=runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/content/runs.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,46 +3,96 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const auth_1 = require("./commands/auth");
6
- const slide_1 = require("./commands/slide");
7
- const video_1 = require("./commands/video");
8
- const course_1 = require("./commands/course");
9
- const evaluate_1 = require("./commands/evaluate");
10
6
  const config_1 = require("./commands/config");
11
7
  const agent_1 = require("./commands/agent");
12
- const module_1 = require("./commands/module");
13
- const test_1 = require("./commands/test");
14
8
  const platform_1 = require("./commands/platform");
9
+ const classroom_1 = require("./commands/classroom");
10
+ const course_1 = require("./commands/course");
11
+ const slide_1 = require("./commands/slide");
12
+ const test_1 = require("./commands/test");
13
+ const module_1 = require("./commands/module");
14
+ const video_1 = require("./commands/video");
15
+ const interactive_1 = require("./commands/interactive");
16
+ const run_1 = require("./commands/run");
17
+ const evaluate_1 = require("./commands/evaluate");
18
+ const learner_1 = require("./commands/learner");
19
+ const webhook_1 = require("./commands/webhook");
20
+ const credits_1 = require("./commands/credits");
15
21
  const runtime_1 = require("./utils/runtime");
16
22
  const package_json_1 = require("../package.json");
17
23
  commander_1.program
18
24
  .name('tutorflow')
19
- .description('TutorFlow CLI - Create AI-powered educational content')
25
+ .description('TutorFlow CLI - create courses, slides, tests, modules, videos, games and evaluations through the TutorFlow Content API')
20
26
  .version(package_json_1.version)
21
27
  .option('--json', 'Output machine-readable JSON to stdout (errors to stderr)')
22
28
  .option('--debug', 'Print stack traces on errors (also via DEBUG=1)')
29
+ .option('--classroom <id>', 'Classroom for content commands (default: the account default classroom, or the sandbox for a test key)')
23
30
  .hook('preAction', (cmd) => {
24
31
  const opts = cmd.opts();
25
32
  if (opts.json)
26
33
  (0, runtime_1.setJsonMode)(true);
27
34
  if (opts.debug)
28
35
  (0, runtime_1.setDebugMode)(true);
36
+ (0, runtime_1.setClassroomOverride)(opts.classroom);
29
37
  });
30
- commander_1.program.addCommand((0, auth_1.authCommand)());
31
- commander_1.program.addCommand((0, slide_1.slideCommand)());
32
- commander_1.program.addCommand((0, video_1.videoCommand)());
33
- commander_1.program.addCommand((0, course_1.courseCommand)());
34
- commander_1.program.addCommand((0, evaluate_1.evaluateCommand)());
35
- commander_1.program.addCommand((0, config_1.configCommand)());
36
- commander_1.program.addCommand((0, agent_1.agentCommand)());
37
- commander_1.program.addCommand((0, module_1.moduleCommand)());
38
- commander_1.program.addCommand((0, test_1.testCommand)());
39
- commander_1.program.addCommand((0, platform_1.platformCommand)());
40
- commander_1.program.parseAsync(process.argv).catch(() => {
41
- // commander already prints its own errors; keep this as a safety net.
42
- process.exit(1);
43
- });
38
+ const commands = [
39
+ auth_1.authCommand,
40
+ config_1.configCommand,
41
+ agent_1.agentCommand,
42
+ platform_1.platformCommand,
43
+ classroom_1.classroomCommand,
44
+ course_1.courseCommand,
45
+ slide_1.slideCommand,
46
+ test_1.testCommand,
47
+ module_1.moduleCommand,
48
+ video_1.videoCommand,
49
+ interactive_1.gameCommand,
50
+ interactive_1.simulationCommand,
51
+ run_1.runCommand,
52
+ evaluate_1.evaluateCommand,
53
+ evaluate_1.evaluationCommand,
54
+ learner_1.learnerCommand,
55
+ webhook_1.webhookCommand,
56
+ credits_1.creditsCommand,
57
+ ];
58
+ for (const create of commands)
59
+ commander_1.program.addCommand(create());
60
+ // Usage errors (unknown option, missing argument) happen before preAction, so
61
+ // JSON mode is read from argv here. They follow the same contract as every
62
+ // other bad input: EINVAL, exit 2, JSON on stderr in JSON mode.
63
+ const jsonRequested = process.argv.includes('--json') || process.env.TUTORFLOW_JSON === '1';
64
+ if (jsonRequested)
65
+ (0, runtime_1.setJsonMode)(true);
66
+ function applyErrorHandling(cmd) {
67
+ cmd.exitOverride();
68
+ cmd.configureOutput({
69
+ writeErr: (text) => {
70
+ if (!jsonRequested)
71
+ process.stderr.write(text);
72
+ },
73
+ });
74
+ cmd.commands.forEach(applyErrorHandling);
75
+ }
76
+ applyErrorHandling(commander_1.program);
77
+ const CLEAN_EXITS = new Set(['commander.helpDisplayed', 'commander.version', 'commander.help']);
44
78
  if (!process.argv.slice(2).length) {
45
79
  commander_1.program.outputHelp();
46
80
  process.exit(1);
47
81
  }
82
+ commander_1.program.parseAsync(process.argv).catch((error) => {
83
+ if (error instanceof commander_1.CommanderError) {
84
+ if (CLEAN_EXITS.has(error.code))
85
+ process.exit(error.exitCode);
86
+ // A bare parent command (e.g. `tutorflow course`) shows its help: keep exit 1.
87
+ if (error.code === 'commander.executeSubCommandAsync' || error.exitCode === 0) {
88
+ process.exit(error.exitCode);
89
+ }
90
+ if (jsonRequested) {
91
+ (0, runtime_1.printError)(new runtime_1.CliError(error.message.replace(/^error: /, ''), { code: 'EINVAL', exitCode: 2 }));
92
+ }
93
+ process.exit(2);
94
+ }
95
+ (0, runtime_1.printError)(error);
96
+ process.exit(1);
97
+ });
48
98
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,4CAAgD;AAChD,4CAAgD;AAChD,8CAAkD;AAClD,kDAAsD;AACtD,8CAAkD;AAClD,4CAAgD;AAChD,8CAAkD;AAClD,0CAA8C;AAC9C,kDAAsD;AACtD,6CAA4D;AAC5D,kDAA0C;AAE1C,mBAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,sBAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,2DAA2D,CAAC;KAC7E,MAAM,CAAC,SAAS,EAAE,iDAAiD,CAAC;KACpE,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;IACzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,IAAI;QAAE,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,KAAK;QAAE,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEL,mBAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,mBAAO,CAAC,UAAU,CAAC,IAAA,oBAAY,GAAE,CAAC,CAAC;AACnC,mBAAO,CAAC,UAAU,CAAC,IAAA,oBAAY,GAAE,CAAC,CAAC;AACnC,mBAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,mBAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;AACtC,mBAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,mBAAO,CAAC,UAAU,CAAC,IAAA,oBAAY,GAAE,CAAC,CAAC;AACnC,mBAAO,CAAC,UAAU,CAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;AACpC,mBAAO,CAAC,UAAU,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC;AAClC,mBAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;AAEtC,mBAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;IAC1C,sEAAsE;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,mBAAO,CAAC,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,32 +1,9 @@
1
1
  /**
2
- * Response types for the TutorFlow Platform API (`/v1/platform/*`).
3
- * These mirror the fields the CLI actually reads. The API may return
4
- * additional fields, which are tolerated via the optional `[key: string]: unknown`
5
- * index signatures on list items.
2
+ * Response types the CLI reads from the Agent Platform account routes
3
+ * (`/v1/platform/agent/*`) and the Content API evaluation route. Content
4
+ * resources are typed loosely in src/content/resource.ts. The API may return
5
+ * additional fields, tolerated via `[key: string]: unknown`.
6
6
  */
7
- export interface ResourceBase {
8
- id: string;
9
- title?: string;
10
- status: string;
11
- createdAt: string;
12
- previewUrl?: string;
13
- }
14
- export interface SlideResource extends ResourceBase {
15
- [key: string]: unknown;
16
- }
17
- export interface VideoResource extends ResourceBase {
18
- sceneCount?: number;
19
- [key: string]: unknown;
20
- }
21
- export interface CourseResource extends ResourceBase {
22
- [key: string]: unknown;
23
- }
24
- export interface LegacyListResponse<T> {
25
- data?: T[];
26
- items?: T[];
27
- total?: number;
28
- [key: string]: unknown;
29
- }
30
7
  export interface EvaluationResponse {
31
8
  score: number | string;
32
9
  feedback: string;
@@ -36,18 +13,20 @@ export type EvaluationType = 'exact' | 'rubric_short_answer' | 'open_ended';
36
13
  export type EvaluationTypeInput = EvaluationType | 'rubric' | 'open-ended';
37
14
  export interface AgentRegisterResponse {
38
15
  organizationId: string;
16
+ /** Deprecated tf_platform_ key. */
39
17
  apiKey: string;
40
18
  keyPrefix: string;
19
+ /** tf_content_ key for every content command. */
20
+ contentApiKey?: string;
21
+ contentApiKeyPrefix?: string;
22
+ defaultClassroomId?: string;
23
+ contentApiBaseUrl?: string;
24
+ trialContentCredits?: number;
41
25
  trialCredits: number;
42
26
  message: string;
43
27
  requiresEmailVerification: boolean;
44
28
  verifyEmailResendEndpoint: string;
45
- nextSteps: {
46
- createSlide: string;
47
- createVideo: string;
48
- accountInfo: string;
49
- [key: string]: unknown;
50
- };
29
+ nextSteps: Record<string, unknown>;
51
30
  [key: string]: unknown;
52
31
  }
53
32
  export interface AgentAccountResponse {
@@ -60,6 +39,9 @@ export interface AgentAccountResponse {
60
39
  isEmailVerified: boolean;
61
40
  restrictedActions: string[];
62
41
  createdAt: string;
42
+ defaultClassroomId?: string | null;
43
+ sandboxClassroomId?: string | null;
44
+ contentApiBaseUrl?: string;
63
45
  [key: string]: unknown;
64
46
  }
65
47
  export interface AgentBillingSessionResponse {
@@ -77,36 +59,4 @@ export interface AgentBillingStatusResponse {
77
59
  restrictedActions: string[];
78
60
  [key: string]: unknown;
79
61
  }
80
- export interface ModuleResource {
81
- id: string;
82
- title?: string | null;
83
- description?: string | null;
84
- type?: string;
85
- status?: string | null;
86
- publicUrl?: string | null;
87
- shareToken?: string;
88
- createdAt?: string;
89
- [key: string]: unknown;
90
- }
91
- export interface ModuleListResponse {
92
- items: ModuleResource[];
93
- total: number;
94
- [key: string]: unknown;
95
- }
96
- export interface TestResource {
97
- id: string;
98
- status: string;
99
- title?: string | null;
100
- description?: string | null;
101
- itemCount?: number | null;
102
- previewUrl?: string | null;
103
- publicUrl?: string | null;
104
- createdAt?: string;
105
- [key: string]: unknown;
106
- }
107
- export interface TestListResponse {
108
- items: TestResource[];
109
- total: number;
110
- [key: string]: unknown;
111
- }
112
62
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,qBAAqB,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
package/dist/types.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  /**
3
- * Response types for the TutorFlow Platform API (`/v1/platform/*`).
4
- * These mirror the fields the CLI actually reads. The API may return
5
- * additional fields, which are tolerated via the optional `[key: string]: unknown`
6
- * index signatures on list items.
3
+ * Response types the CLI reads from the Agent Platform account routes
4
+ * (`/v1/platform/agent/*`) and the Content API evaluation route. Content
5
+ * resources are typed loosely in src/content/resource.ts. The API may return
6
+ * additional fields, tolerated via `[key: string]: unknown`.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  //# sourceMappingURL=types.js.map
@@ -0,0 +1,15 @@
1
+ export declare function parsePositiveInt(value: string | undefined, flag: string): number | undefined;
2
+ export declare function parseNonNegativeNumber(value: string | undefined, flag: string): number | undefined;
3
+ export declare function parseChoice<T extends string>(value: string | undefined, flag: string, choices: readonly T[]): T | undefined;
4
+ /** "a, b,c" → ["a", "b", "c"]; undefined stays undefined. */
5
+ export declare function splitList(value: string | undefined): string[] | undefined;
6
+ /** Commander collector for repeatable flags (`--event a --event b`). */
7
+ export declare function collect(value: string, previous?: string[]): string[];
8
+ /** Drop undefined / empty-string fields so the API sees only what was set. */
9
+ export declare function compact(input: Record<string, unknown>): Record<string, unknown>;
10
+ export declare function idempotencyHeaders(key: string | undefined): Record<string, string> | undefined;
11
+ /** Use the given value, or prompt for it on a TTY, or fail with ENOINTERACTIVE. */
12
+ export declare function valueOrPrompt(value: string | undefined, message: string, hint: string): Promise<string>;
13
+ /** Destructive actions need --yes, or a confirmation on a TTY. */
14
+ export declare function confirmOrRequireYes(yes: boolean | undefined, message: string): Promise<void>;
15
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/utils/args.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO5F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOlG;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,CAAC,EAAE,GACpB,CAAC,GAAG,SAAS,CAMf;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAOzE;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAExE;AAED,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI/E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAE9F;AAED,mFAAmF;AACnF,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,kEAAkE;AAClE,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlG"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePositiveInt = parsePositiveInt;
4
+ exports.parseNonNegativeNumber = parseNonNegativeNumber;
5
+ exports.parseChoice = parseChoice;
6
+ exports.splitList = splitList;
7
+ exports.collect = collect;
8
+ exports.compact = compact;
9
+ exports.idempotencyHeaders = idempotencyHeaders;
10
+ exports.valueOrPrompt = valueOrPrompt;
11
+ exports.confirmOrRequireYes = confirmOrRequireYes;
12
+ const prompts_1 = require("@clack/prompts");
13
+ const runtime_1 = require("./runtime");
14
+ /** Shared flag parsing. Every failure is EINVAL with exit code 2. */
15
+ function invalid(message) {
16
+ return new runtime_1.CliError(message, { code: 'EINVAL', exitCode: 2 });
17
+ }
18
+ function parsePositiveInt(value, flag) {
19
+ if (value === undefined)
20
+ return undefined;
21
+ const parsed = Number(value);
22
+ if (!Number.isInteger(parsed) || parsed < 1) {
23
+ throw invalid(`${flag} must be a positive integer (got "${value}")`);
24
+ }
25
+ return parsed;
26
+ }
27
+ function parseNonNegativeNumber(value, flag) {
28
+ if (value === undefined)
29
+ return undefined;
30
+ const parsed = Number(value);
31
+ if (!Number.isFinite(parsed) || parsed < 0) {
32
+ throw invalid(`${flag} must be a non-negative number (got "${value}")`);
33
+ }
34
+ return parsed;
35
+ }
36
+ function parseChoice(value, flag, choices) {
37
+ if (value === undefined)
38
+ return undefined;
39
+ if (!choices.includes(value)) {
40
+ throw invalid(`${flag} must be one of: ${choices.join(', ')} (got "${value}")`);
41
+ }
42
+ return value;
43
+ }
44
+ /** "a, b,c" → ["a", "b", "c"]; undefined stays undefined. */
45
+ function splitList(value) {
46
+ if (value === undefined)
47
+ return undefined;
48
+ const items = value
49
+ .split(',')
50
+ .map((item) => item.trim())
51
+ .filter(Boolean);
52
+ return items.length ? items : undefined;
53
+ }
54
+ /** Commander collector for repeatable flags (`--event a --event b`). */
55
+ function collect(value, previous = []) {
56
+ return [...previous, value];
57
+ }
58
+ /** Drop undefined / empty-string fields so the API sees only what was set. */
59
+ function compact(input) {
60
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== ''));
61
+ }
62
+ function idempotencyHeaders(key) {
63
+ return key ? { 'Idempotency-Key': key } : undefined;
64
+ }
65
+ /** Use the given value, or prompt for it on a TTY, or fail with ENOINTERACTIVE. */
66
+ async function valueOrPrompt(value, message, hint) {
67
+ if (value?.trim())
68
+ return value.trim();
69
+ (0, runtime_1.requireInteractive)(hint);
70
+ const result = await (0, prompts_1.text)({ message });
71
+ if (!result || typeof result === 'symbol') {
72
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
73
+ }
74
+ return result;
75
+ }
76
+ /** Destructive actions need --yes, or a confirmation on a TTY. */
77
+ async function confirmOrRequireYes(yes, message) {
78
+ if (yes)
79
+ return;
80
+ if (!(0, runtime_1.canPrompt)()) {
81
+ throw new runtime_1.CliError(`${message} Pass --yes to confirm in non-interactive or JSON mode.`, {
82
+ code: 'ENOINTERACTIVE',
83
+ exitCode: 2,
84
+ });
85
+ }
86
+ const confirmed = await (0, prompts_1.confirm)({ message });
87
+ if (confirmed !== true) {
88
+ throw new runtime_1.CliError('Cancelled', { code: 'ECANCELLED', exitCode: 130 });
89
+ }
90
+ }
91
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/utils/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * TutorFlow API key kinds, told apart by prefix:
3
+ * tf_content_test_… Content API test key (sandbox classroom, spends nothing)
4
+ * tf_content_… Content API live key (every content command)
5
+ * tf_platform_… deprecated Agent Platform key (account routes only)
6
+ */
7
+ export type ApiKeyKind = 'content_live' | 'content_test' | 'platform' | 'unknown';
8
+ export declare function getApiKeyKind(apiKey: string): ApiKeyKind;
9
+ export declare function maskApiKey(apiKey: string): string;
10
+ export declare const PLATFORM_KEY_MESSAGE: string;
11
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/utils/keys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;AAOlF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAMxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,eAAO,MAAM,oBAAoB,QAIuC,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLATFORM_KEY_MESSAGE = void 0;
4
+ exports.getApiKeyKind = getApiKeyKind;
5
+ exports.maskApiKey = maskApiKey;
6
+ const CONTENT_TEST_PREFIX = 'tf_content_test_';
7
+ const CONTENT_PREFIX = 'tf_content_';
8
+ const PLATFORM_PREFIX = 'tf_platform_';
9
+ const VISIBLE_KEY_CHARS = 10;
10
+ function getApiKeyKind(apiKey) {
11
+ const key = apiKey.trim();
12
+ if (key.startsWith(CONTENT_TEST_PREFIX))
13
+ return 'content_test';
14
+ if (key.startsWith(CONTENT_PREFIX))
15
+ return 'content_live';
16
+ if (key.startsWith(PLATFORM_PREFIX))
17
+ return 'platform';
18
+ return 'unknown';
19
+ }
20
+ function maskApiKey(apiKey) {
21
+ if (apiKey.length <= VISIBLE_KEY_CHARS)
22
+ return '***';
23
+ return `${apiKey.slice(0, VISIBLE_KEY_CHARS)}...`;
24
+ }
25
+ exports.PLATFORM_KEY_MESSAGE = 'tf_platform_ keys no longer work for content commands: TutorFlow moved courses, slides, ' +
26
+ 'tests, modules, videos, games and evaluations to the Content API. Use a tf_content_ key: ' +
27
+ '`tutorflow agent register` returns one (contentApiKey), or create one in the Agent Platform ' +
28
+ 'dashboard, then run `tutorflow auth login --api-key tf_content_...`.';
29
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/utils/keys.ts"],"names":[],"mappings":";;;AAaA,sCAMC;AAED,gCAGC;AAhBD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAC/C,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,cAAc,CAAC;IAC/D,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,cAAc,CAAC;IAC1D,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,IAAI,MAAM,CAAC,MAAM,IAAI,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC;AACpD,CAAC;AAEY,QAAA,oBAAoB,GAC/B,0FAA0F;IAC1F,2FAA2F;IAC3F,8FAA8F;IAC9F,sEAAsE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAmB/C;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,SAAkB,GAAG,IAAI,CAIpF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAgCnE"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAmB/C;AAaD,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,SAAkB,GAAG,IAAI,CAIpF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAiCnE"}