@baijimu/cli 0.1.4

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 (59) hide show
  1. package/README.md +101 -0
  2. package/dist/args.d.ts +9 -0
  3. package/dist/args.js +54 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/commands/agent.d.ts +1 -0
  6. package/dist/commands/agent.js +177 -0
  7. package/dist/commands/agent.js.map +1 -0
  8. package/dist/commands/api.d.ts +3 -0
  9. package/dist/commands/api.js +52 -0
  10. package/dist/commands/api.js.map +1 -0
  11. package/dist/commands/auth.d.ts +1 -0
  12. package/dist/commands/auth.js +166 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/db-profile.d.ts +1 -0
  15. package/dist/commands/db-profile.js +66 -0
  16. package/dist/commands/db-profile.js.map +1 -0
  17. package/dist/commands/hosted-service.d.ts +1 -0
  18. package/dist/commands/hosted-service.js +332 -0
  19. package/dist/commands/hosted-service.js.map +1 -0
  20. package/dist/commands/module.d.ts +1 -0
  21. package/dist/commands/module.js +199 -0
  22. package/dist/commands/module.js.map +1 -0
  23. package/dist/commands/platform-app.d.ts +1 -0
  24. package/dist/commands/platform-app.js +225 -0
  25. package/dist/commands/platform-app.js.map +1 -0
  26. package/dist/commands/project.d.ts +1 -0
  27. package/dist/commands/project.js +206 -0
  28. package/dist/commands/project.js.map +1 -0
  29. package/dist/commands/runtime.d.ts +1 -0
  30. package/dist/commands/runtime.js +86 -0
  31. package/dist/commands/runtime.js.map +1 -0
  32. package/dist/commands/skill.d.ts +1 -0
  33. package/dist/commands/skill.js +224 -0
  34. package/dist/commands/skill.js.map +1 -0
  35. package/dist/commands/workspace.d.ts +1 -0
  36. package/dist/commands/workspace.js +32 -0
  37. package/dist/commands/workspace.js.map +1 -0
  38. package/dist/config.d.ts +10 -0
  39. package/dist/config.js +71 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/errors.d.ts +5 -0
  42. package/dist/errors.js +14 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/help.d.ts +1 -0
  45. package/dist/help.js +103 -0
  46. package/dist/help.js.map +1 -0
  47. package/dist/http.d.ts +12 -0
  48. package/dist/http.js +82 -0
  49. package/dist/http.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +86 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/json.d.ts +3 -0
  54. package/dist/json.js +19 -0
  55. package/dist/json.js.map +1 -0
  56. package/dist/types.d.ts +26 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +35 -0
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Baijimu CLI
2
+
3
+ `baijimu` is a local CLI for Codex/agents and developers to operate Baijimu through PAT-authenticated Partner APIs.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @baijimu/cli
9
+ ```
10
+
11
+ For local development:
12
+
13
+ ```bash
14
+ npm install
15
+ npm run build
16
+ npm link
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```bash
22
+ baijimu auth login
23
+ baijimu auth status --verify
24
+ baijimu workspace list
25
+ baijimu project file list 123
26
+ baijimu project git status 123
27
+ baijimu api POST /partner/v1/workspaces/list --data '{"page":1,"pageSize":20}'
28
+ ```
29
+
30
+ ## Commands
31
+
32
+ ```bash
33
+ baijimu auth login [--workspace-id <id>] [--scope <scope,...>] [--no-browser]
34
+ baijimu auth login --token <lc_pat_...>
35
+ baijimu auth token set <lc_pat_...>
36
+ baijimu auth status [--verify]
37
+ baijimu auth logout
38
+
39
+ baijimu api <METHOD> <PATH> [--data <json|@file>] [--query k=v] [--header 'Name: value']
40
+
41
+ baijimu workspace list [--page 1] [--page-size 20]
42
+ baijimu workspace get <workspaceId>
43
+
44
+ baijimu project file list <projectId> [path]
45
+ baijimu project file read <projectId> <path> [--include-binary]
46
+ baijimu project file write <projectId> <path> (--content <text>|--content-file <file>) [--encoding text|base64] [--no-create]
47
+ baijimu project file grep <projectId> <query> [path] [--regex] [--case-sensitive] [--max-results n] [--include glob] [--exclude glob]
48
+ baijimu project file download <projectId> [path]
49
+ baijimu project file import-url <projectId> <targetPath> --source-url <url> [--file-name name] [--content-type type]
50
+
51
+ baijimu project git status <projectId>
52
+ baijimu project git head <projectId>
53
+ baijimu project git log <projectId> [--limit n]
54
+ baijimu project git diff <projectId> <filePath> [--staged]
55
+ baijimu project git commit <projectId> --message <message> [--file path ...]
56
+ baijimu project git pull <projectId>
57
+ baijimu project git push <projectId>
58
+ baijimu project git rollback <projectId> <file...>
59
+ baijimu project git reset <projectId> <commitId>
60
+
61
+ baijimu agent session create <projectId> --agent-config-id <id> [--title title] [--metadata <json|@file>]
62
+ baijimu agent session list <projectId> [--limit n] [--offset n]
63
+ baijimu agent session recent [--limit n] [--offset n]
64
+ baijimu agent session get <projectId> <sessionId>
65
+ baijimu agent session messages <projectId> <sessionId> [--limit n] [--offset n] [--before-message-id id]
66
+ baijimu agent session audit <projectId> <sessionId>
67
+ baijimu agent session delete <projectId> <sessionId>
68
+ baijimu agent chat <projectId> <sessionId> --message <text> [--agent-config-id id] [--client-message-id id]
69
+
70
+ baijimu module list <workspaceId> [--project-id <projectId>]
71
+ baijimu module publish <workspaceId> <projectId> --module-id <moduleId> --version <semver> [--commit-id <id>] [--description <text>] [--scope-type <scope>]
72
+
73
+ baijimu runtime app install <workspaceId> --module-id <moduleId> [--version-id <versionId>] [--properties <json|@file>]
74
+ baijimu runtime app upgrade <workspaceId> --module-id <moduleId> --version-id <versionId> [--properties <json|@file>]
75
+ baijimu runtime app update-properties <workspaceId> --module-id <moduleId> --properties <json|@file>
76
+ baijimu runtime app uninstall <workspaceId> --module-id <moduleId>
77
+ ```
78
+
79
+ Credentials are stored under `~/.config/baijimu-cli/config.json` with mode `0600` on POSIX systems.
80
+
81
+ Default API endpoint: `https://www.baijimu.com/lowcode3`.
82
+
83
+ `agent chat` sends a message to an existing session. Use `baijimu agent session messages` to read session messages and replies.
84
+
85
+ ## Release
86
+
87
+ The package is published to npmjs as `@baijimu/cli`.
88
+
89
+ Manual release:
90
+
91
+ ```bash
92
+ npm ci
93
+ npm run test
94
+ npm run pack:check
95
+ npm run release:npm
96
+ ```
97
+
98
+ Jenkins release uses the repository `Jenkinsfile`. Configure a Secret text credential named
99
+ `npmjs-baijimu-publish-token` with an npm granular access token that can publish `@baijimu/cli`
100
+ and has bypass 2FA enabled for CI publishing. Run the job once with `DRY_RUN=true` to verify
101
+ install, tests, and package contents. Publish from `main` with `DRY_RUN=false`.
package/dist/args.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export interface ParsedOptions {
2
+ values: Record<string, string[]>;
3
+ flags: Set<string>;
4
+ positionals: string[];
5
+ }
6
+ export declare function parseOptions(args: string[]): ParsedOptions;
7
+ export declare function option(options: ParsedOptions, name: string): string | undefined;
8
+ export declare function optionList(options: ParsedOptions, name: string): string[];
9
+ export declare function hasFlag(options: ParsedOptions, name: string): boolean;
package/dist/args.js ADDED
@@ -0,0 +1,54 @@
1
+ import { CliError } from "./errors.js";
2
+ export function parseOptions(args) {
3
+ const values = {};
4
+ const flags = new Set();
5
+ const positionals = [];
6
+ for (let i = 0; i < args.length; i += 1) {
7
+ const arg = args[i];
8
+ if (arg === "--") {
9
+ positionals.push(...args.slice(i + 1));
10
+ break;
11
+ }
12
+ if (!arg.startsWith("--")) {
13
+ positionals.push(arg);
14
+ continue;
15
+ }
16
+ const eq = arg.indexOf("=");
17
+ const rawName = eq > 0 ? arg.slice(2, eq) : arg.slice(2);
18
+ const name = normalizeOptionName(rawName);
19
+ if (!name) {
20
+ throw new CliError(`非法参数: ${arg}`);
21
+ }
22
+ if (eq > 0) {
23
+ pushValue(values, name, arg.slice(eq + 1));
24
+ continue;
25
+ }
26
+ const next = args[i + 1];
27
+ if (next && !next.startsWith("--")) {
28
+ pushValue(values, name, next);
29
+ i += 1;
30
+ }
31
+ else {
32
+ flags.add(name);
33
+ }
34
+ }
35
+ return { values, flags, positionals };
36
+ }
37
+ export function option(options, name) {
38
+ const values = options.values[normalizeOptionName(name)];
39
+ return values ? values[values.length - 1] : undefined;
40
+ }
41
+ export function optionList(options, name) {
42
+ return options.values[normalizeOptionName(name)] || [];
43
+ }
44
+ export function hasFlag(options, name) {
45
+ return options.flags.has(normalizeOptionName(name));
46
+ }
47
+ function pushValue(values, name, value) {
48
+ values[name] ||= [];
49
+ values[name].push(value);
50
+ }
51
+ function normalizeOptionName(name) {
52
+ return name.trim().replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);
53
+ }
54
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runAgentCommand(args: string[]): Promise<void>;
@@ -0,0 +1,177 @@
1
+ import { currentAuth, currentEnvironment, loadConfig } from "../config.js";
2
+ import { assertCondition, CliError } from "../errors.js";
3
+ import { BaijimuHttpClient } from "../http.js";
4
+ import { option, parseOptions } from "../args.js";
5
+ import { parseJsonInput, printJson } from "../json.js";
6
+ export async function runAgentCommand(args) {
7
+ const [area, ...rest] = args;
8
+ const client = await authenticatedClient();
9
+ if (area === "session" || area === "sessions") {
10
+ await runAgentSessionCommand(client, rest);
11
+ return;
12
+ }
13
+ if (area === "chat") {
14
+ await runAgentChatCommand(client, rest);
15
+ return;
16
+ }
17
+ throw new CliError("用法: baijimu agent <session|chat> ...");
18
+ }
19
+ async function runAgentChatCommand(client, args) {
20
+ const [projectId, sessionId, ...rest] = args;
21
+ assertCondition(projectId && sessionId, "用法: baijimu agent chat <projectId> <sessionId> --message <text> [--agent-config-id id] [--client-message-id id]");
22
+ const options = parseOptions(rest);
23
+ const message = option(options, "message");
24
+ assertCondition(message, "缺少 --message");
25
+ const body = {
26
+ data: {
27
+ type: "input",
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: message
32
+ }
33
+ ]
34
+ }
35
+ };
36
+ const agentConfigId = option(options, "agent-config-id");
37
+ const clientMessageId = option(options, "client-message-id");
38
+ if (agentConfigId) {
39
+ body.agentConfigId = Number(agentConfigId);
40
+ }
41
+ if (clientMessageId) {
42
+ body.metadata = { clientMessageId };
43
+ }
44
+ printJson(await client.request({
45
+ method: "POST",
46
+ path: `/partner/v1/projects/${projectId}/sessions/${sessionId}/messages`,
47
+ body
48
+ }));
49
+ }
50
+ async function runAgentSessionCommand(client, args) {
51
+ const [subcommand, projectId, sessionId, ...rest] = args;
52
+ assertCondition(subcommand, "用法: baijimu agent session <create|list|recent|get|messages|audit|delete> ...");
53
+ if (subcommand === "recent") {
54
+ const options = parseOptions([projectId, sessionId, ...rest].filter(Boolean));
55
+ printJson(await client.request({
56
+ method: "POST",
57
+ path: "/partner/v1/agent-sessions/recent",
58
+ body: bodyFromOptions(options, ["limit", "offset"])
59
+ }));
60
+ return;
61
+ }
62
+ assertCondition(projectId, `用法: baijimu agent session ${subcommand} <projectId> ...`);
63
+ if (subcommand === "create") {
64
+ const options = parseOptions([sessionId, ...rest].filter(Boolean));
65
+ const agentConfigId = option(options, "agent-config-id");
66
+ assertCondition(agentConfigId, "create 需要 --agent-config-id");
67
+ const metadataInput = option(options, "metadata");
68
+ const metadata = metadataInput ? await parseJsonInput(metadataInput, undefined) : undefined;
69
+ const body = {
70
+ agentConfigId: Number(agentConfigId),
71
+ channel: option(options, "channel") || "baijimu-cli"
72
+ };
73
+ const sessionTitle = option(options, "title");
74
+ const agentName = option(options, "agent-name");
75
+ const statusMessage = option(options, "status-message");
76
+ const parentSessionId = option(options, "parent-session-id");
77
+ const browserProfileId = option(options, "browser-profile-id");
78
+ if (sessionTitle) {
79
+ body.sessionTitle = sessionTitle;
80
+ }
81
+ if (agentName) {
82
+ body.agentName = agentName;
83
+ }
84
+ if (statusMessage) {
85
+ body.statusMessage = statusMessage;
86
+ }
87
+ if (parentSessionId) {
88
+ body.parentSessionId = parentSessionId;
89
+ }
90
+ if (browserProfileId) {
91
+ body.browserProfileId = Number(browserProfileId);
92
+ }
93
+ if (metadata !== undefined) {
94
+ body.metadata = metadata;
95
+ }
96
+ printJson(await client.request({
97
+ method: "POST",
98
+ path: `/partner/v1/projects/${projectId}/agent-sessions/create`,
99
+ body
100
+ }));
101
+ return;
102
+ }
103
+ if (subcommand === "list") {
104
+ const options = parseOptions([sessionId, ...rest].filter(Boolean));
105
+ printJson(await client.request({
106
+ method: "POST",
107
+ path: `/partner/v1/projects/${projectId}/agent-sessions/list`,
108
+ body: bodyFromOptions(options, ["limit", "offset"])
109
+ }));
110
+ return;
111
+ }
112
+ if (subcommand === "get") {
113
+ assertCondition(sessionId, "用法: baijimu agent session get <projectId> <sessionId>");
114
+ printJson(await client.request({
115
+ method: "POST",
116
+ path: `/partner/v1/projects/${projectId}/agent-sessions/${sessionId}/get`
117
+ }));
118
+ return;
119
+ }
120
+ if (subcommand === "messages") {
121
+ assertCondition(sessionId, "用法: baijimu agent session messages <projectId> <sessionId> [--limit n] [--before-message-id id]");
122
+ const options = parseOptions(rest);
123
+ const beforeMessageId = option(options, "before-message-id");
124
+ printJson(await client.request({
125
+ method: "POST",
126
+ path: `/partner/v1/projects/${projectId}/agent-sessions/${sessionId}/${beforeMessageId ? "messages-cursor" : "messages"}`,
127
+ body: bodyFromOptions(options, beforeMessageId ? ["limit", "before-message-id"] : ["limit", "offset"])
128
+ }));
129
+ return;
130
+ }
131
+ if (subcommand === "audit") {
132
+ assertCondition(sessionId, "用法: baijimu agent session audit <projectId> <sessionId>");
133
+ const options = parseOptions(rest);
134
+ printJson(await client.request({
135
+ method: "POST",
136
+ path: `/partner/v1/projects/${projectId}/agent-sessions/${sessionId}/audit`,
137
+ body: bodyFromOptions(options, ["workspace-id", "message-limit", "trace-limit", "billing-limit"])
138
+ }));
139
+ return;
140
+ }
141
+ if (subcommand === "delete") {
142
+ assertCondition(sessionId, "用法: baijimu agent session delete <projectId> <sessionId>");
143
+ printJson(await client.request({
144
+ method: "POST",
145
+ path: `/partner/v1/projects/${projectId}/agent-sessions/${sessionId}/delete`
146
+ }));
147
+ return;
148
+ }
149
+ throw new CliError("用法: baijimu agent session <create|list|recent|get|messages|audit|delete> ...");
150
+ }
151
+ function bodyFromOptions(options, names) {
152
+ const body = {};
153
+ for (const name of names) {
154
+ const value = option(options, name);
155
+ if (value !== undefined) {
156
+ const key = toCamelCase(name);
157
+ body[key] = isNumericOption(name) ? Number(value) : value;
158
+ }
159
+ }
160
+ return body;
161
+ }
162
+ function toCamelCase(name) {
163
+ return name.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
164
+ }
165
+ function isNumericOption(name) {
166
+ return ["limit", "offset", "workspace-id", "message-limit", "trace-limit", "billing-limit"].includes(name);
167
+ }
168
+ async function authenticatedClient() {
169
+ const config = await loadConfig();
170
+ const auth = currentAuth(config);
171
+ assertCondition(auth.token, "当前环境未登录,请先执行 baijimu auth login");
172
+ return new BaijimuHttpClient({
173
+ environment: currentEnvironment(config),
174
+ token: auth.token
175
+ });
176
+ }
177
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function runApiCommand(args: string[]): Promise<void>;
2
+ export declare function parseQueryOptions(values: string[]): Record<string, string[]>;
3
+ export declare function parseHeaderOptions(values: string[]): Record<string, string>;
@@ -0,0 +1,52 @@
1
+ import { currentAuth, currentEnvironment, loadConfig } from "../config.js";
2
+ import { assertCondition, CliError } from "../errors.js";
3
+ import { BaijimuHttpClient } from "../http.js";
4
+ import { option, optionList, parseOptions } from "../args.js";
5
+ import { parseJsonInput, printJson } from "../json.js";
6
+ export async function runApiCommand(args) {
7
+ const [method, path, ...rest] = args;
8
+ assertCondition(method && path, "用法: baijimu api <METHOD> <PATH> [--data <json|@file>]");
9
+ const options = parseOptions(rest);
10
+ const config = await loadConfig();
11
+ const env = currentEnvironment(config);
12
+ const auth = currentAuth(config);
13
+ assertCondition(auth.token, "当前环境未登录,请先执行 baijimu auth login --token <lc_pat_...>");
14
+ const client = new BaijimuHttpClient({
15
+ environment: env,
16
+ token: auth.token
17
+ });
18
+ const result = await client.request({
19
+ method,
20
+ path,
21
+ body: await parseJsonInput(option(options, "data"), undefined),
22
+ query: parseQueryOptions(optionList(options, "query")),
23
+ headers: parseHeaderOptions(optionList(options, "header"))
24
+ });
25
+ printJson(result);
26
+ }
27
+ export function parseQueryOptions(values) {
28
+ const query = {};
29
+ for (const value of values) {
30
+ const index = value.indexOf("=");
31
+ if (index <= 0) {
32
+ throw new CliError(`--query 必须是 k=v 格式: ${value}`);
33
+ }
34
+ const key = value.slice(0, index);
35
+ const item = value.slice(index + 1);
36
+ query[key] ||= [];
37
+ query[key].push(item);
38
+ }
39
+ return query;
40
+ }
41
+ export function parseHeaderOptions(values) {
42
+ const headers = {};
43
+ for (const value of values) {
44
+ const index = value.indexOf(":");
45
+ if (index <= 0) {
46
+ throw new CliError(`--header 必须是 'Name: value' 格式: ${value}`);
47
+ }
48
+ headers[value.slice(0, index).trim()] = value.slice(index + 1).trim();
49
+ }
50
+ return headers;
51
+ }
52
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runAuthCommand(args: string[]): Promise<void>;
@@ -0,0 +1,166 @@
1
+ import { currentAuth, currentEnvironment, loadConfig, maskToken, saveConfig, setCurrentAuth } from "../config.js";
2
+ import { BaijimuHttpClient } from "../http.js";
3
+ import { hasFlag, option, parseOptions } from "../args.js";
4
+ import { assertCondition } from "../errors.js";
5
+ import { printJson } from "../json.js";
6
+ import { spawn } from "node:child_process";
7
+ export async function runAuthCommand(args) {
8
+ const [subcommand, ...rest] = args;
9
+ if (subcommand === "login") {
10
+ const options = parseOptions(rest);
11
+ if (option(options, "token") || options.positionals[0]?.startsWith("lc_pat_")) {
12
+ await setToken(rest);
13
+ return;
14
+ }
15
+ await loginWithDeviceFlow(rest);
16
+ return;
17
+ }
18
+ if (subcommand === "token" && rest[0] === "set") {
19
+ await setToken(rest.slice(1));
20
+ return;
21
+ }
22
+ if (subcommand === "status") {
23
+ const options = parseOptions(rest);
24
+ const config = await loadConfig();
25
+ const env = currentEnvironment(config);
26
+ const auth = currentAuth(config);
27
+ const result = {
28
+ environment: config.currentEnv,
29
+ baseUrl: env.baseUrl,
30
+ authenticated: Boolean(auth.token),
31
+ tokenType: auth.tokenType || null,
32
+ token: maskToken(auth.token),
33
+ loginAt: auth.loginAt || null
34
+ };
35
+ if (hasFlag(options, "verify")) {
36
+ assertCondition(auth.token, "当前环境未登录");
37
+ const client = new BaijimuHttpClient({ environment: env, token: auth.token });
38
+ result.verification = await client.request({
39
+ method: "POST",
40
+ path: "/partner/v1/workspaces/list",
41
+ body: { page: 1, pageSize: 1 }
42
+ });
43
+ }
44
+ printJson(result);
45
+ return;
46
+ }
47
+ if (subcommand === "logout") {
48
+ const config = await loadConfig();
49
+ delete config.auth[config.currentEnv];
50
+ await saveConfig(config);
51
+ printJson({ environment: config.currentEnv, authenticated: false });
52
+ return;
53
+ }
54
+ throw new Error("用法: baijimu auth <login|token set|status|logout>");
55
+ }
56
+ async function setToken(args) {
57
+ const options = parseOptions(args);
58
+ const token = option(options, "token") || options.positionals[0];
59
+ assertCondition(token, "用法: baijimu auth login --token <lc_pat_...>");
60
+ assertCondition(token.startsWith("lc_pat_"), "当前 CLI 只接受 Baijimu PAT: token 必须以 lc_pat_ 开头");
61
+ const config = await loadConfig();
62
+ setCurrentAuth(config, {
63
+ token,
64
+ tokenType: "pat",
65
+ loginAt: new Date().toISOString()
66
+ });
67
+ await saveConfig(config);
68
+ printJson({
69
+ environment: config.currentEnv,
70
+ authenticated: true,
71
+ token: maskToken(token)
72
+ });
73
+ }
74
+ async function loginWithDeviceFlow(args) {
75
+ const options = parseOptions(args);
76
+ const config = await loadConfig();
77
+ const env = currentEnvironment(config);
78
+ const client = new BaijimuHttpClient({ environment: env });
79
+ const scopes = [
80
+ ...options.positionals.filter((item) => item.includes(":")),
81
+ ...((option(options, "scope") || "")
82
+ .split(",")
83
+ .map((item) => item.trim())
84
+ .filter(Boolean))
85
+ ];
86
+ const workspaceId = option(options, "workspace-id");
87
+ const tokenExpiresDays = option(options, "token-expires-days");
88
+ const start = await client.request({
89
+ method: "POST",
90
+ path: "/api/agent-cli-auth/start",
91
+ body: {
92
+ deviceName: option(options, "device-name") || defaultDeviceName(),
93
+ workspaceId: workspaceId ? Number(workspaceId) : null,
94
+ scopes,
95
+ tokenExpiresDays: tokenExpiresDays ? Number(tokenExpiresDays) : null
96
+ }
97
+ });
98
+ process.stdout.write(`请在浏览器中批准 Baijimu CLI 授权。\n`);
99
+ process.stdout.write(`授权码: ${start.userCode}\n`);
100
+ process.stdout.write(`授权链接: ${start.verificationUriComplete}\n`);
101
+ if (!hasFlag(options, "no-browser")) {
102
+ openBrowser(start.verificationUriComplete);
103
+ }
104
+ const deadline = Date.now() + Math.max(30, start.expiresIn || 600) * 1000;
105
+ let intervalMs = Math.max(1, start.interval || 5) * 1000;
106
+ while (Date.now() < deadline) {
107
+ await sleep(intervalMs);
108
+ const poll = await client.request({
109
+ method: "POST",
110
+ path: "/api/agent-cli-auth/poll",
111
+ body: { deviceCode: start.deviceCode }
112
+ });
113
+ if (poll.status === "pending") {
114
+ intervalMs = Math.max(1, poll.interval || start.interval || 5) * 1000;
115
+ continue;
116
+ }
117
+ if (poll.status === "authorized") {
118
+ const token = poll.authorizedPayload?.token;
119
+ assertCondition(token && token.startsWith("lc_pat_"), "授权成功但响应缺少有效 PAT");
120
+ setCurrentAuth(config, {
121
+ token,
122
+ tokenType: "pat",
123
+ loginAt: new Date().toISOString()
124
+ });
125
+ await saveConfig(config);
126
+ printJson({
127
+ environment: config.currentEnv,
128
+ authenticated: true,
129
+ token: maskToken(token),
130
+ userId: poll.authorizedPayload?.userId || null,
131
+ workspaceId: poll.authorizedPayload?.workspaceId || null,
132
+ scopes: poll.authorizedPayload?.scopes || []
133
+ });
134
+ return;
135
+ }
136
+ if (poll.status === "denied") {
137
+ throw new Error("用户拒绝了 Baijimu CLI 授权");
138
+ }
139
+ if (poll.status === "expired") {
140
+ throw new Error("Baijimu CLI 授权请求已过期");
141
+ }
142
+ }
143
+ throw new Error("等待 Baijimu CLI 授权超时");
144
+ }
145
+ function openBrowser(url) {
146
+ const command = process.platform === "darwin"
147
+ ? "open"
148
+ : process.platform === "win32"
149
+ ? "cmd"
150
+ : "xdg-open";
151
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
152
+ const child = spawn(command, args, {
153
+ detached: true,
154
+ stdio: "ignore"
155
+ });
156
+ child.unref();
157
+ }
158
+ function defaultDeviceName() {
159
+ return `Baijimu CLI on ${process.platform}`;
160
+ }
161
+ function sleep(ms) {
162
+ return new Promise((resolve) => {
163
+ setTimeout(resolve, ms);
164
+ });
165
+ }
166
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAClH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA2B3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9E,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAChD,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAA4B;YACtC,WAAW,EAAE,MAAM,CAAC,UAAU;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;YACjC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;SAC9B,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC/B,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;gBACzC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACjE,eAAe,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC;IACtE,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,8CAA8C,CAAC,CAAC;IAE7F,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,cAAc,CAAC,MAAM,EAAE;QACrB,KAAK;QACL,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAC,CAAC;IACH,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,CAAC;QACR,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,aAAa,EAAE,IAAI;QACnB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;KACxB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAc;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG;QACb,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3D,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;aACjC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;KACpB,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACjC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE;YACJ,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,iBAAiB,EAAE;YACjE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YACrD,MAAM;YACN,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;SACrE;KACF,CAA8B,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;QACpC,WAAW,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1E,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACzD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YAChC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE;SACvC,CAA6B,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YACtE,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC;YAC5C,eAAe,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACzE,cAAc,CAAC,MAAM,EAAE;gBACrB,KAAK;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,SAAS,CAAC;gBACR,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,aAAa,EAAE,IAAI;gBACnB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;gBACvB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,IAAI;gBAC9C,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,IAAI,IAAI;gBACxD,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,EAAE;aAC7C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3C,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,UAAU,CAAC;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,kBAAkB,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runDbProfileCommand(args: string[]): Promise<void>;