@openlibing/openlibing-cli 0.1.8

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 (53) hide show
  1. package/README.md +137 -0
  2. package/dist/auth/browser.d.ts +29 -0
  3. package/dist/auth/browser.js +123 -0
  4. package/dist/auth/browser.js.map +1 -0
  5. package/dist/auth/login.d.ts +30 -0
  6. package/dist/auth/login.js +180 -0
  7. package/dist/auth/login.js.map +1 -0
  8. package/dist/auth/refresh.d.ts +3 -0
  9. package/dist/auth/refresh.js +36 -0
  10. package/dist/auth/refresh.js.map +1 -0
  11. package/dist/auth/store.d.ts +19 -0
  12. package/dist/auth/store.js +71 -0
  13. package/dist/auth/store.js.map +1 -0
  14. package/dist/client/http.d.ts +15 -0
  15. package/dist/client/http.js +65 -0
  16. package/dist/client/http.js.map +1 -0
  17. package/dist/client/reportApi.d.ts +54 -0
  18. package/dist/client/reportApi.js +54 -0
  19. package/dist/client/reportApi.js.map +1 -0
  20. package/dist/commands/auth.d.ts +5 -0
  21. package/dist/commands/auth.js +56 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/mcp.d.ts +5 -0
  24. package/dist/commands/mcp.js +33 -0
  25. package/dist/commands/mcp.js.map +1 -0
  26. package/dist/config/env.d.ts +19 -0
  27. package/dist/config/env.js +29 -0
  28. package/dist/config/env.js.map +1 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +19 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/mcp/registry.d.ts +2 -0
  33. package/dist/mcp/registry.js +8 -0
  34. package/dist/mcp/registry.js.map +1 -0
  35. package/dist/mcp/server.d.ts +12 -0
  36. package/dist/mcp/server.js +25 -0
  37. package/dist/mcp/server.js.map +1 -0
  38. package/dist/tools/auth/login.d.ts +4 -0
  39. package/dist/tools/auth/login.js +28 -0
  40. package/dist/tools/auth/login.js.map +1 -0
  41. package/dist/tools/report/index.d.ts +6 -0
  42. package/dist/tools/report/index.js +4 -0
  43. package/dist/tools/report/index.js.map +1 -0
  44. package/dist/tools/report/listTemplates.d.ts +2 -0
  45. package/dist/tools/report/listTemplates.js +16 -0
  46. package/dist/tools/report/listTemplates.js.map +1 -0
  47. package/dist/tools/report/queryData.d.ts +37 -0
  48. package/dist/tools/report/queryData.js +72 -0
  49. package/dist/tools/report/queryData.js.map +1 -0
  50. package/dist/tools/types.d.ts +18 -0
  51. package/dist/tools/types.js +7 -0
  52. package/dist/tools/types.js.map +1 -0
  53. package/package.json +42 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface RequestOptions {
2
+ method?: "GET" | "POST" | "PUT" | "DELETE";
3
+ /** JSON body(自动序列化) */
4
+ body?: unknown;
5
+ /** 附加请求头(覆盖默认) */
6
+ headers?: Record<string, string>;
7
+ timeoutMs?: number;
8
+ /** 是否注入已登录的插件 token */
9
+ auth?: boolean;
10
+ }
11
+ export declare class ApiError extends Error {
12
+ readonly status: number;
13
+ constructor(message: string, status: number);
14
+ }
15
+ export declare function request<T>(url: string, opts?: RequestOptions): Promise<T>;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * REST 客户端封装:baseUrl 组合、浏览器式请求头(WAF 放行)、JSON 编解码、超时与错误。
3
+ * 鉴权注入:网关会话体系下把插件 token 放 Cookie(token=<jwt>),与登录态同构;
4
+ * 若网关支持 Bearer,可切换(见 buildHeaders 注释)。
5
+ */
6
+ import { env } from "../config/env.js";
7
+ import { loadAuth } from "../auth/store.js";
8
+ export class ApiError extends Error {
9
+ status;
10
+ constructor(message, status) {
11
+ super(message);
12
+ this.status = status;
13
+ this.name = "ApiError";
14
+ }
15
+ }
16
+ const BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36";
17
+ function buildHeaders(opts) {
18
+ const origin = new URL(env.opsBaseUrl).origin;
19
+ const headers = {
20
+ "User-Agent": BROWSER_UA,
21
+ Accept: "application/json, text/plain, */*",
22
+ Origin: origin,
23
+ Referer: `${origin}/`,
24
+ };
25
+ if (opts.body !== undefined) {
26
+ headers["Content-Type"] = "application/json";
27
+ }
28
+ if (opts.auth) {
29
+ const auth = loadAuth();
30
+ if (auth?.token) {
31
+ // 完整浏览器会话:Cookie 带 token(+ csrf 如有),并附 Csrf-Token-Open-Li-Bing 头,
32
+ // 走网关标准 CSRF 校验(与 SPA 一致),不依赖 csrf.trust.list 跳过
33
+ headers["Cookie"] = auth.csrf ? `token=${auth.token}; csrf-token-open-li-bing=${auth.csrf}` : `token=${auth.token}`;
34
+ if (auth.csrf) {
35
+ headers["Csrf-Token-Open-Li-Bing"] = auth.csrf;
36
+ }
37
+ }
38
+ }
39
+ return { ...headers, ...opts.headers };
40
+ }
41
+ export async function request(url, opts = {}) {
42
+ const controller = new AbortController();
43
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? 30_000);
44
+ try {
45
+ const resp = await fetch(url, {
46
+ method: opts.method ?? "GET",
47
+ headers: buildHeaders(opts),
48
+ body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
49
+ signal: controller.signal,
50
+ });
51
+ if (!resp.ok) {
52
+ throw new ApiError(`HTTP ${resp.status}`, resp.status);
53
+ }
54
+ return (await resp.json());
55
+ }
56
+ catch (err) {
57
+ if (err instanceof ApiError)
58
+ throw err;
59
+ throw new ApiError(`请求失败: ${err.message}`, 0);
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ }
64
+ }
65
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export interface ReportTemplateColumn {
2
+ /** 列名(snake_case) */
3
+ columnName: string;
4
+ /** 列注释 */
5
+ columnComment: string;
6
+ /** 数据类型 */
7
+ dataType: string;
8
+ /** 是否必填 */
9
+ required: boolean;
10
+ }
11
+ export interface ReportTemplate {
12
+ /** 模板 code,如 triton_model_performance(登记表 model_code) */
13
+ modelCode: string;
14
+ /** 模板名 */
15
+ modelName: string;
16
+ /** 模板描述 */
17
+ description?: string;
18
+ /** 字段元数据 */
19
+ columns: ReportTemplateColumn[];
20
+ /** 已上报数据的仓库地址列表 */
21
+ repoUrls: string[];
22
+ }
23
+ export interface PageResult<T> {
24
+ total: number;
25
+ page: number;
26
+ pageSize: number;
27
+ records: T[];
28
+ }
29
+ export interface QueryReportDataParams {
30
+ /** 模板 code,必填 */
31
+ modelCode: string;
32
+ /** 仓库地址列表,可选;不传或为空则查询全部仓库 */
33
+ repoUrls?: string[];
34
+ /** 开始时间 yyyy-MM-dd HH:mm:ss,可选 */
35
+ startTime?: string;
36
+ /** 结束时间 yyyy-MM-dd HH:mm:ss,可选 */
37
+ endTime?: string;
38
+ /** 时间字段:job_start_time/job_end_time/report_upload_time,默认 job_end_time */
39
+ timeField?: "job_start_time" | "job_end_time" | "report_upload_time";
40
+ /** 过滤条件数组 */
41
+ filters?: {
42
+ field: string;
43
+ op: "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "like" | "in" | "isNull" | "isNotNull";
44
+ value?: unknown;
45
+ }[];
46
+ /** 页码,默认 1 */
47
+ page?: number;
48
+ /** 每页大小,默认 20,最大 500 */
49
+ pageSize?: number;
50
+ }
51
+ /** 查询测试报告模板列表 */
52
+ export declare function listReportTemplates(): Promise<ReportTemplate[]>;
53
+ /** 按条件查询测试报告数据,分页返回 */
54
+ export declare function queryReportData(params: QueryReportDataParams): Promise<PageResult<Record<string, unknown>>>;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 报告功能组 REST 客户端:真实调用 ops 报告接口(走网关转发)。
3
+ * 对应 ops ReportController:POST /test-report/template/list、POST /test-report/data/query。
4
+ * 响应为 ops 统一 Result<T>({code, messageCn, messageEn, data})。
5
+ */
6
+ import { env } from "../config/env.js";
7
+ import { ApiError, request } from "./http.js";
8
+ import { refreshToken } from "../auth/refresh.js";
9
+ /**
10
+ * 401 处理(避免 agent 误判为需要外部 cookie):
11
+ * 1. 自动用 refresh token 续期一次并重试;
12
+ * 2. 续期失败则抛出引导性错误,明确本 CLI 使用独立凭证(~/.openlibing-cli/auth.json),
13
+ * 不依赖 openlibing-auth skill 的 cookie,防止 AI 在 401 后误调外部 skill。
14
+ */
15
+ async function withAuthRetry(fn) {
16
+ try {
17
+ return await fn();
18
+ }
19
+ catch (err) {
20
+ if (err instanceof ApiError && err.status === 401) {
21
+ try {
22
+ await refreshToken();
23
+ return await fn();
24
+ }
25
+ catch {
26
+ throw new Error("访问被拒绝(HTTP 401):本地 MCP 凭证已失效。请运行 `openlibing-cli auth login` 重新登录," +
27
+ "或 `openlibing-cli auth refresh` 续期(凭证位于 ~/.openlibing-cli/auth.json)。" +
28
+ "不要调用 openlibing-auth skill 获取 cookie——本 CLI 使用独立凭证,与网关 cookie 无关。");
29
+ }
30
+ }
31
+ throw err;
32
+ }
33
+ }
34
+ /** 查询测试报告模板列表 */
35
+ export async function listReportTemplates() {
36
+ return withAuthRetry(async () => {
37
+ const result = await request(`${env.opsBaseUrl}/test-report/template/list`, { method: "POST", body: {}, auth: true });
38
+ if (result.code !== 200) {
39
+ throw new Error(`listTemplates 失败: ${result.messageCn ?? result.messageEn ?? result.code}`);
40
+ }
41
+ return result.data;
42
+ });
43
+ }
44
+ /** 按条件查询测试报告数据,分页返回 */
45
+ export async function queryReportData(params) {
46
+ return withAuthRetry(async () => {
47
+ const result = await request(`${env.opsBaseUrl}/test-report/data/query`, { method: "POST", body: params, auth: true });
48
+ if (result.code !== 200) {
49
+ throw new Error(`queryData 失败: ${result.messageCn ?? result.messageEn ?? result.code}`);
50
+ }
51
+ return result.data;
52
+ });
53
+ }
54
+ //# sourceMappingURL=reportApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportApi.js","sourceRoot":"","sources":["../../src/client/reportApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA+DlD;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAI,EAAoB;IAClD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACb,oEAAoE;oBACpE,uEAAuE;oBACvE,mEAAmE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,UAAU,4BAA4B,EAC7C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CACzC,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B;IAE7B,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,GAAG,GAAG,CAAC,UAAU,yBAAyB,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAC7C,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * auth 子命令:auth login / auth status / auth logout / auth refresh。
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function authCommand(program: Command): void;
@@ -0,0 +1,56 @@
1
+ import { login, logout, fingerprint } from "../auth/login.js";
2
+ import { refreshToken } from "../auth/refresh.js";
3
+ import { loadAuth, authFilePath } from "../auth/store.js";
4
+ export function authCommand(program) {
5
+ const cmd = program
6
+ .command("auth")
7
+ .description("插件登录与凭证管理");
8
+ cmd
9
+ .command("login")
10
+ .description("浏览器授权登录(自动捕获回调,点一次授权即完成;失败自动降级手动粘贴)")
11
+ .option("--manual", "强制手动粘贴 URL 方式登录(不自动打开 Playwright 浏览器)")
12
+ .action(async (opts) => {
13
+ try {
14
+ const auth = await login(!!opts.manual);
15
+ console.log(`登录成功:${auth.accountName ?? "unknown"}(fingerprint=${fingerprint(auth.accountId)})`);
16
+ }
17
+ catch (err) {
18
+ console.error(`登录失败:${err.message}`);
19
+ process.exitCode = 1;
20
+ }
21
+ });
22
+ cmd
23
+ .command("status")
24
+ .description("查看登录状态与凭证位置")
25
+ .action(() => {
26
+ const auth = loadAuth();
27
+ if (!auth) {
28
+ console.log("未登录。执行 openlibing-cli auth login 完成授权。");
29
+ return;
30
+ }
31
+ console.log(`已登录:${auth.accountName ?? "unknown"}(fingerprint=${fingerprint(auth.accountId)})`);
32
+ console.log(`凭证文件:${authFilePath()}`);
33
+ console.log(`保存时间:${auth.updatedAt}`);
34
+ });
35
+ cmd
36
+ .command("logout")
37
+ .description("清除本地凭证")
38
+ .action(() => {
39
+ logout();
40
+ console.log("已清除本地凭证。");
41
+ });
42
+ cmd
43
+ .command("refresh")
44
+ .description("用 refresh token 续期 access token")
45
+ .action(async () => {
46
+ try {
47
+ const auth = await refreshToken();
48
+ console.log(`续期成功:${auth.accountName ?? "unknown"}(fingerprint=${fingerprint(auth.accountId)})`);
49
+ }
50
+ catch (err) {
51
+ console.error(`续期失败:${err.message}`);
52
+ process.exitCode = 1;
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,WAAW,CAAC,CAAC;IAE5B,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,UAAU,EAAE,uCAAuC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAA0B,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAS,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,QAAQ,YAAY,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAS,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * mcp 子命令:mcp start(启动 stdio MCP Server)/ mcp list(列出已注册工具)。
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function mcpCommand(program: Command): void;
@@ -0,0 +1,33 @@
1
+ import { startStdioServer } from "../mcp/server.js";
2
+ import { tools } from "../mcp/registry.js";
3
+ import { ensureAuthenticated } from "../auth/login.js";
4
+ export function mcpCommand(program) {
5
+ const cmd = program
6
+ .command("mcp")
7
+ .description("MCP 相关命令");
8
+ cmd
9
+ .command("start")
10
+ .description("启动 MCP stdio server(自动完成授权:已有凭证自动续期,无凭证弹出浏览器点一次授权)")
11
+ .action(async () => {
12
+ try {
13
+ // 连接即授权:凭证续期/授权失败则退出,提示用户处理,避免无凭证空跑
14
+ await ensureAuthenticated();
15
+ }
16
+ catch (err) {
17
+ console.error(`[mcp] 自动授权失败:${err.message}`);
18
+ console.error("[mcp] 请先运行 `openlibing-cli auth login` 完成登录(或安装 Chrome/Edge 后重连)");
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ await startStdioServer();
23
+ });
24
+ cmd
25
+ .command("list")
26
+ .description("列出已注册的 MCP 工具")
27
+ .action(() => {
28
+ for (const tool of tools) {
29
+ console.log(`${tool.name}\t${tool.description}`);
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,UAAU,CAAC,CAAC;IAE3B,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,mBAAmB,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,GAAG,EAAE;QACX,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 环境配置:beta/prod 网关与 ops REST 地址、插件登录参数。
3
+ * 插件链路复用 gateway 现有插件凭证机制(LoginController /plugin/*)。
4
+ */
5
+ export interface EnvConfig {
6
+ /** 环境标识:local / beta / prod */
7
+ env: string;
8
+ /** 网关地址(插件 OAuth 发起 + token 交换 + 业务接口转发) */
9
+ gatewayBaseUrl: string;
10
+ /** ops 报告 REST 接口 base url */
11
+ opsBaseUrl: string;
12
+ /** 插件登录 client:须在网关 LoginUtil.ALLOWED_CLIENTS 白名单(vscode/idea/agent_arena) */
13
+ pluginClient: string;
14
+ /** 插件标识,关联插件与登录 */
15
+ pluginId: string;
16
+ /** 三方平台:gitcode/gitee/github/uniportal/openubmc,可经 OPENLIBING_PLATFORM 指定 */
17
+ platform: "gitcode" | "gitee" | "github" | "uniportal" | "openubmc";
18
+ }
19
+ export declare const env: EnvConfig;
@@ -0,0 +1,29 @@
1
+ const PLATFORMS = ["gitcode", "gitee", "github", "uniportal", "openubmc"];
2
+ function resolvePlatform(v) {
3
+ if (v && PLATFORMS.includes(v)) {
4
+ return v;
5
+ }
6
+ return "gitcode";
7
+ }
8
+ function gatewayHost(env) {
9
+ switch (env) {
10
+ case "prod":
11
+ return "https://www.openlibing.com/gateway";
12
+ case "beta":
13
+ return "https://beta.openlibing.com/gateway";
14
+ case "gamma":
15
+ return "https://gamma.openlibing.com/gateway";
16
+ default:
17
+ return "http://localhost:8073";
18
+ }
19
+ }
20
+ export const env = {
21
+ env: process.env.OPENLIBING_ENV ?? "beta",
22
+ gatewayBaseUrl: process.env.OPENLIBING_GATEWAY_URL ?? gatewayHost(process.env.OPENLIBING_ENV ?? "beta"),
23
+ opsBaseUrl: process.env.OPENLIBING_OPS_URL ??
24
+ `${gatewayHost(process.env.OPENLIBING_ENV ?? "beta")}/openlibing-ops`,
25
+ pluginClient: process.env.OPENLIBING_PLUGIN_CLIENT ?? "agent_arena",
26
+ pluginId: process.env.OPENLIBING_PLUGIN_ID ?? "openlibing-cli",
27
+ platform: resolvePlatform(process.env.OPENLIBING_PLATFORM),
28
+ };
29
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAEnF,SAAS,eAAe,CAAC,CAAU;IACjC,IAAI,CAAC,IAAK,SAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,CAA0B,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,oCAAoC,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,qCAAqC,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,sCAAsC,CAAC;QAChD;YACE,OAAO,uBAAuB,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAc;IAC5B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM;IACzC,cAAc,EACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC;IACzF,UAAU,EACR,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,iBAAiB;IACvE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,aAAa;IACnE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,gBAAgB;IAC9D,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;CAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * OpenLibing MCP CLI 入口。
4
+ * 用法:openlibing-cli mcp start(AI 客户端配置 command 方式启动);openlibing-cli auth login(插件授权登录)
5
+ */
6
+ import { Command } from "commander";
7
+ import { readFileSync } from "node:fs";
8
+ import { mcpCommand } from "./commands/mcp.js";
9
+ import { authCommand } from "./commands/auth.js";
10
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
11
+ const program = new Command();
12
+ program
13
+ .name("openlibing-cli")
14
+ .description("OpenLibing MCP CLI:本地 stdio MCP server")
15
+ .version(pkg.version);
16
+ mcpCommand(program);
17
+ authCommand(program);
18
+ program.parse(process.argv);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC3C,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from "../tools/types.js";
2
+ export declare const tools: ToolDefinition[];
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MCP 工具注册表:按功能组收集工具定义,供 server.ts 统一注册。
3
+ * 协议层由 @modelcontextprotocol/sdk 内置,不手写。
4
+ */
5
+ import { reportTools } from "../tools/report/index.js";
6
+ import { authTools } from "../tools/auth/login.js";
7
+ export const tools = [...reportTools, ...authTools];
8
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,CAAC,MAAM,KAAK,GAAqB,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP Server 组装:官方 SDK McpServer + StdioServerTransport + 注册工具。
3
+ * 协议层(initialize/tools/list/call、JSON-RPC、协议版本协商)全部由 SDK 内置。
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare const SERVER_INFO: {
7
+ readonly name: "openlibing-mcp";
8
+ readonly version: "0.1.0";
9
+ };
10
+ export declare function createMcpServer(): McpServer;
11
+ /** 启动 stdio 传输的 MCP Server(阻塞运行,直到 stdin 关闭) */
12
+ export declare function startStdioServer(): Promise<void>;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MCP Server 组装:官方 SDK McpServer + StdioServerTransport + 注册工具。
3
+ * 协议层(initialize/tools/list/call、JSON-RPC、协议版本协商)全部由 SDK 内置。
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { tools } from "./registry.js";
8
+ export const SERVER_INFO = {
9
+ name: "openlibing-mcp",
10
+ version: "0.1.0",
11
+ };
12
+ export function createMcpServer() {
13
+ const server = new McpServer(SERVER_INFO, { capabilities: { tools: {} } });
14
+ for (const tool of tools) {
15
+ server.tool(tool.name, tool.description, tool.schema, async (args) => tool.handler(args));
16
+ }
17
+ return server;
18
+ }
19
+ /** 启动 stdio 传输的 MCP Server(阻塞运行,直到 stdin 关闭) */
20
+ export async function startStdioServer() {
21
+ const server = createMcpServer();
22
+ const transport = new StdioServerTransport();
23
+ await server.connect(transport);
24
+ }
25
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;CACR,CAAC;AAEX,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,WAAW,EACX,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAA+B,CAAC,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ToolDefinition } from "../types.js";
2
+ export declare const authLoginTool: ToolDefinition;
3
+ /** auth 功能组工具列表(供 registry 聚合) */
4
+ export declare const authTools: ToolDefinition[];
@@ -0,0 +1,28 @@
1
+ import { loginAuto } from "../../auth/login.js";
2
+ import { textResult } from "../types.js";
3
+ export const authLoginTool = {
4
+ name: "auth_login",
5
+ description: "触发浏览器授权登录(自动弹出浏览器,用户点一次授权即完成,无需手动复制 URL)。" +
6
+ "仅在用户明确要求登录/重新登录、或凭证失效需要重新授权时调用;" +
7
+ "调用前请先告知用户将弹出浏览器窗口完成授权。",
8
+ schema: {},
9
+ handler: async () => {
10
+ try {
11
+ const auth = await loginAuto();
12
+ return textResult({
13
+ success: true,
14
+ message: "登录成功",
15
+ accountName: auth.accountName ?? "unknown",
16
+ });
17
+ }
18
+ catch (err) {
19
+ return textResult({
20
+ success: false,
21
+ message: `登录失败:${err.message}(可让用户手动运行 openlibing-cli auth login 完成登录)`,
22
+ });
23
+ }
24
+ },
25
+ };
26
+ /** auth 功能组工具列表(供 registry 聚合) */
27
+ export const authTools = [authLoginTool];
28
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/tools/auth/login.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,2CAA2C;QAC3C,iCAAiC;QACjC,wBAAwB;IAC1B,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;gBAChB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,MAAM;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;aAC3C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,UAAU,CAAC;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAS,GAAa,CAAC,OAAO,2CAA2C;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,SAAS,GAAqB,CAAC,aAAa,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * report 功能组:工具列表导出。
3
+ * 未来功能组 = tools/ 加目录 + 本文件注册一行。
4
+ */
5
+ import type { ToolDefinition } from "../types.js";
6
+ export declare const reportTools: ToolDefinition[];
@@ -0,0 +1,4 @@
1
+ import { listTemplatesTool } from "./listTemplates.js";
2
+ import { queryDataTool } from "./queryData.js";
3
+ export const reportTools = [listTemplatesTool, queryDataTool];
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/report/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAqB,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDefinition } from "../types.js";
2
+ export declare const listTemplatesTool: ToolDefinition;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * report 功能组:查询测试报告模板列表。
3
+ * 对齐 ops ReportMcpTools#listReportTemplates(REST 消费面 / MCP 工具同源)。
4
+ */
5
+ import { listReportTemplates } from "../../client/reportApi.js";
6
+ import { textResult } from "../types.js";
7
+ export const listTemplatesTool = {
8
+ name: "report_listTemplates",
9
+ description: "查询测试报告模板列表,返回模板 code、模板名、字段元数据(列名/注释/类型/必填)与已上报数据的仓库地址列表",
10
+ schema: {},
11
+ handler: async () => {
12
+ const templates = await listReportTemplates();
13
+ return textResult(templates);
14
+ },
15
+ };
16
+ //# sourceMappingURL=listTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listTemplates.js","sourceRoot":"","sources":["../../../src/tools/report/listTemplates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AAE9D,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,0DAA0D;IAC5D,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * report 功能组:按条件查询测试报告数据(分页)。
3
+ * 对齐 ops ReportMcpTools#queryReportData:支持仓库多选(repoUrls,空则全选)、
4
+ * 时间范围、字段过滤(filters)、分页。
5
+ */
6
+ import { z } from "zod";
7
+ import { type ToolDefinition } from "../types.js";
8
+ export declare const queryDataSchema: {
9
+ modelCode: z.ZodString;
10
+ repoUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ startTime: z.ZodOptional<z.ZodString>;
12
+ endTime: z.ZodOptional<z.ZodString>;
13
+ timeField: z.ZodOptional<z.ZodEnum<{
14
+ job_end_time: "job_end_time";
15
+ job_start_time: "job_start_time";
16
+ report_upload_time: "report_upload_time";
17
+ }>>;
18
+ filters: z.ZodOptional<z.ZodArray<z.ZodObject<{
19
+ field: z.ZodString;
20
+ op: z.ZodEnum<{
21
+ eq: "eq";
22
+ gt: "gt";
23
+ gte: "gte";
24
+ in: "in";
25
+ isNotNull: "isNotNull";
26
+ isNull: "isNull";
27
+ like: "like";
28
+ lt: "lt";
29
+ lte: "lte";
30
+ ne: "ne";
31
+ }>;
32
+ value: z.ZodOptional<z.ZodUnknown>;
33
+ }, z.core.$strip>>>;
34
+ page: z.ZodOptional<z.ZodNumber>;
35
+ pageSize: z.ZodOptional<z.ZodNumber>;
36
+ };
37
+ export declare const queryDataTool: ToolDefinition;