/** * @title 工作空间管理模块 * @description 提供云原生构建工作空间的管理功能,包括列表查询、创建、更新和删除工作空间,支持多种过滤条件和分页选项 * @tags workspace, cloud-native, development-environment, cnb, api * @createdAt 2025-12-04 */ import { CNBCore } from "./cnb-core.ts"; /** * 工作空间列表查询参数 */ export interface ListParams { /** Git 分支名称,例如 "main" */ branch?: string; /** 查询结束时间,格式 YYYY-MM-DD HH:mm:ssZZ,例如 2024-12-01 00:00:00+0800 */ end?: string; /** 分页页码,默认为 1 */ page?: number; /** 分页大小,默认 20,最大 100 */ pageSize?: number; /** 仓库路径,例如 "groupname/reponame" */ slug?: string; /** 查询开始时间,格式 YYYY-MM-DD HH:mm:ssZZ,例如 2024-12-01 00:00:00+0800 */ start?: string; /** 开发环境状态,running: 开发环境已启动,closed: 开发环境已关闭 */ status?: 'running' | 'closed'; } /** * 云原生开发环境管理模块 * https://api.cnb.cool/#/operations/GetWorkspaceDetail */ export class Workspace extends CNBCore { constructor(token: string) { super({ token }); } /** * 删除我的云原生开发环境 * @param params 删除参数,pipelineId 和 sn 二选一,优先使用 pipelineId */ async deleteWorkspace(params: { pipelineId?: string; sn?: string }): Promise<{ code: number; message: string }> { const data: { pipelineId?: string; sn?: string } = {}; if (params.pipelineId) { data.pipelineId = params.pipelineId; } else if (params.sn) { data.sn = params.sn; } else { throw new Error('pipelineId 和 sn 必须提供其中一个'); } return this.post({ url: '/workspace/delete', data }); } /** 获取我的云原生开发环境列表 */ async list(params?: ListParams): Promise { return this.get({ url: '/workspace/list', params }); } /** * 停止我的云原生开发环境 * @param params 停止参数,pipelineId 和 sn 二选一,优先使用 pipelineId */ async stopWorkspace(params: { pipelineId?: string; sn?: string }): Promise<{ buildLogUrl: string; message: string; sn: string }> { const data: { pipelineId?: string; sn?: string } = {}; if (params.pipelineId) { data.pipelineId = params.pipelineId; } else if (params.sn) { data.sn = params.sn; } else { throw new Error('pipelineId 和 sn 必须提供其中一个'); } return this.post({ url: '/workspace/stop', data }); } /** * 根据流水线 SN 查询云原生开发访问地址 * @param repo 仓库路径,例如:groupname/reponame * @param sn 流水线构建号 */ async getDetail(repo: string, sn: string): Promise<{ codebuddy: string; codebuddycn: string; cursor: string; jetbrains: Record; jumpUrl: string; remoteSsh: string; ssh: string; vscode: string; 'vscode-insiders': string; webide: string; }> { return this.get({ url: `/${repo}/-/workspace/detail/${sn}` }); } /** * 启动云原生开发环境,已存在环境则直接打开,否则重新创建开发环境 * @param repo 仓库路径,例如:groupname/reponame * @param params 启动参数 * @returns 返回启动结果,包含以下字段: */ async startWorkspace(repo: string, params: { branch?: string; ref?: string }): Promise<{ /** 仅新创建开发环境时返回,表示创建开发环境的流水线日志地址 */ buildLogUrl?: string; /** 仅新创建开发环境时返回,表示创建开发环境的提示信息 */ message?: string; /** 仅新创建开发环境时返回,表示创建开发环境的流水线 sn */ sn?: string; /** 如果存在开发环境,则返回 WebIDE 访问 url;如果不存在开发环境,则返回启动云原生开发的 loading 页面 url 地址 */ url: string; }> { const data: { branch?: string; ref?: string } = {}; if (params.branch) { data.branch = params.branch; } if (params.ref) { data.ref = params.ref; } return this.post({ url: `/${repo}/-/workspace/start`, data }); } } export type ResultList = { hasMore: boolean; list: T[]; pageInfo: { page: number; pageSize: number; }; total: number; } /** * 工作空间信息接口 */ export interface WorkspaceInfo { /** 分支名,例如:main */ branch: string; /** 业务 ID */ business_id: string; /** 备份的 commit 数 */ commit_count: number | null; /** 开发环境创建时间,例如:2024-12-02T03:20:22.000Z */ create_time: string; /** 开发环境持续时间,单位:ms(非实时更新) */ duration: number; /** 备份的文件数 */ file_count: number; /** 备份的文件列表,仅前五个备份文件相对路径 */ file_list: string; /** 是否为预览环境,0: 否,1: 是 */ is_preview: number; /** JetBrains IDE 列表 */ jetbrainsList: any[]; /** 环境销毁时远程最新的 commit short hash */ latest_sha: string | null; /** 创建环境的子流水线 id */ pipeline_id: string; /** 备份的 stash 数 */ remote_stash_count: number | null; /** 仓库 ID */ repo_id: string; /** 仓库地址 */ repo_url: string; /** 恢复备份代码的流水线 id,如果有值表示备份代码已被恢复(重建环境时会恢复备份代码) */ restore_id: string | null; /** 单个 stash 标识,1: 是,0: 否 */ single_stash: number; /** 仓库路径,例如:groupname/reponame */ slug: string; /** 创建开发环境的流水线 sn */ sn: string; /** 开发环境是否支持 ssh 链接 */ ssh: boolean; /** 本地 stash 数 */ stash_count: number; /** 工作区状态,running: 开发环境已启动,closed:开发环境已关闭 */ status: string; /** 用户名 */ user_name: string; /** 开发环境默认工作区路径 */ workspace: string; } /** * 工作空间列表响应结果 */ export type WorkspaceResult = { /** 是否有更多数据 */ hasMore: boolean; /** 工作空间列表 */ list: WorkspaceInfo[]; /** 分页信息 */ pageInfo: { /** 当前页码 */ page: number; /** 每页大小 */ pageSize: number; }; /** 总数量 */ total: number; }