@tutorflow/cli 0.3.0 → 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.
- package/README.md +246 -650
- package/dist/client.d.ts +18 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +85 -18
- package/dist/client.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +41 -26
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +20 -12
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/classroom.d.ts +3 -0
- package/dist/commands/classroom.d.ts.map +1 -0
- package/dist/commands/classroom.js +27 -0
- package/dist/commands/classroom.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/course.d.ts.map +1 -1
- package/dist/commands/course.js +25 -91
- package/dist/commands/course.js.map +1 -1
- package/dist/commands/credits.d.ts +3 -0
- package/dist/commands/credits.d.ts.map +1 -0
- package/dist/commands/credits.js +39 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/evaluate.d.ts +3 -0
- package/dist/commands/evaluate.d.ts.map +1 -1
- package/dist/commands/evaluate.js +135 -44
- package/dist/commands/evaluate.js.map +1 -1
- package/dist/commands/interactive.d.ts +13 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +100 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/learner.d.ts +4 -0
- package/dist/commands/learner.d.ts.map +1 -0
- package/dist/commands/learner.js +76 -0
- package/dist/commands/learner.js.map +1 -0
- package/dist/commands/module.d.ts.map +1 -1
- package/dist/commands/module.js +18 -98
- package/dist/commands/module.js.map +1 -1
- package/dist/commands/platform.d.ts.map +1 -1
- package/dist/commands/platform.js +12 -4
- package/dist/commands/platform.js.map +1 -1
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +69 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/slide.d.ts.map +1 -1
- package/dist/commands/slide.js +25 -97
- package/dist/commands/slide.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +38 -106
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/video.d.ts.map +1 -1
- package/dist/commands/video.js +138 -86
- package/dist/commands/video.js.map +1 -1
- package/dist/commands/webhook.d.ts +3 -0
- package/dist/commands/webhook.d.ts.map +1 -0
- package/dist/commands/webhook.js +75 -0
- package/dist/commands/webhook.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -16
- package/dist/config.js.map +1 -1
- package/dist/content/context.d.ts +26 -0
- package/dist/content/context.d.ts.map +1 -0
- package/dist/content/context.js +74 -0
- package/dist/content/context.js.map +1 -0
- package/dist/content/resource.d.ts +66 -0
- package/dist/content/resource.d.ts.map +1 -0
- package/dist/content/resource.js +181 -0
- package/dist/content/resource.js.map +1 -0
- package/dist/content/runs.d.ts +51 -0
- package/dist/content/runs.d.ts.map +1 -0
- package/dist/content/runs.js +171 -0
- package/dist/content/runs.js.map +1 -0
- package/dist/index.js +71 -21
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +17 -64
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -4
- package/dist/utils/args.d.ts +15 -0
- package/dist/utils/args.d.ts.map +1 -0
- package/dist/utils/args.js +91 -0
- package/dist/utils/args.js.map +1 -0
- package/dist/utils/keys.d.ts +11 -0
- package/dist/utils/keys.d.ts.map +1 -0
- package/dist/utils/keys.js +29 -0
- package/dist/utils/keys.js.map +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +21 -6
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/runtime.d.ts +14 -4
- package/dist/utils/runtime.d.ts.map +1 -1
- package/dist/utils/runtime.js +42 -7
- package/dist/utils/runtime.js.map +1 -1
- package/package.json +4 -3
- package/dist/utils/spinner.d.ts +0 -8
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js +0 -26
- package/dist/utils/spinner.js.map +0 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,19 +1,34 @@
|
|
|
1
|
+
import { CliError } from './utils/runtime';
|
|
1
2
|
export interface IClientConfig {
|
|
2
3
|
apiKey: string;
|
|
3
4
|
baseUrl: string;
|
|
4
5
|
}
|
|
6
|
+
export declare const DEFAULT_BASE_URL = "https://api.tutorflow.io";
|
|
7
|
+
/** An env var counts only when it is set to something non-empty. */
|
|
8
|
+
export declare function envValue(name: string): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Resolution order (env wins so CI/agents can override config without
|
|
11
|
+
* touching ~/.tutorflow/config.json):
|
|
12
|
+
*
|
|
13
|
+
* 1. TUTORFLOW_API_KEY / TUTORFLOW_BASE_URL env vars
|
|
14
|
+
* 2. ~/.tutorflow/config.json
|
|
15
|
+
* 3. baseUrl default
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveConfig(): Promise<IClientConfig>;
|
|
18
|
+
export declare function toApiError(status: number, data: unknown, headerRequestId?: string): CliError;
|
|
5
19
|
export declare class ApiClient {
|
|
6
20
|
private config;
|
|
7
21
|
constructor(config?: IClientConfig);
|
|
8
22
|
static create(): Promise<ApiClient>;
|
|
23
|
+
static createPublic(): Promise<ApiClient>;
|
|
9
24
|
/**
|
|
10
25
|
* Like `create` but throws CliError if no API key is resolvable. Use this
|
|
11
26
|
* in any command that talks to the API so we get a single, consistent
|
|
12
27
|
* "not authenticated" path.
|
|
13
28
|
*/
|
|
14
29
|
static createAuthenticated(): Promise<ApiClient>;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
get apiKey(): string;
|
|
31
|
+
get baseUrl(): string;
|
|
32
|
+
request<T>(method: string, endpoint: string, body?: Record<string, unknown>, extraHeaders?: Record<string, string>): Promise<T>;
|
|
18
33
|
}
|
|
19
34
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAM5D;AAiDD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,CAqB5F;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,CAAC,EAAE,aAAa;WAKrB,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;WAI5B,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAK/C;;;;OAIG;WACU,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC;IAWtD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEK,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC;CAsCd"}
|
package/dist/client.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ApiClient = void 0;
|
|
3
|
+
exports.ApiClient = exports.DEFAULT_BASE_URL = void 0;
|
|
4
|
+
exports.envValue = envValue;
|
|
5
|
+
exports.resolveConfig = resolveConfig;
|
|
6
|
+
exports.toApiError = toApiError;
|
|
4
7
|
const undici_1 = require("undici");
|
|
5
8
|
const config_1 = require("./config");
|
|
6
9
|
const runtime_1 = require("./utils/runtime");
|
|
7
|
-
|
|
10
|
+
exports.DEFAULT_BASE_URL = 'https://api.tutorflow.io';
|
|
11
|
+
/** An env var counts only when it is set to something non-empty. */
|
|
12
|
+
function envValue(name) {
|
|
13
|
+
const value = process.env[name]?.trim();
|
|
14
|
+
return value ? value : undefined;
|
|
15
|
+
}
|
|
8
16
|
/**
|
|
9
17
|
* Resolution order (env wins so CI/agents can override config without
|
|
10
18
|
* touching ~/.tutorflow/config.json):
|
|
@@ -16,17 +24,74 @@ const DEFAULT_BASE_URL = 'https://api.tutorflow.io';
|
|
|
16
24
|
async function resolveConfig() {
|
|
17
25
|
const fileConfig = await (0, config_1.readConfig)();
|
|
18
26
|
return {
|
|
19
|
-
apiKey:
|
|
20
|
-
baseUrl:
|
|
27
|
+
apiKey: envValue('TUTORFLOW_API_KEY') ?? fileConfig.apiKey ?? '',
|
|
28
|
+
baseUrl: envValue('TUTORFLOW_BASE_URL') ?? fileConfig.baseUrl ?? exports.DEFAULT_BASE_URL,
|
|
21
29
|
};
|
|
22
30
|
}
|
|
31
|
+
/** Advice for API error codes an agent can act on. */
|
|
32
|
+
const API_ERROR_HINTS = {
|
|
33
|
+
content_payment_required: 'Add credits: `tutorflow agent billing session` (needs a verified email) or ' +
|
|
34
|
+
'`tutorflow agent billing x402-deposit --amount-usd <n>`. Check the balance with `tutorflow credits balance`.',
|
|
35
|
+
content_platform_key_not_accepted: 'The Content API takes tf_content_ keys only. `tutorflow agent register` returns one (contentApiKey).',
|
|
36
|
+
platform_content_key_too_narrow: 'Account routes need a full live tf_content_ key. Pass --classroom <id> to skip the account lookup.',
|
|
37
|
+
content_insufficient_scope: 'This key lacks the scope named in requiredScope.',
|
|
38
|
+
content_classroom_not_allowed: 'This key cannot reach that classroom. `tutorflow classroom list` shows the ones it can.',
|
|
39
|
+
content_sandbox_unsupported: 'Test keys (tf_content_test_) cannot use this route; use a live key.',
|
|
40
|
+
email_verification_required: 'Verify the account email first: `tutorflow agent verify-email resend`.',
|
|
41
|
+
content_precondition_failed: 'The resource changed meanwhile; fetch it again and retry.',
|
|
42
|
+
};
|
|
43
|
+
const STATUS_HINTS = {
|
|
44
|
+
401: 'Check the API key: `tutorflow auth whoami`.',
|
|
45
|
+
402: API_ERROR_HINTS.content_payment_required,
|
|
46
|
+
429: 'Rate limited; retry after retryAfterSeconds.',
|
|
47
|
+
};
|
|
48
|
+
function readErrorBody(data) {
|
|
49
|
+
if (!data || typeof data !== 'object')
|
|
50
|
+
return undefined;
|
|
51
|
+
const record = data;
|
|
52
|
+
if (record.error && typeof record.error === 'object')
|
|
53
|
+
return record.error;
|
|
54
|
+
if ('message' in record)
|
|
55
|
+
return record;
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
function formatMessage(message) {
|
|
59
|
+
if (Array.isArray(message))
|
|
60
|
+
return message.join('; ');
|
|
61
|
+
return message;
|
|
62
|
+
}
|
|
63
|
+
function toApiError(status, data, headerRequestId) {
|
|
64
|
+
const body = readErrorBody(data);
|
|
65
|
+
const apiCode = typeof body?.code === 'string' ? body.code : undefined;
|
|
66
|
+
const message = formatMessage(body?.message) ?? (typeof data === 'string' && data ? data : JSON.stringify(data));
|
|
67
|
+
const prefix = apiCode ? `API error ${status} ${apiCode}` : `API error ${status}`;
|
|
68
|
+
return new runtime_1.CliError(`${prefix}: ${message}`, {
|
|
69
|
+
code: `EHTTP_${status}`,
|
|
70
|
+
details: {
|
|
71
|
+
status,
|
|
72
|
+
apiCode,
|
|
73
|
+
requestId: body?.requestId ?? headerRequestId,
|
|
74
|
+
retryAfterSeconds: body?.retryAfterSeconds,
|
|
75
|
+
requiredScope: body?.requiredScope,
|
|
76
|
+
validation: Array.isArray(body?.details) ? body?.details : undefined,
|
|
77
|
+
billingSessionUrl: body?.billingSessionUrl,
|
|
78
|
+
x402: body?.x402,
|
|
79
|
+
hint: (apiCode && API_ERROR_HINTS[apiCode]) ?? STATUS_HINTS[status],
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
23
83
|
class ApiClient {
|
|
24
84
|
constructor(config) {
|
|
25
|
-
|
|
85
|
+
const resolved = config || { apiKey: '', baseUrl: exports.DEFAULT_BASE_URL };
|
|
86
|
+
this.config = { ...resolved, baseUrl: resolved.baseUrl.replace(/\/+$/, '') };
|
|
26
87
|
}
|
|
27
88
|
static async create() {
|
|
28
89
|
return new ApiClient(await resolveConfig());
|
|
29
90
|
}
|
|
91
|
+
static async createPublic() {
|
|
92
|
+
const config = await resolveConfig();
|
|
93
|
+
return new ApiClient({ ...config, apiKey: '' });
|
|
94
|
+
}
|
|
30
95
|
/**
|
|
31
96
|
* Like `create` but throws CliError if no API key is resolvable. Use this
|
|
32
97
|
* in any command that talks to the API so we get a single, consistent
|
|
@@ -39,15 +104,23 @@ class ApiClient {
|
|
|
39
104
|
}
|
|
40
105
|
return new ApiClient(config);
|
|
41
106
|
}
|
|
42
|
-
|
|
107
|
+
get apiKey() {
|
|
108
|
+
return this.config.apiKey;
|
|
109
|
+
}
|
|
110
|
+
get baseUrl() {
|
|
111
|
+
return this.config.baseUrl;
|
|
112
|
+
}
|
|
113
|
+
async request(method, endpoint, body, extraHeaders) {
|
|
43
114
|
const url = `${this.config.baseUrl}${endpoint}`;
|
|
115
|
+
const headers = { Accept: 'application/json', ...extraHeaders };
|
|
116
|
+
if (body)
|
|
117
|
+
headers['Content-Type'] = 'application/json';
|
|
118
|
+
if (this.config.apiKey) {
|
|
119
|
+
headers.Authorization = `Bearer ${this.config.apiKey}`;
|
|
120
|
+
}
|
|
44
121
|
const init = {
|
|
45
122
|
method,
|
|
46
|
-
headers
|
|
47
|
-
'Content-Type': 'application/json',
|
|
48
|
-
'X-API-Key': this.config.apiKey,
|
|
49
|
-
...headers,
|
|
50
|
-
},
|
|
123
|
+
headers,
|
|
51
124
|
};
|
|
52
125
|
if (body)
|
|
53
126
|
init.body = JSON.stringify(body);
|
|
@@ -67,16 +140,10 @@ class ApiClient {
|
|
|
67
140
|
// non-JSON response; keep as text
|
|
68
141
|
}
|
|
69
142
|
if (!response.ok) {
|
|
70
|
-
throw
|
|
143
|
+
throw toApiError(response.status, data, response.headers.get('request-id') ?? undefined);
|
|
71
144
|
}
|
|
72
145
|
return data;
|
|
73
146
|
}
|
|
74
|
-
setApiKey(apiKey) {
|
|
75
|
-
this.config.apiKey = apiKey;
|
|
76
|
-
}
|
|
77
|
-
setBaseUrl(baseUrl) {
|
|
78
|
-
this.config.baseUrl = baseUrl;
|
|
79
|
-
}
|
|
80
147
|
}
|
|
81
148
|
exports.ApiClient = ApiClient;
|
|
82
149
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,YAAY,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,YAAY,IAAI,OAAO,CAkLtC"}
|
package/dist/commands/agent.js
CHANGED
|
@@ -4,44 +4,49 @@ exports.agentCommand = agentCommand;
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const prompts_1 = require("@clack/prompts");
|
|
6
6
|
const client_1 = require("../client");
|
|
7
|
+
const keys_1 = require("../utils/keys");
|
|
7
8
|
const config_1 = require("../config");
|
|
8
9
|
const output_1 = require("../utils/output");
|
|
9
10
|
const runtime_1 = require("../utils/runtime");
|
|
10
|
-
const
|
|
11
|
+
const args_1 = require("../utils/args");
|
|
11
12
|
function agentCommand() {
|
|
12
|
-
const agent = new commander_1.Command('agent').description('
|
|
13
|
+
const agent = new commander_1.Command('agent').description('Agent Platform account: registration, balance, billing and email verification');
|
|
13
14
|
agent
|
|
14
15
|
.command('register')
|
|
15
|
-
.description('Self-register
|
|
16
|
+
.description('Self-register an agent account and receive a Content API key (tf_content_)')
|
|
16
17
|
.option('--name <name>', 'Workspace display name')
|
|
17
18
|
.option('--slug <slug>', 'Unique workspace slug')
|
|
18
|
-
.option('--email <email>', 'Contact email
|
|
19
|
+
.option('--email <email>', 'Contact email; needed to verify the account and buy credits')
|
|
19
20
|
.option('--agent-identity <identity>', 'Optional agent identity string')
|
|
20
|
-
.option('--no-save', 'Do not save the returned API key to ~/.tutorflow/config.json')
|
|
21
|
+
.option('--no-save', 'Do not save the returned Content API key to ~/.tutorflow/config.json')
|
|
21
22
|
.action((0, runtime_1.command)(async (options) => {
|
|
22
23
|
const name = await requiredOptionOrPrompt(options.name, 'Workspace display name:', '--name <name>');
|
|
23
24
|
const slug = await requiredOptionOrPrompt(options.slug, 'Workspace slug:', '--slug <slug>');
|
|
24
|
-
const baseUrl = await
|
|
25
|
-
|
|
26
|
-
const
|
|
25
|
+
const { baseUrl } = await (0, client_1.resolveConfig)();
|
|
26
|
+
// Pin the API origin only when it is not the default (staging, self-hosted).
|
|
27
|
+
const savedBaseUrl = baseUrl === client_1.DEFAULT_BASE_URL ? undefined : baseUrl;
|
|
28
|
+
const client = await client_1.ApiClient.createPublic();
|
|
29
|
+
const body = (0, args_1.compact)({
|
|
27
30
|
name,
|
|
28
31
|
slug,
|
|
29
32
|
email: options.email,
|
|
30
33
|
agentIdentity: options.agentIdentity,
|
|
31
|
-
};
|
|
32
|
-
Object.keys(body).forEach((key) => {
|
|
33
|
-
if (body[key] === undefined || body[key] === '')
|
|
34
|
-
delete body[key];
|
|
35
34
|
});
|
|
36
35
|
const response = await client.request('POST', '/v1/platform/agent/register', body);
|
|
36
|
+
// Content commands need the tf_content_ key; the platform key is kept
|
|
37
|
+
// in the answer only for the deprecated /v1/platform content routes.
|
|
38
|
+
const savedKey = response.contentApiKey ?? response.apiKey;
|
|
37
39
|
if (options.save !== false) {
|
|
38
|
-
await (0, config_1.updateConfig)({ apiKey:
|
|
40
|
+
await (0, config_1.updateConfig)({ apiKey: savedKey, baseUrl: savedBaseUrl });
|
|
39
41
|
}
|
|
40
42
|
(0, output_1.printResult)(response);
|
|
43
|
+
if (options.save !== false) {
|
|
44
|
+
(0, output_1.printStatus)(`Saved ${(0, keys_1.maskApiKey)(savedKey)} to ~/.tutorflow/config.json`, 'success');
|
|
45
|
+
}
|
|
41
46
|
}));
|
|
42
47
|
agent
|
|
43
48
|
.command('account')
|
|
44
|
-
.description('Show
|
|
49
|
+
.description('Show balance, defaultClassroomId, sandboxClassroomId and Content API URLs')
|
|
45
50
|
.action((0, runtime_1.command)(async () => {
|
|
46
51
|
const client = await client_1.ApiClient.createAuthenticated();
|
|
47
52
|
const response = await client.request('GET', '/v1/platform/agent/account');
|
|
@@ -64,6 +69,16 @@ function agentCommand() {
|
|
|
64
69
|
const response = await client.request('POST', '/v1/platform/agent/billing/session');
|
|
65
70
|
(0, output_1.printResult)(response);
|
|
66
71
|
}));
|
|
72
|
+
billing
|
|
73
|
+
.command('x402-deposit')
|
|
74
|
+
.description('Get a USDC (Base) deposit address for an amount; pay it, then send the x402 payment')
|
|
75
|
+
.requiredOption('--amount-usd <amount>', 'Amount in USD')
|
|
76
|
+
.action((0, runtime_1.command)(async (options) => {
|
|
77
|
+
const amountUsd = parseAmountUsd(options.amountUsd);
|
|
78
|
+
const client = await client_1.ApiClient.createAuthenticated();
|
|
79
|
+
const response = await client.request('POST', '/v1/platform/agent/billing/x402/deposit', { amountUsd });
|
|
80
|
+
(0, output_1.printResult)(response);
|
|
81
|
+
}));
|
|
67
82
|
agent.addCommand(billing);
|
|
68
83
|
const checkout = new commander_1.Command('checkout').description('Use public checkout token endpoints');
|
|
69
84
|
checkout
|
|
@@ -71,7 +86,7 @@ function agentCommand() {
|
|
|
71
86
|
.description('Read workspace info for a TutorFlow checkout token')
|
|
72
87
|
.requiredOption('--token <token>', 'Checkout token from agent billing session URL')
|
|
73
88
|
.action((0, runtime_1.command)(async (options) => {
|
|
74
|
-
const client = await client_1.ApiClient.
|
|
89
|
+
const client = await client_1.ApiClient.createPublic();
|
|
75
90
|
const qs = new URLSearchParams({ token: options.token });
|
|
76
91
|
const response = await client.request('GET', `/v1/platform/agent/checkout?${qs.toString()}`);
|
|
77
92
|
(0, output_1.printResult)(response);
|
|
@@ -82,14 +97,8 @@ function agentCommand() {
|
|
|
82
97
|
.requiredOption('--token <token>', 'Checkout token from agent billing session URL')
|
|
83
98
|
.requiredOption('--amount-usd <amount>', 'Top-up amount in USD')
|
|
84
99
|
.action((0, runtime_1.command)(async (options) => {
|
|
85
|
-
const amountUsd =
|
|
86
|
-
|
|
87
|
-
throw new runtime_1.CliError('--amount-usd must be a number', {
|
|
88
|
-
code: 'EINVAL',
|
|
89
|
-
exitCode: 2,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
const client = await client_1.ApiClient.create();
|
|
100
|
+
const amountUsd = parseAmountUsd(options.amountUsd);
|
|
101
|
+
const client = await client_1.ApiClient.createPublic();
|
|
93
102
|
const response = await client.request('POST', '/v1/platform/agent/checkout', { token: options.token, amountUsd });
|
|
94
103
|
(0, output_1.printResult)(response);
|
|
95
104
|
}));
|
|
@@ -116,8 +125,14 @@ async function requiredOptionOrPrompt(value, message, flagHint) {
|
|
|
116
125
|
}
|
|
117
126
|
return result;
|
|
118
127
|
}
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
|
|
128
|
+
function parseAmountUsd(value) {
|
|
129
|
+
const amountUsd = Number(value);
|
|
130
|
+
if (!Number.isFinite(amountUsd) || amountUsd <= 0) {
|
|
131
|
+
throw new runtime_1.CliError('--amount-usd must be a positive number', {
|
|
132
|
+
code: 'EINVAL',
|
|
133
|
+
exitCode: 2,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return amountUsd;
|
|
122
137
|
}
|
|
123
138
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":";;AAuBA,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,WAAW,IAAI,OAAO,CA8ErC"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -3,17 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.authCommand = authCommand;
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const prompts_1 = require("@clack/prompts");
|
|
6
|
+
const client_1 = require("../client");
|
|
6
7
|
const config_1 = require("../config");
|
|
8
|
+
const keys_1 = require("../utils/keys");
|
|
7
9
|
const runtime_1 = require("../utils/runtime");
|
|
8
10
|
const output_1 = require("../utils/output");
|
|
9
11
|
function authCommand() {
|
|
10
12
|
const auth = new commander_1.Command('auth').description('Manage authentication');
|
|
11
13
|
auth
|
|
12
14
|
.command('login')
|
|
13
|
-
.description('
|
|
15
|
+
.description('Save an API key (tf_content_… for content commands)')
|
|
14
16
|
.option('--api-key <key>', 'API key (overrides interactive prompt; also reads TUTORFLOW_API_KEY)')
|
|
15
17
|
.action((0, runtime_1.command)(async (options) => {
|
|
16
|
-
let apiKey = options.apiKey ??
|
|
18
|
+
let apiKey = options.apiKey ?? (0, client_1.envValue)('TUTORFLOW_API_KEY');
|
|
17
19
|
if (!apiKey) {
|
|
18
20
|
(0, runtime_1.requireInteractive)('Pass --api-key <key> or set TUTORFLOW_API_KEY.');
|
|
19
21
|
const result = await (0, prompts_1.password)({ message: 'Enter your TutorFlow API key:' });
|
|
@@ -22,12 +24,14 @@ function authCommand() {
|
|
|
22
24
|
}
|
|
23
25
|
apiKey = result;
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
apiKey = apiKey?.trim();
|
|
28
|
+
if (!apiKey) {
|
|
26
29
|
throw new runtime_1.CliError('API key is empty', { code: 'EINVAL', exitCode: 2 });
|
|
27
30
|
}
|
|
28
31
|
await (0, config_1.updateConfig)({ apiKey });
|
|
29
|
-
(0,
|
|
30
|
-
(0, output_1.
|
|
32
|
+
const keyKind = (0, keys_1.getApiKeyKind)(apiKey);
|
|
33
|
+
(0, output_1.printStatus)('Authentication saved', 'success');
|
|
34
|
+
(0, output_1.printResult)({ ok: true, apiKeyPreview: (0, keys_1.maskApiKey)(apiKey), keyKind, warning: keyWarning(keyKind) });
|
|
31
35
|
}));
|
|
32
36
|
auth
|
|
33
37
|
.command('logout')
|
|
@@ -36,7 +40,7 @@ function authCommand() {
|
|
|
36
40
|
.action((0, runtime_1.command)(async (options) => {
|
|
37
41
|
if (!options.force) {
|
|
38
42
|
// In non-interactive mode require --force so we never block silently.
|
|
39
|
-
if (!
|
|
43
|
+
if (!(0, runtime_1.canPrompt)()) {
|
|
40
44
|
throw new runtime_1.CliError('Pass --force to logout in non-interactive mode.', {
|
|
41
45
|
code: 'ENOINTERACTIVE',
|
|
42
46
|
exitCode: 2,
|
|
@@ -55,21 +59,25 @@ function authCommand() {
|
|
|
55
59
|
}));
|
|
56
60
|
auth
|
|
57
61
|
.command('whoami')
|
|
58
|
-
.description('Show
|
|
62
|
+
.description('Show which key and API the CLI will use (no network call)')
|
|
59
63
|
.action((0, runtime_1.command)(async () => {
|
|
60
|
-
const
|
|
61
|
-
const apiKey = process.env.TUTORFLOW_API_KEY ?? fileConfig.apiKey;
|
|
62
|
-
const baseUrl = process.env.TUTORFLOW_BASE_URL ?? fileConfig.baseUrl ?? 'https://api.tutorflow.io';
|
|
64
|
+
const { apiKey, baseUrl } = await (0, client_1.resolveConfig)();
|
|
63
65
|
if (!apiKey) {
|
|
64
66
|
throw new runtime_1.CliError('Not authenticated', { code: 'EAUTH', exitCode: 1 });
|
|
65
67
|
}
|
|
68
|
+
const keyKind = (0, keys_1.getApiKeyKind)(apiKey);
|
|
66
69
|
(0, output_1.printResult)({
|
|
67
70
|
authenticated: true,
|
|
68
|
-
apiKeyPreview:
|
|
71
|
+
apiKeyPreview: (0, keys_1.maskApiKey)(apiKey),
|
|
72
|
+
keyKind,
|
|
69
73
|
baseUrl,
|
|
70
|
-
source:
|
|
74
|
+
source: (0, client_1.envValue)('TUTORFLOW_API_KEY') ? 'env' : 'config',
|
|
75
|
+
warning: keyWarning(keyKind),
|
|
71
76
|
});
|
|
72
77
|
}));
|
|
73
78
|
return auth;
|
|
74
79
|
}
|
|
80
|
+
function keyWarning(keyKind) {
|
|
81
|
+
return keyKind === 'platform' ? keys_1.PLATFORM_KEY_MESSAGE : undefined;
|
|
82
|
+
}
|
|
75
83
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classroom.d.ts","sourceRoot":"","sources":["../../src/commands/classroom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,gBAAgB,IAAI,OAAO,CAwB1C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classroomCommand = classroomCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const output_1 = require("../utils/output");
|
|
6
|
+
const runtime_1 = require("../utils/runtime");
|
|
7
|
+
const context_1 = require("../content/context");
|
|
8
|
+
function classroomCommand() {
|
|
9
|
+
const classroom = new commander_1.Command('classroom').description('Classrooms this Content API key can reach');
|
|
10
|
+
classroom
|
|
11
|
+
.command('list')
|
|
12
|
+
.description('List classrooms (pin one with --classroom, TUTORFLOW_CLASSROOM_ID or `config set classroomId`)')
|
|
13
|
+
.action((0, runtime_1.command)(async () => {
|
|
14
|
+
const client = await (0, context_1.createContentClient)();
|
|
15
|
+
const classrooms = await client.request('GET', '/v1/content/classrooms');
|
|
16
|
+
(0, output_1.printResult)((0, runtime_1.isJsonMode)()
|
|
17
|
+
? classrooms
|
|
18
|
+
: classrooms.map((c) => ({
|
|
19
|
+
ID: c.id,
|
|
20
|
+
Name: c.name ?? '',
|
|
21
|
+
Slug: c.slug ?? '',
|
|
22
|
+
Sandbox: c.isSandbox ? 'yes' : '',
|
|
23
|
+
})));
|
|
24
|
+
}));
|
|
25
|
+
return classroom;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=classroom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classroom.js","sourceRoot":"","sources":["../../src/commands/classroom.ts"],"names":[],"mappings":";;AAaA,4CAwBC;AArCD,yCAAoC;AACpC,4CAA8C;AAC9C,8CAAuD;AACvD,gDAAyD;AAUzD,SAAgB,gBAAgB;IAC9B,MAAM,SAAS,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAEpG,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gGAAgG,CAAC;SAC7G,MAAM,CACL,IAAA,iBAAO,EAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAmB,GAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAc,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACtF,IAAA,oBAAW,EACT,IAAA,oBAAU,GAAE;YACV,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;aAClC,CAAC,CAAC,CACR,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,aAAa,IAAI,OAAO,CA4CvC"}
|
package/dist/commands/config.js
CHANGED
|
@@ -5,7 +5,8 @@ const commander_1 = require("commander");
|
|
|
5
5
|
const config_1 = require("../config");
|
|
6
6
|
const output_1 = require("../utils/output");
|
|
7
7
|
const runtime_1 = require("../utils/runtime");
|
|
8
|
-
const
|
|
8
|
+
const keys_1 = require("../utils/keys");
|
|
9
|
+
const VALID_KEYS = ['apiKey', 'baseUrl', 'classroomId', 'workspace'];
|
|
9
10
|
function configCommand() {
|
|
10
11
|
const config = new commander_1.Command('config').description('Manage CLI configuration');
|
|
11
12
|
config
|
|
@@ -40,14 +41,13 @@ function configCommand() {
|
|
|
40
41
|
return config;
|
|
41
42
|
}
|
|
42
43
|
function maskIfSecret(key, value) {
|
|
43
|
-
|
|
44
|
-
return `${value.slice(0, 10)}...`;
|
|
45
|
-
return value;
|
|
44
|
+
return key === 'apiKey' ? (0, keys_1.maskApiKey)(value) : value;
|
|
46
45
|
}
|
|
47
46
|
function maskConfig(cfg) {
|
|
48
47
|
return {
|
|
49
48
|
apiKey: cfg.apiKey ? maskIfSecret('apiKey', cfg.apiKey) : undefined,
|
|
50
49
|
baseUrl: cfg.baseUrl,
|
|
50
|
+
classroomId: cfg.classroomId,
|
|
51
51
|
workspace: cfg.workspace,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/commands/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/commands/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,aAAa,IAAI,OAAO,CA0BvC"}
|