@spaceflow/core 0.5.0 → 0.7.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["webpack://@spaceflow/core/webpack/runtime/define_property_getters","webpack://@spaceflow/core/webpack/runtime/ensure_chunk","webpack://@spaceflow/core/webpack/runtime/get javascript chunk filename","webpack://@spaceflow/core/webpack/runtime/has_own_property","webpack://@spaceflow/core/webpack/runtime/public_path","webpack://@spaceflow/core/webpack/runtime/module_chunk_loading","webpack://@spaceflow/core/./src/extension-system/extension.interface.ts","webpack://@spaceflow/core/./src/extension-system/define-extension.ts","webpack://@spaceflow/core/./src/extension-system/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/types.ts","webpack://@spaceflow/core/./src/shared/git-provider/detect-provider.ts","webpack://@spaceflow/core/./src/shared/git-provider/parse-repo-url.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk-diff.utils.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitea.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/github.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitlab.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/git-provider.service.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/index.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk.service.ts","webpack://@spaceflow/core/./src/shared/git-sdk/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/config.interface.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/llm-adapter.interface.ts","webpack://@spaceflow/core/./src/shared/verbose/index.ts","webpack://@spaceflow/core/./src/shared/claude-setup/claude-setup.service.ts","webpack://@spaceflow/core/./src/shared/claude-setup/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/claude-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/openai.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/open-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-session.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-proxy.service.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/stream-logger.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/card-action.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/feishu-sdk.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/fieshu-card.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/module.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/index.ts","webpack://@spaceflow/core/./src/shared/storage/storage.service.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/memory.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/file.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/index.ts","webpack://@spaceflow/core/./src/shared/storage/index.ts","webpack://@spaceflow/core/./src/shared/parallel/parallel-executor.ts","webpack://@spaceflow/core/./src/shared/parallel/index.ts","webpack://@spaceflow/core/./src/shared/output/output.service.ts","webpack://@spaceflow/core/./src/shared/output/index.ts","webpack://@spaceflow/core/./src/shared/editor-config/index.ts","webpack://@spaceflow/core/./src/shared/llm-jsonput/index.ts","webpack://@spaceflow/core/./src/shared/source-utils/index.ts","webpack://@spaceflow/core/./src/shared/package-manager/index.ts","webpack://@spaceflow/core/./src/shared/spaceflow-dir/index.ts","webpack://@spaceflow/core/./src/shared/rspack-config/rspack-config.ts","webpack://@spaceflow/core/./src/shared/rspack-config/index.ts","webpack://@spaceflow/core/./src/shared/mcp/index.ts","webpack://@spaceflow/core/./src/shared/i18n/locale-detect.ts","webpack://@spaceflow/core/./src/shared/i18n/i18n.ts","webpack://@spaceflow/core/./src/shared/i18n/index.ts","webpack://@spaceflow/core/./src/shared/logger/renderers/plain.renderer.ts","webpack://@spaceflow/core/./src/shared/logger/logger.ts","webpack://@spaceflow/core/./src/shared/logger/index.ts","webpack://@spaceflow/core/./src/config/schema-generator.service.ts","webpack://@spaceflow/core/./src/config/spaceflow.config.ts","webpack://@spaceflow/core/./src/config/config-loader.ts","webpack://@spaceflow/core/./src/config/git-provider.config.ts","webpack://@spaceflow/core/./src/config/ci.config.ts","webpack://@spaceflow/core/./src/config/llm.config.ts","webpack://@spaceflow/core/./src/config/feishu.config.ts","webpack://@spaceflow/core/./src/config/storage.config.ts","webpack://@spaceflow/core/./src/config/config-reader.service.ts","webpack://@spaceflow/core/./src/config/config-reader.ts","webpack://@spaceflow/core/./src/config/load-env.ts","webpack://@spaceflow/core/./src/config/index.ts","webpack://@spaceflow/core/./src/index.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".js\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.p = \"\";","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"410\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","/** .spaceflow 目录名 */\nexport const SPACEFLOW_DIR = \".spaceflow\";\n\n/** package.json 文件名 */\nexport const PACKAGE_JSON = \"package.json\";\n\n/**\n * Extension 元数据\n */\nexport interface SpaceflowExtensionMetadata {\n /** Extension 名称 */\n name: string;\n /** 提供的命令列表 */\n commands: string[];\n /** 对应 spaceflow.json 中的配置 key(可选) */\n configKey?: string;\n /** 依赖的其他 Extension 配置 key 列表,读取其他 Extension 配置前必须在此声明 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数,返回 zod schema,用于验证配置和生成 JSON Schema */\n configSchema?: () => unknown;\n /** Extension 版本 */\n version?: string;\n /** Extension 描述 */\n description?: string;\n}\n\n/**\n * .spaceflow/package.json 中的 dependencies\n */\nexport type ExtensionDependencies = Record<string, string>;\n\n/**\n * Spaceflow 导出类型\n * - flow: 子命令(默认),需要构建,注册为 CLI 子命令\n * - command: 编辑器命令,复制到 .claude/commands/ 等目录\n * - skill: 技能包,复制到 .claude/skills/ 等目录\n * - mcp: MCP Server,注册到编辑器的 mcp.json 配置\n */\nexport type SpaceflowExportType = \"flow\" | \"command\" | \"skill\" | \"mcp\";\n\n/**\n * MCP Server 配置\n */\nexport interface McpServerConfig {\n /** 启动命令,如 \"node\", \"python\" */\n command: string;\n /** 启动参数,如 [\"dist/index.js\"] */\n args?: string[];\n /** 需要的环境变量名列表,安装时会提示用户配置 */\n env?: string[];\n}\n\n/**\n * 单个导出项配置\n */\nexport interface SpaceflowExportConfig {\n /** 导出类型,默认为 flow */\n type?: SpaceflowExportType;\n /** 入口路径,相对于包根目录 */\n entry: string;\n /** 描述(可选) */\n description?: string;\n /** MCP Server 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * package.json 中的 spaceflow 配置\n *\n * 完整格式:\n * ```json\n * \"spaceflow\": {\n * \"exports\": {\n * \"review\": { \"type\": \"flow\", \"entry\": \".\" },\n * \"review-rules\": { \"type\": \"skill\", \"entry\": \"./skills\" },\n * \"my-mcp\": { \"type\": \"mcp\", \"entry\": \".\", \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] } }\n * }\n * }\n * ```\n *\n * 简化格式(单导出):\n * ```json\n * \"spaceflow\": {\n * \"type\": \"mcp\",\n * \"entry\": \".\",\n * \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] }\n * }\n * ```\n */\nexport interface SpaceflowPackageConfig {\n /** 多导出配置 */\n exports?: Record<string, SpaceflowExportConfig>;\n /** 简化格式:导出类型 */\n type?: SpaceflowExportType;\n /** 简化格式:入口路径 */\n entry?: string;\n /** 简化格式:描述 */\n description?: string;\n /** 简化格式:MCP 配置 */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析后的导出项\n */\nexport interface ResolvedSpaceflowExport {\n /** 导出名称 */\n name: string;\n /** 导出类型 */\n type: SpaceflowExportType;\n /** 入口路径(绝对路径) */\n entry: string;\n /** 描述 */\n description?: string;\n /** MCP 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析 spaceflow 配置,返回所有导出项\n */\nexport function resolveSpaceflowConfig(\n config: SpaceflowPackageConfig | undefined,\n packageName: string,\n packagePath: string,\n): ResolvedSpaceflowExport[] {\n const { join } = require(\"path\");\n\n if (!config) {\n return [];\n }\n\n // 完整格式:有 exports 字段\n if (config.exports) {\n return Object.entries(config.exports).map(([name, exportConfig]) => ({\n name,\n type: exportConfig.type || \"flow\",\n entry: join(packagePath, exportConfig.entry),\n description: exportConfig.description,\n mcp: exportConfig.mcp,\n }));\n }\n\n // 简化格式:直接有 type/entry 字段\n if (config.entry) {\n return [\n {\n name: packageName,\n type: config.type || \"flow\",\n entry: join(packagePath, config.entry),\n description: config.description,\n mcp: config.mcp,\n },\n ];\n }\n\n return [];\n}\n","import type { ExtensionDefinition, McpServerDefinition } from \"./types\";\n\n/**\n * 定义扩展\n * 这是一个类型安全的工厂函数,用于创建扩展定义\n * @param definition 扩展定义\n * @returns 扩展定义(原样返回,仅用于类型推断)\n */\nexport function defineExtension(\n definition: ExtensionDefinition,\n): ExtensionDefinition {\n return definition;\n}\n\n/**\n * 定义 MCP 服务器\n * 这是一个类型安全的工厂函数,用于创建 MCP 服务器定义\n * @param definition MCP 服务器定义\n * @returns MCP 服务器定义(原样返回,仅用于类型推断)\n */\nexport function defineMcpServer(\n definition: McpServerDefinition,\n): McpServerDefinition {\n return definition;\n}\n","// 旧版接口(保留兼容,后续移除)\nexport * from \"./extension.interface\";\n\n// 新版接口\nexport * from \"./types\";\nexport * from \"./define-extension\";\n","/**\n * Git Provider 通用类型定义\n * 适用于 Gitea、GitHub 等多种 Git 托管平台\n */\n\n/** Git Provider 平台类型 */\nexport type GitProviderType = \"gitea\" | \"github\" | \"gitlab\";\n\n/** Git Provider 模块配置选项 */\nexport interface GitProviderModuleOptions {\n /** Git Provider 平台类型 */\n provider: GitProviderType;\n /** 服务器 URL */\n baseUrl: string;\n /** API Token */\n token: string;\n}\n\n/** Git Provider 模块异步配置选项 */\nexport interface GitProviderModuleAsyncOptions {\n useFactory: (...args: unknown[]) => Promise<GitProviderModuleOptions> | GitProviderModuleOptions;\n inject?: any[];\n}\n\n/** 注入令牌 */\nexport const GIT_PROVIDER_MODULE_OPTIONS = \"GIT_PROVIDER_MODULE_OPTIONS\";\n\n/** 分支保护规则 */\nexport interface BranchProtection {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n branch_name?: string;\n created_at?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n rule_name?: string;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n updated_at?: string;\n}\n\n/** 创建分支保护规则选项 */\nexport interface CreateBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n /** 分支名称或通配符规则 */\n branch_name?: string;\n /** 规则名称 */\n rule_name?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 编辑分支保护规则选项 */\nexport interface EditBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 分支信息 */\nexport interface Branch {\n commit?: {\n id?: string;\n message?: string;\n timestamp?: string;\n };\n effective_branch_protection_name?: string;\n enable_status_check?: boolean;\n name?: string;\n protected?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n user_can_merge?: boolean;\n user_can_push?: boolean;\n}\n\n/** 仓库信息 */\nexport interface Repository {\n id?: number;\n owner?: {\n id?: number;\n login?: string;\n full_name?: string;\n };\n name?: string;\n full_name?: string;\n default_branch?: string;\n}\n\n/** Pull Request 信息 */\nexport interface PullRequest {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n head?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n base?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n user?: {\n id?: number;\n login?: string;\n };\n /** PR 指定的评审人(个人用户) */\n requested_reviewers?: Array<{\n id?: number;\n login?: string;\n }>;\n /** PR 指定的评审团队 */\n requested_reviewers_teams?: Array<{\n id?: number;\n name?: string;\n /** 团队成员 */\n members?: Array<{\n id?: number;\n login?: string;\n }>;\n }>;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n merge_base?: string;\n}\n\n/** 编辑 PR 的选项 */\nexport interface EditPullRequestOption {\n title?: string;\n body?: string;\n state?: \"open\" | \"closed\";\n base?: string;\n}\n\n/** PR Commit 信息 */\nexport interface PullRequestCommit {\n sha?: string;\n commit?: {\n message?: string;\n author?: {\n name?: string;\n email?: string;\n date?: string;\n };\n };\n author?: {\n id?: number;\n login?: string;\n };\n committer?: {\n id?: number;\n login?: string;\n };\n}\n\n/** 文件变更信息 */\nexport interface ChangedFile {\n filename?: string;\n status?: string;\n additions?: number;\n deletions?: number;\n changes?: number;\n patch?: string;\n raw_url?: string;\n contents_url?: string;\n}\n\n/** Commit 详细信息(包含文件变更) */\nexport interface CommitInfo extends PullRequestCommit {\n files?: ChangedFile[];\n}\n\n/** Issue/PR 评论 */\nexport interface IssueComment {\n id?: number;\n body?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n}\n\n/** 创建 Issue 评论选项 */\nexport interface CreateIssueCommentOption {\n body: string;\n}\n\n/** 创建 Issue 的选项 */\nexport interface CreateIssueOption {\n /** Issue 标题 */\n title: string;\n /** Issue 内容 */\n body?: string;\n /** 指派人用户名列表 */\n assignees?: string[];\n /** 标签 ID 列表 */\n labels?: number[];\n /** 里程碑 ID */\n milestone?: number;\n /** 截止日期 */\n due_date?: string;\n}\n\n/** Issue 响应 */\nexport interface Issue {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n labels?: Array<{\n id?: number;\n name?: string;\n color?: string;\n }>;\n assignees?: Array<{\n id?: number;\n login?: string;\n }>;\n milestone?: {\n id?: number;\n title?: string;\n };\n created_at?: string;\n updated_at?: string;\n closed_at?: string;\n html_url?: string;\n}\n\n/** PR Review 事件类型 */\nexport type ReviewStateType = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" | \"PENDING\";\n\n/** PR Review 事件常量 */\nexport const REVIEW_STATE = {\n APPROVE: \"APPROVE\",\n REQUEST_CHANGES: \"REQUEST_CHANGES\",\n COMMENT: \"COMMENT\",\n PENDING: \"PENDING\",\n} as const;\n\n/** PR Review 行级评论 Diff 方向 */\nexport const DIFF_SIDE = {\n RIGHT: \"RIGHT\",\n LEFT: \"LEFT\",\n} as const;\n\n/** PR Review 行级评论 */\nexport interface CreatePullReviewComment {\n /** 文件路径 */\n path: string;\n /** 评论内容 */\n body: string;\n /** 旧文件行号(删除行),新增行设为 0 */\n old_position?: number;\n /** 新文件行号(新增/修改行),删除行设为 0 */\n new_position?: number;\n}\n\n/** 创建 PR Review 的选项 */\nexport interface CreatePullReviewOption {\n /** Review 事件类型 */\n event?: ReviewStateType;\n /** Review 主体评论 */\n body?: string;\n /** 行级评论列表 */\n comments?: CreatePullReviewComment[];\n /** 提交 SHA(可选) */\n commit_id?: string;\n}\n\n/** PR Review 响应 */\nexport interface PullReview {\n id?: number;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n commit_id?: string;\n}\n\n/** PR Review 行级评论响应 */\nexport interface PullReviewComment {\n id?: number;\n body?: string;\n path?: string;\n position?: number;\n original_position?: number;\n commit_id?: string;\n original_commit_id?: string;\n diff_hunk?: string;\n pull_request_review_id?: number;\n user?: {\n id?: number;\n login?: string;\n };\n /** 解决者,如果不为 null 表示评论已被标记为已解决 */\n resolver?: {\n id?: number;\n login?: string;\n } | null;\n created_at?: string;\n updated_at?: string;\n html_url?: string;\n}\n\n/** PR Review Thread 已解决信息 */\nexport interface ResolvedThread {\n /** 文件路径 */\n path?: string;\n /** 行号(新文件中的行号) */\n line?: number;\n /** 解决者 */\n resolvedBy?: {\n id?: number;\n login?: string;\n } | null;\n}\n\n/** 用户信息 */\nexport interface User {\n id?: number;\n login?: string;\n full_name?: string;\n email?: string;\n avatar_url?: string;\n}\n\n/** 仓库目录/文件条目 */\nexport interface RepositoryContent {\n /** 文件名 */\n name: string;\n /** 文件路径 */\n path: string;\n /** 类型:file 或 dir */\n type: \"file\" | \"dir\";\n /** 文件大小(字节) */\n size?: number;\n /** 下载 URL */\n download_url?: string;\n}\n\n/** 远程仓库引用(解析自浏览器 URL) */\nexport interface RemoteRepoRef {\n /** 仓库所有者 */\n owner: string;\n /** 仓库名称 */\n repo: string;\n /** 子目录路径(空字符串表示根目录) */\n path: string;\n /** 分支/标签(undefined 表示默认分支) */\n ref?: string;\n /** 来源平台类型 */\n provider: GitProviderType;\n /** 原始服务器 URL(如 https://git.bjxgj.com) */\n serverUrl: string;\n}\n\n/** 评论/Issue 的 Reaction(表情符号反应) */\nexport interface Reaction {\n /** 添加 reaction 的用户 */\n user?: {\n id?: number;\n login?: string;\n };\n /** reaction 内容,如 +1, -1, laugh, hooray, confused, heart, rocket, eyes */\n content?: string;\n /** 创建时间 */\n created_at?: string;\n}\n","import type { GitProviderType } from \"./types\";\n\n/** 环境检测结果 */\nexport interface DetectedProviderInfo {\n /** 检测到的 provider 类型 */\n provider: GitProviderType;\n /** 检测到的服务器 URL */\n serverUrl: string;\n /** 检测到的 API Token */\n token: string;\n /** 检测来源说明 */\n source: string;\n}\n\n/**\n * 从环境变量自动检测 Git Provider 类型和配置\n *\n * 检测优先级:\n * 1. 显式指定 `GIT_PROVIDER_TYPE` 环境变量(最高优先级)\n * 2. 存在 `GITEA_TOKEN` → Gitea\n * 3. 存在 `GITLAB_TOKEN` 或 `CI_JOB_TOKEN`(GitLab CI)→ GitLab\n * 4. 存在 `GITHUB_TOKEN` → GitHub\n * 5. 默认 → GitHub\n */\nexport function detectProvider(\n env: Record<string, string | undefined> = process.env,\n): DetectedProviderInfo {\n const explicit = env.GIT_PROVIDER_TYPE as GitProviderType | undefined;\n if (explicit && isValidProvider(explicit)) {\n return buildResult(explicit, env, \"GIT_PROVIDER_TYPE 环境变量\");\n }\n if (env.GITEA_TOKEN) {\n return buildResult(\"gitea\", env, \"检测到 GITEA_TOKEN\");\n }\n if (env.GITLAB_TOKEN || env.CI_JOB_TOKEN) {\n return buildResult(\n \"gitlab\",\n env,\n env.GITLAB_TOKEN ? \"检测到 GITLAB_TOKEN\" : \"检测到 CI_JOB_TOKEN(GitLab CI)\",\n );\n }\n if (env.GITHUB_TOKEN) {\n return buildResult(\"github\", env, \"检测到 GITHUB_TOKEN\");\n }\n return buildResult(\"github\", env, \"默认\");\n}\n\n/** 检查是否为有效的 provider 类型 */\nfunction isValidProvider(value: string): value is GitProviderType {\n return value === \"gitea\" || value === \"github\" || value === \"gitlab\";\n}\n\n/** 根据 provider 类型从环境变量中提取 serverUrl 和 token */\nfunction buildResult(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n source: string,\n): DetectedProviderInfo {\n const serverUrl = resolveServerUrl(provider, env);\n const token = resolveToken(provider, env);\n return { provider, serverUrl, token, source };\n}\n\n/**\n * 解析服务器 URL\n * - 优先使用 GIT_PROVIDER_URL\n * - Gitea: GITEA_SERVER_URL > GITHUB_SERVER_URL\n * - GitHub: GITHUB_API_URL > 默认 https://api.github.com\n * - GitLab: CI_SERVER_URL > GITLAB_URL\n */\nfunction resolveServerUrl(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n): string {\n if (env.GIT_PROVIDER_URL) {\n return env.GIT_PROVIDER_URL;\n }\n if (provider === \"github\") {\n return env.GITHUB_API_URL || \"https://api.github.com\";\n }\n if (provider === \"gitlab\") {\n return env.CI_SERVER_URL || env.GITLAB_URL || \"https://gitlab.com\";\n }\n // Gitea: 优先 GITEA_SERVER_URL,其次从 GITHUB_SERVER_URL 推导\n if (env.GITEA_SERVER_URL) {\n return env.GITEA_SERVER_URL;\n }\n if (env.GITHUB_SERVER_URL) {\n return env.GITHUB_SERVER_URL;\n }\n return \"\";\n}\n\n/**\n * 解析 API Token\n * - 优先使用 GIT_PROVIDER_TOKEN\n * - Gitea: GITEA_TOKEN > GITHUB_TOKEN\n * - GitHub: GITHUB_TOKEN\n * - GitLab: GITLAB_TOKEN > CI_JOB_TOKEN\n */\nfunction resolveToken(provider: GitProviderType, env: Record<string, string | undefined>): string {\n if (env.GIT_PROVIDER_TOKEN) {\n return env.GIT_PROVIDER_TOKEN;\n }\n if (provider === \"github\") {\n return env.GITHUB_TOKEN || \"\";\n }\n if (provider === \"gitlab\") {\n return env.GITLAB_TOKEN || env.CI_JOB_TOKEN || \"\";\n }\n return env.GITEA_TOKEN || env.GITHUB_TOKEN || \"\";\n}\n","import type { RemoteRepoRef, GitProviderType } from \"./types\";\nimport { detectProvider } from \"./detect-provider\";\n\n/** 已知的 GitHub 域名 */\nconst GITHUB_HOSTS = new Set([\"github.com\", \"www.github.com\"]);\n\n/** 已知的 GitLab 域名 */\nconst GITLAB_HOSTS = new Set([\"gitlab.com\", \"www.gitlab.com\"]);\n\n/**\n * 解析浏览器中复制的仓库 URL 为结构化的仓库引用\n *\n * 支持的 URL 格式:\n * - Gitea 仓库:https://git.example.com/owner/repo\n * - Gitea 目录:https://git.example.com/owner/repo/src/branch/main/path/to/dir\n * - Gitea 标签:https://git.example.com/owner/repo/src/tag/v1.0/path/to/dir\n * - Gitea commit:https://git.example.com/owner/repo/src/commit/abc123/path/to/dir\n * - GitHub 仓库:https://github.com/owner/repo\n * - GitHub 目录:https://github.com/owner/repo/tree/main/path/to/dir\n * - GitLab 仓库:https://gitlab.com/owner/repo\n * - GitLab 目录:https://gitlab.com/owner/repo/-/tree/main/path/to/dir\n * - git+ssh URL:git+ssh://git@host/owner/repo.git\n * - SSH URL:git@host:owner/repo.git\n *\n * @returns 解析后的仓库引用,无法解析时返回 null\n */\nexport function parseRepoUrl(url: string): RemoteRepoRef | null {\n const trimmed = url.trim();\n if (!trimmed) return null;\n // SSH 格式: git@host:owner/repo.git\n if (trimmed.startsWith(\"git@\")) {\n return parseSshUrl(trimmed);\n }\n // git+ssh:// 格式\n if (trimmed.startsWith(\"git+ssh://\")) {\n return parseGitSshUrl(trimmed);\n }\n // HTTP(S) URL\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return parseHttpUrl(trimmed);\n }\n return null;\n}\n\n/** 解析 HTTP(S) URL */\nfunction parseHttpUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const hostname = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `${parsed.protocol}//${parsed.host}`;\n const isGithub = isGithubHost(hostname);\n const isGitlab = isGitlabHost(hostname);\n const provider: GitProviderType = isGithub\n ? \"github\"\n : isGitlab\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n // 仓库根目录(只有 owner/repo)\n if (segments.length === 2) {\n return { owner, repo, path: \"\", provider, serverUrl };\n }\n // GitHub: /owner/repo/tree/branch/path...\n if (isGithub && segments[2] === \"tree\" && segments.length >= 4) {\n const ref = segments[3];\n const path = segments.slice(4).join(\"/\");\n return { owner, repo, path, ref, provider, serverUrl };\n }\n // GitLab: /owner/repo/-/tree/branch/path...\n if (segments[2] === \"-\" && segments[3] === \"tree\" && segments.length >= 5) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: isGitlab ? \"gitlab\" : provider, serverUrl };\n }\n // Gitea: /owner/repo/src/branch/<branch>/path...\n // /owner/repo/src/tag/<tag>/path...\n // /owner/repo/src/commit/<sha>/path...\n if (segments[2] === \"src\" && segments.length >= 4) {\n const refType = segments[3]; // \"branch\", \"tag\", \"commit\"\n if (\n (refType === \"branch\" || refType === \"tag\" || refType === \"commit\") &&\n segments.length >= 5\n ) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: \"gitea\", serverUrl };\n }\n }\n // 无法识别的子路径,当作仓库根目录\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git@host:owner/repo.git 格式 */\nfunction parseSshUrl(url: string): RemoteRepoRef | null {\n const match = url.match(/^git@([^:]+):(.+?)(?:\\.git)?$/);\n if (!match) return null;\n const host = match[1];\n const pathPart = match[2];\n const segments = pathPart.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1];\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git+ssh://git@host/owner/repo.git 格式 */\nfunction parseGitSshUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url.replace(\"git+ssh://\", \"ssh://\"));\n } catch {\n return null;\n }\n const host = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 判断是否为 GitHub 域名 */\nfunction isGithubHost(hostname: string): boolean {\n return GITHUB_HOSTS.has(hostname) || hostname.endsWith(\".github.com\");\n}\n\n/** 判断是否为 GitLab 域名 */\nfunction isGitlabHost(hostname: string): boolean {\n return GITLAB_HOSTS.has(hostname) || hostname.endsWith(\".gitlab.com\");\n}\n\n/** 根据服务器 URL 检测 provider 类型(非 GitHub/GitLab 默认为 Gitea) */\nfunction detectProviderForHost(serverUrl: string): GitProviderType {\n const detected = detectProvider({ GIT_PROVIDER_URL: serverUrl });\n return detected.provider;\n}\n","import type { GitDiffFile } from \"./git-sdk.types\";\n\nconst GIT_STATUS_MAP: Record<string, string> = {\n A: \"added\",\n M: \"modified\",\n D: \"deleted\",\n R: \"renamed\",\n C: \"copied\",\n};\n\nexport function mapGitStatus(status: string): string {\n return GIT_STATUS_MAP[status] || \"modified\";\n}\n\nexport function parseChangedLinesFromPatch(patch?: string): Set<number> {\n const changedLines = new Set<number>();\n if (!patch) return changedLines;\n\n const lines = patch.split(\"\\n\");\n let currentLine = 0;\n\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n changedLines.add(currentLine);\n currentLine++;\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n // 删除行,不增加 currentLine\n } else if (!line.startsWith(\"\\\\\")) {\n currentLine++;\n }\n }\n\n return changedLines;\n}\n\n/**\n * 表示一个 diff hunk 的行号变更信息\n */\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n}\n\n/**\n * 从 patch 中解析所有 hunk 信息\n */\nexport function parseHunksFromPatch(patch?: string): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n if (!patch) return hunks;\n\n const lines = patch.split(\"\\n\");\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch) {\n hunks.push({\n oldStart: parseInt(hunkMatch[1], 10),\n oldCount: parseInt(hunkMatch[2] ?? \"1\", 10),\n newStart: parseInt(hunkMatch[3], 10),\n newCount: parseInt(hunkMatch[4] ?? \"1\", 10),\n });\n }\n }\n return hunks;\n}\n\n/**\n * 根据 diff hunks 计算旧行号对应的新行号\n * @param oldLine 旧文件中的行号\n * @param hunks diff hunk 列表\n * @returns 新行号,如果该行被删除则返回 null\n */\nexport function calculateNewLineNumber(oldLine: number, hunks: DiffHunk[]): number | null {\n let offset = 0;\n\n for (const hunk of hunks) {\n const oldEnd = hunk.oldStart + hunk.oldCount - 1;\n\n if (oldLine < hunk.oldStart) {\n // 行号在这个 hunk 之前,应用之前累积的偏移\n break;\n }\n\n if (oldLine >= hunk.oldStart && oldLine <= oldEnd) {\n // 行号在这个 hunk 的删除范围内\n // 需要检查这一行是否被删除\n // 简化处理:如果 hunk 有删除(oldCount > 0),且行在范围内,认为可能被修改\n // 返回对应的新位置(基于 hunk 的起始位置)\n const lineOffsetInHunk = oldLine - hunk.oldStart;\n if (lineOffsetInHunk < hunk.newCount) {\n // 行仍然存在(可能被修改)\n return hunk.newStart + lineOffsetInHunk + offset;\n } else {\n // 行被删除\n return null;\n }\n }\n\n // 计算这个 hunk 带来的偏移\n offset += hunk.newCount - hunk.oldCount;\n }\n\n // 行号在所有 hunk 之后,应用总偏移\n return oldLine + offset;\n}\n\n/**\n * 批量计算文件中多个旧行号对应的新行号\n * @param oldLines 旧行号数组\n * @param patch diff patch 文本\n * @returns Map<旧行号, 新行号>,被删除的行不在结果中\n */\nexport function calculateLineOffsets(\n oldLines: number[],\n patch?: string,\n): Map<number, number | null> {\n const result = new Map<number, number | null>();\n const hunks = parseHunksFromPatch(patch);\n\n for (const oldLine of oldLines) {\n result.set(oldLine, calculateNewLineNumber(oldLine, hunks));\n }\n\n return result;\n}\n\nexport function parseDiffText(diffText: string): GitDiffFile[] {\n const files: GitDiffFile[] = [];\n const fileDiffs = diffText.split(/^diff --git /m).filter(Boolean);\n\n for (const fileDiff of fileDiffs) {\n const headerMatch = fileDiff.match(/^a\\/(.+?) b\\/(.+?)[\\r\\n]/);\n if (!headerMatch) continue;\n\n const filename = headerMatch[2];\n const patchStart = fileDiff.indexOf(\"@@\");\n if (patchStart === -1) continue;\n\n const patch = fileDiff.slice(patchStart);\n files.push({ filename, patch });\n }\n\n return files;\n}\n","import { execSync } from \"child_process\";\nimport { parseDiffText } from \"../../git-sdk/git-sdk-diff.utils\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * Gitea 平台适配器\n */\nexport class GiteaAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v1${path}`;\n const headers: Record<string, string> = {\n Authorization: `token ${this.token}`,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.request<Repository>(\"GET\", `/repos/${owner}/${repo}`);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.request<Branch>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.request<BranchProtection[]>(\"GET\", `/repos/${owner}/${repo}/branch_protections`);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"GET\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"POST\",\n `/repos/${owner}/${repo}/branch_protections`,\n options,\n );\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"PATCH\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n options,\n );\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const protectionOptions = hasWhitelist\n ? {\n enable_push: true,\n enable_push_whitelist: true,\n push_whitelist_usernames: pushWhitelistUsernames,\n }\n : { enable_push: false };\n if (existing) {\n return this.editBranchProtection(\n owner,\n repo,\n existing.rule_name || branch,\n protectionOptions,\n );\n } else {\n return this.createBranchProtection(owner, repo, {\n rule_name: branch,\n branch_name: branch,\n ...protectionOptions,\n });\n }\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n await this.deleteBranchProtection(owner, repo, existing.rule_name || branch);\n return existing;\n }\n return null;\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n const listResult = execSync(\n `curl -s -X GET \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n const protections = JSON.parse(listResult) as Array<{\n rule_name?: string;\n branch_name?: string;\n }>;\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n const ruleName = existing.rule_name || branch;\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections/${ruleName}\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${ruleName}`);\n } else {\n console.log(`✅ 分支本身没有保护规则,无需解锁`);\n }\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.request<PullRequest>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.request<PullRequest>(\"PATCH\", `/repos/${owner}/${repo}/pulls/${index}`, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n return this.request<PullRequest[]>(\"GET\", `/repos/${owner}/${repo}/pulls${query}`);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"limit\", String(limit));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", options.sort);\n if (options?.milestone) params.set(\"milestone\", String(options.milestone));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const prs = await this.request<PullRequest[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!prs || prs.length === 0) break;\n allPRs.push(...prs);\n if (prs.length < limit) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const commits = await this.request<PullRequestCommit[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&limit=${limit}`,\n );\n if (!commits || commits.length === 0) break;\n allCommits.push(...commits);\n if (commits.length < limit) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const files = await this.request<ChangedFile[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files`,\n );\n const needsPatch = files.some((f) => !f.patch && f.status !== \"deleted\");\n if (!needsPatch) {\n return files;\n }\n try {\n const diffText = await this.getPullRequestDiff(owner, repo, index);\n const diffFiles = parseDiffText(diffText);\n const patchMap = new Map(diffFiles.map((f) => [f.filename, f.patch]));\n for (const file of files) {\n if (!file.patch && file.filename) {\n file.patch = patchMap.get(file.filename);\n }\n }\n } catch (error) {\n console.warn(`警告: 无法获取 PR diff 来填充 patch 字段:`, error);\n }\n return files;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/pulls/${index}.diff`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.request<CommitInfo>(\"GET\", `/repos/${owner}/${repo}/git/commits/${sha}`);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(\n `${this.baseUrl}/api/v1/repos/${owner}/${repo}/compare/${baseSha}...${headSha}.diff`,\n );\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/git/commits/${sha}.diff`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const url = `${this.baseUrl}/api/v1/repos/${owner}/${repo}/raw/${encodeURIComponent(filepath)}${query}`;\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${encodeURIComponent(path)}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<\n Array<{ name: string; path: string; type: string; size: number; download_url?: string }>\n >(\"GET\", `/repos/${owner}/${repo}/contents${encodedPath}${query}`);\n return result.map((item) => ({\n name: item.name,\n path: item.path,\n type: item.type === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size,\n download_url: item.download_url,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.request<Issue>(\"POST\", `/repos/${owner}/${repo}/issues`, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.request<IssueComment[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/comments`);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n options,\n );\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.request<PullReview>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n options,\n );\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.request<PullReview[]>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}/reviews`);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // Gitea 不支持更新 review,使用删除+创建的方式模拟\n await this.deletePullReview(owner, repo, index, reviewId);\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.request<PullReviewComment[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n // Gitea: PR review comment reactions 使用与 issue comment 相同的路径\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.request<Reaction[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/reactions`);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"limit\", String(limit));\n const result = await this.request<{ data: User[] }>(\n \"GET\",\n `/users/search?${params.toString()}`,\n );\n return result.data || [];\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.request<User[]>(\"GET\", `/teams/${teamId}/members`);\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n DIFF_SIDE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/** GraphQL review thread 节点类型 */\ninterface GraphQLReviewThread {\n isResolved: boolean;\n resolvedBy?: { login: string; databaseId: number } | null;\n path?: string | null;\n line?: number | null;\n comments: { nodes: Array<{ databaseId: number }> };\n}\n\n/**\n * GitHub 平台适配器\n */\nexport class GithubAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github+json\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async requestGraphQL<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const graphqlUrl =\n this.baseUrl.replace(/\\/v3\\/?$/, \"\").replace(/\\/api\\/v3\\/?$/, \"\") + \"/graphql\";\n const response = await fetch(graphqlUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub GraphQL error: ${response.status} - ${errorText}`);\n }\n const json = (await response.json()) as { data: T; errors?: unknown[] };\n if (json.errors) {\n throw new Error(`GitHub GraphQL errors: ${JSON.stringify(json.errors)}`);\n }\n return json.data;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github.v3.diff\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const result = await this.request<Record<string, unknown>>(\"GET\", `/repos/${owner}/${repo}`);\n return this.mapRepository(result);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n return this.mapBranch(result);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n try {\n const rules = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/rules/rulesets`,\n );\n return rules.map((rule) => this.mapRulesetToProtection(rule));\n } catch {\n return [];\n }\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const branchName = options.branch_name || options.rule_name || \"\";\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branchName)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branchName);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const body: Record<string, unknown> = {\n required_status_checks: null,\n enforce_admins: true,\n required_pull_request_reviews: null,\n restrictions: hasWhitelist\n ? { users: pushWhitelistUsernames, teams: [] }\n : { users: [], teams: [] },\n };\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branch);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/repos/${owner}/${repo}/branches/${branch}/protection\" -H \"Authorization: Bearer ${this.token}\" -H \"Accept: application/vnd.github+json\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n );\n return this.mapPullRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n options,\n );\n return this.mapPullRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls${query}`,\n );\n return results.map((pr) => this.mapPullRequest(pr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", this.mapSortParam(options.sort));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allPRs.push(...results.map((pr) => this.mapPullRequest(pr)));\n if (results.length < perPage) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((f) => this.mapChangedFile(f)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/commits/${sha}`,\n );\n const commit = this.mapCommit(result);\n const files = ((result.files as Array<Record<string, unknown>>) || []).map((f) =>\n this.mapChangedFile(f),\n );\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/compare/${baseSha}...${headSha}`);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/commits/${sha}`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const result = await this.request<{ content?: string; encoding?: string }>(\n \"GET\",\n `/repos/${owner}/${repo}/contents/${filepath}${query}`,\n );\n if (result.content && result.encoding === \"base64\") {\n return Buffer.from(result.content, \"base64\").toString(\"utf-8\");\n }\n return result.content || \"\";\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${path}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/contents${encodedPath}${query}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size as number,\n download_url: item.download_url as string,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const body: Record<string, unknown> = {\n title: options.title,\n body: options.body,\n assignees: options.assignees,\n labels: options.labels,\n milestone: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n );\n return results.map((c) => this.mapIssueComment(c));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n { body: options.body },\n );\n return this.mapIssueComment(result);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n return this.mapIssueComment(result);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const body: Record<string, unknown> = {\n event: this.mapReviewEvent(options.event),\n body: options.body,\n commit_id: options.commit_id,\n };\n if (options.comments?.length) {\n body.comments = options.comments.map((c) => ({\n path: c.path,\n body: c.body,\n line: c.new_position,\n side: DIFF_SIDE.RIGHT,\n }));\n }\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n body,\n );\n return this.mapPullReview(result);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n );\n return results.map((r) => this.mapPullReview(r));\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // GitHub 的 updatePullReview 只能更新 PENDING 状态的 review\n // 已提交的 review 无法更新,所以使用删除+创建的方式\n try {\n await this.deletePullReview(owner, repo, index, reviewId);\n } catch {\n // 已提交的 review 无法删除,忽略错误\n }\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n const comments = results.map((c) => this.mapPullReviewComment(c));\n // 通过 GraphQL 补充 resolved 状态\n try {\n const resolvedMap = await this.fetchResolvedThreads(owner, repo, index);\n for (const comment of comments) {\n if (comment.id && resolvedMap.has(comment.id)) {\n comment.resolver = resolvedMap.get(comment.id) ?? null;\n }\n }\n } catch {\n // GraphQL 查询失败不影响主流程\n }\n return comments;\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"per_page\", String(limit));\n const result = await this.request<{ items: Array<Record<string, unknown>> }>(\n \"GET\",\n `/search/users?${params.toString()}`,\n );\n return (result.items || []).map((u) => this.mapUser(u));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/teams/${teamId}/members`,\n );\n return results.map((u) => this.mapUser(u));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapRepository(data: Record<string, unknown>): Repository {\n const owner = data.owner as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n owner: owner\n ? {\n id: owner.id as number,\n login: owner.login as string,\n full_name: owner.full_name as string,\n }\n : undefined,\n name: data.name as string,\n full_name: data.full_name as string,\n default_branch: data.default_branch as string,\n };\n }\n\n protected mapBranch(data: Record<string, unknown>): Branch {\n const commit = data.commit as Record<string, unknown> | undefined;\n const commitObj = commit?.commit as Record<string, unknown> | undefined;\n return {\n name: data.name as string,\n protected: data.protected as boolean,\n commit: commit\n ? {\n id: commit.sha as string,\n message: commitObj?.message as string,\n }\n : undefined,\n };\n }\n\n protected mapPullRequest(data: Record<string, unknown>): PullRequest {\n const head = data.head as Record<string, unknown> | undefined;\n const base = data.base as Record<string, unknown> | undefined;\n const user = data.user as Record<string, unknown> | undefined;\n const reviewers = data.requested_reviewers as Array<Record<string, unknown>> | undefined;\n const teams = data.requested_teams as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n head: head\n ? {\n ref: head.ref as string,\n sha: head.sha as string,\n repo: head.repo ? this.mapRepository(head.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n base: base\n ? {\n ref: base.ref as string,\n sha: base.sha as string,\n repo: base.repo ? this.mapRepository(base.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.login as string,\n })),\n requested_reviewers_teams: teams?.map((t) => ({\n id: t.id as number,\n name: t.name as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapCommit(data: Record<string, unknown>): PullRequestCommit {\n const commit = data.commit as Record<string, unknown> | undefined;\n const author = commit?.author as Record<string, unknown> | undefined;\n const ghAuthor = data.author as Record<string, unknown> | undefined;\n const ghCommitter = data.committer as Record<string, unknown> | undefined;\n return {\n sha: data.sha as string,\n commit: commit\n ? {\n message: commit.message as string,\n author: author\n ? {\n name: author.name as string,\n email: author.email as string,\n date: author.date as string,\n }\n : undefined,\n }\n : undefined,\n author: ghAuthor ? { id: ghAuthor.id as number, login: ghAuthor.login as string } : undefined,\n committer: ghCommitter\n ? { id: ghCommitter.id as number, login: ghCommitter.login as string }\n : undefined,\n };\n }\n\n protected mapChangedFile(data: Record<string, unknown>): ChangedFile {\n return {\n filename: data.filename as string,\n status: data.status as string,\n additions: data.additions as number,\n deletions: data.deletions as number,\n changes: data.changes as number,\n patch: data.patch as string,\n raw_url: data.raw_url as string,\n contents_url: data.contents_url as string,\n };\n }\n\n protected mapIssueComment(data: Record<string, unknown>): IssueComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const user = data.user as Record<string, unknown> | undefined;\n const labels = data.labels as Array<Record<string, unknown>> | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n labels: labels?.map((l) => ({\n id: l.id as number,\n name: l.name as string,\n color: l.color as string,\n })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.login as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapPullReview(data: Record<string, unknown>): PullReview {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.submitted_at as string,\n updated_at: data.submitted_at as string,\n commit_id: data.commit_id as string,\n };\n }\n\n /**\n * 通过 GraphQL 查询 PR 的 review threads resolved 状态\n * 返回 Map<commentId, resolver>(用于 listPullReviewComments 内部补充 resolver)\n */\n protected async fetchResolvedThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<Map<number, { id?: number; login?: string } | null>> {\n const threads = await this.queryReviewThreads(owner, repo, prNumber);\n const resolvedMap = new Map<number, { id?: number; login?: string } | null>();\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n if (!firstComment?.databaseId) continue;\n resolvedMap.set(\n firstComment.databaseId,\n thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n );\n }\n return resolvedMap;\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const threads = await this.queryReviewThreads(owner, repo, index);\n const result: ResolvedThread[] = [];\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n result.push({\n path: thread.path ?? undefined,\n line: thread.line ?? undefined,\n resolvedBy: thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n });\n }\n return result;\n }\n\n /**\n * GraphQL 查询 PR 的所有 review threads\n */\n protected async queryReviewThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<GraphQLReviewThread[]> {\n const QUERY = `\n query($owner: String!, $repo: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n resolvedBy { login databaseId }\n path\n line\n comments(first: 1) {\n nodes { databaseId }\n }\n }\n }\n }\n }\n }\n `;\n interface GraphQLResult {\n repository: {\n pullRequest: {\n reviewThreads: {\n nodes: GraphQLReviewThread[];\n };\n };\n };\n }\n const data = await this.requestGraphQL<GraphQLResult>(QUERY, {\n owner,\n repo,\n prNumber,\n });\n return data.repository.pullRequest.reviewThreads.nodes;\n }\n\n protected mapPullReviewComment(data: Record<string, unknown>): PullReviewComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n path: data.path as string,\n position: data.position as number,\n original_position: data.original_position as number,\n commit_id: data.commit_id as string,\n original_commit_id: data.original_commit_id as string,\n diff_hunk: data.diff_hunk as string,\n pull_request_review_id: data.pull_request_review_id as number,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapReaction(data: Record<string, unknown>): Reaction {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n content: data.content as string,\n created_at: data.created_at as string,\n };\n }\n\n protected mapUser(data: Record<string, unknown>): User {\n return {\n id: data.id as number,\n login: data.login as string,\n full_name: data.name as string,\n email: data.email as string,\n avatar_url: data.avatar_url as string,\n };\n }\n\n protected mapGithubProtection(\n data: Record<string, unknown>,\n branchName: string,\n ): BranchProtection {\n const requiredReviews = data.required_pull_request_reviews as\n | Record<string, unknown>\n | undefined;\n return {\n branch_name: branchName,\n rule_name: branchName,\n required_approvals: requiredReviews?.required_approving_review_count as number,\n dismiss_stale_approvals: requiredReviews?.dismiss_stale_reviews as boolean,\n enable_push: true,\n };\n }\n\n protected mapRulesetToProtection(data: Record<string, unknown>): BranchProtection {\n return {\n rule_name: data.name as string,\n branch_name: data.name as string,\n };\n }\n\n protected buildGithubProtectionBody(\n options: CreateBranchProtectionOption | EditBranchProtectionOption,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n required_status_checks: options.enable_status_check\n ? { strict: true, contexts: options.status_check_contexts || [] }\n : null,\n enforce_admins: options.block_admin_merge_override ?? false,\n required_pull_request_reviews: options.required_approvals\n ? {\n required_approving_review_count: options.required_approvals,\n dismiss_stale_reviews: options.dismiss_stale_approvals ?? false,\n }\n : null,\n restrictions: options.enable_push_whitelist\n ? {\n users: options.push_whitelist_usernames || [],\n teams: options.push_whitelist_teams || [],\n }\n : null,\n };\n return body;\n }\n\n protected mapReviewEvent(event?: string): string {\n const eventMap: Record<string, string> = {\n [REVIEW_STATE.APPROVE]: REVIEW_STATE.APPROVE,\n [REVIEW_STATE.REQUEST_CHANGES]: REVIEW_STATE.REQUEST_CHANGES,\n [REVIEW_STATE.COMMENT]: REVIEW_STATE.COMMENT,\n [REVIEW_STATE.PENDING]: REVIEW_STATE.PENDING,\n };\n return event ? eventMap[event] || event : REVIEW_STATE.COMMENT;\n }\n\n protected mapSortParam(sort: string): string {\n const sortMap: Record<string, string> = {\n oldest: \"created\",\n recentupdate: \"updated\",\n leastupdate: \"updated\",\n mostcomment: \"comments\",\n leastcomment: \"comments\",\n };\n return sortMap[sort] || \"created\";\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * GitLab 平台适配器\n *\n * GitLab API 特点:\n * - 使用 PRIVATE-TOKEN 认证\n * - 项目通过 URL-encoded path(owner/repo)标识\n * - Merge Request(MR)对应 Pull Request\n * - Notes 对应 Comments/Reviews\n * - API 前缀 /api/v4\n */\nexport class GitlabAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n /** 将 owner/repo 编码为 GitLab 项目路径 */\n protected encodeProject(owner: string, repo: string): string {\n return encodeURIComponent(`${owner}/${repo}`);\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const headers: Record<string, string> = {\n \"PRIVATE-TOKEN\": this.token,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(path: string): Promise<string> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\"GET\", `/projects/${project}`);\n const namespace = result.namespace as Record<string, unknown> | undefined;\n return {\n id: result.id as number,\n name: result.name as string,\n full_name: result.path_with_namespace as string,\n default_branch: result.default_branch as string,\n owner: namespace\n ? {\n id: namespace.id as number,\n login: namespace.path as string,\n full_name: namespace.name as string,\n }\n : undefined,\n };\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/branches/${encodeURIComponent(branch)}`,\n );\n const commit = result.commit as Record<string, unknown> | undefined;\n return {\n name: result.name as string,\n protected: result.protected as boolean,\n commit: commit ? { id: commit.id as string, message: commit.message as string } : undefined,\n };\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/protected_branches`,\n );\n return results.map((p) => this.mapProtection(p));\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n return this.mapProtection(result);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const branchName = options.branch_name || options.rule_name || \"\";\n const body: Record<string, unknown> = {\n name: branchName,\n push_access_level: options.enable_push ? 30 : 0, // 30=Developer, 0=No one\n merge_access_level: 30,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/protected_branches`,\n body,\n );\n return this.mapProtection(result);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n // GitLab 不支持直接编辑,需要先删除再创建\n await this.deleteBranchProtection(owner, repo, name);\n return this.createBranchProtection(owner, repo, {\n branch_name: name,\n rule_name: name,\n ...options,\n });\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n // 先尝试删除已有保护\n try {\n await this.deleteBranchProtection(owner, repo, branch);\n } catch {\n // 不存在时忽略\n }\n const pushLevel = options?.pushWhitelistUsernames?.length ? 30 : 0;\n return this.createBranchProtection(owner, repo, {\n branch_name: branch,\n rule_name: branch,\n enable_push: pushLevel > 0,\n });\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n const project = this.encodeProject(owner, repo);\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v4/projects/${project}/protected_branches/${encodeURIComponent(branch)}\" -H \"PRIVATE-TOKEN: ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Merge Request(对应 Pull Request) ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}`,\n );\n return this.mapMergeRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {};\n if (options.title) body.title = options.title;\n if (options.body !== undefined) body.description = options.body;\n if (options.state) body.state_event = options.state === \"closed\" ? \"close\" : \"reopen\";\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}`,\n body,\n );\n return this.mapMergeRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const glState = this.mapStateParam(state);\n const query = glState ? `?state=${glState}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests${query}`,\n );\n return results.map((mr) => this.mapMergeRequest(mr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const allMRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", this.mapStateParam(options.state) || \"all\");\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allMRs.push(...results.map((mr) => this.mapMergeRequest(mr)));\n if (results.length < perPage) break;\n page++;\n }\n return allMRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const project = this.encodeProject(owner, repo);\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapGitlabCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const project = this.encodeProject(owner, repo);\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/diffs?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((d) => this.mapDiffToChangedFile(d)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n const project = this.encodeProject(owner, repo);\n return this.fetchText(`/projects/${project}/merge_requests/${index}/raw_diffs`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}`,\n );\n // 获取 commit 的 diff 来填充 files\n let files: ChangedFile[] = [];\n try {\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n files = diffs.map((d) => this.mapDiffToChangedFile(d));\n } catch {\n // diff 获取失败时忽略\n }\n const commit = this.mapGitlabCommit(result);\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<{ diffs: Array<Record<string, unknown>> }>(\n \"GET\",\n `/projects/${project}/repository/compare?from=${encodeURIComponent(baseSha)}&to=${encodeURIComponent(headSha)}`,\n );\n // 将 diffs 拼接为 unified diff 文本\n return (result.diffs || [])\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n return diffs\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const encodedPath = encodeURIComponent(filepath);\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const url = `${this.baseUrl}/api/v4/projects/${project}/repository/files/${encodedPath}/raw${query}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(\n `GitLab API error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n return response.text();\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const project = this.encodeProject(owner, repo);\n const params = new URLSearchParams();\n if (path) params.set(\"path\", path);\n if (ref) params.set(\"ref\", ref);\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/tree?${params.toString()}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"tree\" ? (\"dir\" as const) : (\"file\" as const),\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {\n title: options.title,\n description: options.body,\n assignee_ids: options.assignees,\n labels: options.labels?.join(\",\"),\n milestone_id: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab: MR notes 作为 issue comments\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results.filter((n) => !(n.system as boolean)).map((n) => this.mapNote(n));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n return this.mapNote(result);\n }\n\n async updateIssueComment(\n _owner: string,\n _repo: string,\n _commentId: number,\n _body: string,\n ): Promise<IssueComment> {\n // GitLab 更新 note 需要 noteable_iid,接口签名不含此信息\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 更新评论,请使用 createIssueComment 替代\");\n }\n\n async deleteIssueComment(_owner: string, _repo: string, _commentId: number): Promise<void> {\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 删除评论\");\n }\n\n // ============ MR Review(对应 PR Review) ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 note 模拟\n // 如果有 body,创建一个总体评论\n if (options.body) {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n const note = this.mapNote(result);\n return {\n id: note.id,\n body: note.body,\n state: options.event || REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n }\n // 如果有行级评论,逐个创建\n if (options.comments?.length) {\n for (const comment of options.comments) {\n await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: `**${comment.path}** (line ${comment.new_position})\\n\\n${comment.body}` },\n );\n }\n }\n // 如果是 APPROVE 事件,调用 approve API\n if (options.event === REVIEW_STATE.APPROVE) {\n await this.request<void>(\"POST\", `/projects/${project}/merge_requests/${index}/approve`);\n }\n return {\n id: 0,\n body: options.body || \"\",\n state: options.event || REVIEW_STATE.COMMENT,\n };\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 notes 模拟\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !(n.system as boolean))\n .map((n) => {\n const note = this.mapNote(n);\n return {\n id: note.id,\n body: note.body,\n state: REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n });\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n { body },\n );\n return {\n id: result.id as number,\n body: result.body as string,\n state: REVIEW_STATE.COMMENT,\n user: result.author\n ? {\n id: (result.author as Record<string, unknown>).id as number,\n login: (result.author as Record<string, unknown>).username as string,\n }\n : undefined,\n };\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n _reviewId: number,\n ): Promise<PullReviewComment[]> {\n // GitLab 没有 review 下的 comments 概念,返回所有 diff notes\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !!(n.position as Record<string, unknown> | undefined))\n .map((n) => {\n const user = (n.author as Record<string, unknown>) || {};\n const position = (n.position as Record<string, unknown>) || {};\n return {\n id: n.id as number,\n body: n.body as string,\n path: (position.new_path || position.old_path) as string,\n position: position.new_line as number,\n original_position: position.old_line as number,\n user: { id: user.id as number, login: user.username as string },\n created_at: n.created_at as string,\n updated_at: n.updated_at as string,\n };\n });\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n // GitLab: 删除 MR note\n const project = this.encodeProject(owner, repo);\n // GitLab 删除 note 需要 merge_request_iid,但此处只有 commentId(note_id)\n // 使用全局 note 删除不可行,需要通过其他方式获取 MR iid\n // 暂时忽略,GitLab 场景下行级评论删除不常用\n console.warn(\n `⚠️ GitLab 暂不支持删除单条 review comment (id: ${commentId}, project: ${project})`,\n );\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getPullReviewCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const project = this.encodeProject(owner, repo);\n try {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/award_emoji`,\n );\n return results.map((r) => {\n const user = r.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.username as string } : undefined,\n content: r.name as string,\n created_at: r.created_at as string,\n };\n });\n } catch {\n return [];\n }\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"search\", query);\n params.set(\"per_page\", String(limit));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/users?${params.toString()}`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n email: u.email as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n // GitLab: group members\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/groups/${teamId}/members`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapProtection(data: Record<string, unknown>): BranchProtection {\n const pushAccess = data.push_access_levels as Array<Record<string, unknown>> | undefined;\n return {\n branch_name: data.name as string,\n rule_name: data.name as string,\n enable_push: pushAccess ? pushAccess.some((l) => (l.access_level as number) > 0) : false,\n };\n }\n\n protected mapMergeRequest(data: Record<string, unknown>): PullRequest {\n const author = data.author as Record<string, unknown> | undefined;\n const reviewers = data.reviewers as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n head: {\n ref: data.source_branch as string,\n sha: data.sha as string,\n },\n base: {\n ref: data.target_branch as string,\n sha: data.diff_refs\n ? ((data.diff_refs as Record<string, unknown>).base_sha as string)\n : undefined,\n },\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.username as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapGitlabCommit(data: Record<string, unknown>): PullRequestCommit {\n return {\n sha: (data.id || data.sha) as string,\n commit: {\n message: (data.message || data.title) as string,\n author: {\n name: data.author_name as string,\n email: data.author_email as string,\n date: (data.authored_date || data.created_at) as string,\n },\n },\n author: data.author_name ? { login: data.author_name as string } : undefined,\n committer: data.committer_name ? { login: data.committer_name as string } : undefined,\n };\n }\n\n protected mapDiffToChangedFile(data: Record<string, unknown>): ChangedFile {\n let status = \"modified\";\n if (data.new_file) status = \"added\";\n else if (data.deleted_file) status = \"deleted\";\n else if (data.renamed_file) status = \"renamed\";\n const diff = data.diff as string | undefined;\n // 从 diff 中计算 additions/deletions\n let additions = 0;\n let deletions = 0;\n if (diff) {\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) additions++;\n if (line.startsWith(\"-\") && !line.startsWith(\"---\")) deletions++;\n }\n }\n return {\n filename: (data.new_path || data.old_path) as string,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: diff,\n };\n }\n\n protected mapNote(data: Record<string, unknown>): IssueComment {\n const author = data.author as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const author = data.author as Record<string, unknown> | undefined;\n const labels = data.labels as string[] | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n labels: labels?.map((l) => ({ name: l })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.username as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.web_url as string,\n };\n }\n\n protected mapStateParam(state?: \"open\" | \"closed\" | \"all\"): string | undefined {\n if (!state) return undefined;\n const stateMap: Record<string, string> = {\n open: \"opened\",\n closed: \"closed\",\n all: \"all\",\n };\n return stateMap[state] || state;\n }\n}\n","import type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"./git-provider.interface\";\nimport {\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"./types\";\nimport { GiteaAdapter } from \"./adapters/gitea.adapter\";\nimport { GithubAdapter } from \"./adapters/github.adapter\";\nimport { GitlabAdapter } from \"./adapters/gitlab.adapter\";\n\n/**\n * Git Provider 统一服务\n * 根据配置的 provider 类型代理到对应的适配器实现\n */\nexport class GitProviderService implements GitProvider {\n protected readonly adapter: GitProvider;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.adapter = this.createAdapter(options);\n }\n\n /**\n * 根据 provider 类型创建对应的适配器\n */\n protected createAdapter(options: GitProviderModuleOptions): GitProvider {\n switch (options.provider) {\n case \"gitea\":\n return new GiteaAdapter(options);\n case \"github\":\n return new GithubAdapter(options);\n case \"gitlab\":\n return new GitlabAdapter(options);\n default:\n throw new Error(`不支持的 Git Provider 类型: ${options.provider}`);\n }\n }\n\n // ============ 配置验证 ============\n\n validateConfig(): void {\n this.adapter.validateConfig();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.adapter.getRepository(owner, repo);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.adapter.getBranch(owner, repo, branch);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.adapter.listBranchProtections(owner, repo);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.adapter.getBranchProtection(owner, repo, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.createBranchProtection(owner, repo, options);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.editBranchProtection(owner, repo, name, options);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n return this.adapter.deleteBranchProtection(owner, repo, name);\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n return this.adapter.lockBranch(owner, repo, branch, options);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n return this.adapter.unlockBranch(owner, repo, branch);\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n this.adapter.unlockBranchSync(owner, repo, branch);\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.adapter.getPullRequest(owner, repo, index);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.adapter.editPullRequest(owner, repo, index, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n return this.adapter.listPullRequests(owner, repo, state);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n return this.adapter.listAllPullRequests(owner, repo, options);\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n return this.adapter.getPullRequestCommits(owner, repo, index);\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n return this.adapter.getPullRequestFiles(owner, repo, index);\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.adapter.getPullRequestDiff(owner, repo, index);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.adapter.getCommit(owner, repo, sha);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.adapter.getCompareDiff(owner, repo, baseSha, headSha);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.adapter.getCommitDiff(owner, repo, sha);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n return this.adapter.getFileContent(owner, repo, filepath, ref);\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path?: string,\n ref?: string,\n ): Promise<RepositoryContent[]> {\n return this.adapter.listRepositoryContents(owner, repo, path, ref);\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.adapter.createIssue(owner, repo, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.adapter.listIssueComments(owner, repo, index);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.adapter.createIssueComment(owner, repo, index, options);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.adapter.updateIssueComment(owner, repo, commentId, body);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deleteIssueComment(owner, repo, commentId);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.adapter.createPullReview(owner, repo, index, options);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.adapter.listPullReviews(owner, repo, index);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n return this.adapter.updatePullReview(owner, repo, index, reviewId, body);\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n return this.adapter.deletePullReview(owner, repo, index, reviewId);\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.adapter.listPullReviewComments(owner, repo, index, reviewId);\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deletePullReviewComment(owner, repo, commentId);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n return this.adapter.listResolvedThreads(owner, repo, index);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getIssueCommentReactions(owner, repo, commentId);\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getPullReviewCommentReactions(owner, repo, commentId);\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.adapter.getIssueReactions(owner, repo, index);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit?: number): Promise<User[]> {\n return this.adapter.searchUsers(query, limit);\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.adapter.getTeamMembers(teamId);\n }\n}\n","export * from \"./gitea.adapter\";\nexport * from \"./github.adapter\";\nexport * from \"./gitlab.adapter\";\n","export * from \"./types\";\nexport * from \"./detect-provider\";\nexport * from \"./parse-repo-url\";\nexport * from \"./git-provider.interface\";\nexport * from \"./git-provider.service\";\nexport * from \"./adapters\";\n","import { spawn, execSync } from \"child_process\";\nimport type { GitCommit, GitChangedFile, GitDiffFile, GitRunOptions } from \"./git-sdk.types\";\nimport { mapGitStatus, parseDiffText } from \"./git-sdk-diff.utils\";\n\nexport class GitSdkService {\n protected readonly defaultOptions: GitRunOptions = {\n cwd: process.cwd(),\n maxBuffer: 10 * 1024 * 1024, // 10MB\n };\n\n runCommand(args: string[], options?: GitRunOptions): Promise<string> {\n const opts = { ...this.defaultOptions, ...options };\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd: opts.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(`Git 命令失败 (${code}): ${stderr}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n runCommandSync(args: string[], options?: GitRunOptions): string {\n const opts = { ...this.defaultOptions, ...options };\n return execSync(`git ${args.join(\" \")}`, {\n cwd: opts.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: opts.maxBuffer,\n });\n }\n\n getRemoteUrl(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"remote\", \"get-url\", \"origin\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getCurrentBranch(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getDefaultBranch(options?: GitRunOptions): string {\n try {\n const result = this.runCommandSync(\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n options,\n ).trim();\n return result.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // 回退到常见默认分支\n for (const branch of [\"main\", \"master\"]) {\n try {\n this.runCommandSync([\"rev-parse\", \"--verify\", `origin/${branch}`], options);\n return branch;\n } catch {\n continue;\n }\n }\n return \"main\";\n }\n }\n\n parseRepositoryFromRemoteUrl(remoteUrl: string): { owner: string; repo: string } | null {\n const match = remoteUrl.match(/[/:]([\\w.-]+)\\/([\\w.-]+?)(?:\\.git)?$/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n return null;\n }\n\n async getChangedFilesBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitChangedFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"diff\", \"--name-status\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const files: GitChangedFile[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [status, filename] = line.split(\"\\t\");\n files.push({\n filename,\n status: mapGitStatus(status),\n });\n }\n\n return files;\n }\n\n /**\n * 获取两个 ref 之间的 diff(包含 patch 信息)\n * @param baseRef 基准 ref\n * @param headRef 目标 ref\n * @param options 运行选项\n * @returns 包含 filename 和 patch 的文件列表\n */\n async getDiffBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitDiffFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand([\"diff\", `${resolvedBase}..${resolvedHead}`], options);\n\n return parseDiffText(result);\n }\n\n async getCommitsBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitCommit[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"log\", \"--format=%H|%s|%an|%ae|%aI\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const commits: GitCommit[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, authorName, authorEmail, date] = line.split(\"|\");\n commits.push({\n sha,\n message,\n author: {\n name: authorName,\n email: authorEmail,\n date,\n },\n });\n }\n\n return commits;\n }\n\n async getFilesForCommit(sha: string, options?: GitRunOptions): Promise<string[]> {\n const result = await this.runCommand([\"show\", \"--name-only\", \"--format=\", sha], options);\n return result.trim().split(\"\\n\").filter(Boolean);\n }\n\n async getFileContent(ref: string, filename: string, options?: GitRunOptions): Promise<string> {\n return this.runCommand([\"show\", `${ref}:${filename}`], options);\n }\n\n getCommitDiff(sha: string, options?: GitRunOptions): GitDiffFile[] {\n try {\n const output = this.runCommandSync([\"show\", \"--format=\", \"--patch\", sha], options);\n return parseDiffText(output);\n } catch (error) {\n console.warn(`⚠️ git show 失败: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * 解析 ref,支持本地分支、远程分支、commit SHA\n * 优先级:commit SHA > 本地分支 > origin/分支 > fetch后重试 > 原始值\n */\n async resolveRef(ref: string, options?: GitRunOptions): Promise<string> {\n if (!ref) {\n throw new Error(`resolveRef: ref 参数不能为空。调用栈: ${new Error().stack}`);\n }\n if (/^[0-9a-f]{7,40}$/i.test(ref)) {\n return ref;\n }\n if (ref.startsWith(\"origin/\")) {\n return ref;\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", ref], options);\n return ref;\n } catch {\n // 本地分支不存在\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", `origin/${ref}`], options);\n return `origin/${ref}`;\n } catch {\n // origin/分支也不存在\n }\n try {\n await this.runCommand(\n [\"fetch\", \"origin\", `${ref}:refs/remotes/origin/${ref}`, \"--depth=1\"],\n options,\n );\n return `origin/${ref}`;\n } catch {\n // fetch 失败\n }\n return ref;\n }\n}\n","export * from \"./git-sdk.types\";\nexport * from \"./git-sdk-diff.utils\";\nexport { GitSdkService } from \"./git-sdk.service\";\n","export interface ClaudeAdapterConfig {\n model?: string;\n baseUrl?: string;\n authToken?: string;\n hasCompletedOnboarding?: boolean;\n}\n\nexport interface OpenAIAdapterConfig {\n model: string;\n baseUrl?: string;\n apiKey: string;\n}\n\nexport interface OpenCodeAdapterConfig {\n model?: string;\n /** OpenCode 服务地址,默认 http://localhost:4096 */\n serverUrl?: string;\n /** 云厂商 API 地址(会动态写入 opencode.json 配置) */\n baseUrl?: string;\n apiKey?: string;\n providerID?: string;\n}\n\nexport type LLMMode = \"claude-code\" | \"openai\" | \"gemini\" | \"open-code\";\n\nexport interface GeminiAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n}\n\nexport interface LlmProxyConfig {\n defaultAdapter?: LLMMode;\n claudeCode?: ClaudeAdapterConfig;\n openai?: OpenAIAdapterConfig;\n openCode?: OpenCodeAdapterConfig;\n gemini?: GeminiAdapterConfig;\n}\n\nexport const LLM_PROXY_CONFIG = Symbol(\"LLM_PROXY_CONFIG\");\n","export * from \"./message.interface\";\nexport * from \"./session.interface\";\nexport * from \"./config.interface\";\nexport type { VerboseLevel } from \"../../verbose\";\n","import type { LlmMessage, LlmRequestOptions, LlmResponse, LlmStreamEvent } from \"../interfaces\";\nimport type { VerboseLevel } from \"../../verbose\";\n\nexport interface LlmAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n verbose?: VerboseLevel;\n}\n\nexport interface LlmAdapter {\n readonly name: string;\n\n chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse>;\n\n chatStream(messages: LlmMessage[], options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent>;\n\n isConfigured(): boolean;\n\n isSupportJsonSchema(): boolean;\n}\n\nexport const LLM_ADAPTER = Symbol(\"LLM_ADAPTER\");\n","/**\n * 日志级别(字符串模式)\n * - \"silent\": 静默模式,不输出任何日志\n * - \"info\": 显示过程日志(如 \"开始审查\"、\"完成审查\")\n * - \"verbose\": 显示详细日志\n * - \"debug\": 显示调试日志(包括大模型的输入提示词和输出过程)\n */\nexport type LogLevel = \"silent\" | \"info\" | \"verbose\" | \"debug\";\n\n/**\n * Verbose 日志级别(数字模式,向后兼容)\n * - 0 / false: 静默模式,只返回结果\n * - 1 / true: 显示过程日志\n * - 2: 显示详细日志\n * - 3: 显示调试日志\n */\nexport type VerboseLevel = 0 | 1 | 2 | 3 | false | true;\n\n/** 日志级别优先级映射 */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n silent: 0,\n info: 1,\n verbose: 2,\n debug: 3,\n} as const;\n\n/** VerboseLevel 数字到 LogLevel 字符串的映射 */\nconst VERBOSE_TO_LOG_LEVEL: Record<number, LogLevel> = {\n 0: \"silent\",\n 1: \"info\",\n 2: \"verbose\",\n 3: \"debug\",\n} as const;\n\n/**\n * 将任意级别值统一转为 LogLevel 字符串\n * @param level 日志级别(字符串、数字、布尔值)\n * @returns LogLevel 字符串\n */\nexport const toLogLevel = (level: LogLevel | VerboseLevel | undefined): LogLevel => {\n if (level === undefined) return \"info\";\n if (typeof level === \"string\") return level;\n if (level === true) return \"info\";\n if (level === false) return \"silent\";\n return VERBOSE_TO_LOG_LEVEL[level] ?? \"info\";\n};\n\n/**\n * 将 verbose 值规范化为数字\n * @param verbose verbose 值(支持字符串、数字、布尔值)\n * @returns 规范化后的数字 (0, 1, 2, 3)\n */\nexport function normalizeVerbose(\n verbose: LogLevel | VerboseLevel | boolean | undefined,\n): 0 | 1 | 2 | 3 {\n if (verbose === undefined || verbose === false || verbose === 0 || verbose === \"silent\") return 0;\n if (verbose === true || verbose === 1 || verbose === \"info\") return 1;\n if (verbose === 2 || verbose === \"verbose\") return 2;\n return 3;\n}\n\n/**\n * 判断是否应该打印指定级别的日志\n * @param verbose 当前 verbose 级别(支持字符串或数字)\n * @param requiredLevel 需要的最低级别 (1, 2, 3)\n * @returns 是否应该打印\n */\nexport function shouldLog(\n verbose: LogLevel | VerboseLevel | undefined,\n requiredLevel: 1 | 2 | 3,\n): boolean {\n return normalizeVerbose(verbose) >= requiredLevel;\n}\n\n/**\n * 解析命令行 verbose 参数\n * 支持: -v, -v 2, -v 3, --verbose, --verbose 2, -vvv (计数模式)\n * @param val 命令行参数值(字符串、布尔值、数字或 undefined)\n * @returns 规范化后的 VerboseLevel\n */\nexport function parseVerbose(val: string | boolean | number | undefined): 0 | 1 | 2 | 3 {\n if (val === undefined || val === 0) return 1;\n if (val === true || val === \"\") return 1;\n if (typeof val === \"number\") return normalizeVerbose(val as VerboseLevel);\n const level = parseInt(val as string, 10);\n if (isNaN(level)) return 1;\n return normalizeVerbose(level as VerboseLevel);\n}\n","import { readFile, writeFile, mkdir, copyFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { LlmProxyConfig } from \"../llm-proxy/interfaces\";\nimport { shouldLog, type VerboseLevel } from \"../verbose\";\n\nexport class ClaudeSetupService {\n constructor(protected readonly llmConfig?: LlmProxyConfig) {}\n\n private getPaths() {\n const claudeDir = join(homedir(), \".claude\");\n return {\n claudeDir,\n settingsPath: join(claudeDir, \"settings.json\"),\n settingsBackupPath: join(claudeDir, \"settings.json.bak\"),\n claudeJsonPath: join(homedir(), \".claude.json\"),\n claudeJsonBackupPath: join(homedir(), \".claude.json.bak\"),\n };\n }\n\n async backup(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsPath, paths.settingsBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonPath, paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n }\n\n async restore(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsBackupPath, paths.settingsPath);\n await unlink(paths.settingsBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonBackupPath, paths.claudeJsonPath);\n await unlink(paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n }\n\n /**\n * 使用临时配置执行操作\n * 自动备份现有配置,执行完成后恢复\n */\n async withTemporaryConfig<T>(fn: () => Promise<T>, verbose?: VerboseLevel): Promise<T> {\n await this.backup();\n try {\n await this.configure(verbose);\n return await fn();\n } finally {\n await this.restore();\n }\n }\n\n async configure(verbose?: VerboseLevel): Promise<void> {\n const { claudeDir, settingsPath, claudeJsonPath } = this.getPaths();\n\n const claudeCode = this.llmConfig?.claudeCode;\n\n if (!claudeCode) {\n if (shouldLog(verbose, 1)) {\n console.log(\"未配置 claude 设置,跳过\");\n }\n return;\n }\n\n try {\n await mkdir(claudeDir, { recursive: true });\n } catch {\n // ignore if exists\n }\n\n let existingSettings = {};\n try {\n const content = await readFile(settingsPath, \"utf-8\");\n existingSettings = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n\n const existing = existingSettings as Record<string, Record<string, unknown>>;\n const env: Record<string, string> = { ...(existing.env as Record<string, string>) };\n if (claudeCode.baseUrl) env.ANTHROPIC_BASE_URL = claudeCode.baseUrl;\n if (claudeCode.authToken) {\n env.ANTHROPIC_AUTH_TOKEN = claudeCode.authToken;\n } else {\n throw new Error(\"未配置 claudeCode.authToken 设置\");\n }\n if (claudeCode.model) env.ANTHROPIC_MODEL = claudeCode.model;\n\n const mergedSettings = {\n ...existingSettings,\n env,\n };\n\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${settingsPath}`);\n }\n\n if (claudeCode.hasCompletedOnboarding !== undefined) {\n let claudeJson: Record<string, unknown> = {};\n try {\n const content = await readFile(claudeJsonPath, \"utf-8\");\n claudeJson = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n claudeJson.hasCompletedOnboarding = claudeCode.hasCompletedOnboarding;\n await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${claudeJsonPath}`);\n }\n }\n }\n}\n","export * from \"./claude-setup.service\";\n","import { query, type SpawnOptions } from \"@anthropic-ai/claude-agent-sdk\";\nimport { spawn } from \"child_process\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { ClaudeSetupService } from \"../../claude-setup\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class ClaudeCodeAdapter implements LlmAdapter {\n readonly name = \"claude-code\";\n private readonly claudeSetupService: ClaudeSetupService;\n\n constructor(private readonly config: LlmProxyConfig) {\n // 创建 ClaudeSetupService 实例,传入 LLM 配置\n this.claudeSetupService = new ClaudeSetupService(config);\n }\n\n isConfigured(): boolean {\n return !!this.config.claudeCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n // 备份原有配置\n await this.claudeSetupService.backup();\n\n try {\n // 应用临时配置\n await this.claudeSetupService.configure(options?.verbose);\n\n const claudeConf = this.config.claudeCode;\n\n if (!claudeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.ClaudeCodeAdapter.chatStream] 未配置 claude 设置\",\n };\n return;\n }\n\n const model = options?.model || claudeConf.model || \"claude-sonnet-4-5\";\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] 配置: Model=${model}, BaseURL=${claudeConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n const handleUncaughtError = (err: Error) => {\n if ((err as any).code === \"EPIPE\") {\n console.error(\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] EPIPE 错误: Claude CLI 子进程意外退出\",\n );\n throw err;\n }\n };\n process.on(\"uncaughtException\", handleUncaughtError);\n\n try {\n const spawnEnv = { ...process.env };\n if (claudeConf.baseUrl) spawnEnv.ANTHROPIC_BASE_URL = claudeConf.baseUrl;\n if (claudeConf.authToken) spawnEnv.ANTHROPIC_AUTH_TOKEN = claudeConf.authToken;\n\n const spawnClaudeCodeProcess = (spawnOptions: SpawnOptions) => {\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] Spawning: ${spawnOptions.command} ${spawnOptions.args?.join(\" \")}`,\n );\n }\n const child = spawn(spawnOptions.command, spawnOptions.args || [], {\n ...spawnOptions,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: spawnEnv,\n });\n\n child.stderr?.on(\"data\", (data) => {\n console.error(`[LLMProxy.ClaudeCodeAdapter.chatStream] CLI stderr: ${data.toString()}`);\n });\n\n return child;\n };\n\n const queryOptions: Parameters<typeof query>[0][\"options\"] = {\n model,\n systemPrompt,\n permissionMode: \"default\",\n spawnClaudeCodeProcess,\n };\n\n if (options?.allowedTools?.length) {\n queryOptions.allowedTools = options.allowedTools as any;\n }\n\n if (options?.jsonSchema) {\n queryOptions.outputFormat = {\n type: \"json_schema\",\n schema: options.jsonSchema.getSchema(),\n };\n }\n\n const response = query({\n prompt: userPrompt,\n options: queryOptions,\n });\n\n let finalContent = \"\";\n let structuredOutput: unknown = undefined;\n\n for await (const message of response) {\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (typeof content === \"string\") {\n yield { type: \"text\", content };\n finalContent += content;\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === \"text\") {\n yield { type: \"text\", content: block.text };\n finalContent += block.text;\n } else if (block.type === \"tool_use\") {\n yield { type: \"tool_use\", name: block.name, input: block.input };\n } else if (block.type === (\"thought\" as any)) {\n yield { type: \"thought\", content: (block as any).thought };\n }\n }\n }\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n if (message.structured_output) {\n structuredOutput = message.structured_output;\n }\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n structuredOutput,\n },\n };\n } else {\n yield {\n type: \"error\",\n message: `[LLMProxy.ClaudeCodeAdapter.chatStream] ${message.errors?.join(\", \") || \"未知错误\"}`,\n };\n }\n }\n }\n } catch (error: any) {\n if (error?.code === \"EPIPE\" || error?.message?.includes(\"EPIPE\")) {\n yield {\n type: \"error\",\n message:\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] 连接中断 (EPIPE)。请检查:\\n\" +\n \"1. ANTHROPIC_AUTH_TOKEN 环境变量是否正确设置\\n\" +\n \"2. ANTHROPIC_BASE_URL 是否与 Claude Agent SDK 兼容\\n\" +\n \"3. Claude CLI 是否已正确安装\",\n };\n } else {\n throw error;\n }\n } finally {\n process.removeListener(\"uncaughtException\", handleUncaughtError);\n }\n } finally {\n // 恢复原有配置\n await this.claudeSetupService.restore();\n }\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return true;\n }\n}\n","import OpenAI from \"openai\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenAIAdapter implements LlmAdapter {\n readonly name = \"openai\";\n\n private client: OpenAI | null = null;\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openai;\n }\n\n private getClient(): OpenAI {\n if (this.client) {\n return this.client;\n }\n\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.getClient] 未配置 openai 设置\");\n }\n\n this.client = new OpenAI({\n apiKey: openaiConf.apiKey,\n baseURL: openaiConf.baseUrl || undefined,\n });\n\n return this.client;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.chat] 未配置 openai 设置\");\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n try {\n const response = await client.chat.completions.create({\n model,\n messages: messages,\n });\n\n const content = response.choices[0]?.message?.content || \"\";\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 响应: Model=${response.model}, Usage=${response.usage?.total_tokens} tokens`,\n );\n }\n\n return {\n content,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n throw new Error(\n `[LLMProxy.OpenAIAdapter.chat] API 错误 (${error.status}): ${error.message}\\n` +\n `请检查:\\n` +\n `1. API Key 是否正确\\n` +\n `2. Base URL 是否正确\\n` +\n `3. 模型名称是否有效`,\n );\n }\n throw error;\n }\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n yield { type: \"error\", message: \"[LLMProxy.OpenAIAdapter.chatStream] 未配置 openai 设置\" };\n return;\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(`[LLMProxy.OpenAIAdapter.chatStream] 配置: Model=${model}`);\n }\n try {\n const stream = await client.chat.completions.create({\n model,\n messages: messages,\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n yield { type: \"text\", content: delta };\n fullContent += delta;\n }\n }\n\n yield {\n type: \"result\",\n response: {\n content: fullContent,\n },\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n yield {\n type: \"error\",\n message: `[LLMProxy.OpenAIAdapter.chatStream] API 错误 (${error.status}): ${error.message}`,\n };\n } else {\n throw error;\n }\n }\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","import { createOpencode } from \"@opencode-ai/sdk\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n OpenCodeAdapterConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenCodeAdapter implements LlmAdapter {\n readonly name = \"open-code\";\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openCodeConf = this.config.openCode;\n\n if (!openCodeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 未配置 openCode 设置\",\n };\n return;\n }\n\n const providerID = openCodeConf.providerID || \"openai\";\n const configModel = options?.model || openCodeConf.model || \"gpt-4o\";\n const model = configModel.includes(\"/\") ? configModel : `${providerID}/${configModel}`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 配置: Model=${model}, ProviderID=${providerID}, BaseURL=${openCodeConf.baseUrl || \"默认\"}`,\n );\n }\n\n // 创建 OpenCode 实例(自动启动服务器,使用动态端口避免冲突)\n let opencode: Awaited<ReturnType<typeof createOpencode>> | null = null;\n const port = 4096 + Math.floor(Math.random() * 1000);\n\n // 确保进程退出时关闭服务器\n const cleanup = () => {\n if (opencode?.server) {\n opencode.server.close();\n opencode = null;\n }\n };\n process.once(\"exit\", cleanup);\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n opencode = await createOpencode({\n port,\n config: this.buildOpenCodeConfig(openCodeConf, model),\n });\n\n const { client } = opencode;\n\n // 设置 provider 认证(使用自定义 provider ID)\n const customProviderID = \"custom-openai\";\n if (openCodeConf.apiKey) {\n await client.auth.set({\n path: { id: customProviderID },\n body: { type: \"api\", key: openCodeConf.apiKey },\n });\n }\n\n const session = await client.session.create({\n body: { title: `spaceflow-${Date.now()}` },\n });\n\n if (!session.data?.id) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 创建 session 失败\",\n };\n return;\n }\n\n const sessionId = session.data.id;\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (systemPrompt) {\n await client.session.prompt({\n path: { id: sessionId },\n body: {\n noReply: true,\n parts: [{ type: \"text\", text: systemPrompt }],\n },\n });\n }\n\n // 从原始 model 中提取 modelID,但使用自定义 provider ID\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 发送 prompt: model=${customProviderID}/${modelID}, userPrompt长度=${userPrompt.length}`,\n );\n }\n\n const result = await client.session.prompt({\n path: { id: sessionId },\n body: {\n model: { providerID: customProviderID, modelID },\n parts: [{ type: \"text\", text: userPrompt }],\n },\n });\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 完整响应对象:\\n${JSON.stringify(result, null, 2)}`,\n );\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] result.data:\\n${JSON.stringify(result.data, null, 2)}`,\n );\n }\n\n let finalContent = \"\";\n\n if (result.data?.parts) {\n for (const part of result.data.parts) {\n const partType = part.type;\n\n switch (partType) {\n case \"text\": {\n const text = (part as any).text || \"\";\n yield { type: \"text\", content: text };\n finalContent += text;\n break;\n }\n\n case \"tool\": {\n // 工具调用(ToolPart)\n const toolPart = part as any;\n const state = toolPart.state || {};\n yield {\n type: \"tool_use\",\n name: toolPart.tool || \"unknown\",\n input: state.input || {},\n status: state.status,\n output: state.output,\n title: state.title,\n };\n break;\n }\n\n case \"agent\": {\n // 子代理调用(AgentPart)\n const agentPart = part as any;\n yield {\n type: \"agent\",\n name: agentPart.name || \"unknown\",\n source: agentPart.source?.value,\n };\n break;\n }\n\n case \"subtask\": {\n // 子任务\n const subtaskPart = part as any;\n yield {\n type: \"subtask\",\n agent: subtaskPart.agent,\n prompt: subtaskPart.prompt,\n description: subtaskPart.description,\n };\n break;\n }\n\n case \"step-start\": {\n yield {\n type: \"step_start\",\n snapshot: (part as any).snapshot,\n };\n break;\n }\n\n case \"step-finish\": {\n const stepPart = part as any;\n yield {\n type: \"step_finish\",\n reason: stepPart.reason,\n tokens: stepPart.tokens,\n cost: stepPart.cost,\n };\n break;\n }\n\n case \"reasoning\": {\n const reasoningPart = part as any;\n yield {\n type: \"reasoning\",\n content: reasoningPart.text || \"\",\n };\n break;\n }\n\n default:\n // 其他类型(file, snapshot, patch, retry, compaction 等)暂不处理\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 未处理的 part 类型: ${partType}`,\n );\n }\n break;\n }\n }\n }\n\n if (shouldLog(options?.verbose, 1) && !finalContent) {\n console.warn(\n `[LLMProxy.OpenCodeAdapter.chatStream] 警告: 响应内容为空,parts=${JSON.stringify(result.data?.parts)}`,\n );\n }\n\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n },\n };\n\n try {\n await client.session.delete({ path: { id: sessionId } });\n } catch {\n // ignore cleanup errors\n }\n } catch (error: any) {\n yield {\n type: \"error\",\n message:\n `[LLMProxy.OpenCodeAdapter.chatStream] 错误: ${error.message}\\n` +\n `请检查:\\n` +\n `1. baseUrl 配置是否正确\\n` +\n `2. apiKey 是否有效\\n` +\n `3. 模型配置是否有效`,\n };\n } finally {\n // 移除事件监听器\n process.removeListener(\"exit\", cleanup);\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n // 关闭服务器\n cleanup();\n }\n }\n\n /**\n * 构建 OpenCode 配置\n */\n private buildOpenCodeConfig(\n openCodeConf: OpenCodeAdapterConfig,\n model: string,\n ): Record<string, any> {\n // 使用自定义 provider ID(如 custom-openai)而不是 openai\n // 因为 OpenCode 会根据 providerID 决定使用哪个 SDK 方法\n // openai provider 会调用 sdk.responses(),而自定义 provider 使用 @ai-sdk/openai-compatible\n const customProviderID = \"custom-openai\";\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n // 使用 @ai-sdk/openai-compatible,使用 Chat Completions API (/chat/completions)\n const config: Record<string, any> = {\n model: `${customProviderID}/${modelID}`,\n provider: {\n [customProviderID]: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Custom OpenAI Compatible\",\n },\n },\n };\n\n // 配置 provider baseURL\n if (openCodeConf.baseUrl) {\n config.provider[customProviderID].options = {\n baseURL: openCodeConf.baseUrl,\n };\n }\n\n // 注册自定义模型\n config.provider[customProviderID].models = {\n [modelID]: {\n name: modelID,\n attachment: true,\n reasoning: false,\n temperature: true,\n tool_call: true,\n cost: {\n input: 0,\n output: 0,\n },\n limit: {\n context: 128000,\n output: 16000,\n },\n },\n };\n\n return config;\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","export * from \"./llm-adapter.interface\";\nexport * from \"./claude-code.adapter\";\nexport * from \"./openai.adapter\";\nexport * from \"./open-code.adapter\";\n","import { randomUUID } from \"crypto\";\nimport type { LlmAdapter } from \"./adapters\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmSession,\n SessionOptions,\n} from \"./interfaces\";\nimport { type VerboseLevel, normalizeVerbose } from \"../verbose\";\n\nexport class LlmSessionImpl implements LlmSession {\n readonly id: string;\n readonly adapterName: string;\n\n private history: LlmMessage[] = [];\n private systemPrompt: string = \"\";\n private defaultModel?: string;\n private verbose: VerboseLevel = 0;\n\n constructor(\n private readonly adapter: LlmAdapter,\n options?: SessionOptions,\n ) {\n this.id = randomUUID();\n this.adapterName = adapter.name;\n\n if (options?.systemPrompt) {\n this.systemPrompt = options.systemPrompt;\n }\n if (options?.model) {\n this.defaultModel = options.model;\n }\n if (options?.verbose !== undefined) {\n this.verbose = normalizeVerbose(options.verbose);\n }\n }\n\n async send(content: string, options?: LlmRequestOptions): Promise<LlmResponse> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n const response = await this.adapter.chat(messages, mergedOptions);\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: response.content };\n this.history.push(assistantMessage);\n\n return response;\n }\n\n async *sendStream(content: string, options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n let fullContent = \"\";\n\n for await (const event of this.adapter.chatStream(messages, mergedOptions)) {\n yield event;\n\n if (event.type === \"text\") {\n fullContent += event.content;\n } else if (event.type === \"result\") {\n fullContent = event.response.content;\n }\n }\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: fullContent };\n this.history.push(assistantMessage);\n }\n\n getHistory(): LlmMessage[] {\n return [...this.history];\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n private buildMessages(): LlmMessage[] {\n const messages: LlmMessage[] = [];\n\n if (this.systemPrompt) {\n messages.push({ role: \"system\", content: this.systemPrompt });\n }\n\n messages.push(...this.history);\n\n return messages;\n }\n\n private mergeOptions(options?: LlmRequestOptions): LlmRequestOptions {\n return {\n model: options?.model || this.defaultModel,\n verbose: options?.verbose ?? this.verbose,\n ...options,\n };\n }\n}\n","import type { LlmAdapter } from \"./adapters\";\nimport { ClaudeCodeAdapter } from \"./adapters/claude-code.adapter\";\nimport { OpenAIAdapter } from \"./adapters/openai.adapter\";\nimport { OpenCodeAdapter } from \"./adapters/open-code.adapter\";\nimport { LlmSessionImpl } from \"./llm-session\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmSession,\n SessionOptions,\n LlmProxyConfig,\n LLMMode,\n} from \"./interfaces\";\nimport type { LlmJsonPut } from \"../llm-jsonput\";\n\nexport interface ChatOptions extends LlmRequestOptions {\n adapter?: LLMMode;\n}\n\nexport class LlmProxyService {\n private adapters: Map<LLMMode, LlmAdapter> = new Map();\n\n constructor(private readonly config: LlmProxyConfig) {\n // 适配器接收完整配置,内部自行读取所需部分\n const claudeCodeAdapter = new ClaudeCodeAdapter(config);\n const openaiAdapter = new OpenAIAdapter(config);\n const openCodeAdapter = new OpenCodeAdapter(config);\n this.adapters.set(\"claude-code\", claudeCodeAdapter);\n this.adapters.set(\"openai\", openaiAdapter);\n this.adapters.set(\"open-code\", openCodeAdapter);\n }\n\n createSession(adapterType?: LLMMode, options?: SessionOptions): LlmSession {\n const type = adapterType || this.getDefaultAdapterType();\n const adapter = this.getAdapter(type);\n\n return new LlmSessionImpl(adapter, options);\n }\n\n async chat(messages: LlmMessage[], options?: ChatOptions): Promise<LlmResponse> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n const response = await adapter.chat(messages, options);\n\n if (options?.jsonSchema && response.content && !response.structuredOutput) {\n response.structuredOutput = await options.jsonSchema.parse(response.content);\n }\n\n return response;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: ChatOptions,\n ): AsyncIterable<import(\"./interfaces\").LlmStreamEvent> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n for await (const event of adapter.chatStream(messages, options)) {\n if (\n event.type === \"result\" &&\n options?.jsonSchema &&\n event.response.content &&\n !event.response.structuredOutput\n ) {\n try {\n event.response.structuredOutput = await options.jsonSchema.parse(event.response.content);\n } catch (error: any) {\n // JSON 解析失败,保持 structuredOutput 为 undefined\n console.error(\"[LLMProxyService.chatStream] JSON 解析失败:\", error);\n }\n }\n yield event;\n }\n }\n\n appendJsonSchemaSystemPrompt(messages: LlmMessage[], jsonSchema: LlmJsonPut): LlmMessage[] {\n const systemMsg = messages.find((msg) => msg.role === \"system\");\n if (jsonSchema.isMatched(systemMsg?.content || \"\")) {\n return messages;\n }\n if (systemMsg) {\n systemMsg.content += `\\n\\n${jsonSchema.jsonFormatInstruction}`;\n } else {\n messages.unshift({ role: \"system\", content: jsonSchema.jsonFormatInstruction });\n }\n return messages;\n }\n\n getAvailableAdapters(): LLMMode[] {\n const available: LLMMode[] = [];\n\n for (const [type, adapter] of this.adapters) {\n if (adapter.isConfigured()) {\n available.push(type);\n }\n }\n\n return available;\n }\n\n private getDefaultAdapterType(): LLMMode {\n return this.config.defaultAdapter || \"openai\";\n }\n\n private getAdapter(type: LLMMode): LlmAdapter {\n const adapter = this.adapters.get(type);\n\n if (!adapter) {\n throw new Error(`[LLMProxy.getAdapter] 不支持的 LLM 类型: ${type}`);\n }\n\n if (!adapter.isConfigured()) {\n throw new Error(`[LLMProxy.getAdapter] 适配器 \"${type}\" 未配置`);\n }\n\n return adapter;\n }\n}\n","import type { LlmStreamEvent } from \"./interfaces\";\n\nexport interface StreamLoggerState {\n isFirstText: boolean;\n}\n\n/**\n * 创建一个新的 StreamLogger 状态\n */\nexport function createStreamLoggerState(): StreamLoggerState {\n return { isFirstText: true };\n}\n\n/**\n * 记录 LLM 流式事件到终端\n * @param event LLM 流式事件\n * @param state 日志状态(用于跟踪是否是第一个文本块)\n */\nexport function logStreamEvent(event: LlmStreamEvent, state: StreamLoggerState): void {\n switch (event.type) {\n case \"text\":\n if (state.isFirstText) {\n process.stdout.write(\"\\n🤖 AI: \");\n state.isFirstText = false;\n }\n process.stdout.write(event.content);\n break;\n case \"tool_use\":\n console.log(`\\n🛠️ 工具调用: ${event.name}`);\n if (event.title) {\n console.log(` 标题: ${event.title}`);\n }\n console.log(` 输入: ${JSON.stringify(event.input)}`);\n if (event.status) {\n console.log(` 状态: ${event.status}`);\n }\n if (event.output) {\n console.log(\n ` 输出: ${event.output.substring(0, 200)}${event.output.length > 200 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"thought\":\n console.log(`\\n💭 思考: ${event.content}`);\n state.isFirstText = true;\n break;\n case \"result\":\n console.log(`\\n✅ 结果已返回`);\n state.isFirstText = true;\n break;\n case \"error\":\n console.error(`\\n❌ 错误: ${event.message}`);\n state.isFirstText = true;\n break;\n case \"agent\":\n console.log(`\\n🤖 子代理: ${event.name}`);\n if (event.source) {\n console.log(\n ` 来源: ${event.source.substring(0, 100)}${event.source.length > 100 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"subtask\":\n console.log(`\\n📋 子任务: ${event.description}`);\n console.log(` 代理: ${event.agent}`);\n console.log(\n ` 提示: ${event.prompt.substring(0, 100)}${event.prompt.length > 100 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n case \"step_start\":\n console.log(`\\n▶️ 步骤开始`);\n state.isFirstText = true;\n break;\n case \"step_finish\":\n console.log(`\\n⏹️ 步骤结束: ${event.reason}`);\n if (event.tokens) {\n const tokens = event.tokens as any;\n console.log(\n ` Token: 输入=${tokens.input || 0}, 输出=${tokens.output || 0}, 推理=${tokens.reasoning || 0}`,\n );\n }\n if (event.cost !== undefined) {\n console.log(` 成本: $${event.cost.toFixed(6)}`);\n }\n state.isFirstText = true;\n break;\n case \"reasoning\":\n console.log(\n `\\n🧠 推理: ${event.content.substring(0, 200)}${event.content.length > 200 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n }\n}\n","export * from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./llm-session\";\nexport * from \"./llm-proxy.service\";\nexport * from \"./stream-logger\";\n","/**\n * 飞书 SDK 卡片交互回调相关类型\n */\n\nimport type { I18nLocale } from \"./common\";\nimport type { CardData } from \"./card\";\n\n/** 卡片交互事件名称常量 */\nexport const FEISHU_CARD_ACTION_TRIGGER = \"card.action.trigger\" as const;\n\n/** 回调基本信息 (header) */\nexport interface CardActionHeader {\n /** 回调的唯一标识 */\n event_id: string;\n /** 应用的 Verification Token */\n token: string;\n /** 回调发送的时间,微秒级时间戳 */\n create_time: string;\n /** 回调类型,固定为 \"card.action.trigger\" */\n event_type: typeof FEISHU_CARD_ACTION_TRIGGER;\n /** 应用归属的 tenant key */\n tenant_key: string;\n /** 应用的 App ID */\n app_id: string;\n}\n\n/** 操作者信息 */\nexport interface CardActionOperator {\n /** 回调触发者的 tenant key */\n tenant_key: string;\n /** 回调触发者的 user_id (需开启权限) */\n user_id?: string;\n /** 回调触发者的 open_id */\n open_id: string;\n /** 回调触发者的 union_id */\n union_id?: string;\n}\n\n/** 交互信息 */\nexport interface CardActionInfo {\n /** 交互组件绑定的开发者自定义回传数据 */\n value?: Record<string, unknown> | string;\n /** 交互组件的标签 */\n tag: string;\n /** 用户当前所在地区的时区 */\n timezone?: string;\n /** 组件的自定义唯一标识 */\n name?: string;\n /** 表单容器内用户提交的数据 */\n form_value?: Record<string, unknown>;\n /** 输入框组件提交的数据 (未内嵌在表单中时) */\n input_value?: string;\n /** 单选组件的选项回调值 */\n option?: string;\n /** 多选组件的选项回调值 */\n options?: string[];\n /** 勾选器组件的回调数据 */\n checked?: boolean;\n}\n\n/** 展示场景上下文 */\nexport interface CardActionContext {\n /** 链接地址 (适用于链接预览场景) */\n url?: string;\n /** 链接预览的 token */\n preview_token?: string;\n /** 消息 ID */\n open_message_id: string;\n /** 会话 ID */\n open_chat_id: string;\n}\n\n/** 回调详细信息 (event) */\nexport interface CardActionEventData {\n /** 回调触发者信息 */\n operator: CardActionOperator;\n /** 更新卡片用的凭证,有效期 30 分钟,最多可更新 2 次 */\n token: string;\n /** 交互信息 */\n action: CardActionInfo;\n /** 卡片展示场景 */\n host?: string;\n /** 卡片分发类型,链接预览卡片时为 url_preview */\n delivery_type?: \"url_preview\";\n /** 展示场景上下文 */\n context: CardActionContext;\n}\n\n/** 回调结构体 (schema 2.0) */\nexport interface CardActionTriggerCallback {\n /** 回调版本,固定为 \"2.0\" */\n schema: \"2.0\";\n /** 回调基本信息 */\n header: CardActionHeader;\n /** 回调详细信息 */\n event: CardActionEventData;\n}\n\n/** Toast 提示配置 */\nexport interface CardActionToast {\n /** 弹窗提示的类型 */\n type?: \"info\" | \"success\" | \"error\" | \"warning\";\n /** 单语言提示文案 */\n content?: string;\n /** 多语言提示文案 */\n i18n?: Partial<Record<I18nLocale, string>>;\n}\n\n/** 响应回调的结构体 */\nexport interface CardActionTriggerResponse {\n /** Toast 弹窗提示 */\n toast?: CardActionToast;\n /** 卡片数据 (用于更新卡片) */\n card?: CardData;\n}\n\n/** 交互事件回调接口 */\nexport interface CardActionTriggerEventCallback {\n /** 完成回调,返回响应结果 */\n done: (result: CardActionTriggerResponse) => void;\n}\n\n/** 交互事件 (用于事件监听器),包含回调数据和 done 方法 */\nexport interface CardActionTriggerEvent\n extends CardActionTriggerEventCallback, CardActionTriggerCallback {}\n\n/** 事件注册类型 */\nexport interface CardEvents {\n [FEISHU_CARD_ACTION_TRIGGER]: (\n data: CardActionTriggerCallback,\n ) => Promise<CardActionTriggerResponse>;\n}\n","import { EventEmitter } from \"events\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport {\n FeishuModuleOptions,\n FeishuUser,\n GetUserParams,\n FEISHU_CARD_ACTION_TRIGGER,\n type CardEvents,\n type CardActionTriggerResponse,\n type CardActionTriggerEvent,\n} from \"./types\";\n\n/**\n * 飞书 API 服务\n */\nexport class FeishuSdkService {\n protected readonly client: lark.Client;\n protected readonly eventEmitter: EventEmitter;\n private eventDispatcher: lark.EventDispatcher | null = null;\n\n constructor(protected readonly options: FeishuModuleOptions) {\n this.eventEmitter = new EventEmitter();\n this.client = new lark.Client({\n appId: options.appId,\n appSecret: options.appSecret,\n appType: options.appType === \"store\" ? lark.AppType.ISV : lark.AppType.SelfBuild,\n domain: options.domain === \"lark\" ? lark.Domain.Lark : lark.Domain.Feishu,\n });\n\n this.initEventDispatcher();\n }\n\n /**\n * 注册事件监听器\n */\n on(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n /**\n * 移除事件监听器\n */\n off(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n private initEventDispatcher(): void {\n this.eventDispatcher = new lark.EventDispatcher({\n encryptKey: \"encrypt key\",\n }).register<CardEvents>({\n [FEISHU_CARD_ACTION_TRIGGER]: async (data) => {\n let done: (result: CardActionTriggerResponse) => void = () => null;\n const p = new Promise<CardActionTriggerResponse>((resolve) => {\n done = resolve;\n });\n\n // 转换为事件监听器友好的格式\n const event: CardActionTriggerEvent = {\n ...data,\n done,\n };\n\n this.eventEmitter.emit(FEISHU_CARD_ACTION_TRIGGER, event);\n return await p;\n },\n });\n }\n\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * 验证飞书配置\n */\n validateConfig(): void {\n if (!this.options?.appId) {\n throw new Error(\"缺少配置 feishu.appId (环境变量 FEISHU_APP_ID)\");\n }\n\n if (!this.options?.appSecret) {\n throw new Error(\"缺少配置 feishu.appSecret (环境变量 FEISHU_APP_SECRET)\");\n }\n }\n\n /**\n * 获取原始 Lark Client 实例\n * 用于调用 SDK 中未封装的 API\n */\n getClient(): lark.Client {\n return this.client;\n }\n\n /**\n * 获取用户信息\n * @param params 获取用户信息的参数\n * @returns 用户信息\n */\n async getUser(params: GetUserParams): Promise<FeishuUser | null> {\n const { userId, userIdType = \"open_id\", departmentIdType } = params;\n\n const response = await this.client.contact.user.get({\n path: {\n user_id: userId,\n },\n params: {\n user_id_type: userIdType,\n department_id_type: departmentIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return response.data?.user as FeishuUser | null;\n }\n\n /**\n * 批量获取用户信息\n * @param userIds 用户 ID 列表\n * @param userIdType 用户 ID 类型\n * @returns 用户信息列表\n */\n async batchGetUsers(\n userIds: string[],\n userIdType: \"open_id\" | \"union_id\" | \"user_id\" = \"open_id\",\n ): Promise<FeishuUser[]> {\n const response = await this.client.contact.user.batch({\n params: {\n user_ids: userIds,\n user_id_type: userIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return (response.data?.items || []) as FeishuUser[];\n }\n}\n","import { FeishuSdkService } from \"./feishu-sdk.service\";\nimport {\n SendCardParams,\n ReplyCardParams,\n UpdateCardParams,\n SendMessageResponse,\n CardContent,\n type CardActionTriggerCallback,\n} from \"./types\";\nimport { FEISHU_CARD_ACTION_TRIGGER } from \"./types\";\n\n/**\n * 飞书卡片消息服务\n * 提供卡片消息的发送、回复、更新功能\n */\nexport class FeishuCardService {\n constructor(protected readonly feishuSdkService: FeishuSdkService) {\n // 监听卡片动作触发事件\n feishuSdkService.on(FEISHU_CARD_ACTION_TRIGGER, (event) => {\n this.handleCardActionTrigger(event);\n });\n }\n\n async handleCardActionTrigger(event: CardActionTriggerCallback): Promise<void> {\n const _eventHook = event.header.event_type ?? event.event.action.tag;\n\n // console.log(_eventHook);\n }\n\n /**\n * 将卡片内容转换为字符串\n */\n protected serializeCard(card: CardContent): string {\n return typeof card === \"string\" ? card : JSON.stringify(card);\n }\n\n /**\n * 转换 API 响应为统一格式\n */\n protected transformMessageResponse(data: any): SendMessageResponse {\n return {\n messageId: data.message_id,\n rootId: data.root_id,\n parentId: data.parent_id,\n msgType: data.msg_type,\n createTime: data.create_time,\n updateTime: data.update_time,\n deleted: data.deleted,\n updated: data.updated,\n chatId: data.chat_id,\n sender: {\n id: data.sender?.id,\n idType: data.sender?.id_type,\n senderType: data.sender?.sender_type,\n tenantKey: data.sender?.tenant_key,\n },\n };\n }\n\n /**\n * 发送卡片消息\n * @param params 发送卡片消息的参数\n * @returns 发送结果\n */\n async sendCard(params: SendCardParams): Promise<SendMessageResponse> {\n const { receiveId, receiveIdType, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.create({\n params: {\n receive_id_type: receiveIdType,\n },\n data: {\n receive_id: receiveId,\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书发送卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 回复卡片消息\n * @param params 回复卡片消息的参数\n * @returns 回复结果\n */\n async replyCard(params: ReplyCardParams): Promise<SendMessageResponse> {\n const { messageId, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.reply({\n path: {\n message_id: messageId,\n },\n data: {\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书回复卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 更新卡片消息\n * @param params 更新卡片消息的参数\n * @returns 更新是否成功\n */\n async updateCard(params: UpdateCardParams): Promise<void> {\n const { messageId, card } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.patch({\n path: {\n message_id: messageId,\n },\n data: {\n content: this.serializeCard(card),\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书更新卡片失败: ${response.code} - ${response.msg}`);\n }\n }\n}\n","/**\n * 飞书 SDK 模块配置类型\n */\n\nexport const FEISHU_MODULE_OPTIONS = \"FEISHU_MODULE_OPTIONS\";\n\nexport interface FeishuModuleOptions {\n /** 应用 ID */\n appId: string;\n /** 应用密钥 */\n appSecret: string;\n /** 应用类型:自建应用或商店应用 */\n appType?: \"self_build\" | \"store\";\n /** 域名:飞书或 Lark */\n domain?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuModuleAsyncOptions {\n useFactory: (...args: any[]) => Promise<FeishuModuleOptions> | FeishuModuleOptions;\n inject?: any[];\n}\n","/**\n * 飞书 SDK 类型定义\n */\n\n// Module - 模块配置\nexport {\n FEISHU_MODULE_OPTIONS,\n type FeishuModuleOptions,\n type FeishuModuleAsyncOptions,\n} from \"./module\";\n\n// Common - 通用类型\nexport { type I18nLocale } from \"./common\";\n\n// User - 用户相关\nexport { type UserIdType, type FeishuUser, type GetUserParams } from \"./user\";\n\n// Message - 消息相关\nexport { type ReceiveIdType, type SendMessageResponse } from \"./message\";\n\n// Card - 卡片消息\nexport {\n type CardContent,\n type SendCardParams,\n type ReplyCardParams,\n type UpdateCardParams,\n type CardDataRaw,\n type CardDataTemplate,\n type CardData,\n} from \"./card\";\n\n// CardAction - 卡片交互回调\nexport {\n FEISHU_CARD_ACTION_TRIGGER,\n type CardActionHeader,\n type CardActionOperator,\n type CardActionInfo,\n type CardActionContext,\n type CardActionEventData,\n type CardActionTriggerCallback,\n type CardActionToast,\n type CardActionTriggerResponse,\n type CardActionTriggerEventCallback,\n type CardActionTriggerEvent,\n type CardEvents,\n} from \"./card-action\";\n","export * from \"./feishu-sdk.service\";\nexport * from \"./fieshu-card.service\";\nexport * from \"./types/index\";\n","import { type StorageAdapter } from \"./adapters/storage-adapter.interface\";\nimport type { IStorageService } from \"../../extension-system/types\";\n\n/**\n * Storage 服务配置选项\n */\nexport interface StorageServiceOptions {\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl?: number;\n /** 最大 key 数量,超过时会淘汰最早过期的 key,0 或 undefined 表示不限制 */\n maxKeys?: number;\n}\n\n/**\n * Storage 服务\n * 提供统一的键值存储接口,支持过期时间和层级 key\n *\n * Key 使用 : 作为层级分隔符,例如:\n * - user:123:profile\n * - cache:api:users\n */\nexport class StorageService implements IStorageService {\n protected cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n protected readonly adapter: StorageAdapter,\n protected readonly options: StorageServiceOptions = {},\n ) {\n // 启动定期清理过期项的定时器\n this.startCleanupTimer();\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * 启动定期清理过期项的定时器\n */\n protected startCleanupTimer(): void {\n // 每分钟清理一次过期项\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(console.error);\n }, 60 * 1000);\n // 使用 unref() 让定时器不阻止进程退出\n this.cleanupTimer.unref();\n }\n\n /**\n * 清理所有过期项\n */\n async cleanup(): Promise<number> {\n const now = Date.now();\n const allKeys = await this.adapter.keys();\n let cleaned = 0;\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && item.expireAt && item.expireAt <= now) {\n await this.adapter.delete(key);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * 获取值\n * @param key 键名,支持 : 分隔的层级结构\n * @returns 值,如果不存在或已过期返回 undefined\n */\n async get<T = any>(key: string): Promise<T | undefined> {\n const item = await this.adapter.get<T>(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n /**\n * 设置值\n * @param key 键名,支持 : 分隔的层级结构\n * @param value 值\n * @param ttl 过期时间(毫秒),0 或 undefined 表示使用默认值\n */\n async set<T = any>(key: string, value: T, ttl?: number): Promise<void> {\n const effectiveTtl = ttl ?? this.options.defaultTtl ?? 0;\n\n // 检查是否需要淘汰\n if (this.options.maxKeys && this.options.maxKeys > 0) {\n const exists = await this.adapter.has(key);\n if (!exists) {\n await this.evictIfNeeded();\n }\n }\n\n await this.adapter.set(key, {\n value,\n expireAt: effectiveTtl > 0 ? Date.now() + effectiveTtl : undefined,\n });\n }\n\n /**\n * 如果超过最大 key 数量,淘汰最早过期的 key\n */\n protected async evictIfNeeded(): Promise<void> {\n const maxKeys = this.options.maxKeys;\n if (!maxKeys || maxKeys <= 0) return;\n\n const currentSize = await this.adapter.size();\n if (currentSize < maxKeys) return;\n\n // 先清理过期的 key\n await this.cleanup();\n\n // 再次检查\n const sizeAfterCleanup = await this.adapter.size();\n if (sizeAfterCleanup < maxKeys) return;\n\n // 仍然超过限制,淘汰最早过期的 key\n const allKeys = await this.adapter.keys();\n const keyWithExpire: { key: string; expireAt: number }[] = [];\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item) {\n keyWithExpire.push({\n key,\n expireAt: item.expireAt ?? Infinity, // 永不过期的放最后\n });\n }\n }\n\n // 按过期时间排序,最早过期的在前面\n keyWithExpire.sort((a, b) => a.expireAt - b.expireAt);\n\n // 淘汰超出的 key\n const toEvict = sizeAfterCleanup - maxKeys + 1; // +1 为新 key 腾出空间\n for (let i = 0; i < toEvict && i < keyWithExpire.length; i++) {\n await this.adapter.delete(keyWithExpire[i].key);\n }\n }\n\n /**\n * 删除值\n * @param key 键名\n * @returns 是否删除成功\n */\n async del(key: string): Promise<boolean> {\n return this.adapter.delete(key);\n }\n\n /**\n * 检查键是否存在(且未过期)\n * @param key 键名\n */\n async has(key: string): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * 获取匹配的键名列表\n * @param pattern 匹配模式,支持 * 通配符\n *\n * 示例:\n * - keys('user:*') 获取所有以 user: 开头的键\n * - keys('*:profile') 获取所有以 :profile 结尾的键\n * - keys('user:*:settings') 获取匹配模式的键\n */\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = await this.adapter.keys(pattern);\n const now = Date.now();\n const validKeys: string[] = [];\n\n // 过滤掉已过期的键\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && (!item.expireAt || item.expireAt > now)) {\n validKeys.push(key);\n }\n }\n\n return validKeys;\n }\n\n /**\n * 获取指定前缀下的所有键\n * @param prefix 前缀,例如 'user:123'\n */\n async keysWithPrefix(prefix: string): Promise<string[]> {\n return this.keys(`${prefix}:*`);\n }\n\n /**\n * 删除指定前缀下的所有键\n * @param prefix 前缀\n * @returns 删除的键数量\n */\n async delByPrefix(prefix: string): Promise<number> {\n const keysToDelete = await this.keysWithPrefix(prefix);\n let deleted = 0;\n\n for (const key of keysToDelete) {\n if (await this.adapter.delete(key)) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * 设置过期时间\n * @param key 键名\n * @param ttl 过期时间(毫秒)\n * @returns 是否设置成功\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n await this.adapter.set(key, {\n ...item,\n expireAt: ttl > 0 ? Date.now() + ttl : undefined,\n });\n\n return true;\n }\n\n /**\n * 获取剩余过期时间\n * @param key 键名\n * @returns 剩余时间(毫秒),-1 表示永不过期,undefined 表示键不存在\n */\n async ttl(key: string): Promise<number | undefined> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n if (!item.expireAt) {\n return -1; // 永不过期\n }\n\n return item.expireAt - Date.now();\n }\n\n /**\n * 清空所有存储\n */\n async clear(): Promise<void> {\n await this.adapter.clear();\n }\n\n /**\n * 获取当前存储的 key 数量\n */\n async size(): Promise<number> {\n return this.adapter.size();\n }\n}\n","import { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 内存存储适配器\n * 数据存储在内存中,进程重启后数据丢失\n */\nexport class MemoryAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 文件存储适配器\n * 数据持久化到 JSON 文件,支持进程重启后恢复\n */\nexport class FileAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n protected filePath: string;\n protected saveTimer: ReturnType<typeof setTimeout> | null = null;\n protected readonly debounceMs = 100; // 防抖延迟\n\n constructor(filePath: string) {\n this.filePath = filePath;\n this.load();\n }\n\n /**\n * 从文件加载数据\n */\n protected load(): void {\n try {\n if (fs.existsSync(this.filePath)) {\n const data = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(data) as Record<string, StorageItem>;\n this.store = new Map(Object.entries(parsed));\n }\n } catch {\n // 文件不存在或解析失败,使用空存储\n this.store = new Map();\n }\n }\n\n /**\n * 保存数据到文件(防抖)\n */\n protected save(): void {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = setTimeout(() => {\n this.saveSync();\n this.saveTimer = null;\n }, this.debounceMs);\n }\n\n /**\n * 同步保存数据到文件\n */\n protected saveSync(): void {\n try {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const data = Object.fromEntries(this.store);\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf-8\");\n } catch (error) {\n console.error(\"Failed to save storage file:\", error);\n }\n }\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n this.save();\n }\n\n async delete(key: string): Promise<boolean> {\n const result = this.store.delete(key);\n if (result) {\n this.save();\n }\n return result;\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.save();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","export * from \"./storage-adapter.interface\";\nexport * from \"./memory.adapter\";\nexport * from \"./file.adapter\";\n","export * from \"./storage.service\";\nexport * from \"./types\";\nexport * from \"./adapters\";\n","export interface ParallelTask<T, R> {\n id: string;\n data: T;\n execute: (data: T) => Promise<R>;\n}\n\nexport interface ParallelResult<R> {\n id: string;\n success: boolean;\n result?: R;\n error?: Error;\n}\n\nexport interface ParallelExecutorOptions {\n concurrency?: number;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n onProgress?: (completed: number, total: number, taskId: string) => void;\n onTaskStart?: (taskId: string) => void;\n onTaskComplete?: (taskId: string, success: boolean) => void;\n onRetry?: (taskId: string, attempt: number, error: Error) => void;\n stopOnError?: boolean;\n}\n\nexport class ParallelExecutor {\n private readonly concurrency: number;\n private readonly timeout?: number;\n private readonly retries: number;\n private readonly retryDelay: number;\n private readonly onProgress?: (completed: number, total: number, taskId: string) => void;\n private readonly onTaskStart?: (taskId: string) => void;\n private readonly onTaskComplete?: (taskId: string, success: boolean) => void;\n private readonly onRetry?: (taskId: string, attempt: number, error: Error) => void;\n private readonly stopOnError: boolean;\n\n constructor(options: ParallelExecutorOptions = {}) {\n this.concurrency = options.concurrency ?? 5;\n this.timeout = options.timeout;\n this.retries = options.retries ?? 0;\n this.retryDelay = options.retryDelay ?? 1000;\n this.onProgress = options.onProgress;\n this.onTaskStart = options.onTaskStart;\n this.onTaskComplete = options.onTaskComplete;\n this.onRetry = options.onRetry;\n this.stopOnError = options.stopOnError ?? false;\n }\n\n async execute<T, R>(tasks: ParallelTask<T, R>[]): Promise<ParallelResult<R>[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult<R>[] = [];\n const total = tasks.length;\n let completed = 0;\n let shouldStop = false;\n\n const executeTask = async (task: ParallelTask<T, R>): Promise<ParallelResult<R>> => {\n if (shouldStop) {\n return { id: task.id, success: false, error: new Error(\"Execution stopped\") };\n }\n\n this.onTaskStart?.(task.id);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n this.onRetry?.(task.id, attempt, lastError!);\n await this.delay(this.retryDelay);\n }\n\n try {\n const result = await this.executeWithTimeout(task, task.data);\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, true);\n return { id: task.id, success: true, result };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, false);\n\n if (this.stopOnError) {\n shouldStop = true;\n }\n\n return {\n id: task.id,\n success: false,\n error: lastError,\n };\n };\n\n // 使用滑动窗口并发控制\n const pending: Promise<void>[] = [];\n const taskQueue = [...tasks];\n\n while (taskQueue.length > 0 || pending.length > 0) {\n // 填充到并发上限\n while (pending.length < this.concurrency && taskQueue.length > 0 && !shouldStop) {\n const task = taskQueue.shift()!;\n const promise = executeTask(task).then((result) => {\n results.push(result);\n // 从 pending 中移除\n const index = pending.indexOf(promise);\n if (index > -1) {\n pending.splice(index, 1);\n }\n });\n pending.push(promise);\n }\n\n // 等待任意一个完成\n if (pending.length > 0) {\n await Promise.race(pending);\n }\n }\n\n // 按原始顺序排序结果\n const taskIdOrder = new Map(tasks.map((t, i) => [t.id, i]));\n results.sort((a, b) => (taskIdOrder.get(a.id) ?? 0) - (taskIdOrder.get(b.id) ?? 0));\n\n return results;\n }\n\n async map<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n getId?: (item: T, index: number) => string,\n ): Promise<ParallelResult<R>[]> {\n const tasks: ParallelTask<{ item: T; index: number }, R>[] = items.map((item, index) => ({\n id: getId ? getId(item, index) : String(index),\n data: { item, index },\n execute: async ({ item, index }) => fn(item, index),\n }));\n\n return this.execute(tasks);\n }\n\n private async executeWithTimeout<T, R>(task: ParallelTask<T, R>, data: T): Promise<R> {\n if (!this.timeout) {\n return task.execute(data);\n }\n\n return Promise.race([\n task.execute(data),\n new Promise<R>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Task ${task.id} timed out after ${this.timeout}ms`)),\n this.timeout,\n ),\n ),\n ]);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport function parallel(options?: ParallelExecutorOptions): ParallelExecutor {\n return new ParallelExecutor(options);\n}\n","export * from \"./parallel-executor\";\n","import { randomUUID } from \"crypto\";\nimport type { IOutputService } from \"../../extension-system/types\";\n\nconst OUTPUT_MARKER_START = \"::spaceflow-output::\";\nconst OUTPUT_MARKER_END = \"::end::\";\n\n/**\n * OutputService - 用于标准化命令输出\n *\n * 命令可以通过此服务设置输出值,这些值会在命令执行完成后\n * 以特定格式输出到 stdout,供 CI 流程中的其他步骤使用。\n *\n * 输出格式: ::spaceflow-output::{\"key\":\"value\",\"_cacheId\":\"uuid\"}::end::\n *\n * _cacheId 用于 actions/cache 在不同 job 之间传递数据\n *\n * 使用示例:\n * ```typescript\n * const output = new OutputService();\n * output.set(\"version\", \"1.0.0\");\n * output.set(\"tag\", \"v1.0.0\");\n * output.flush();\n * ```\n */\nexport class OutputService implements IOutputService {\n protected outputs: Record<string, string> = {};\n protected cacheId: string = randomUUID();\n\n /**\n * 设置单个输出值\n */\n set(key: string, value: string | number | boolean): void {\n this.outputs[key] = String(value);\n }\n\n /**\n * 批量设置输出值\n */\n setAll(values: Record<string, string | number | boolean>): void {\n for (const [key, value] of Object.entries(values)) {\n this.set(key, value);\n }\n }\n\n /**\n * 获取所有输出值\n */\n getAll(): Record<string, string> {\n return { ...this.outputs };\n }\n\n /**\n * 清空所有输出值\n */\n clear(): void {\n this.outputs = {};\n }\n\n /**\n * 输出所有值到 stdout(带标记格式)\n * 通常在命令执行完成后调用\n * _cacheId 会被 actions 捕获并用于 actions/cache\n */\n flush(): void {\n if (Object.keys(this.outputs).length === 0) {\n return;\n }\n\n // 输出到 stdout,包含 cacheId 供 actions/cache 使用\n const outputWithCache = { ...this.outputs, _cacheId: this.cacheId };\n const json = JSON.stringify(outputWithCache);\n console.log(`${OUTPUT_MARKER_START}${json}${OUTPUT_MARKER_END}`);\n }\n\n /**\n * 检查是否有输出值\n */\n hasOutputs(): boolean {\n return Object.keys(this.outputs).length > 0;\n }\n\n /**\n * 获取当前 cacheId\n */\n getCacheId(): string {\n return this.cacheId;\n }\n\n /**\n * 输出信息\n */\n info(message: string): void {\n console.log(message);\n }\n\n /**\n * 输出成功信息\n */\n success(message: string): void {\n console.log(`✅ ${message}`);\n }\n\n /**\n * 输出警告\n */\n warn(message: string): void {\n console.warn(`⚠️ ${message}`);\n }\n\n /**\n * 输出错误\n */\n error(message: string): void {\n console.error(`❌ ${message}`);\n }\n\n /**\n * 输出调试信息\n */\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(`🔍 ${message}`);\n }\n }\n}\n\nexport { OUTPUT_MARKER_START, OUTPUT_MARKER_END };\n","export * from \"./output.service\";\n","/**\n * 编辑器配置目录映射\n * key: 编辑器名称(用于配置文件)\n * value: 编辑器配置目录名(以 . 开头)\n */\nexport const EDITOR_DIR_MAPPING: Record<string, string> = {\n claudeCode: \".claude\",\n windsurf: \".windsurf\",\n cursor: \".cursor\",\n opencode: \".opencode\",\n};\n\n/**\n * 默认支持的编辑器\n */\nexport const DEFAULT_EDITOR = \"claudeCode\";\n\n/**\n * 根据编辑器名称获取配置目录名\n */\nexport function getEditorDirName(editor: string): string {\n return EDITOR_DIR_MAPPING[editor] || `.${editor}`;\n}\n","import { jsonrepair } from \"jsonrepair\";\nimport type { LlmJsonPutSchema, LlmJsonSchema } from \"./types\";\n\nexport type { LlmJsonPutSchema, LlmJsonSchema, LlmJsonSchemaType } from \"./types\";\n\nexport interface ParseOptions {\n disableRequestRetry?: boolean;\n}\n\nexport interface LlmJsonPutOptions {\n llmRequest?: (prompt: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n systemPrompt?: string;\n}\n\nconst JSON_FORMAT_INSTRUCTION = `请严格以 JSON 格式输出结果,不要输出任何其他内容,格式如下:`;\n\nexport class LlmJsonPut<T = any> {\n public readonly jsonFormatInstruction: string;\n constructor(\n protected schema: LlmJsonPutSchema,\n protected opts?: LlmJsonPutOptions,\n ) {\n this.jsonFormatInstruction = this.getJsonFormatInstruction(schema);\n }\n\n isMatched(prompt: string): boolean {\n return prompt.includes(JSON_FORMAT_INSTRUCTION);\n }\n\n getSchema(): Record<string, unknown> {\n return this.schema as unknown as Record<string, unknown>;\n }\n\n getJsonFormatInstruction(schema: LlmJsonPutSchema): string {\n const generateExample = (s: LlmJsonSchema): any => {\n if (s.type === \"object\") {\n const obj: any = {};\n for (const [key, value] of Object.entries(s.properties || {})) {\n obj[key] = generateExample(value);\n }\n return obj;\n } else if (s.type === \"array\") {\n return [generateExample(s.items!)];\n }\n return s.description || `<${s.type}>`;\n };\n\n const example = JSON.stringify(generateExample(schema), null, 2);\n\n return `${JSON_FORMAT_INSTRUCTION}\\n\\`\\`\\`json\\n${example}\\`\\`\\`\\n注意:只输出 JSON,不要包含 markdown 代码块或其他文字。`;\n }\n\n async parse(input: string, opts?: ParseOptions): Promise<T> {\n let content = input.trim();\n\n // 尝试移除 markdown 代码块\n if (content.startsWith(\"```\")) {\n content = content.replace(/^```(?:json)?\\n?/, \"\").replace(/\\n?```$/, \"\");\n }\n\n try {\n try {\n return JSON.parse(content);\n } catch {\n // 如果原生解析失败,尝试修复\n const repaired = jsonrepair(content);\n return JSON.parse(repaired);\n }\n } catch (err) {\n // 如果以上都不行就都丢给大模型,然后在重新走parse,但是要记录重新执行的次数,最多5次\n let retryCount = 0;\n while (retryCount < 5 && !opts?.disableRequestRetry) {\n const response = await this.request(input);\n return response;\n }\n throw new Error(\n `无法解析或修复 LLM 返回的 JSON: ${err instanceof Error ? err.message : String(err)}\\n原始内容: ${input}`,\n );\n }\n }\n\n async request(userPrompt: string): Promise<T> {\n if (!this.opts?.llmRequest) {\n throw new Error(\"未配置 llmRequest 方法,无法发起请求\");\n }\n\n const systemPrompt = `${this.opts.systemPrompt ? this.opts.systemPrompt + \"\\n\" : \"\"}${this.jsonFormatInstruction}`;\n const response = await this.opts.llmRequest({\n systemPrompt,\n userPrompt,\n });\n return this.parse(response, { disableRequestRetry: true });\n }\n}\n","/**\n * Source 类型定义\n */\nexport type SourceType = \"npm\" | \"git\" | \"local\";\n\n/**\n * 判断是否为 Git URL\n * 支持: git@xxx.git, https://xxx.git, git+ssh://xxx, git+https://xxx\n */\nexport function isGitUrl(source: string): boolean {\n return (\n source.startsWith(\"git@\") ||\n source.startsWith(\"git+\") ||\n (source.startsWith(\"https://\") && source.endsWith(\".git\")) ||\n source.endsWith(\".git\")\n );\n}\n\n/**\n * 判断是否为本地路径\n * 支持: ./path, ../path, /path, link:./path, skills/\n */\nexport function isLocalPath(source: string): boolean {\n return (\n source.startsWith(\"workspace:\") ||\n source.startsWith(\"link:\") ||\n source.startsWith(\"./\") ||\n source.startsWith(\"../\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"skills/\")\n );\n}\n\n/**\n * 获取 source 类型\n */\nexport function getSourceType(source: string): SourceType {\n if (isLocalPath(source)) return \"local\";\n if (isGitUrl(source)) return \"git\";\n return \"npm\";\n}\n\n/**\n * 规范化 source(移除 link: 前缀等)\n */\nexport function normalizeSource(source: string): string {\n if (source.startsWith(\"link:\")) {\n return source.substring(5); // 移除 \"link:\" 前缀\n }\n return source;\n}\n\n/**\n * 从 npm 包名中提取纯包名(去除版本号后缀)\n * 例如: @spaceflow/review@0.10.0 → @spaceflow/review\n * some-package@1.2.3 → some-package\n */\nexport function extractNpmPackageName(source: string): string {\n // 处理 scoped 包: @scope/name@version\n if (source.startsWith(\"@\")) {\n const slashIndex = source.indexOf(\"/\");\n if (slashIndex !== -1) {\n const afterSlash = source.substring(slashIndex + 1);\n const atIndex = afterSlash.indexOf(\"@\");\n if (atIndex !== -1) {\n return source.substring(0, slashIndex + 1 + atIndex);\n }\n }\n return source;\n }\n // 处理普通包: name@version\n const atIndex = source.indexOf(\"@\");\n if (atIndex !== -1) {\n return source.substring(0, atIndex);\n }\n return source;\n}\n\n/**\n * 从 source 提取名称\n * npm 包: @scope/package -> package\n * git URL: git@git.example.com:org/repo.git -> repo\n * 本地路径: ./skills/publish -> publish\n */\nexport function extractName(source: string): string {\n if (isLocalPath(source)) {\n // 本地路径:取最后一个目录名\n const parts = source.replace(/\\/$/, \"\").split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"unknown\";\n } else if (isGitUrl(source)) {\n let path = source;\n path = path.replace(/\\.git$/, \"\");\n path = path.replace(/^git@[^:]+:/, \"\");\n path = path.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n const parts = path.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"unknown\";\n } else {\n // npm 包名:先去除版本号后缀,再提取名称\n // @spaceflow/review@0.10.0 → @spaceflow/review → review\n const packageName = extractNpmPackageName(source);\n const parts = packageName.split(\"/\");\n const lastPart = parts[parts.length - 1];\n // 移除 spaceflow-plugin- 或 plugin- 前缀\n return lastPart.replace(/^spaceflow-plugin-/, \"\").replace(/^plugin-/, \"\");\n }\n}\n\n/**\n * 构建 git 仓库的 package spec(用于 pnpm add)\n * git@xxx.git -> git+ssh://git@xxx.git\n * https://xxx.git -> git+https://xxx.git\n */\nexport function buildGitPackageSpec(source: string, ref?: string): string {\n let spec: string;\n if (source.startsWith(\"git@\")) {\n // SSH 格式: git@host:org/repo.git -> git+ssh://git@host/org/repo.git\n const sshUrl = source.replace(\":\", \"/\").replace(\"git@\", \"git+ssh://git@\");\n spec = sshUrl;\n } else if (source.startsWith(\"https://\")) {\n spec = `git+${source}`;\n } else {\n spec = source;\n }\n\n // 添加 ref(分支/tag/commit)\n if (ref) {\n spec += `#${ref}`;\n }\n\n return spec;\n}\n","import { execSync } from \"child_process\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * 检测项目使用的包管理器\n * 必须同时满足:命令可用 AND lock 文件存在\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getPackageManager(cwd?: string): string {\n const workDir = cwd || process.cwd();\n\n // pnpm: 命令可用 + pnpm-lock.yaml 存在\n if (existsSync(join(workDir, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 命令不可用,继续检测其他\n }\n }\n\n // yarn: 命令可用 + yarn.lock 存在\n if (existsSync(join(workDir, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 命令不可用,继续检测其他\n }\n }\n\n // npm: 命令可用 + package-lock.json 存在\n if (existsSync(join(workDir, \"package-lock.json\"))) {\n try {\n execSync(\"npm --version\", { stdio: \"ignore\" });\n return \"npm\";\n } catch {\n // npm 命令不可用\n }\n }\n\n // 默认回退到 npm\n return \"npm\";\n}\n\n/**\n * 检测指定目录使用的包管理器(基于 lock 文件)\n * 如果没有 lock 文件,尝试检测 pnpm 是否可用\n * @param dir 目标目录\n */\nexport function detectPackageManager(dir: string): string {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(dir, \"yarn.lock\"))) {\n return \"yarn\";\n }\n if (existsSync(join(dir, \"package-lock.json\"))) {\n return \"npm\";\n }\n // 默认使用 pnpm(如果可用)\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n return \"npm\";\n }\n}\n\n/**\n * 检测当前目录是否为 pnpm workspace\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function isPnpmWorkspace(cwd?: string): boolean {\n const workDir = cwd || process.cwd();\n return existsSync(join(workDir, \"pnpm-workspace.yaml\"));\n}\n\n/**\n * 将 .spaceflow 添加到根项目的 devDependencies 中\n * 使用 file: 协议,兼容 npm 和 pnpm\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否成功添加(如果已存在则返回 false)\n */\nexport function addSpaceflowToDevDependencies(cwd?: string): boolean {\n const { readFileSync, writeFileSync } = require(\"fs\");\n const workDir = cwd || process.cwd();\n const packageJsonPath = join(workDir, \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // 检查是否已存在\n if (pkg.devDependencies?.[\"spaceflow\"]) {\n return false;\n }\n\n // 添加到 devDependencies\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n pkg.devDependencies[\"spaceflow\"] = \"file:.spaceflow\";\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n}\n","import { existsSync, readFileSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { SPACEFLOW_DIR, PACKAGE_JSON } from \"../../extension-system/extension.interface\";\n\n/**\n * 获取 .spaceflow 目录路径\n * @param isGlobal 是否为全局目录(~/.spaceflow)\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getSpaceflowDir(isGlobal: boolean, cwd?: string): string {\n if (isGlobal) {\n return join(homedir(), SPACEFLOW_DIR);\n }\n return join(cwd || process.cwd(), SPACEFLOW_DIR);\n}\n\n/**\n * 确保 .spaceflow 目录存在\n * @param spaceflowDir .spaceflow 目录路径\n */\nexport function ensureSpaceflowDir(spaceflowDir: string): void {\n if (!existsSync(spaceflowDir)) {\n mkdirSync(spaceflowDir, { recursive: true });\n }\n\n // 创建 .gitignore\n const gitignorePath = join(spaceflowDir, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n const gitignoreContent = `# Spaceflow Extension dependencies\nnode_modules/\npnpm-lock.yaml\nconfig-schema.json\n`;\n writeFileSync(gitignorePath, gitignoreContent);\n }\n\n}\n\n/**\n * 获取 @spaceflow/core 的版本号\n * 从 process.argv[1](cli 入口)向上找到 @spaceflow/cli 的 package.json\n * 读取其中声明的 @spaceflow/core 依赖版本,保证 cli 和 core 版本一致\n */\nexport function getSpaceflowCoreVersion(): string {\n const cliEntryPath = process.argv[1];\n if (cliEntryPath) {\n // cli 入口: .../node_modules/@spaceflow/cli/dist/cli.js → 往上两级是包根目录\n const cliDir = join(cliEntryPath, \"..\", \"..\");\n const cliPkgPath = join(cliDir, PACKAGE_JSON);\n if (existsSync(cliPkgPath)) {\n try {\n const cliPkg = JSON.parse(readFileSync(cliPkgPath, \"utf-8\"));\n if (cliPkg.name === \"@spaceflow/cli\") {\n const coreVersion = cliPkg.dependencies?.[\"@spaceflow/core\"];\n if (coreVersion) {\n return coreVersion;\n }\n }\n } catch {\n // ignore\n }\n }\n }\n return \"latest\";\n}\n\n/**\n * 确保 .spaceflow 目录及 package.json 存在,并保持 @spaceflow/core 版本与 cli 一致\n * @param spaceflowDir .spaceflow 目录路径\n */\nexport function ensureSpaceflowPackageJson(spaceflowDir: string): void {\n ensureSpaceflowDir(spaceflowDir);\n\n const packageJsonPath = join(spaceflowDir, PACKAGE_JSON);\n const coreVersion = getSpaceflowCoreVersion();\n\n if (existsSync(packageJsonPath)) {\n // 已存在:检查并更新 @spaceflow/core 版本\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n if (pkg.dependencies?.[\"@spaceflow/core\"] !== coreVersion) {\n pkg.dependencies = pkg.dependencies || {};\n pkg.dependencies[\"@spaceflow/core\"] = coreVersion;\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n }\n } catch {\n // ignore\n }\n } else {\n // 不存在:创建\n const packageJson = {\n name: \"spaceflow\",\n private: true,\n dependencies: {\n \"@spaceflow/core\": coreVersion,\n },\n };\n writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n }\n}\n\n/**\n * 确保编辑器目录有 .gitignore 文件,并将生成的文件加入忽略列表\n * @param editorRoot 编辑器根目录(如 .claude)\n * @param itemType 项目类型 (skills 或 commands)\n * @param itemName 项目名称\n */\nexport async function ensureEditorGitignore(\n editorRoot: string,\n itemType: \"skills\" | \"commands\",\n itemName: string,\n): Promise<void> {\n const { readFile, writeFile } = await import(\"fs/promises\");\n const gitignorePath = join(editorRoot, \".gitignore\");\n const ignoreEntry = itemType === \"skills\" ? `skills/${itemName}` : `commands/${itemName}.md`;\n\n let content = \"\";\n if (existsSync(gitignorePath)) {\n content = await readFile(gitignorePath, \"utf-8\");\n // 检查是否已包含该条目\n const lines = content.split(\"\\n\").map((l) => l.trim());\n if (lines.includes(ignoreEntry)) {\n return;\n }\n // 确保末尾有换行\n if (!content.endsWith(\"\\n\")) {\n content += \"\\n\";\n }\n } else {\n content = \"# 自动生成的 .gitignore - spaceflow 安装的 skills 和 commands\\n\";\n }\n\n content += `${ignoreEntry}\\n`;\n await writeFile(gitignorePath, content);\n}\n","import { resolve } from \"path\";\nimport type { Configuration, RuleSetRule } from \"@rspack/core\";\n\n/**\n * 插件构建配置选项\n */\nexport interface PluginBuildOptions {\n /** 插件名称 */\n name: string;\n /** 插件根目录路径 */\n path: string;\n /** 入口文件路径,默认 ./src/index.ts */\n entry?: string;\n /** 输出目录,默认 dist */\n outDir?: string;\n /** 是否压缩,默认 false */\n minimize?: boolean;\n /** 额外的外部依赖 */\n externals?: Configuration[\"externals\"];\n /** 额外的 resolve alias */\n alias?: Record<string, string>;\n /** 自定义 module rules */\n rules?: RuleSetRule[];\n}\n\n/**\n * 核心框架路径配置\n */\nexport interface CorePathOptions {\n /** core 包根目录 */\n coreRoot: string;\n}\n\n/**\n * 默认的外部依赖列表\n */\nexport const DEFAULT_EXTERNALS: Configuration[\"externals\"] = [\n // Spaceflow 核心 - 运行时从 core 加载\n { \"@spaceflow/core\": \"module @spaceflow/core\" },\n // 排除所有 node_modules(除了相对路径和 src/ 别名)\n /^(?!\\.\\/|\\.\\.\\/|src\\/)[^./]/,\n];\n\n/**\n * 默认的 TypeScript 编译规则\n */\nexport const DEFAULT_TS_RULE: RuleSetRule = {\n test: /\\.ts$/,\n exclude: /node_modules/,\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n transform: {\n legacyDecorator: true,\n decoratorMetadata: true,\n },\n target: \"es2022\",\n },\n },\n};\n\n/**\n * 创建插件构建的 rspack 配置\n */\nexport function createPluginConfig(\n options: PluginBuildOptions,\n coreOptions: CorePathOptions,\n): Configuration {\n const {\n name,\n path: pluginPath,\n entry = \"./src/index.ts\",\n outDir = \"dist\",\n minimize = false,\n externals: customExternals = [],\n alias: customAlias = {},\n rules: customRules = [],\n } = options;\n\n const { coreRoot } = coreOptions;\n\n // 合并外部依赖\n const mergedExternals = Array.isArray(customExternals)\n ? [...(DEFAULT_EXTERNALS as any[]), ...customExternals]\n : [...(DEFAULT_EXTERNALS as any[]), customExternals];\n\n // 合并 alias\n const alias = {\n \"@spaceflow/core\": resolve(coreRoot, \"src\", \"index.ts\"),\n ...customAlias,\n };\n\n // 合并 rules\n const rules = [DEFAULT_TS_RULE, ...customRules];\n\n return {\n name,\n context: pluginPath,\n optimization: {\n minimize,\n },\n entry: {\n index: entry,\n },\n target: \"node\",\n mode: process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n output: {\n filename: \"[name].js\",\n path: resolve(pluginPath, outDir),\n library: { type: \"module\" },\n chunkFormat: \"module\",\n clean: true,\n },\n experiments: {\n outputModule: true,\n },\n externalsType: \"module-import\",\n externals: mergedExternals,\n resolve: {\n extensions: [\".ts\", \".js\"],\n extensionAlias: {\n \".js\": [\".ts\", \".js\"],\n },\n alias,\n },\n module: {\n rules,\n },\n };\n}\n\n/**\n * 创建多入口插件配置\n */\nexport function createMultiEntryPluginConfig(\n options: Omit<PluginBuildOptions, \"entry\"> & {\n entries: Record<string, string>;\n },\n coreOptions: CorePathOptions,\n): Configuration {\n const config = createPluginConfig({ ...options, entry: \"./src/index.ts\" }, coreOptions);\n\n return {\n ...config,\n entry: options.entries,\n };\n}\n","export * from \"./rspack-config\";\n","/**\n * MCP (Model Context Protocol) 支持模块\n *\n * 提供装饰器和基础设施,用于在服务中定义 MCP 工具\n *\n * 使用方式:\n * ```typescript\n * class ListRulesInput {\n * @ApiPropertyOptional({ description: \"项目目录\" })\n * @IsString()\n * @IsOptional()\n * cwd?: string;\n * }\n *\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({\n * name: \"list_rules\",\n * description: \"获取所有审查规则\",\n * dto: ListRulesInput,\n * })\n * async listRules(input: ListRulesInput) {\n * return { rules: [...] };\n * }\n * }\n * ```\n */\n\nimport \"reflect-metadata\";\n\n/** MCP 服务元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_SERVER_METADATA = Symbol.for(\"spaceflow:mcp:server\");\n\n/** MCP 工具元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_TOOL_METADATA = Symbol.for(\"spaceflow:mcp:tool\");\n\n/** JSON Schema 类型 */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchema & { description?: string }>;\n required?: string[];\n items?: JsonSchema;\n description?: string;\n}\n\n/** MCP 服务定义 */\nexport interface McpServerDefinition {\n /** 服务名称 */\n name: string;\n /** 服务版本 */\n version?: string;\n /** 服务描述 */\n description?: string;\n}\n\n/** Swagger 元数据常量 */\nconst SWAGGER_API_MODEL_PROPERTIES = \"swagger/apiModelProperties\";\nconst SWAGGER_API_MODEL_PROPERTIES_ARRAY = \"swagger/apiModelPropertiesArray\";\n\n/**\n * 从 @nestjs/swagger 的 @ApiProperty / @ApiPropertyOptional 元数据生成 JSON Schema\n * 直接读取 swagger 装饰器存储的 reflect-metadata,无需自定义装饰器\n */\nexport function dtoToJsonSchema(dtoClass: new (...args: any[]) => any): JsonSchema {\n const prototype = dtoClass.prototype;\n\n // 读取属性名列表(swagger 存储格式为 \":propertyName\")\n const propertyKeys: string[] = (\n Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES_ARRAY, prototype) || []\n ).map((key: string) => key.replace(/^:/, \"\"));\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key of propertyKeys) {\n const meta = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES, prototype, key) || {};\n\n // 推断 JSON Schema type\n const typeMap: Record<string, string> = {\n String: \"string\",\n Number: \"number\",\n Boolean: \"boolean\",\n Array: \"array\",\n Object: \"object\",\n };\n\n let schemaType = meta.type;\n // meta.type 可能是构造函数(如 Boolean)或字符串(如 \"boolean\")\n if (typeof schemaType === \"function\") {\n schemaType = typeMap[schemaType.name] || \"string\";\n }\n // 从 reflect-metadata 的 design:type 推断\n if (!schemaType) {\n const reflectedType = Reflect.getMetadata(\"design:type\", prototype, key);\n if (reflectedType) {\n schemaType = typeMap[reflectedType.name] || \"string\";\n }\n }\n\n const prop: Record<string, any> = {};\n if (schemaType) prop.type = schemaType;\n if (meta.description) prop.description = meta.description;\n if (meta.default !== undefined) prop.default = meta.default;\n if (meta.enum) prop.enum = meta.enum;\n if (meta.example !== undefined) prop.example = meta.example;\n\n properties[key] = prop;\n\n // required 判断:swagger 的 @ApiProperty 默认 required=true,@ApiPropertyOptional 为 false\n if (meta.required !== false) {\n required.push(key);\n }\n }\n\n const schema: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) schema.required = required;\n return schema;\n}\n\n/** MCP 工具定义 */\nexport interface McpToolDefinition {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 schema (JSON Schema 格式,与 dto 二选一) */\n inputSchema?: JsonSchema;\n /** 输入参数 DTO 类(与 inputSchema 二选一,优先级高于 inputSchema) */\n dto?: new (...args: any[]) => any;\n}\n\n/** 存储的工具元数据 */\nexport interface McpToolMetadata extends McpToolDefinition {\n /** 方法名 */\n methodName: string;\n}\n\n/**\n * MCP 服务装饰器\n * 标记一个类为 MCP 服务,内部自动应用 @Injectable()\n *\n * @example\n * ```typescript\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({ name: \"list_rules\", description: \"获取规则\" })\n * async listRules() { ... }\n * }\n * ```\n */\nexport function McpServer(definition: McpServerDefinition): ClassDecorator {\n return (target: Function) => {\n // 使用静态属性存储元数据(跨模块可访问)\n (target as any).__mcp_server__ = definition;\n };\n}\n\n/**\n * MCP 工具装饰器\n * 标记一个方法为 MCP 工具\n */\nexport function McpTool(definition: McpToolDefinition): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor as any;\n // 使用静态属性存储工具列表(跨模块可访问)\n if (!constructor.__mcp_tools__) {\n constructor.__mcp_tools__ = [];\n }\n\n // 如果提供了 dto,自动从 swagger 元数据生成 inputSchema\n const resolvedDefinition = { ...definition };\n if (resolvedDefinition.dto) {\n resolvedDefinition.inputSchema = dtoToJsonSchema(resolvedDefinition.dto);\n }\n\n constructor.__mcp_tools__.push({\n ...resolvedDefinition,\n methodName: String(propertyKey),\n });\n };\n}\n\n/**\n * 检查一个类是否是 MCP 服务\n */\nexport function isMcpServer(target: any): boolean {\n const constructor = target?.constructor || target;\n return !!constructor?.__mcp_server__;\n}\n\n/**\n * 获取 MCP 服务元数据\n */\nexport function getMcpServerMetadata(target: any): McpServerDefinition | undefined {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_server__;\n}\n\n/**\n * 从服务类获取所有 MCP 工具定义\n */\nexport function getMcpTools(target: any): McpToolMetadata[] {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_tools__ || [];\n}\n\n/**\n * MCP Server 运行器\n * 收集服务中的 MCP 工具并启动 stdio 服务\n */\nexport async function runMcpServer(\n service: any,\n serverInfo: { name: string; version: string },\n): Promise<void> {\n const tools = getMcpTools(service);\n\n if (tools.length === 0) {\n console.error(\"没有找到 MCP 工具定义\");\n process.exit(1);\n }\n\n // 动态导入 MCP SDK(避免在不需要时加载)\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const server = new McpServer(serverInfo);\n\n // 注册所有工具(使用 v1 API: server.tool)\n for (const tool of tools) {\n // v1 API: server.tool(name, description, schema, callback)\n // 使用工具定义中的 inputSchema 转为 zod,如果没有则传空对象\n const schema = tool.inputSchema ? jsonSchemaToZod(tool.inputSchema) : {};\n server.tool(tool.name, tool.description, schema, async (args: any) => {\n try {\n const result = await service[tool.methodName](args || {});\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n /**\n * 将 JSON Schema 转换为简单的 zod 对象(MCP SDK 需要 zod)\n * 仅处理顶层 properties,满足 MCP 工具注册需求\n */\n function jsonSchemaToZod(jsonSchema: JsonSchema): Record<string, any> {\n const { z } = require(\"zod\") as typeof import(\"zod\");\n if (!jsonSchema.properties) return {};\n\n const shape: Record<string, any> = {};\n const requiredFields = jsonSchema.required || [];\n\n for (const [key, prop] of Object.entries(jsonSchema.properties)) {\n let field: any;\n switch (prop.type) {\n case \"number\":\n field = z.number();\n break;\n case \"boolean\":\n field = z.boolean();\n break;\n case \"array\":\n field = z.array(z.any());\n break;\n case \"object\":\n field = z.object({});\n break;\n default:\n field = z.string();\n }\n if (prop.description) field = field.describe(prop.description);\n if (!requiredFields.includes(key)) field = field.optional();\n shape[key] = field;\n }\n\n return shape;\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`MCP Server \"${serverInfo.name}\" started with ${tools.length} tools`);\n}\n","import { readFileSync, existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\n\n/** 默认语言 */\nconst DEFAULT_LOCALE = \"zh-CN\";\n\n/** 配置文件名 */\nconst CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** .spaceflow 目录名 */\nconst SPACEFLOW_DIR = \".spaceflow\";\n\n/**\n * 标准化 locale 字符串为 BCP 47 格式\n * @example \"zh_CN\" → \"zh-CN\", \"zh-Hans\" → \"zh-CN\", \"en_US.UTF-8\" → \"en-US\"\n */\nfunction normalizeLocale(raw: string): string | undefined {\n const cleaned = raw.replace(/\\..*$/, \"\").trim();\n // 处理 Apple 格式:zh-Hans → zh-CN, zh-Hant → zh-TW\n if (/^zh[-_]?Hans/i.test(cleaned)) return \"zh-CN\";\n if (/^zh[-_]?Hant/i.test(cleaned)) return \"zh-TW\";\n // 处理标准格式:zh_CN / zh-CN / en_US / en-US\n const match = cleaned.match(/^([a-z]{2})[-_]([A-Z]{2})/i);\n if (match) return `${match[1].toLowerCase()}-${match[2].toUpperCase()}`;\n // 处理纯语言代码:zh → zh-CN, en → en\n const langOnly = cleaned.match(/^([a-z]{2})$/i);\n if (langOnly) {\n const lang = langOnly[1].toLowerCase();\n return lang === \"zh\" ? \"zh-CN\" : lang;\n }\n return undefined;\n}\n\n/**\n * 从 spaceflow.json 读取 lang 字段\n * 按优先级从高到低查找:项目 > 全局\n */\nfunction readLangFromConfig(): string | undefined {\n const paths = [\n join(process.cwd(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n join(homedir(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n ];\n for (const configPath of paths) {\n if (!existsSync(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as Record<string, unknown>;\n if (typeof config.lang === \"string\" && config.lang.length > 0) {\n return normalizeLocale(config.lang) ?? config.lang;\n }\n } catch {\n // 忽略解析错误\n }\n }\n return undefined;\n}\n\n/**\n * 从系统环境变量推断 locale\n * 解析 LANG 格式如 \"zh_CN.UTF-8\" → \"zh-CN\"\n */\nfunction readEnvLocale(): string | undefined {\n const raw = process.env.LC_ALL || process.env.LANG;\n if (!raw) return undefined;\n return normalizeLocale(raw);\n}\n\n/**\n * macOS:通过 defaults read 获取系统首选语言\n * AppleLanguages 比 LANG 环境变量更准确地反映用户实际语言偏好\n */\nfunction readMacOSLocale(): string | undefined {\n try {\n const output = execSync(\"defaults read -g AppleLanguages\", {\n encoding: \"utf-8\",\n timeout: 500,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // 输出格式: (\\n \"zh-Hans-CN\",\\n \"en-CN\"\\n)\n const match = output.match(/\"([^\"]+)\"/);\n if (!match) return undefined;\n return normalizeLocale(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Windows:通过 PowerShell 获取系统 UI 语言\n */\nfunction readWindowsLocale(): string | undefined {\n try {\n const output = execSync('powershell -NoProfile -Command \"(Get-Culture).Name\"', {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const trimmed = output.trim();\n if (!trimmed) return undefined;\n return normalizeLocale(trimmed);\n } catch {\n return undefined;\n }\n}\n\n/**\n * 读取操作系统级别的语言偏好\n * macOS: defaults read -g AppleLanguages\n * Windows: PowerShell Get-Culture\n */\nfunction readOSLocale(): string | undefined {\n const os = platform();\n if (os === \"darwin\") return readMacOSLocale();\n if (os === \"win32\") return readWindowsLocale();\n return undefined;\n}\n\n/**\n * 检测当前语言\n *\n * 优先级:\n * 1. 环境变量 SPACEFLOW_LANG\n * 2. spaceflow.json 中的 lang 字段(项目 > 全局)\n * 3. 操作系统语言偏好(macOS AppleLanguages / Windows Get-Culture)\n * 4. 系统环境变量 LC_ALL / LANG\n * 5. 回退到 zh-CN\n */\nexport function detectLocale(): string {\n const envLang = process.env.SPACEFLOW_LANG;\n if (envLang) return normalizeLocale(envLang) ?? envLang;\n return readLangFromConfig() || readOSLocale() || readEnvLocale() || DEFAULT_LOCALE;\n}\n","import * as i18nextModule from \"i18next\";\nimport type { TOptions, i18n } from \"i18next\";\n\n// 兼容 CJS/ESM 混合环境\nconst i18next: i18n =\n (i18nextModule as unknown as { default: i18n }).default || (i18nextModule as unknown as i18n);\nimport { detectLocale } from \"./locale-detect\";\nimport zhCN from \"../../locales/zh-cn/translation.json\";\nimport en from \"../../locales/en/translation.json\";\n\n/** 默认命名空间 */\nconst DEFAULT_NS = \"translation\";\n\n/** 是否已初始化 */\nlet initialized = false;\n\n/**\n * 初始化 i18n\n * 当提供 resources 且无后端加载器时,i18next.init() 同步完成\n * @param lang 指定语言,不传则自动检测\n */\nexport function initI18n(lang?: string): void {\n if (initialized) return;\n const lng = lang || detectLocale();\n // i18next v25+ 移除了 initSync,但提供内联 resources 时 init() 同步完成\n void i18next.init({\n lng,\n fallbackLng: \"zh-CN\",\n defaultNS: DEFAULT_NS,\n ns: [DEFAULT_NS],\n resources: {\n \"zh-CN\": { [DEFAULT_NS]: zhCN },\n en: { [DEFAULT_NS]: en },\n },\n interpolation: {\n escapeValue: false,\n },\n returnNull: false,\n returnEmptyString: false,\n // i18next v25.8+ 会在 init 时输出 locize.com 推广日志\n showSupportNotice: false,\n });\n initialized = true;\n}\n\n/**\n * 重置 i18n 状态(仅用于测试)\n */\nexport function resetI18n(): void {\n initialized = false;\n}\n\n/**\n * 翻译函数\n * 装饰器和运行时均可使用\n * @param key 翻译 key\n * @param options 插值参数\n */\nexport function t(key: string, options?: TOptions): string {\n if (!initialized) {\n initI18n();\n }\n return i18next.t(key, options) as string;\n}\n\n/**\n * 为外部 Extension 注册语言资源\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addLocaleResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n if (!initialized) {\n initI18n();\n }\n for (const [lng, translations] of Object.entries(resources)) {\n i18next.addResourceBundle(lng, ns, translations, true, true);\n }\n if (!i18next.options.ns) {\n i18next.options.ns = [DEFAULT_NS, ns];\n } else if (Array.isArray(i18next.options.ns) && !i18next.options.ns.includes(ns)) {\n i18next.options.ns.push(ns);\n }\n}\n","export { initI18n, t, addLocaleResources } from \"./i18n\";\n","import type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"../logger.interface\";\n\n/** 时间戳格式化 */\nconst timestamp = (): string => {\n const now = new Date();\n return `${now.toLocaleTimeString()}`;\n};\n\n/** plain 模式渲染器:纯文本输出,适合 CI / 管道 */\nexport class PlainRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ✅ ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${timestamp()} ${prefix} ⚠️ ${message}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${timestamp()} ${prefix} ❌ ${message}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} [DEBUG] ${message}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n console.log(`${timestamp()} ${prefix} ⏳ ${message}`);\n return {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ⏳ ${msg}`);\n },\n succeed: (msg?: string) => {\n console.log(`${timestamp()} ${prefix} ✅ ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n console.error(`${timestamp()} ${prefix} ❌ ${msg ?? message}`);\n },\n stop: () => {},\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\" } = options;\n const tag = label ? `${label} ` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const pct = Math.round((current / total) * 100);\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}${current}/${total} (${pct}%)${suffix}`);\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ✅ ${tag}${total}/${total} (100%)${suffix}`);\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const results: T[] = [];\n for (const item of items) {\n if (item.enabled === false) {\n console.log(`${timestamp()} ${prefix} ⏭️ [跳过] ${item.title}`);\n continue;\n }\n console.log(`${timestamp()} ${prefix} ▶ ${item.title}`);\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ${msg}`);\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await item.task(ctx, control);\n if (skipped) {\n const suffix = skipReason ? `: ${skipReason}` : \"\";\n console.log(`${timestamp()} ${prefix} ⏭️ ${item.title}${suffix}`);\n } else {\n console.log(`${timestamp()} ${prefix} ✅ ${item.title}`);\n }\n results.push(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`${timestamp()} ${prefix} ❌ ${item.title}: ${errMsg}`);\n throw err;\n }\n }\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n","import type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n} from \"./logger.interface\";\nimport { LOG_LEVEL_PRIORITY } from \"./logger.interface\";\nimport { PlainRenderer } from \"./renderers/plain.renderer\";\n\n/** 检测是否为 TUI 环境 */\nconst detectMode = (): RenderMode => {\n if (process.env.CI || !process.stdout.isTTY) return \"plain\";\n return \"tui\";\n};\n\n/** TUI 渲染器缓存(延迟加载,避免 ESM 兼容问题) */\nlet tuiRendererCache: LogRenderer | null = null;\n\n/** 延迟加载 TUI 渲染器(chalk/ora/log-update 均为纯 ESM 包) */\nconst loadTuiRenderer = async (): Promise<LogRenderer> => {\n if (tuiRendererCache) return tuiRendererCache;\n const { TuiRenderer } = await import(\"./renderers/tui.renderer\");\n tuiRendererCache = new TuiRenderer();\n return tuiRendererCache;\n};\n\n/** 解析渲染模式,返回实际模式标识 */\nconst resolveMode = (mode: RenderMode): \"plain\" | \"tui\" => {\n if (mode === \"auto\") return detectMode() === \"tui\" ? \"tui\" : \"plain\";\n return mode;\n};\n\n/**\n * 全局日志工具类\n *\n * 每个子命令创建独立实例,支持 plain / tui 两种输出模式。\n * TUI 模式提供 Spinner、进度条、任务列表等富交互能力,\n * plain 模式下自动降级为普通文本输出。\n *\n * @example\n * ```typescript\n * const logger = new Logger(\"build\");\n * logger.info(\"开始构建\");\n * const s = logger.spin(\"编译中...\");\n * s.succeed(\"编译完成\");\n * ```\n */\nexport class Logger {\n private readonly name: string;\n private readonly level: LogLevel;\n private readonly resolvedMode: \"plain\" | \"tui\";\n private readonly plainRenderer: PlainRenderer;\n private tuiRenderer: LogRenderer | null = null;\n\n constructor(options: LoggerOptions | string) {\n const opts = typeof options === \"string\" ? { name: options } : options;\n this.name = opts.name;\n this.level = opts.level ?? \"info\";\n this.resolvedMode = resolveMode(opts.mode ?? \"auto\");\n this.plainRenderer = new PlainRenderer();\n }\n\n /** 格式化前缀 */\n private get prefix(): string {\n return `[${this.name}]`;\n }\n\n /** 获取当前渲染器(TUI 未加载时降级为 plain) */\n private get renderer(): LogRenderer {\n if (this.resolvedMode === \"tui\" && this.tuiRenderer) return this.tuiRenderer;\n return this.plainRenderer;\n }\n\n /**\n * 初始化 TUI 渲染器(异步)\n * 在使用 TUI 特有功能前调用,确保渲染器已加载\n */\n async init(): Promise<void> {\n if (this.resolvedMode === \"tui\" && !this.tuiRenderer) {\n this.tuiRenderer = await loadTuiRenderer();\n }\n }\n\n /** 判断是否应输出指定级别的日志 */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.level];\n }\n\n /** 输出 info 级别日志 */\n info(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.info(this.prefix, message);\n }\n }\n\n /** 输出 success 级别日志 */\n success(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.success(this.prefix, message);\n }\n }\n\n /** 输出 warn 级别日志 */\n warn(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.warn(this.prefix, message);\n }\n }\n\n /** 输出 error 级别日志 */\n error(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.error(this.prefix, message);\n }\n }\n\n /** 输出 verbose 级别日志(level >= verbose 才输出) */\n verbose(message: string): void {\n if (this.shouldLog(\"verbose\")) {\n this.renderer.verbose(this.prefix, message);\n }\n }\n\n /** 输出 debug 级别日志(level >= debug 才输出) */\n debug(message: string): void {\n if (this.shouldLog(\"debug\")) {\n this.renderer.debug(this.prefix, message);\n }\n }\n\n /**\n * 创建 Spinner\n * TUI 模式下显示动画 spinner,plain 模式下降级为普通日志\n */\n spin(message: string): Spinner {\n return this.renderer.createSpinner(this.prefix, message);\n }\n\n /**\n * 创建进度条\n * TUI 模式下显示实时进度条,plain 模式下降级为百分比日志\n */\n progress(options: ProgressBarOptions): ProgressBar {\n return this.renderer.createProgressBar(this.prefix, options);\n }\n\n /**\n * 执行任务列表\n * TUI 模式下多行实时更新,plain 模式下顺序输出\n */\n async tasks<T>(items: TaskItem<T>[]): Promise<T[]> {\n return this.renderer.runTasks<T>(this.prefix, items);\n }\n\n /** 输出表格 */\n table(data: Record<string, unknown>[]): void {\n this.renderer.table(this.prefix, data);\n }\n\n /**\n * 创建子 Logger\n * 命名空间自动拼接,如 \"build\" → \"build:compile\"\n */\n child(name: string): Logger {\n return new Logger({\n name: `${this.name}:${name}`,\n level: this.level,\n mode: this.resolvedMode,\n });\n }\n}\n","export { Logger } from \"./logger\";\nexport type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"./logger.interface\";\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/** Schema 注册信息 */\nexport interface SchemaRegistry {\n /** 配置 key */\n configKey: string;\n /** zod schema 工厂函数 */\n schemaFactory: () => z.ZodType;\n /** 描述 */\n description?: string;\n}\n\n/** 全局 schema 注册表 */\nconst schemaRegistry = new Map<string, SchemaRegistry>();\n\n/**\n * 注册插件配置 schema(由插件加载器调用)\n */\nexport function registerPluginSchema(registry: SchemaRegistry): void {\n schemaRegistry.set(registry.configKey, registry);\n}\n\n/**\n * 获取所有已注册的 schema\n */\nexport function getRegisteredSchemas(): Map<string, SchemaRegistry> {\n return schemaRegistry;\n}\n\n/**\n * Schema 生成服务\n * 用于生成 JSON Schema 文件\n */\nexport class SchemaGeneratorService {\n /**\n * 生成完整的 spaceflow.json 的 JSON Schema\n * @param outputPath 输出路径\n */\n generateJsonSchema(outputPath: string): void {\n const properties: Record<string, unknown> = {\n dependencies: {\n type: \"object\",\n description: \"已安装的技能包注册表\",\n additionalProperties: { type: \"string\" },\n },\n support: {\n type: \"array\",\n description: \"支持的编辑器列表\",\n items: { type: \"string\" },\n },\n };\n\n // 添加所有插件的 schema\n for (const [configKey, registry] of schemaRegistry) {\n try {\n const schema = registry.schemaFactory();\n const jsonSchema = z.toJSONSchema(schema, {\n target: \"draft-07\",\n });\n properties[configKey] = {\n ...jsonSchema,\n description: registry.description || `${configKey} 插件配置`,\n };\n } catch (error) {\n console.warn(`⚠️ 无法转换 ${configKey} 的 schema:`, error);\n }\n }\n\n const fullSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Spaceflow Configuration\",\n description: \"Spaceflow 配置文件 schema\",\n type: \"object\",\n properties,\n additionalProperties: true,\n };\n\n // 确保目录存在\n const dir = path.dirname(outputPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // 写入文件\n fs.writeFileSync(outputPath, JSON.stringify(fullSchema, null, 2), \"utf-8\");\n console.log(`✅ JSON Schema 已生成: ${outputPath}`);\n\n // 自动添加到 .gitignore\n this.addToGitignore(dir, path.basename(outputPath));\n }\n\n /**\n * 生成 JSON Schema 到默认路径 (.spaceflow/config-schema.json)\n */\n generate(): void {\n const outputPath = path.join(process.cwd(), \".spaceflow\", \"config-schema.json\");\n this.generateJsonSchema(outputPath);\n }\n\n /**\n * 将文件添加到 .gitignore(如果不存在)\n */\n private addToGitignore(dir: string, filename: string): void {\n const gitignorePath = path.join(dir, \".gitignore\");\n let content = \"\";\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, \"utf-8\");\n // 检查是否已存在\n const lines = content.split(\"\\n\").map((line) => line.trim());\n if (lines.includes(filename)) {\n return;\n }\n } else {\n content = \"# 自动生成的 .gitignore\\n\";\n }\n\n // 追加文件名\n const newContent = content.endsWith(\"\\n\")\n ? `${content}${filename}\\n`\n : `${content}\\n${filename}\\n`;\n\n fs.writeFileSync(gitignorePath, newContent, \"utf-8\");\n }\n}\n","import { readFileSync, existsSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport stringify from \"json-stringify-pretty-compact\";\nimport { z } from \"zod\";\nimport type { LLMMode } from \"../shared/llm-proxy\";\nimport { registerPluginSchema } from \"./schema-generator.service\";\n\n/** 默认编辑器 */\nexport const DEFAULT_SUPPORT_EDITOR = \"claudeCode\";\n\n/** 配置文件名 */\nexport const CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** RC 配置文件名(位于 .spaceflow 同级目录) */\nexport const RC_FILE_NAME = \".spaceflowrc\";\n\n/** Spaceflow 核心配置 Schema */\nconst SpaceflowCoreConfigSchema = z.object({\n /** 界面语言,如 zh-CN、en */\n lang: z.string().optional().describe(\"界面语言,如 zh-CN、en\"),\n /** 已安装的技能包注册表 */\n dependencies: z.record(z.string(), z.string()).optional().describe(\"已安装的技能包注册表\"),\n /** 支持的编辑器列表,用于安装 skills 和 commands 时关联目录 */\n support: z.array(z.string()).default([DEFAULT_SUPPORT_EDITOR]).describe(\"支持的编辑器列表\"),\n});\n\n// 注册 spaceflow 核心配置 schema\nregisterPluginSchema({\n configKey: \"spaceflow\",\n schemaFactory: () => SpaceflowCoreConfigSchema,\n description: \"Spaceflow 核心配置\",\n});\n\n/**\n * SpaceflowConfig - 通用配置\n * 子命令的配置由各自模块定义和管理\n */\nexport type SpaceflowConfig = z.infer<typeof SpaceflowCoreConfigSchema> & {\n /** 子命令配置,由各子命令模块自行定义类型 */\n [key: string]: unknown;\n};\n\n// ============ 配置文件操作工具函数 ============\n\n// 不应该被深度合并的字段,这些字段应该直接覆盖而非合并\nconst NO_MERGE_FIELDS = [\"dependencies\"];\n\n/**\n * 深度合并对象\n * 后面的对象会覆盖前面的对象,数组会被替换而非合并\n * NO_MERGE_FIELDS 中的字段不会被深度合并,而是直接覆盖\n */\nfunction deepMerge<T extends Record<string, unknown>>(...objects: Partial<T>[]): Partial<T> {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n for (const key in obj) {\n const value = obj[key];\n const existing = result[key];\n\n // 对于 NO_MERGE_FIELDS 中的字段,直接覆盖而非合并\n if (NO_MERGE_FIELDS.includes(key)) {\n if (value !== undefined) {\n result[key] = value;\n }\n } else if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ) {\n result[key] = deepMerge(\n existing as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result as Partial<T>;\n}\n\n/**\n * 获取主配置文件路径(用于写入)\n * 配置文件统一存放在 .spaceflow/ 目录下\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getConfigPath(cwd?: string): string {\n return join(cwd || process.cwd(), \".spaceflow\", CONFIG_FILE_NAME);\n}\n\n/**\n * 获取所有配置文件路径(按优先级从低到高排列)\n * 优先级: ~/.spaceflow/spaceflow.json < ~/.spaceflowrc < ./.spaceflow/spaceflow.json < ./.spaceflowrc\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getConfigPaths(cwd?: string): string[] {\n const workDir = cwd || process.cwd();\n return [\n join(homedir(), \".spaceflow\", CONFIG_FILE_NAME),\n join(homedir(), RC_FILE_NAME),\n join(workDir, \".spaceflow\", CONFIG_FILE_NAME),\n join(workDir, RC_FILE_NAME),\n ];\n}\n\n/** .env 文件名 */\nconst ENV_FILE_NAME = \".env\";\n\n/**\n * 获取所有 .env 文件路径(按优先级从高到低排列,供 ConfigModule.envFilePath 使用)\n *\n * NestJS ConfigModule 中 envFilePath 数组靠前的优先级更高(先读到的变量不会被后面覆盖)\n * 因此返回顺序为从高到低:\n * 1. ./.env (程序启动目录,最高优先级)\n * 2. ./.spaceflow/.env (项目配置目录)\n * 3. ~/.env (全局 home 目录)\n * 4. ~/.spaceflow/.env (全局配置目录,最低优先级)\n *\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getEnvFilePaths(cwd?: string): string[] {\n const workDir = cwd || process.cwd();\n return [\n join(workDir, ENV_FILE_NAME),\n join(workDir, \".spaceflow\", ENV_FILE_NAME),\n join(homedir(), ENV_FILE_NAME),\n join(homedir(), \".spaceflow\", ENV_FILE_NAME),\n ];\n}\n\n/**\n * 读取单个配置文件(同步)\n * @param configPath 配置文件路径\n */\nfunction readSingleConfigSync(configPath: string): Partial<SpaceflowConfig> {\n if (!existsSync(configPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n console.warn(`警告: 无法解析配置文件 ${configPath}`);\n return {};\n }\n}\n\n/**\n * 读取配置文件(同步)\n * 按优先级从低到高读取并合并配置:\n * 1. ~/.spaceflow/spaceflow.json (全局配置,最低优先级)\n * 2. ~/.spaceflowrc (全局 RC 配置)\n * 3. ./.spaceflow/spaceflow.json (项目配置)\n * 4. ./.spaceflowrc (项目根目录 RC 配置,最高优先级)\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function readConfigSync(cwd?: string): Partial<SpaceflowConfig> {\n const configPaths = getConfigPaths(cwd);\n const configs = configPaths.map((p) => readSingleConfigSync(p));\n return deepMerge(...configs);\n}\n\n/**\n * 写入配置文件(同步)\n * @param config 配置对象\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function writeConfigSync(config: Partial<SpaceflowConfig>, cwd?: string): void {\n const configPath = getConfigPath(cwd);\n writeFileSync(configPath, stringify(config, { indent: 2 }) + \"\\n\");\n}\n\n/**\n * 获取支持的编辑器列表\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getSupportedEditors(cwd?: string): string[] {\n const config = readConfigSync(cwd);\n return config.support || [DEFAULT_SUPPORT_EDITOR];\n}\n\n/**\n * 获取 dependencies\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getDependencies(cwd?: string): Record<string, string> {\n const config = readConfigSync(cwd);\n return (config.dependencies as Record<string, string>) || {};\n}\n\n/**\n * 找到包含指定字段的最高优先级配置文件路径\n * 如果没有找到,返回项目级 .spaceflowrc 路径(默认写入位置)\n * @param field 要查找的字段名\n * @param cwd 工作目录\n */\nexport function findConfigFileWithField(field: string, cwd?: string): string {\n const workDir = cwd || process.cwd();\n // 按优先级从高到低查找,找到第一个包含该字段的文件\n const candidates = [\n join(workDir, RC_FILE_NAME),\n join(workDir, \".spaceflow\", CONFIG_FILE_NAME),\n join(homedir(), RC_FILE_NAME),\n join(homedir(), \".spaceflow\", CONFIG_FILE_NAME),\n ];\n\n for (const filePath of candidates) {\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const config = JSON.parse(content);\n if (config[field] !== undefined) {\n return filePath;\n }\n } catch {\n // 解析失败,跳过\n }\n }\n }\n\n // 默认写入项目级 .spaceflowrc\n return join(workDir, RC_FILE_NAME);\n}\n\n/**\n * 更新单个 dependency\n * 找到 dependencies 所在的配置文件并原地更新,默认写入 .spaceflowrc\n * @param name 依赖名称\n * @param source 依赖来源\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否有更新(false 表示已存在相同配置)\n */\nexport function updateDependency(name: string, source: string, cwd?: string): boolean {\n const targetFile = findConfigFileWithField(\"dependencies\", cwd);\n const config = existsSync(targetFile)\n ? (JSON.parse(readFileSync(targetFile, \"utf-8\")) as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n if (!config.dependencies) {\n config.dependencies = {};\n }\n\n const dependencies = config.dependencies as Record<string, string>;\n\n // 检查是否已存在相同配置\n if (dependencies[name] === source) {\n return false;\n }\n\n dependencies[name] = source;\n writeFileSync(targetFile, stringify(config, { indent: 2 }) + \"\\n\");\n return true;\n}\n\n/**\n * 删除单个 dependency\n * 找到 dependencies 所在的配置文件并原地更新\n * @param name 依赖名称\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否有删除(false 表示不存在)\n */\nexport function removeDependency(name: string, cwd?: string): boolean {\n const targetFile = findConfigFileWithField(\"dependencies\", cwd);\n if (!existsSync(targetFile)) {\n return false;\n }\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(targetFile, \"utf-8\"));\n } catch {\n return false;\n }\n\n if (!config.dependencies) {\n return false;\n }\n\n const dependencies = config.dependencies as Record<string, string>;\n\n if (!(name in dependencies)) {\n return false;\n }\n\n delete dependencies[name];\n writeFileSync(targetFile, stringify(config, { indent: 2 }) + \"\\n\");\n return true;\n}\n\n/**\n * 获取 spaceflow 配置(兼容旧 API)\n * @deprecated 请使用 loadSpaceflowConfig()\n */\nexport function spaceflowConfig(): SpaceflowConfig {\n return loadSpaceflowConfig();\n}\n\n/**\n * 加载 spaceflow.json 配置(用于 CLI 启动时)\n * 使用 zod 验证配置\n */\nexport function loadSpaceflowConfig(): SpaceflowConfig {\n const fileConfig = readConfigSync();\n\n // 使用 zod 验证核心配置\n const result = SpaceflowCoreConfigSchema.safeParse(fileConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Spaceflow 配置验证失败:\\n${errors}`);\n }\n\n return {\n ...fileConfig,\n ...result.data,\n } as SpaceflowConfig;\n}\n\nexport type { LLMMode };\n","import { z } from \"zod\";\nimport { readConfigSync } from \"./spaceflow.config\";\nimport { registerPluginSchema } from \"./schema-generator.service\";\n\n/**\n * 配置加载器选项\n */\nexport interface ConfigLoaderOptions<T extends z.ZodObject<z.ZodRawShape>> {\n /** 配置 key(用于从 spaceflow.json 读取) */\n configKey: string;\n /** zod schema(应包含 .default() 设置默认值) */\n schemaFactory: () => T;\n /** 配置描述(用于生成 JSON Schema) */\n description?: string;\n}\n\n/**\n * 创建配置加载器\n * 统一使用 zod 进行配置验证和默认值填充\n *\n * @example\n * ```ts\n * const GitProviderConfigSchema = z.object({\n * serverUrl: z.string().default(process.env.GITHUB_SERVER_URL || \"\"),\n * token: z.string().default(process.env.GITHUB_TOKEN || \"\"),\n * });\n *\n * export type GitProviderConfig = z.infer<typeof GitProviderConfigSchema>;\n *\n * export const gitProviderConfig = createConfigLoader({\n * configKey: \"gitProvider\",\n * schemaFactory: GitProviderConfigSchema,\n * description: \"Git Provider 服务配置\",\n * });\n * ```\n */\nexport function createConfigLoader<T extends z.ZodObject<z.ZodRawShape>>(\n options: ConfigLoaderOptions<T>,\n) {\n const { configKey, schemaFactory, description } = options;\n\n // 创建配置加载器\n return (): z.infer<T> => {\n const schema = schemaFactory();\n // 注册 schema 用于 JSON Schema 生成\n registerPluginSchema({\n configKey,\n schemaFactory: () => schema,\n description,\n });\n\n const fileConfig = readConfigSync();\n const rawConfig = fileConfig[configKey] ?? {};\n\n // 使用 zod 验证并填充默认值\n const result = schema.safeParse(rawConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`配置 \"${configKey}\" 验证失败:\\n${errors}`);\n }\n\n return result.data;\n };\n}\n\n/**\n * 创建简单配置加载器(仅从环境变量读取,不读取配置文件)\n * 适用于 CI 等纯环境变量配置\n */\nexport function createEnvConfigLoader<T extends z.ZodObject<z.ZodRawShape>>(\n options: Omit<ConfigLoaderOptions<T>, \"description\"> & { description?: string },\n) {\n const { configKey, schemaFactory, description } = options;\n\n return (): z.infer<T> => {\n const schema = schemaFactory();\n // 注册 schema(如果有描述)\n if (description) {\n registerPluginSchema({\n configKey,\n schemaFactory: () => schema,\n description,\n });\n }\n // 直接使用空对象,让 schema 的 default 值生效\n const result = schema.safeParse({});\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`配置 \"${configKey}\" 验证失败:\\n${errors}`);\n }\n\n return result.data;\n };\n}\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\nimport { detectProvider } from \"../shared/git-provider/detect-provider\";\n\n/** 从环境自动检测的默认值 */\nconst detected = detectProvider();\n\n/** Git Provider 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** Git Provider 类型(自动检测或手动指定) */\n provider: z\n .enum([\"gitea\", \"github\", \"gitlab\"])\n .default(detected.provider)\n .describe(\"Git Provider 类型 (github | gitea | gitlab),未指定时自动检测\"),\n /** Git Provider 服务器 URL */\n serverUrl: z.string().default(detected.serverUrl).describe(\"Git Provider 服务器 URL\"),\n /** Git Provider API Token */\n token: z.string().default(detected.token).describe(\"Git Provider API Token\"),\n });\n\n/** Git Provider 配置类型 */\nexport type GitProviderConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const gitProviderConfig = createConfigLoader({\n configKey: \"gitProvider\",\n schemaFactory,\n description: \"Git Provider 服务配置\",\n});\n","import { z } from \"zod\";\nimport { createEnvConfigLoader } from \"./config-loader\";\n\n/** CI 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** 仓库名称 (owner/repo 格式) */\n repository: z\n .string()\n .default(process.env.GITHUB_REPOSITORY || \"\")\n .describe(\"仓库名称 (owner/repo 格式)\"),\n /** 当前分支名称 */\n refName: z\n .string()\n .default(process.env.GITHUB_REF_NAME || \"\")\n .describe(\"当前分支名称\"),\n actor: z\n .string()\n .default(process.env.GITHUB_ACTOR || \"\")\n .describe(\"当前操作者\"),\n });\n\n/** CI 配置类型 */\nexport type CiConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const ciConfig = createEnvConfigLoader({\n configKey: \"ci\",\n schemaFactory,\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\nconst schemaFactory = () => {\n /** Claude Code 适配器配置 Schema */\n const ClaudeCodeConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.CLAUDE_CODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n authToken: z\n .string()\n .default(process.env.CLAUDE_CODE_AUTH_TOKEN || \"\")\n .describe(\"认证令牌\"),\n model: z\n .string()\n .default(process.env.CLAUDE_CODE_MODEL || \"claude-sonnet-4-5\")\n .describe(\"模型名称\"),\n hasCompletedOnboarding: z.boolean().optional().describe(\"是否已完成 Claude Code 引导流程\"),\n });\n\n /** OpenAI 适配器配置 Schema */\n const OpenAIConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.OPENAI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENAI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.OPENAI_MODEL || \"gpt-4o\")\n .describe(\"模型名称\"),\n });\n\n /** OpenCode 适配器配置 Schema */\n const OpenCodeConfigSchema = z.object({\n serverUrl: z\n .string()\n .default(process.env.OPENCODE_SERVER_URL || \"http://localhost:4096\")\n .describe(\"服务器 URL\"),\n baseUrl: z\n .string()\n .default(process.env.OPENCODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENCODE_API_KEY || \"\")\n .describe(\"API Key\"),\n providerID: z\n .string()\n .default(process.env.OPENCODE_PROVIDER_ID || \"openai\")\n .describe(\"Provider ID\"),\n model: z\n .string()\n .default(process.env.OPENCODE_MODEL || \"\")\n .describe(\"模型名称\"),\n });\n\n /** Gemini 适配器配置 Schema */\n const GeminiConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.GEMINI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.GEMINI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.GEMINI_MODEL || \"\")\n .describe(\"模型名称\"),\n });\n\n /** LLM 配置 Schema */\n const LlmConfigSchema = z.object({\n claudeCode: z\n .preprocess((v) => v ?? {}, ClaudeCodeConfigSchema)\n .describe(\"Claude Code 适配器配置\"),\n openai: z.preprocess((v) => v ?? {}, OpenAIConfigSchema).describe(\"OpenAI 适配器配置\"),\n openCode: z.preprocess((v) => v ?? {}, OpenCodeConfigSchema).describe(\"OpenCode 适配器配置\"),\n gemini: z.preprocess((v) => v ?? {}, GeminiConfigSchema).describe(\"Gemini 适配器配置\"),\n });\n\n return LlmConfigSchema;\n};\n\n/** LLM 系统配置类型 */\nexport type LlmConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\n/** Claude Code 适配器配置类型 */\nexport type ClaudeCodeConfig = z.infer<LlmConfig[\"claudeCode\"]>;\n\n/** OpenAI 适配器配置类型 */\nexport type OpenAIConfig = z.infer<LlmConfig[\"openai\"]>;\n\n/** OpenCode 适配器配置类型 */\nexport type OpenCodeConfig = z.infer<LlmConfig[\"openCode\"]>;\n\n/** Gemini 适配器配置类型 */\nexport type GeminiConfig = z.infer<LlmConfig[\"gemini\"]>;\n\nexport const llmConfig = createConfigLoader({\n configKey: \"llm\",\n schemaFactory,\n description: \"LLM 服务配置\",\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\nconst schemaFactory = () =>\n z.object({\n /** 飞书应用 ID */\n appId: z\n .string()\n .default(process.env.FEISHU_APP_ID || \"\")\n .describe(\"飞书应用 ID\"),\n /** 飞书应用密钥 */\n appSecret: z\n .string()\n .default(process.env.FEISHU_APP_SECRET || \"\")\n .describe(\"飞书应用密钥\"),\n /** 应用类型:自建应用或商店应用 */\n appType: z\n .enum([\"self_build\", \"store\"])\n .default((process.env.FEISHU_APP_TYPE as \"self_build\" | \"store\") || \"self_build\")\n .describe(\"应用类型\"),\n /** 域名:飞书或 Lark */\n domain: z\n .enum([\"feishu\", \"lark\"])\n .default((process.env.FEISHU_DOMAIN as \"feishu\" | \"lark\") || \"feishu\")\n .describe(\"域名\"),\n });\n\n/** 飞书配置类型 */\nexport type FeishuConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const feishuConfig = createConfigLoader({\n configKey: \"feishu\",\n schemaFactory,\n description: \"飞书 SDK 配置\",\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\n/** Storage 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** 适配器类型:memory 或 file */\n adapter: z\n .enum([\"memory\", \"file\"])\n .default((process.env.STORAGE_ADAPTER as \"memory\" | \"file\") || \"memory\")\n .describe(\"适配器类型\"),\n /** 文件适配器的存储路径(仅 file 适配器需要) */\n filePath: z.string().optional().describe(\"文件存储路径\"),\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl: z\n .number()\n .default(process.env.STORAGE_DEFAULT_TTL ? parseInt(process.env.STORAGE_DEFAULT_TTL, 10) : 0)\n .describe(\"默认过期时间(毫秒)\"),\n /** 最大 key 数量,0 表示不限制 */\n maxKeys: z\n .number()\n .default(process.env.STORAGE_MAX_KEYS ? parseInt(process.env.STORAGE_MAX_KEYS, 10) : 0)\n .describe(\"最大 key 数量\"),\n });\n\n/** Storage 配置类型 */\nexport type StorageConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const storageConfig = createConfigLoader({\n configKey: \"storage\",\n schemaFactory,\n description: \"存储服务配置\",\n});\n","/**\n * 系统配置(不包含插件配置)\n */\nexport interface SystemConfig {\n /** 已安装的技能包注册表 */\n dependencies?: Record<string, string>;\n /** 支持的编辑器列表 */\n support?: string[];\n}\n\n/**\n * 插件配置注册信息\n */\nexport interface PluginConfigRegistry {\n /** 插件名称 */\n name: string;\n /** 配置 key */\n configKey?: string;\n /** 依赖的其他插件配置 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数 */\n configSchema?: () => unknown;\n}\n\n/** 全局插件配置注册表(使用 global 确保跨模块共享) */\nconst PLUGIN_REGISTRY_KEY = Symbol.for(\"spaceflow.pluginRegistry\");\nconst globalAny = global as any;\nif (!globalAny[PLUGIN_REGISTRY_KEY]) {\n globalAny[PLUGIN_REGISTRY_KEY] = new Map<string, PluginConfigRegistry>();\n}\nconst pluginRegistry: Map<string, PluginConfigRegistry> = globalAny[PLUGIN_REGISTRY_KEY];\n\n/**\n * 注册插件配置(由插件加载器调用)\n */\nexport function registerPluginConfig(registry: PluginConfigRegistry): void {\n if (registry.configKey) {\n pluginRegistry.set(registry.configKey, registry);\n }\n}\n\n/**\n * 获取已注册的插件配置\n */\nexport function getRegisteredPluginConfig(configKey: string): PluginConfigRegistry | undefined {\n return pluginRegistry.get(configKey);\n}\n\n/**\n * 配置读取服务\n * 提供三种配置读取方式:\n * 1. getPluginConfig - 读取指定插件的配置\n * 2. getOtherPluginConfig - 读取其他插件的配置(需要在 metadata 中声明依赖)\n * 3. getSystemConfig - 读取系统配置\n */\nexport class ConfigReaderService {\n constructor() {}\n\n /**\n * 读取插件的配置\n * 使用 schema 验证并合并默认值\n * @param configKey 插件的配置 key\n * @returns 验证后的插件配置\n */\n getPluginConfig<T>(configKey: string): T {\n const rawConfig = (global as any).spaceflowConfig || {};\n const userConfig = rawConfig[configKey] ?? {};\n\n // 从注册表获取 schema 工厂函数\n const registry = pluginRegistry.get(configKey);\n const schemaFactory = registry?.configSchema;\n\n if (!schemaFactory || typeof schemaFactory !== \"function\") {\n return userConfig as T;\n }\n\n // 调用工厂函数获取 schema\n const schema = schemaFactory();\n if (!schema || typeof (schema as any).parse !== \"function\") {\n return userConfig as T;\n }\n\n // 使用 schema.parse() 验证并填充默认值\n try {\n return (schema as any).parse(userConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${configKey}\" 验证失败:`, error);\n return userConfig as T;\n }\n }\n\n /**\n * 读取其他插件的配置\n * 必须在插件的 metadata.configDependencies 中声明依赖\n * @param fromConfigKey 当前插件的配置 key\n * @param targetConfigKey 目标插件的配置 key\n * @returns 合并后的插件配置\n */\n getOtherPluginConfig<T>(fromConfigKey: string, targetConfigKey: string): T {\n const fromRegistry = pluginRegistry.get(fromConfigKey);\n if (!fromRegistry) {\n throw new Error(`插件 \"${fromConfigKey}\" 未注册`);\n }\n\n // 检查是否已声明依赖\n const dependencies = fromRegistry.configDependencies ?? [];\n if (!dependencies.includes(targetConfigKey)) {\n throw new Error(\n `插件 \"${fromRegistry.name}\" 未声明对 \"${targetConfigKey}\" 配置的依赖。` +\n `请在插件 metadata 的 configDependencies 中添加 \"${targetConfigKey}\"`,\n );\n }\n\n return this.getPluginConfig<T>(targetConfigKey);\n }\n\n /**\n * 读取系统配置(不包含插件配置)\n * @returns 系统配置\n */\n getSystemConfig(): SystemConfig {\n const rawConfig = (global as any).spaceflowConfig || {};\n return {\n dependencies: rawConfig.dependencies,\n support: rawConfig.support,\n };\n }\n}\n","import type { ZodSchema } from \"zod\";\nimport { readConfigSync } from \"./spaceflow.config\";\nimport type { IConfigReader } from \"../extension-system/types\";\n\n/**\n * 配置读取器\n * 不依赖 NestJS,直接读取配置文件\n */\nexport class ConfigReader implements IConfigReader {\n private config: Record<string, unknown>;\n private schemas = new Map<string, ZodSchema>();\n\n constructor(cwd?: string) {\n this.config = readConfigSync(cwd) as Record<string, unknown>;\n }\n\n /**\n * 获取配置值\n * @param key 配置路径(支持点分隔,如 \"gitProvider.token\")\n */\n get<T>(key: string): T | undefined {\n const parts = key.split(\".\");\n let current: unknown = this.config;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current as T | undefined;\n }\n\n /**\n * 获取插件配置\n * 使用已注册的 schema 验证并填充默认值\n * @param key 插件配置 key\n */\n getPluginConfig<T>(key: string): T | undefined {\n const rawConfig = this.config[key] ?? {};\n const schema = this.schemas.get(key);\n if (!schema) {\n return rawConfig as T;\n }\n try {\n return schema.parse(rawConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${key}\" 验证失败:`, error);\n return rawConfig as T;\n }\n }\n\n /**\n * 注册配置 schema\n * @param key 配置 key\n * @param schema Zod schema\n */\n registerSchema(key: string, schema: ZodSchema): void {\n this.schemas.set(key, schema);\n }\n\n /**\n * 重新加载配置\n * @param cwd 工作目录\n */\n reload(cwd?: string): void {\n this.config = readConfigSync(cwd) as Record<string, unknown>;\n }\n\n /**\n * 获取原始配置对象\n */\n getRawConfig(): Record<string, unknown> {\n return this.config;\n }\n}\n","import { config } from \"dotenv\";\nimport { existsSync } from \"fs\";\n\n/**\n * 加载 .env 文件\n * 按优先级从高到低加载,先加载的变量不会被后加载的覆盖\n * @param paths .env 文件路径列表(按优先级从高到低排列)\n */\nexport function loadEnvFiles(paths: string[]): void {\n for (const envPath of paths) {\n if (existsSync(envPath)) {\n config({ path: envPath, override: false });\n }\n }\n}\n","export * from \"./git-provider.config\";\nexport * from \"./ci.config\";\nexport * from \"./llm.config\";\nexport * from \"./feishu.config\";\nexport * from \"./storage.config\";\nexport * from \"./spaceflow.config\";\nexport * from \"./config-reader.service\";\nexport * from \"./schema-generator.service\";\nexport * from \"./config-loader\";\n\n// 新版配置系统(不依赖 NestJS)\nexport { ConfigReader } from \"./config-reader\";\nexport { loadEnvFiles } from \"./load-env\";\n\nimport { gitProviderConfig } from \"./git-provider.config\";\nimport { ciConfig } from \"./ci.config\";\nimport { llmConfig } from \"./llm.config\";\nimport { feishuConfig } from \"./feishu.config\";\nimport { storageConfig } from \"./storage.config\";\nimport { spaceflowConfig } from \"./spaceflow.config\";\n\n/**\n * 所有配置加载器\n */\nexport const configLoaders = [\n gitProviderConfig,\n ciConfig,\n llmConfig,\n feishuConfig,\n storageConfig,\n spaceflowConfig,\n];\n","// ============ 插件系统 ============\nexport * from \"./extension-system\";\n\n// ============ 基础能力模块 ============\n// Git Provider - 多平台 Git 托管 API 操作(GitHub、Gitea、GitLab)\nexport * from \"./shared/git-provider\";\n\n// Git SDK - Git 命令操作\nexport * from \"./shared/git-sdk\";\n\n// LLM Proxy - 多 LLM 适配器\nexport * from \"./shared/llm-proxy\";\n\n// Feishu SDK - 飞书 API 操作\nexport * from \"./shared/feishu-sdk\";\n\n// Storage - 存储服务\nexport * from \"./shared/storage\";\n\n// Claude Setup - Claude Agent 配置\nexport * from \"./shared/claude-setup\";\n\n// Parallel - 并行执行工具\nexport * from \"./shared/parallel\";\n\n// Output - 输出服务\nexport * from \"./shared/output\";\n\n// Verbose - 日志级别\nexport * from \"./shared/verbose\";\n\n// Editor Config - 编辑器配置\nexport * from \"./shared/editor-config\";\n\n// LLM JsonPut - JSON 结构化输出\nexport * from \"./shared/llm-jsonput\";\n\n// Source Utils - 源类型判断工具\nexport * from \"./shared/source-utils\";\n\n// Package Manager - 包管理器检测\nexport * from \"./shared/package-manager\";\n\n// Spaceflow Dir - .spaceflow 目录管理\nexport * from \"./shared/spaceflow-dir\";\n\n// Rspack Config - Rspack 配置工具\nexport * from \"./shared/rspack-config\";\n\n// MCP - Model Context Protocol 支持\n// 注意:McpServerDefinition 和 McpToolDefinition 已在 extension-system/types.ts 中定义\n// 这里只导出装饰器和工具函数,避免重复导出\nexport {\n MCP_SERVER_METADATA,\n MCP_TOOL_METADATA,\n type JsonSchema,\n dtoToJsonSchema,\n type McpToolMetadata,\n McpServer,\n McpTool,\n isMcpServer,\n getMcpServerMetadata,\n getMcpTools,\n runMcpServer,\n} from \"./shared/mcp\";\n\n// I18n - 国际化\nexport * from \"./shared/i18n\";\n\n// Logger - 全局日志工具\nexport * from \"./shared/logger\";\n\n// ============ 配置相关 ============\nexport * from \"./config\";\n\n// ============ Zod 重导出 ============\nexport { z } from \"zod\";\n"],"names":["SPACEFLOW_DIR","PACKAGE_JSON","resolveSpaceflowConfig","config","packageName","packagePath","join","require","Object","name","exportConfig","defineExtension","definition","defineMcpServer","GIT_PROVIDER_MODULE_OPTIONS","REVIEW_STATE","DIFF_SIDE","detectProvider","env","process","explicit","isValidProvider","buildResult","value","provider","source","serverUrl","resolveServerUrl","token","resolveToken","GITHUB_HOSTS","Set","GITLAB_HOSTS","parseRepoUrl","url","trimmed","parseSshUrl","parseGitSshUrl","parseHttpUrl","parsed","URL","hostname","segments","Boolean","owner","repo","isGithub","isGithubHost","isGitlab","isGitlabHost","detectProviderForHost","ref","path","refType","match","host","pathPart","detected","GIT_STATUS_MAP","mapGitStatus","status","parseChangedLinesFromPatch","patch","changedLines","lines","currentLine","line","hunkMatch","parseInt","parseHunksFromPatch","hunks","calculateNewLineNumber","oldLine","offset","hunk","oldEnd","lineOffsetInHunk","calculateLineOffsets","oldLines","result","Map","parseDiffText","diffText","files","fileDiffs","fileDiff","headerMatch","filename","patchStart","execSync","GiteaAdapter","options","Error","method","body","headers","response","fetch","JSON","undefined","errorText","branch","encodeURIComponent","protections","existing","p","pushWhitelistUsernames","hasWhitelist","protectionOptions","listResult","ruleName","console","error","index","state","query","allPRs","page","limit","params","URLSearchParams","String","prs","allCommits","commits","needsPatch","f","diffFiles","patchMap","file","sha","baseSha","headSha","filepath","encodedPath","item","commentId","reviewId","teamId","GithubAdapter","variables","graphqlUrl","json","rules","rule","branchName","results","pr","perPage","c","allFiles","commit","Buffer","r","comments","resolvedMap","comment","u","data","commitObj","head","base","user","reviewers","teams","t","author","ghAuthor","ghCommitter","labels","assignees","milestone","l","a","prNumber","threads","thread","firstComment","QUERY","requiredReviews","event","eventMap","sort","sortMap","GitlabAdapter","project","namespace","pushLevel","glState","mr","allMRs","d","diffs","oldPath","newPath","diff","n","_owner","_repo","_commentId","_body","note","_reviewId","position","pushAccess","additions","deletions","stateMap","GitProviderService","spawn","GitSdkService","args","opts","Promise","resolve","reject","child","stdout","stderr","code","err","remoteUrl","baseRef","headRef","resolvedBase","resolvedHead","message","authorName","authorEmail","date","output","LLM_PROXY_CONFIG","Symbol","LLM_ADAPTER","LOG_LEVEL_PRIORITY","VERBOSE_TO_LOG_LEVEL","toLogLevel","level","normalizeVerbose","verbose","shouldLog","requiredLevel","parseVerbose","val","isNaN","readFile","writeFile","mkdir","copyFile","unlink","homedir","ClaudeSetupService","llmConfig","claudeDir","paths","e","fn","settingsPath","claudeJsonPath","claudeCode","existingSettings","content","mergedSettings","claudeJson","ClaudeCodeAdapter","messages","claudeConf","model","systemPrompt","userPrompt","handleUncaughtError","spawnEnv","spawnClaudeCodeProcess","spawnOptions","queryOptions","finalContent","structuredOutput","Array","block","systemMessage","m","userMessages","OpenAI","OpenAIAdapter","openaiConf","client","stream","fullContent","chunk","delta","createOpencode","OpenCodeAdapter","openCodeConf","providerID","configModel","opencode","port","Math","cleanup","customProviderID","session","Date","sessionId","modelID","part","partType","text","toolPart","agentPart","subtaskPart","stepPart","reasoningPart","randomUUID","LlmSessionImpl","adapter","userMessage","mergedOptions","assistantMessage","prompt","LlmProxyService","claudeCodeAdapter","openaiAdapter","openCodeAdapter","adapterType","type","jsonSchema","systemMsg","msg","available","createStreamLoggerState","logStreamEvent","tokens","FEISHU_CARD_ACTION_TRIGGER","EventEmitter","lark","FeishuSdkService","eventName","listener","done","userId","userIdType","departmentIdType","userIds","FeishuCardService","feishuSdkService","_eventHook","card","receiveId","receiveIdType","uuid","messageId","FEISHU_MODULE_OPTIONS","StorageService","clearInterval","setInterval","now","allKeys","cleaned","key","ttl","effectiveTtl","exists","maxKeys","currentSize","sizeAfterCleanup","keyWithExpire","Infinity","b","toEvict","i","pattern","validKeys","prefix","keysToDelete","deleted","MemoryAdapter","regexPattern","regex","RegExp","fs","FileAdapter","filePath","clearTimeout","setTimeout","dir","ParallelExecutor","tasks","total","completed","shouldStop","executeTask","task","lastError","attempt","pending","taskQueue","promise","taskIdOrder","items","getId","_","ms","parallel","OUTPUT_MARKER_START","OUTPUT_MARKER_END","OutputService","values","outputWithCache","EDITOR_DIR_MAPPING","DEFAULT_EDITOR","getEditorDirName","editor","jsonrepair","JSON_FORMAT_INSTRUCTION","LlmJsonPut","schema","generateExample","s","obj","example","input","repaired","retryCount","isGitUrl","isLocalPath","getSourceType","normalizeSource","extractNpmPackageName","slashIndex","afterSlash","atIndex","extractName","parts","lastPart","buildGitPackageSpec","spec","sshUrl","existsSync","getPackageManager","cwd","workDir","detectPackageManager","isPnpmWorkspace","addSpaceflowToDevDependencies","readFileSync","writeFileSync","packageJsonPath","pkg","mkdirSync","getSpaceflowDir","isGlobal","ensureSpaceflowDir","spaceflowDir","gitignorePath","gitignoreContent","getSpaceflowCoreVersion","cliEntryPath","cliDir","cliPkgPath","cliPkg","coreVersion","ensureSpaceflowPackageJson","packageJson","ensureEditorGitignore","editorRoot","itemType","itemName","ignoreEntry","DEFAULT_EXTERNALS","DEFAULT_TS_RULE","createPluginConfig","coreOptions","pluginPath","entry","outDir","minimize","customExternals","customAlias","customRules","coreRoot","mergedExternals","alias","createMultiEntryPluginConfig","MCP_SERVER_METADATA","MCP_TOOL_METADATA","SWAGGER_API_MODEL_PROPERTIES","SWAGGER_API_MODEL_PROPERTIES_ARRAY","dtoToJsonSchema","dtoClass","prototype","propertyKeys","Reflect","properties","required","meta","typeMap","schemaType","reflectedType","prop","McpServer","target","McpTool","propertyKey","_descriptor","constructor","resolvedDefinition","isMcpServer","getMcpServerMetadata","getMcpTools","runMcpServer","service","serverInfo","tools","StdioServerTransport","server","tool","jsonSchemaToZod","z","shape","requiredFields","field","transport","platform","DEFAULT_LOCALE","CONFIG_FILE_NAME","normalizeLocale","raw","langOnly","lang","readLangFromConfig","configPath","readEnvLocale","readMacOSLocale","readWindowsLocale","readOSLocale","os","detectLocale","envLang","i18nextModule","i18next","zhCN","en","DEFAULT_NS","initialized","initI18n","lng","resetI18n","addLocaleResources","ns","resources","translations","timestamp","PlainRenderer","label","tag","current","pct","suffix","skipped","skipReason","control","reason","ctx","errMsg","_prefix","detectMode","tuiRendererCache","loadTuiRenderer","TuiRenderer","resolveMode","mode","Logger","schemaRegistry","registerPluginSchema","registry","getRegisteredSchemas","SchemaGeneratorService","outputPath","configKey","fullSchema","newContent","stringify","DEFAULT_SUPPORT_EDITOR","RC_FILE_NAME","SpaceflowCoreConfigSchema","NO_MERGE_FIELDS","deepMerge","objects","getConfigPath","getConfigPaths","ENV_FILE_NAME","getEnvFilePaths","readSingleConfigSync","readConfigSync","configPaths","configs","writeConfigSync","getSupportedEditors","getDependencies","findConfigFileWithField","candidates","updateDependency","targetFile","dependencies","removeDependency","spaceflowConfig","loadSpaceflowConfig","fileConfig","errors","createConfigLoader","schemaFactory","description","rawConfig","createEnvConfigLoader","gitProviderConfig","ciConfig","ClaudeCodeConfigSchema","OpenAIConfigSchema","OpenCodeConfigSchema","GeminiConfigSchema","LlmConfigSchema","v","feishuConfig","storageConfig","PLUGIN_REGISTRY_KEY","globalAny","global","pluginRegistry","registerPluginConfig","getRegisteredPluginConfig","ConfigReaderService","userConfig","fromConfigKey","targetConfigKey","fromRegistry","ConfigReader","loadEnvFiles","envPath","configLoaders"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["webpack://@spaceflow/core/webpack/runtime/define_property_getters","webpack://@spaceflow/core/webpack/runtime/ensure_chunk","webpack://@spaceflow/core/webpack/runtime/get javascript chunk filename","webpack://@spaceflow/core/webpack/runtime/has_own_property","webpack://@spaceflow/core/webpack/runtime/public_path","webpack://@spaceflow/core/webpack/runtime/module_chunk_loading","webpack://@spaceflow/core/./src/extension-system/extension.interface.ts","webpack://@spaceflow/core/./src/extension-system/define-extension.ts","webpack://@spaceflow/core/./src/extension-system/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/types.ts","webpack://@spaceflow/core/./src/shared/git-provider/detect-provider.ts","webpack://@spaceflow/core/./src/shared/git-provider/parse-repo-url.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk-diff.utils.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitea.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/github.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/gitlab.adapter.ts","webpack://@spaceflow/core/./src/shared/git-provider/git-provider.service.ts","webpack://@spaceflow/core/./src/shared/git-provider/adapters/index.ts","webpack://@spaceflow/core/./src/shared/git-provider/index.ts","webpack://@spaceflow/core/./src/shared/git-sdk/git-sdk.service.ts","webpack://@spaceflow/core/./src/shared/git-sdk/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/config.interface.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/interfaces/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/llm-adapter.interface.ts","webpack://@spaceflow/core/./src/shared/verbose/index.ts","webpack://@spaceflow/core/./src/shared/claude-setup/claude-setup.service.ts","webpack://@spaceflow/core/./src/shared/claude-setup/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/claude-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/openai.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/open-code.adapter.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/adapters/index.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-session.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/llm-proxy.service.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/stream-logger.ts","webpack://@spaceflow/core/./src/shared/llm-proxy/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/card-action.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/feishu-sdk.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/fieshu-card.service.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/module.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/types/index.ts","webpack://@spaceflow/core/./src/shared/feishu-sdk/index.ts","webpack://@spaceflow/core/./src/shared/storage/storage.service.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/memory.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/file.adapter.ts","webpack://@spaceflow/core/./src/shared/storage/adapters/index.ts","webpack://@spaceflow/core/./src/shared/storage/index.ts","webpack://@spaceflow/core/./src/shared/parallel/parallel-executor.ts","webpack://@spaceflow/core/./src/shared/parallel/index.ts","webpack://@spaceflow/core/./src/shared/output/output.service.ts","webpack://@spaceflow/core/./src/shared/output/index.ts","webpack://@spaceflow/core/./src/shared/editor-config/index.ts","webpack://@spaceflow/core/./src/shared/llm-jsonput/index.ts","webpack://@spaceflow/core/./src/shared/source-utils/index.ts","webpack://@spaceflow/core/./src/shared/package-manager/index.ts","webpack://@spaceflow/core/./src/shared/spaceflow-dir/index.ts","webpack://@spaceflow/core/./src/shared/rspack-config/rspack-config.ts","webpack://@spaceflow/core/./src/shared/rspack-config/index.ts","webpack://@spaceflow/core/./src/shared/mcp/index.ts","webpack://@spaceflow/core/./src/shared/i18n/locale-detect.ts","webpack://@spaceflow/core/./src/shared/i18n/i18n.ts","webpack://@spaceflow/core/./src/shared/i18n/index.ts","webpack://@spaceflow/core/./src/shared/logger/renderers/plain.renderer.ts","webpack://@spaceflow/core/./src/shared/logger/logger.ts","webpack://@spaceflow/core/./src/shared/logger/index.ts","webpack://@spaceflow/core/./src/config/schema-generator.service.ts","webpack://@spaceflow/core/./src/config/spaceflow.config.ts","webpack://@spaceflow/core/./src/config/config-loader.ts","webpack://@spaceflow/core/./src/config/git-provider.config.ts","webpack://@spaceflow/core/./src/config/ci.config.ts","webpack://@spaceflow/core/./src/config/llm.config.ts","webpack://@spaceflow/core/./src/config/feishu.config.ts","webpack://@spaceflow/core/./src/config/storage.config.ts","webpack://@spaceflow/core/./src/config/config-reader.service.ts","webpack://@spaceflow/core/./src/config/config-reader.ts","webpack://@spaceflow/core/./src/config/load-env.ts","webpack://@spaceflow/core/./src/config/index.ts","webpack://@spaceflow/core/./src/index.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".js\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.p = \"\";","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"410\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","/** .spaceflow 目录名 */\nexport const SPACEFLOW_DIR = \".spaceflow\";\n\n/** package.json 文件名 */\nexport const PACKAGE_JSON = \"package.json\";\n\n/**\n * Extension 元数据\n */\nexport interface SpaceflowExtensionMetadata {\n /** Extension 名称 */\n name: string;\n /** 提供的命令列表 */\n commands: string[];\n /** 对应 spaceflow.json 中的配置 key(可选) */\n configKey?: string;\n /** 依赖的其他 Extension 配置 key 列表,读取其他 Extension 配置前必须在此声明 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数,返回 zod schema,用于验证配置和生成 JSON Schema */\n configSchema?: () => unknown;\n /** Extension 版本 */\n version?: string;\n /** Extension 描述 */\n description?: string;\n}\n\n/**\n * .spaceflow/package.json 中的 dependencies\n */\nexport type ExtensionDependencies = Record<string, string>;\n\n/**\n * Spaceflow 导出类型\n * - flow: 子命令(默认),需要构建,注册为 CLI 子命令\n * - command: 编辑器命令,复制到 .claude/commands/ 等目录\n * - skill: 技能包,复制到 .claude/skills/ 等目录\n * - mcp: MCP Server,注册到编辑器的 mcp.json 配置\n */\nexport type SpaceflowExportType = \"flow\" | \"command\" | \"skill\" | \"mcp\";\n\n/**\n * MCP Server 配置\n */\nexport interface McpServerConfig {\n /** 启动命令,如 \"node\", \"python\" */\n command: string;\n /** 启动参数,如 [\"dist/index.js\"] */\n args?: string[];\n /** 需要的环境变量名列表,安装时会提示用户配置 */\n env?: string[];\n}\n\n/**\n * 单个导出项配置\n */\nexport interface SpaceflowExportConfig {\n /** 导出类型,默认为 flow */\n type?: SpaceflowExportType;\n /** 入口路径,相对于包根目录 */\n entry: string;\n /** 描述(可选) */\n description?: string;\n /** MCP Server 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * package.json 中的 spaceflow 配置\n *\n * 完整格式:\n * ```json\n * \"spaceflow\": {\n * \"exports\": {\n * \"review\": { \"type\": \"flow\", \"entry\": \".\" },\n * \"review-rules\": { \"type\": \"skill\", \"entry\": \"./skills\" },\n * \"my-mcp\": { \"type\": \"mcp\", \"entry\": \".\", \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] } }\n * }\n * }\n * ```\n *\n * 简化格式(单导出):\n * ```json\n * \"spaceflow\": {\n * \"type\": \"mcp\",\n * \"entry\": \".\",\n * \"mcp\": { \"command\": \"node\", \"args\": [\"dist/index.js\"] }\n * }\n * ```\n */\nexport interface SpaceflowPackageConfig {\n /** 多导出配置 */\n exports?: Record<string, SpaceflowExportConfig>;\n /** 简化格式:导出类型 */\n type?: SpaceflowExportType;\n /** 简化格式:入口路径 */\n entry?: string;\n /** 简化格式:描述 */\n description?: string;\n /** 简化格式:MCP 配置 */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析后的导出项\n */\nexport interface ResolvedSpaceflowExport {\n /** 导出名称 */\n name: string;\n /** 导出类型 */\n type: SpaceflowExportType;\n /** 入口路径(绝对路径) */\n entry: string;\n /** 描述 */\n description?: string;\n /** MCP 配置(仅 type 为 mcp 时有效) */\n mcp?: McpServerConfig;\n}\n\n/**\n * 解析 spaceflow 配置,返回所有导出项\n */\nexport function resolveSpaceflowConfig(\n config: SpaceflowPackageConfig | undefined,\n packageName: string,\n packagePath: string,\n): ResolvedSpaceflowExport[] {\n const { join } = require(\"path\");\n\n if (!config) {\n return [];\n }\n\n // 完整格式:有 exports 字段\n if (config.exports) {\n return Object.entries(config.exports).map(([name, exportConfig]) => ({\n name,\n type: exportConfig.type || \"flow\",\n entry: join(packagePath, exportConfig.entry),\n description: exportConfig.description,\n mcp: exportConfig.mcp,\n }));\n }\n\n // 简化格式:直接有 type/entry 字段\n if (config.entry) {\n return [\n {\n name: packageName,\n type: config.type || \"flow\",\n entry: join(packagePath, config.entry),\n description: config.description,\n mcp: config.mcp,\n },\n ];\n }\n\n return [];\n}\n","import type { ExtensionDefinition, McpServerDefinition } from \"./types\";\n\n/**\n * 定义扩展\n * 这是一个类型安全的工厂函数,用于创建扩展定义\n * @param definition 扩展定义\n * @returns 扩展定义(原样返回,仅用于类型推断)\n */\nexport function defineExtension(\n definition: ExtensionDefinition,\n): ExtensionDefinition {\n return definition;\n}\n\n/**\n * 定义 MCP 服务器\n * 这是一个类型安全的工厂函数,用于创建 MCP 服务器定义\n * @param definition MCP 服务器定义\n * @returns MCP 服务器定义(原样返回,仅用于类型推断)\n */\nexport function defineMcpServer(\n definition: McpServerDefinition,\n): McpServerDefinition {\n return definition;\n}\n","// 旧版接口(保留兼容,后续移除)\nexport * from \"./extension.interface\";\n\n// 新版接口\nexport * from \"./types\";\nexport * from \"./define-extension\";\n","/**\n * Git Provider 通用类型定义\n * 适用于 Gitea、GitHub 等多种 Git 托管平台\n */\n\n/** Git Provider 平台类型 */\nexport type GitProviderType = \"gitea\" | \"github\" | \"gitlab\";\n\n/** Git Provider 模块配置选项 */\nexport interface GitProviderModuleOptions {\n /** Git Provider 平台类型 */\n provider: GitProviderType;\n /** 服务器 URL */\n baseUrl: string;\n /** API Token */\n token: string;\n}\n\n/** Git Provider 模块异步配置选项 */\nexport interface GitProviderModuleAsyncOptions {\n useFactory: (...args: unknown[]) => Promise<GitProviderModuleOptions> | GitProviderModuleOptions;\n inject?: any[];\n}\n\n/** 注入令牌 */\nexport const GIT_PROVIDER_MODULE_OPTIONS = \"GIT_PROVIDER_MODULE_OPTIONS\";\n\n/** 分支保护规则 */\nexport interface BranchProtection {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n branch_name?: string;\n created_at?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n rule_name?: string;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n updated_at?: string;\n}\n\n/** 创建分支保护规则选项 */\nexport interface CreateBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n /** 分支名称或通配符规则 */\n branch_name?: string;\n /** 规则名称 */\n rule_name?: string;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 编辑分支保护规则选项 */\nexport interface EditBranchProtectionOption {\n approvals_whitelist_teams?: string[];\n approvals_whitelist_username?: string[];\n block_admin_merge_override?: boolean;\n block_on_official_review_requests?: boolean;\n block_on_outdated_branch?: boolean;\n block_on_rejected_reviews?: boolean;\n dismiss_stale_approvals?: boolean;\n enable_approvals_whitelist?: boolean;\n enable_force_push?: boolean;\n enable_force_push_allowlist?: boolean;\n enable_merge_whitelist?: boolean;\n /** 是否允许推送 */\n enable_push?: boolean;\n enable_push_whitelist?: boolean;\n enable_status_check?: boolean;\n force_push_allowlist_deploy_keys?: boolean;\n force_push_allowlist_teams?: string[];\n force_push_allowlist_usernames?: string[];\n ignore_stale_approvals?: boolean;\n merge_whitelist_teams?: string[];\n merge_whitelist_usernames?: string[];\n priority?: number;\n protected_file_patterns?: string;\n push_whitelist_deploy_keys?: boolean;\n push_whitelist_teams?: string[];\n push_whitelist_usernames?: string[];\n require_signed_commits?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n unprotected_file_patterns?: string;\n}\n\n/** 分支信息 */\nexport interface Branch {\n commit?: {\n id?: string;\n message?: string;\n timestamp?: string;\n };\n effective_branch_protection_name?: string;\n enable_status_check?: boolean;\n name?: string;\n protected?: boolean;\n required_approvals?: number;\n status_check_contexts?: string[];\n user_can_merge?: boolean;\n user_can_push?: boolean;\n}\n\n/** 仓库信息 */\nexport interface Repository {\n id?: number;\n owner?: {\n id?: number;\n login?: string;\n full_name?: string;\n };\n name?: string;\n full_name?: string;\n default_branch?: string;\n}\n\n/** Pull Request 信息 */\nexport interface PullRequest {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n head?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n base?: {\n ref?: string;\n sha?: string;\n repo?: Repository;\n };\n user?: {\n id?: number;\n login?: string;\n };\n /** PR 指定的评审人(个人用户) */\n requested_reviewers?: Array<{\n id?: number;\n login?: string;\n }>;\n /** PR 指定的评审团队 */\n requested_reviewers_teams?: Array<{\n id?: number;\n name?: string;\n /** 团队成员 */\n members?: Array<{\n id?: number;\n login?: string;\n }>;\n }>;\n created_at?: string;\n updated_at?: string;\n merged_at?: string;\n merge_base?: string;\n}\n\n/** 编辑 PR 的选项 */\nexport interface EditPullRequestOption {\n title?: string;\n body?: string;\n state?: \"open\" | \"closed\";\n base?: string;\n}\n\n/** PR Commit 信息 */\nexport interface PullRequestCommit {\n sha?: string;\n commit?: {\n message?: string;\n author?: {\n name?: string;\n email?: string;\n date?: string;\n };\n };\n author?: {\n id?: number;\n login?: string;\n };\n committer?: {\n id?: number;\n login?: string;\n };\n}\n\n/** 文件变更信息 */\nexport interface ChangedFile {\n filename?: string;\n status?: string;\n additions?: number;\n deletions?: number;\n changes?: number;\n patch?: string;\n raw_url?: string;\n contents_url?: string;\n}\n\n/** Commit 详细信息(包含文件变更) */\nexport interface CommitInfo extends PullRequestCommit {\n files?: ChangedFile[];\n}\n\n/** Issue/PR 评论 */\nexport interface IssueComment {\n id?: number;\n body?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n}\n\n/** 创建 Issue 评论选项 */\nexport interface CreateIssueCommentOption {\n body: string;\n}\n\n/** 创建 Issue 的选项 */\nexport interface CreateIssueOption {\n /** Issue 标题 */\n title: string;\n /** Issue 内容 */\n body?: string;\n /** 指派人用户名列表 */\n assignees?: string[];\n /** 标签 ID 列表 */\n labels?: number[];\n /** 里程碑 ID */\n milestone?: number;\n /** 截止日期 */\n due_date?: string;\n}\n\n/** Issue 响应 */\nexport interface Issue {\n id?: number;\n number?: number;\n title?: string;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n labels?: Array<{\n id?: number;\n name?: string;\n color?: string;\n }>;\n assignees?: Array<{\n id?: number;\n login?: string;\n }>;\n milestone?: {\n id?: number;\n title?: string;\n };\n created_at?: string;\n updated_at?: string;\n closed_at?: string;\n html_url?: string;\n}\n\n/** PR Review 事件类型 */\nexport type ReviewStateType = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" | \"PENDING\";\n\n/** PR Review 事件常量 */\nexport const REVIEW_STATE = {\n APPROVE: \"APPROVE\",\n REQUEST_CHANGES: \"REQUEST_CHANGES\",\n COMMENT: \"COMMENT\",\n PENDING: \"PENDING\",\n} as const;\n\n/** PR Review 行级评论 Diff 方向 */\nexport const DIFF_SIDE = {\n RIGHT: \"RIGHT\",\n LEFT: \"LEFT\",\n} as const;\n\n/** PR Review 行级评论 */\nexport interface CreatePullReviewComment {\n /** 文件路径 */\n path: string;\n /** 评论内容 */\n body: string;\n /** 旧文件行号(删除行),新增行设为 0 */\n old_position?: number;\n /** 新文件行号(新增/修改行),删除行设为 0 */\n new_position?: number;\n}\n\n/** 创建 PR Review 的选项 */\nexport interface CreatePullReviewOption {\n /** Review 事件类型 */\n event?: ReviewStateType;\n /** Review 主体评论 */\n body?: string;\n /** 行级评论列表 */\n comments?: CreatePullReviewComment[];\n /** 提交 SHA(可选) */\n commit_id?: string;\n}\n\n/** PR Review 响应 */\nexport interface PullReview {\n id?: number;\n body?: string;\n state?: string;\n user?: {\n id?: number;\n login?: string;\n };\n created_at?: string;\n updated_at?: string;\n commit_id?: string;\n}\n\n/** PR Review 行级评论响应 */\nexport interface PullReviewComment {\n id?: number;\n body?: string;\n path?: string;\n position?: number;\n original_position?: number;\n commit_id?: string;\n original_commit_id?: string;\n diff_hunk?: string;\n pull_request_review_id?: number;\n user?: {\n id?: number;\n login?: string;\n };\n /** 解决者,如果不为 null 表示评论已被标记为已解决 */\n resolver?: {\n id?: number;\n login?: string;\n } | null;\n created_at?: string;\n updated_at?: string;\n html_url?: string;\n}\n\n/** PR Review Thread 已解决信息 */\nexport interface ResolvedThread {\n /** 文件路径 */\n path?: string;\n /** 行号(新文件中的行号) */\n line?: number;\n /** 解决者 */\n resolvedBy?: {\n id?: number;\n login?: string;\n } | null;\n}\n\n/** 用户信息 */\nexport interface User {\n id?: number;\n login?: string;\n full_name?: string;\n email?: string;\n avatar_url?: string;\n}\n\n/** 仓库目录/文件条目 */\nexport interface RepositoryContent {\n /** 文件名 */\n name: string;\n /** 文件路径 */\n path: string;\n /** 类型:file 或 dir */\n type: \"file\" | \"dir\";\n /** 文件大小(字节) */\n size?: number;\n /** 下载 URL */\n download_url?: string;\n}\n\n/** 远程仓库引用(解析自浏览器 URL) */\nexport interface RemoteRepoRef {\n /** 仓库所有者 */\n owner: string;\n /** 仓库名称 */\n repo: string;\n /** 子目录路径(空字符串表示根目录) */\n path: string;\n /** 分支/标签(undefined 表示默认分支) */\n ref?: string;\n /** 来源平台类型 */\n provider: GitProviderType;\n /** 原始服务器 URL(如 https://git.bjxgj.com) */\n serverUrl: string;\n}\n\n/** 评论/Issue 的 Reaction(表情符号反应) */\nexport interface Reaction {\n /** 添加 reaction 的用户 */\n user?: {\n id?: number;\n login?: string;\n };\n /** reaction 内容,如 +1, -1, laugh, hooray, confused, heart, rocket, eyes */\n content?: string;\n /** 创建时间 */\n created_at?: string;\n}\n","import type { GitProviderType } from \"./types\";\n\n/** 环境检测结果 */\nexport interface DetectedProviderInfo {\n /** 检测到的 provider 类型 */\n provider: GitProviderType;\n /** 检测到的服务器 URL */\n serverUrl: string;\n /** 检测到的 API Token */\n token: string;\n /** 检测来源说明 */\n source: string;\n}\n\n/**\n * 从环境变量自动检测 Git Provider 类型和配置\n *\n * 检测优先级:\n * 1. 显式指定 `GIT_PROVIDER_TYPE` 环境变量(最高优先级)\n * 2. 存在 `GITEA_TOKEN` → Gitea\n * 3. 存在 `GITLAB_TOKEN` 或 `CI_JOB_TOKEN`(GitLab CI)→ GitLab\n * 4. 存在 `GITHUB_TOKEN` → GitHub\n * 5. 默认 → GitHub\n */\nexport function detectProvider(\n env: Record<string, string | undefined> = process.env,\n): DetectedProviderInfo {\n const explicit = env.GIT_PROVIDER_TYPE as GitProviderType | undefined;\n if (explicit && isValidProvider(explicit)) {\n return buildResult(explicit, env, \"GIT_PROVIDER_TYPE 环境变量\");\n }\n if (env.GITEA_TOKEN) {\n return buildResult(\"gitea\", env, \"检测到 GITEA_TOKEN\");\n }\n if (env.GITLAB_TOKEN || env.CI_JOB_TOKEN) {\n return buildResult(\n \"gitlab\",\n env,\n env.GITLAB_TOKEN ? \"检测到 GITLAB_TOKEN\" : \"检测到 CI_JOB_TOKEN(GitLab CI)\",\n );\n }\n if (env.GITHUB_TOKEN) {\n return buildResult(\"github\", env, \"检测到 GITHUB_TOKEN\");\n }\n return buildResult(\"github\", env, \"默认\");\n}\n\n/** 检查是否为有效的 provider 类型 */\nfunction isValidProvider(value: string): value is GitProviderType {\n return value === \"gitea\" || value === \"github\" || value === \"gitlab\";\n}\n\n/** 根据 provider 类型从环境变量中提取 serverUrl 和 token */\nfunction buildResult(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n source: string,\n): DetectedProviderInfo {\n const serverUrl = resolveServerUrl(provider, env);\n const token = resolveToken(provider, env);\n return { provider, serverUrl, token, source };\n}\n\n/**\n * 解析服务器 URL\n * - 优先使用 GIT_PROVIDER_URL\n * - Gitea: GITEA_SERVER_URL > GITHUB_SERVER_URL\n * - GitHub: GITHUB_API_URL > 默认 https://api.github.com\n * - GitLab: CI_SERVER_URL > GITLAB_URL\n */\nfunction resolveServerUrl(\n provider: GitProviderType,\n env: Record<string, string | undefined>,\n): string {\n if (env.GIT_PROVIDER_URL) {\n return env.GIT_PROVIDER_URL;\n }\n if (provider === \"github\") {\n return env.GITHUB_API_URL || \"https://api.github.com\";\n }\n if (provider === \"gitlab\") {\n return env.CI_SERVER_URL || env.GITLAB_URL || \"https://gitlab.com\";\n }\n // Gitea: 优先 GITEA_SERVER_URL,其次从 GITHUB_SERVER_URL 推导\n if (env.GITEA_SERVER_URL) {\n return env.GITEA_SERVER_URL;\n }\n if (env.GITHUB_SERVER_URL) {\n return env.GITHUB_SERVER_URL;\n }\n return \"\";\n}\n\n/**\n * 解析 API Token\n * - 优先使用 GIT_PROVIDER_TOKEN\n * - Gitea: GITEA_TOKEN > GITHUB_TOKEN\n * - GitHub: GITHUB_TOKEN\n * - GitLab: GITLAB_TOKEN > CI_JOB_TOKEN\n */\nfunction resolveToken(provider: GitProviderType, env: Record<string, string | undefined>): string {\n if (env.GIT_PROVIDER_TOKEN) {\n return env.GIT_PROVIDER_TOKEN;\n }\n if (provider === \"github\") {\n return env.GITHUB_TOKEN || \"\";\n }\n if (provider === \"gitlab\") {\n return env.GITLAB_TOKEN || env.CI_JOB_TOKEN || \"\";\n }\n return env.GITEA_TOKEN || env.GITHUB_TOKEN || \"\";\n}\n","import type { RemoteRepoRef, GitProviderType } from \"./types\";\nimport { detectProvider } from \"./detect-provider\";\n\n/** 已知的 GitHub 域名 */\nconst GITHUB_HOSTS = new Set([\"github.com\", \"www.github.com\"]);\n\n/** 已知的 GitLab 域名 */\nconst GITLAB_HOSTS = new Set([\"gitlab.com\", \"www.gitlab.com\"]);\n\n/**\n * 解析浏览器中复制的仓库 URL 为结构化的仓库引用\n *\n * 支持的 URL 格式:\n * - Gitea 仓库:https://git.example.com/owner/repo\n * - Gitea 目录:https://git.example.com/owner/repo/src/branch/main/path/to/dir\n * - Gitea 标签:https://git.example.com/owner/repo/src/tag/v1.0/path/to/dir\n * - Gitea commit:https://git.example.com/owner/repo/src/commit/abc123/path/to/dir\n * - GitHub 仓库:https://github.com/owner/repo\n * - GitHub 目录:https://github.com/owner/repo/tree/main/path/to/dir\n * - GitLab 仓库:https://gitlab.com/owner/repo\n * - GitLab 目录:https://gitlab.com/owner/repo/-/tree/main/path/to/dir\n * - git+ssh URL:git+ssh://git@host/owner/repo.git\n * - SSH URL:git@host:owner/repo.git\n *\n * @returns 解析后的仓库引用,无法解析时返回 null\n */\nexport function parseRepoUrl(url: string): RemoteRepoRef | null {\n const trimmed = url.trim();\n if (!trimmed) return null;\n // SSH 格式: git@host:owner/repo.git\n if (trimmed.startsWith(\"git@\")) {\n return parseSshUrl(trimmed);\n }\n // git+ssh:// 格式\n if (trimmed.startsWith(\"git+ssh://\")) {\n return parseGitSshUrl(trimmed);\n }\n // HTTP(S) URL\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return parseHttpUrl(trimmed);\n }\n return null;\n}\n\n/** 解析 HTTP(S) URL */\nfunction parseHttpUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const hostname = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `${parsed.protocol}//${parsed.host}`;\n const isGithub = isGithubHost(hostname);\n const isGitlab = isGitlabHost(hostname);\n const provider: GitProviderType = isGithub\n ? \"github\"\n : isGitlab\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n // 仓库根目录(只有 owner/repo)\n if (segments.length === 2) {\n return { owner, repo, path: \"\", provider, serverUrl };\n }\n // GitHub: /owner/repo/tree/branch/path...\n if (isGithub && segments[2] === \"tree\" && segments.length >= 4) {\n const ref = segments[3];\n const path = segments.slice(4).join(\"/\");\n return { owner, repo, path, ref, provider, serverUrl };\n }\n // GitLab: /owner/repo/-/tree/branch/path...\n if (segments[2] === \"-\" && segments[3] === \"tree\" && segments.length >= 5) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: isGitlab ? \"gitlab\" : provider, serverUrl };\n }\n // Gitea: /owner/repo/src/branch/<branch>/path...\n // /owner/repo/src/tag/<tag>/path...\n // /owner/repo/src/commit/<sha>/path...\n if (segments[2] === \"src\" && segments.length >= 4) {\n const refType = segments[3]; // \"branch\", \"tag\", \"commit\"\n if (\n (refType === \"branch\" || refType === \"tag\" || refType === \"commit\") &&\n segments.length >= 5\n ) {\n const ref = segments[4];\n const path = segments.slice(5).join(\"/\");\n return { owner, repo, path, ref, provider: \"gitea\", serverUrl };\n }\n }\n // 无法识别的子路径,当作仓库根目录\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git@host:owner/repo.git 格式 */\nfunction parseSshUrl(url: string): RemoteRepoRef | null {\n const match = url.match(/^git@([^:]+):(.+?)(?:\\.git)?$/);\n if (!match) return null;\n const host = match[1];\n const pathPart = match[2];\n const segments = pathPart.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1];\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 解析 git+ssh://git@host/owner/repo.git 格式 */\nfunction parseGitSshUrl(url: string): RemoteRepoRef | null {\n let parsed: URL;\n try {\n parsed = new URL(url.replace(\"git+ssh://\", \"ssh://\"));\n } catch {\n return null;\n }\n const host = parsed.hostname;\n const segments = parsed.pathname.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/, \"\");\n const serverUrl = `https://${host}`;\n const provider: GitProviderType = isGithubHost(host)\n ? \"github\"\n : isGitlabHost(host)\n ? \"gitlab\"\n : detectProviderForHost(serverUrl);\n return { owner, repo, path: \"\", provider, serverUrl };\n}\n\n/** 判断是否为 GitHub 域名 */\nfunction isGithubHost(hostname: string): boolean {\n return GITHUB_HOSTS.has(hostname) || hostname.endsWith(\".github.com\");\n}\n\n/** 判断是否为 GitLab 域名 */\nfunction isGitlabHost(hostname: string): boolean {\n return GITLAB_HOSTS.has(hostname) || hostname.endsWith(\".gitlab.com\");\n}\n\n/** 根据服务器 URL 检测 provider 类型(非 GitHub/GitLab 默认为 Gitea) */\nfunction detectProviderForHost(serverUrl: string): GitProviderType {\n const detected = detectProvider({ GIT_PROVIDER_URL: serverUrl });\n return detected.provider;\n}\n","import type { GitDiffFile } from \"./git-sdk.types\";\n\nconst GIT_STATUS_MAP: Record<string, string> = {\n A: \"added\",\n M: \"modified\",\n D: \"deleted\",\n R: \"renamed\",\n C: \"copied\",\n};\n\nexport function mapGitStatus(status: string): string {\n return GIT_STATUS_MAP[status] || \"modified\";\n}\n\nexport function parseChangedLinesFromPatch(patch?: string): Set<number> {\n const changedLines = new Set<number>();\n if (!patch) return changedLines;\n\n const lines = patch.split(\"\\n\");\n let currentLine = 0;\n\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n changedLines.add(currentLine);\n currentLine++;\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n // 删除行,不增加 currentLine\n } else if (!line.startsWith(\"\\\\\")) {\n currentLine++;\n }\n }\n\n return changedLines;\n}\n\n/**\n * 表示一个 diff hunk 的行号变更信息\n */\nexport interface DiffHunk {\n oldStart: number;\n oldCount: number;\n newStart: number;\n newCount: number;\n}\n\n/**\n * 从 patch 中解析所有 hunk 信息\n */\nexport function parseHunksFromPatch(patch?: string): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n if (!patch) return hunks;\n\n const lines = patch.split(\"\\n\");\n for (const line of lines) {\n const hunkMatch = line.match(/^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch) {\n hunks.push({\n oldStart: parseInt(hunkMatch[1], 10),\n oldCount: parseInt(hunkMatch[2] ?? \"1\", 10),\n newStart: parseInt(hunkMatch[3], 10),\n newCount: parseInt(hunkMatch[4] ?? \"1\", 10),\n });\n }\n }\n return hunks;\n}\n\n/**\n * 根据 diff hunks 计算旧行号对应的新行号\n * @param oldLine 旧文件中的行号\n * @param hunks diff hunk 列表\n * @returns 新行号,如果该行被删除则返回 null\n */\nexport function calculateNewLineNumber(oldLine: number, hunks: DiffHunk[]): number | null {\n let offset = 0;\n\n for (const hunk of hunks) {\n const oldEnd = hunk.oldStart + hunk.oldCount - 1;\n\n if (oldLine < hunk.oldStart) {\n // 行号在这个 hunk 之前,应用之前累积的偏移\n break;\n }\n\n if (oldLine >= hunk.oldStart && oldLine <= oldEnd) {\n // 行号在这个 hunk 的删除范围内\n // 需要检查这一行是否被删除\n // 简化处理:如果 hunk 有删除(oldCount > 0),且行在范围内,认为可能被修改\n // 返回对应的新位置(基于 hunk 的起始位置)\n const lineOffsetInHunk = oldLine - hunk.oldStart;\n if (lineOffsetInHunk < hunk.newCount) {\n // 行仍然存在(可能被修改)\n return hunk.newStart + lineOffsetInHunk + offset;\n } else {\n // 行被删除\n return null;\n }\n }\n\n // 计算这个 hunk 带来的偏移\n offset += hunk.newCount - hunk.oldCount;\n }\n\n // 行号在所有 hunk 之后,应用总偏移\n return oldLine + offset;\n}\n\n/**\n * 批量计算文件中多个旧行号对应的新行号\n * @param oldLines 旧行号数组\n * @param patch diff patch 文本\n * @returns Map<旧行号, 新行号>,被删除的行不在结果中\n */\nexport function calculateLineOffsets(\n oldLines: number[],\n patch?: string,\n): Map<number, number | null> {\n const result = new Map<number, number | null>();\n const hunks = parseHunksFromPatch(patch);\n\n for (const oldLine of oldLines) {\n result.set(oldLine, calculateNewLineNumber(oldLine, hunks));\n }\n\n return result;\n}\n\nexport function parseDiffText(diffText: string): GitDiffFile[] {\n const files: GitDiffFile[] = [];\n const fileDiffs = diffText.split(/^diff --git /m).filter(Boolean);\n\n for (const fileDiff of fileDiffs) {\n const headerMatch = fileDiff.match(/^a\\/(.+?) b\\/(.+?)[\\r\\n]/);\n if (!headerMatch) continue;\n\n const filename = headerMatch[2];\n const patchStart = fileDiff.indexOf(\"@@\");\n if (patchStart === -1) continue;\n\n const patch = fileDiff.slice(patchStart);\n files.push({ filename, patch });\n }\n\n return files;\n}\n","import { execSync } from \"child_process\";\nimport { parseDiffText } from \"../../git-sdk/git-sdk-diff.utils\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * Gitea 平台适配器\n */\nexport class GiteaAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v1${path}`;\n const headers: Record<string, string> = {\n Authorization: `token ${this.token}`,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.request<Repository>(\"GET\", `/repos/${owner}/${repo}`);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.request<Branch>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.request<BranchProtection[]>(\"GET\", `/repos/${owner}/${repo}/branch_protections`);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"GET\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"POST\",\n `/repos/${owner}/${repo}/branch_protections`,\n options,\n );\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.request<BranchProtection>(\n \"PATCH\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n options,\n );\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branch_protections/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const protectionOptions = hasWhitelist\n ? {\n enable_push: true,\n enable_push_whitelist: true,\n push_whitelist_usernames: pushWhitelistUsernames,\n }\n : { enable_push: false };\n if (existing) {\n return this.editBranchProtection(\n owner,\n repo,\n existing.rule_name || branch,\n protectionOptions,\n );\n } else {\n return this.createBranchProtection(owner, repo, {\n rule_name: branch,\n branch_name: branch,\n ...protectionOptions,\n });\n }\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n const protections = await this.listBranchProtections(owner, repo);\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n await this.deleteBranchProtection(owner, repo, existing.rule_name || branch);\n return existing;\n }\n return null;\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n const listResult = execSync(\n `curl -s -X GET \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n const protections = JSON.parse(listResult) as Array<{\n rule_name?: string;\n branch_name?: string;\n }>;\n const existing = protections.find((p) => p.rule_name === branch || p.branch_name === branch);\n if (existing) {\n const ruleName = existing.rule_name || branch;\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v1/repos/${owner}/${repo}/branch_protections/${ruleName}\" -H \"Authorization: token ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${ruleName}`);\n } else {\n console.log(`✅ 分支本身没有保护规则,无需解锁`);\n }\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.request<PullRequest>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.request<PullRequest>(\"PATCH\", `/repos/${owner}/${repo}/pulls/${index}`, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n return this.request<PullRequest[]>(\"GET\", `/repos/${owner}/${repo}/pulls${query}`);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"limit\", String(limit));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", options.sort);\n if (options?.milestone) params.set(\"milestone\", String(options.milestone));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const prs = await this.request<PullRequest[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!prs || prs.length === 0) break;\n allPRs.push(...prs);\n if (prs.length < limit) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const limit = 50;\n while (true) {\n const commits = await this.request<PullRequestCommit[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&limit=${limit}`,\n );\n if (!commits || commits.length === 0) break;\n allCommits.push(...commits);\n if (commits.length < limit) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const files = await this.request<ChangedFile[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files`,\n );\n const needsPatch = files.some((f) => !f.patch && f.status !== \"deleted\");\n if (!needsPatch) {\n return files;\n }\n try {\n const diffText = await this.getPullRequestDiff(owner, repo, index);\n const diffFiles = parseDiffText(diffText);\n const patchMap = new Map(diffFiles.map((f) => [f.filename, f.patch]));\n for (const file of files) {\n if (!file.patch && file.filename) {\n file.patch = patchMap.get(file.filename);\n }\n }\n } catch (error) {\n console.warn(`警告: 无法获取 PR diff 来填充 patch 字段:`, error);\n }\n return files;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/pulls/${index}.diff`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.request<CommitInfo>(\"GET\", `/repos/${owner}/${repo}/git/commits/${sha}`);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(\n `${this.baseUrl}/api/v1/repos/${owner}/${repo}/compare/${baseSha}...${headSha}.diff`,\n );\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/git/commits/${sha}.diff`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const url = `${this.baseUrl}/api/v1/repos/${owner}/${repo}/raw/${encodeURIComponent(filepath)}${query}`;\n const response = await fetch(url, {\n headers: { Authorization: `token ${this.token}` },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(`Gitea API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${encodeURIComponent(path)}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<\n Array<{ name: string; path: string; type: string; size: number; download_url?: string }>\n >(\"GET\", `/repos/${owner}/${repo}/contents${encodedPath}${query}`);\n return result.map((item) => ({\n name: item.name,\n path: item.path,\n type: item.type === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size,\n download_url: item.download_url,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.request<Issue>(\"POST\", `/repos/${owner}/${repo}/issues`, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.request<IssueComment[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/comments`);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n options,\n );\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.request<IssueComment>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.request<PullReview>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n options,\n );\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.request<PullReview[]>(\"GET\", `/repos/${owner}/${repo}/pulls/${index}/reviews`);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // Gitea 不支持更新 review,使用删除+创建的方式模拟\n await this.deletePullReview(owner, repo, index, reviewId);\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.request<PullReviewComment[]>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n // Gitea: PR review comment reactions 使用与 issue comment 相同的路径\n return this.request<Reaction[]>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.request<Reaction[]>(\"GET\", `/repos/${owner}/${repo}/issues/${index}/reactions`);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"limit\", String(limit));\n const result = await this.request<{ data: User[] }>(\n \"GET\",\n `/users/search?${params.toString()}`,\n );\n return result.data || [];\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.request<User[]>(\"GET\", `/teams/${teamId}/members`);\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n DIFF_SIDE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/** GraphQL review thread 节点类型 */\ninterface GraphQLReviewThread {\n isResolved: boolean;\n resolvedBy?: { login: string; databaseId: number } | null;\n path?: string | null;\n line?: number | null;\n comments: { nodes: Array<{ databaseId: number }> };\n}\n\n/**\n * GitHub 平台适配器\n */\nexport class GithubAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github+json\",\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async requestGraphQL<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<T> {\n const graphqlUrl =\n this.baseUrl.replace(/\\/v3\\/?$/, \"\").replace(/\\/api\\/v3\\/?$/, \"\") + \"/graphql\";\n const response = await fetch(graphqlUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub GraphQL error: ${response.status} - ${errorText}`);\n }\n const json = (await response.json()) as { data: T; errors?: unknown[] };\n if (json.errors) {\n throw new Error(`GitHub GraphQL errors: ${JSON.stringify(json.errors)}`);\n }\n return json.data;\n }\n\n protected async fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n Accept: \"application/vnd.github.v3.diff\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitHub API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const result = await this.request<Record<string, unknown>>(\"GET\", `/repos/${owner}/${repo}`);\n return this.mapRepository(result);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}`,\n );\n return this.mapBranch(result);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n try {\n const rules = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/rules/rulesets`,\n );\n return rules.map((rule) => this.mapRulesetToProtection(rule));\n } catch {\n return [];\n }\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const branchName = options.branch_name || options.rule_name || \"\";\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branchName)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branchName);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n const body = this.buildGithubProtectionBody(options);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, name);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(name)}/protection`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n const pushWhitelistUsernames = options?.pushWhitelistUsernames;\n const hasWhitelist = pushWhitelistUsernames && pushWhitelistUsernames.length > 0;\n const body: Record<string, unknown> = {\n required_status_checks: null,\n enforce_admins: true,\n required_pull_request_reviews: null,\n restrictions: hasWhitelist\n ? { users: pushWhitelistUsernames, teams: [] }\n : { users: [], teams: [] },\n };\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/repos/${owner}/${repo}/branches/${encodeURIComponent(branch)}/protection`,\n body,\n );\n return this.mapGithubProtection(result, branch);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/repos/${owner}/${repo}/branches/${branch}/protection\" -H \"Authorization: Bearer ${this.token}\" -H \"Accept: application/vnd.github+json\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n );\n return this.mapPullRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/pulls/${index}`,\n options,\n );\n return this.mapPullRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const query = state ? `?state=${state}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls${query}`,\n );\n return results.map((pr) => this.mapPullRequest(pr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const allPRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", options.state);\n if (options?.sort) params.set(\"sort\", this.mapSortParam(options.sort));\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allPRs.push(...results.map((pr) => this.mapPullRequest(pr)));\n if (results.length < perPage) break;\n page++;\n }\n return allPRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/files?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((f) => this.mapChangedFile(f)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${index}`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/repos/${owner}/${repo}/commits/${sha}`,\n );\n const commit = this.mapCommit(result);\n const files = ((result.files as Array<Record<string, unknown>>) || []).map((f) =>\n this.mapChangedFile(f),\n );\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/compare/${baseSha}...${headSha}`);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.fetchText(`${this.baseUrl}/repos/${owner}/${repo}/commits/${sha}`);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const result = await this.request<{ content?: string; encoding?: string }>(\n \"GET\",\n `/repos/${owner}/${repo}/contents/${filepath}${query}`,\n );\n if (result.content && result.encoding === \"base64\") {\n return Buffer.from(result.content, \"base64\").toString(\"utf-8\");\n }\n return result.content || \"\";\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const encodedPath = path ? `/${path}` : \"\";\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/contents${encodedPath}${query}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"dir\" ? (\"dir\" as const) : (\"file\" as const),\n size: item.size as number,\n download_url: item.download_url as string,\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const body: Record<string, unknown> = {\n title: options.title,\n body: options.body,\n assignees: options.assignees,\n labels: options.labels,\n milestone: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n );\n return results.map((c) => this.mapIssueComment(c));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/issues/${index}/comments`,\n { body: options.body },\n );\n return this.mapIssueComment(result);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n const result = await this.request<Record<string, unknown>>(\n \"PATCH\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body },\n );\n return this.mapIssueComment(result);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/issues/comments/${commentId}`);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const body: Record<string, unknown> = {\n event: this.mapReviewEvent(options.event),\n body: options.body,\n commit_id: options.commit_id,\n };\n if (options.comments?.length) {\n body.comments = options.comments.map((c) => ({\n path: c.path,\n body: c.body,\n line: c.new_position,\n side: DIFF_SIDE.RIGHT,\n }));\n }\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n body,\n );\n return this.mapPullReview(result);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews`,\n );\n return results.map((r) => this.mapPullReview(r));\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n // GitHub 的 updatePullReview 只能更新 PENDING 状态的 review\n // 已提交的 review 无法更新,所以使用删除+创建的方式\n try {\n await this.deletePullReview(owner, repo, index, reviewId);\n } catch {\n // 已提交的 review 无法删除,忽略错误\n }\n return this.createPullReview(owner, repo, index, {\n event: REVIEW_STATE.COMMENT,\n body,\n });\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/${index}/reviews/${reviewId}/comments`,\n );\n const comments = results.map((c) => this.mapPullReviewComment(c));\n // 通过 GraphQL 补充 resolved 状态\n try {\n const resolvedMap = await this.fetchResolvedThreads(owner, repo, index);\n for (const comment of comments) {\n if (comment.id && resolvedMap.has(comment.id)) {\n comment.resolver = resolvedMap.get(comment.id) ?? null;\n }\n }\n } catch {\n // GraphQL 查询失败不影响主流程\n }\n return comments;\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n await this.request<void>(\"DELETE\", `/repos/${owner}/${repo}/pulls/comments/${commentId}`);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/pulls/comments/${commentId}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/repos/${owner}/${repo}/issues/${index}/reactions`,\n );\n return results.map((r) => this.mapReaction(r));\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"q\", query);\n params.set(\"per_page\", String(limit));\n const result = await this.request<{ items: Array<Record<string, unknown>> }>(\n \"GET\",\n `/search/users?${params.toString()}`,\n );\n return (result.items || []).map((u) => this.mapUser(u));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/teams/${teamId}/members`,\n );\n return results.map((u) => this.mapUser(u));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapRepository(data: Record<string, unknown>): Repository {\n const owner = data.owner as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n owner: owner\n ? {\n id: owner.id as number,\n login: owner.login as string,\n full_name: owner.full_name as string,\n }\n : undefined,\n name: data.name as string,\n full_name: data.full_name as string,\n default_branch: data.default_branch as string,\n };\n }\n\n protected mapBranch(data: Record<string, unknown>): Branch {\n const commit = data.commit as Record<string, unknown> | undefined;\n const commitObj = commit?.commit as Record<string, unknown> | undefined;\n return {\n name: data.name as string,\n protected: data.protected as boolean,\n commit: commit\n ? {\n id: commit.sha as string,\n message: commitObj?.message as string,\n }\n : undefined,\n };\n }\n\n protected mapPullRequest(data: Record<string, unknown>): PullRequest {\n const head = data.head as Record<string, unknown> | undefined;\n const base = data.base as Record<string, unknown> | undefined;\n const user = data.user as Record<string, unknown> | undefined;\n const reviewers = data.requested_reviewers as Array<Record<string, unknown>> | undefined;\n const teams = data.requested_teams as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n head: head\n ? {\n ref: head.ref as string,\n sha: head.sha as string,\n repo: head.repo ? this.mapRepository(head.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n base: base\n ? {\n ref: base.ref as string,\n sha: base.sha as string,\n repo: base.repo ? this.mapRepository(base.repo as Record<string, unknown>) : undefined,\n }\n : undefined,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.login as string,\n })),\n requested_reviewers_teams: teams?.map((t) => ({\n id: t.id as number,\n name: t.name as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapCommit(data: Record<string, unknown>): PullRequestCommit {\n const commit = data.commit as Record<string, unknown> | undefined;\n const author = commit?.author as Record<string, unknown> | undefined;\n const ghAuthor = data.author as Record<string, unknown> | undefined;\n const ghCommitter = data.committer as Record<string, unknown> | undefined;\n return {\n sha: data.sha as string,\n commit: commit\n ? {\n message: commit.message as string,\n author: author\n ? {\n name: author.name as string,\n email: author.email as string,\n date: author.date as string,\n }\n : undefined,\n }\n : undefined,\n author: ghAuthor ? { id: ghAuthor.id as number, login: ghAuthor.login as string } : undefined,\n committer: ghCommitter\n ? { id: ghCommitter.id as number, login: ghCommitter.login as string }\n : undefined,\n };\n }\n\n protected mapChangedFile(data: Record<string, unknown>): ChangedFile {\n return {\n filename: data.filename as string,\n status: data.status as string,\n additions: data.additions as number,\n deletions: data.deletions as number,\n changes: data.changes as number,\n patch: data.patch as string,\n raw_url: data.raw_url as string,\n contents_url: data.contents_url as string,\n };\n }\n\n protected mapIssueComment(data: Record<string, unknown>): IssueComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const user = data.user as Record<string, unknown> | undefined;\n const labels = data.labels as Array<Record<string, unknown>> | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.number as number,\n title: data.title as string,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n labels: labels?.map((l) => ({\n id: l.id as number,\n name: l.name as string,\n color: l.color as string,\n })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.login as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapPullReview(data: Record<string, unknown>): PullReview {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n state: data.state as string,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.submitted_at as string,\n updated_at: data.submitted_at as string,\n commit_id: data.commit_id as string,\n };\n }\n\n /**\n * 通过 GraphQL 查询 PR 的 review threads resolved 状态\n * 返回 Map<commentId, resolver>(用于 listPullReviewComments 内部补充 resolver)\n */\n protected async fetchResolvedThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<Map<number, { id?: number; login?: string } | null>> {\n const threads = await this.queryReviewThreads(owner, repo, prNumber);\n const resolvedMap = new Map<number, { id?: number; login?: string } | null>();\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n const firstComment = thread.comments.nodes[0];\n if (!firstComment?.databaseId) continue;\n resolvedMap.set(\n firstComment.databaseId,\n thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n );\n }\n return resolvedMap;\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n const threads = await this.queryReviewThreads(owner, repo, index);\n const result: ResolvedThread[] = [];\n for (const thread of threads) {\n if (!thread.isResolved) continue;\n result.push({\n path: thread.path ?? undefined,\n line: thread.line ?? undefined,\n resolvedBy: thread.resolvedBy\n ? { id: thread.resolvedBy.databaseId, login: thread.resolvedBy.login }\n : null,\n });\n }\n return result;\n }\n\n /**\n * GraphQL 查询 PR 的所有 review threads\n */\n protected async queryReviewThreads(\n owner: string,\n repo: string,\n prNumber: number,\n ): Promise<GraphQLReviewThread[]> {\n const QUERY = `\n query($owner: String!, $repo: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100) {\n nodes {\n isResolved\n resolvedBy { login databaseId }\n path\n line\n comments(first: 1) {\n nodes { databaseId }\n }\n }\n }\n }\n }\n }\n `;\n interface GraphQLResult {\n repository: {\n pullRequest: {\n reviewThreads: {\n nodes: GraphQLReviewThread[];\n };\n };\n };\n }\n const data = await this.requestGraphQL<GraphQLResult>(QUERY, {\n owner,\n repo,\n prNumber,\n });\n return data.repository.pullRequest.reviewThreads.nodes;\n }\n\n protected mapPullReviewComment(data: Record<string, unknown>): PullReviewComment {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n path: data.path as string,\n position: data.position as number,\n original_position: data.original_position as number,\n commit_id: data.commit_id as string,\n original_commit_id: data.original_commit_id as string,\n diff_hunk: data.diff_hunk as string,\n pull_request_review_id: data.pull_request_review_id as number,\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n html_url: data.html_url as string,\n };\n }\n\n protected mapReaction(data: Record<string, unknown>): Reaction {\n const user = data.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.login as string } : undefined,\n content: data.content as string,\n created_at: data.created_at as string,\n };\n }\n\n protected mapUser(data: Record<string, unknown>): User {\n return {\n id: data.id as number,\n login: data.login as string,\n full_name: data.name as string,\n email: data.email as string,\n avatar_url: data.avatar_url as string,\n };\n }\n\n protected mapGithubProtection(\n data: Record<string, unknown>,\n branchName: string,\n ): BranchProtection {\n const requiredReviews = data.required_pull_request_reviews as\n | Record<string, unknown>\n | undefined;\n return {\n branch_name: branchName,\n rule_name: branchName,\n required_approvals: requiredReviews?.required_approving_review_count as number,\n dismiss_stale_approvals: requiredReviews?.dismiss_stale_reviews as boolean,\n enable_push: true,\n };\n }\n\n protected mapRulesetToProtection(data: Record<string, unknown>): BranchProtection {\n return {\n rule_name: data.name as string,\n branch_name: data.name as string,\n };\n }\n\n protected buildGithubProtectionBody(\n options: CreateBranchProtectionOption | EditBranchProtectionOption,\n ): Record<string, unknown> {\n const body: Record<string, unknown> = {\n required_status_checks: options.enable_status_check\n ? { strict: true, contexts: options.status_check_contexts || [] }\n : null,\n enforce_admins: options.block_admin_merge_override ?? false,\n required_pull_request_reviews: options.required_approvals\n ? {\n required_approving_review_count: options.required_approvals,\n dismiss_stale_reviews: options.dismiss_stale_approvals ?? false,\n }\n : null,\n restrictions: options.enable_push_whitelist\n ? {\n users: options.push_whitelist_usernames || [],\n teams: options.push_whitelist_teams || [],\n }\n : null,\n };\n return body;\n }\n\n protected mapReviewEvent(event?: string): string {\n const eventMap: Record<string, string> = {\n [REVIEW_STATE.APPROVE]: REVIEW_STATE.APPROVE,\n [REVIEW_STATE.REQUEST_CHANGES]: REVIEW_STATE.REQUEST_CHANGES,\n [REVIEW_STATE.COMMENT]: REVIEW_STATE.COMMENT,\n [REVIEW_STATE.PENDING]: REVIEW_STATE.PENDING,\n };\n return event ? eventMap[event] || event : REVIEW_STATE.COMMENT;\n }\n\n protected mapSortParam(sort: string): string {\n const sortMap: Record<string, string> = {\n oldest: \"created\",\n recentupdate: \"updated\",\n leastupdate: \"updated\",\n mostcomment: \"comments\",\n leastcomment: \"comments\",\n };\n return sortMap[sort] || \"created\";\n }\n}\n","import { execSync } from \"child_process\";\nimport type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"../git-provider.interface\";\nimport {\n REVIEW_STATE,\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"../types\";\n\n/**\n * GitLab 平台适配器\n *\n * GitLab API 特点:\n * - 使用 PRIVATE-TOKEN 认证\n * - 项目通过 URL-encoded path(owner/repo)标识\n * - Merge Request(MR)对应 Pull Request\n * - Notes 对应 Comments/Reviews\n * - API 前缀 /api/v4\n */\nexport class GitlabAdapter implements GitProvider {\n protected readonly baseUrl: string;\n protected readonly token: string;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n }\n\n /** 将 owner/repo 编码为 GitLab 项目路径 */\n protected encodeProject(owner: string, repo: string): string {\n return encodeURIComponent(`${owner}/${repo}`);\n }\n\n validateConfig(): void {\n if (!this.options?.baseUrl) {\n throw new Error(\"缺少配置 gitProvider.baseUrl (环境变量 GIT_PROVIDER_URL)\");\n }\n if (!this.options?.token) {\n throw new Error(\"缺少配置 gitProvider.token (环境变量 GIT_PROVIDER_TOKEN)\");\n }\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const headers: Record<string, string> = {\n \"PRIVATE-TOKEN\": this.token,\n \"Content-Type\": \"application/json\",\n };\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n if (response.status === 204) {\n return {} as T;\n }\n return response.json() as Promise<T>;\n }\n\n protected async fetchText(path: string): Promise<string> {\n const url = `${this.baseUrl}/api/v4${path}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GitLab API error: ${response.status} ${response.statusText} - ${errorText}`);\n }\n return response.text();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\"GET\", `/projects/${project}`);\n const namespace = result.namespace as Record<string, unknown> | undefined;\n return {\n id: result.id as number,\n name: result.name as string,\n full_name: result.path_with_namespace as string,\n default_branch: result.default_branch as string,\n owner: namespace\n ? {\n id: namespace.id as number,\n login: namespace.path as string,\n full_name: namespace.name as string,\n }\n : undefined,\n };\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/branches/${encodeURIComponent(branch)}`,\n );\n const commit = result.commit as Record<string, unknown> | undefined;\n return {\n name: result.name as string,\n protected: result.protected as boolean,\n commit: commit ? { id: commit.id as string, message: commit.message as string } : undefined,\n };\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/protected_branches`,\n );\n return results.map((p) => this.mapProtection(p));\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n return this.mapProtection(result);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n const project = this.encodeProject(owner, repo);\n const branchName = options.branch_name || options.rule_name || \"\";\n const body: Record<string, unknown> = {\n name: branchName,\n push_access_level: options.enable_push ? 30 : 0, // 30=Developer, 0=No one\n merge_access_level: 30,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/protected_branches`,\n body,\n );\n return this.mapProtection(result);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n // GitLab 不支持直接编辑,需要先删除再创建\n await this.deleteBranchProtection(owner, repo, name);\n return this.createBranchProtection(owner, repo, {\n branch_name: name,\n rule_name: name,\n ...options,\n });\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/protected_branches/${encodeURIComponent(name)}`,\n );\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n // 先尝试删除已有保护\n try {\n await this.deleteBranchProtection(owner, repo, branch);\n } catch {\n // 不存在时忽略\n }\n const pushLevel = options?.pushWhitelistUsernames?.length ? 30 : 0;\n return this.createBranchProtection(owner, repo, {\n branch_name: branch,\n rule_name: branch,\n enable_push: pushLevel > 0,\n });\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n try {\n const existing = await this.getBranchProtection(owner, repo, branch);\n await this.deleteBranchProtection(owner, repo, branch);\n return existing;\n } catch {\n return null;\n }\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n const project = this.encodeProject(owner, repo);\n try {\n execSync(\n `curl -s -X DELETE \"${this.baseUrl}/api/v4/projects/${project}/protected_branches/${encodeURIComponent(branch)}\" -H \"PRIVATE-TOKEN: ${this.token}\"`,\n { encoding: \"utf-8\" },\n );\n console.log(`✅ 分支已解锁(同步): ${branch}`);\n } catch (error) {\n console.error(\"⚠️ 同步解锁分支失败:\", error instanceof Error ? error.message : error);\n }\n }\n\n // ============ Merge Request(对应 Pull Request) ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}`,\n );\n return this.mapMergeRequest(result);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {};\n if (options.title) body.title = options.title;\n if (options.body !== undefined) body.description = options.body;\n if (options.state) body.state_event = options.state === \"closed\" ? \"close\" : \"reopen\";\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}`,\n body,\n );\n return this.mapMergeRequest(result);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const glState = this.mapStateParam(state);\n const query = glState ? `?state=${glState}` : \"\";\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests${query}`,\n );\n return results.map((mr) => this.mapMergeRequest(mr));\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n const project = this.encodeProject(owner, repo);\n const allMRs: PullRequest[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const params = new URLSearchParams();\n params.set(\"page\", String(page));\n params.set(\"per_page\", String(perPage));\n if (options?.state) params.set(\"state\", this.mapStateParam(options.state) || \"all\");\n if (options?.labels?.length) params.set(\"labels\", options.labels.join(\",\"));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests?${params.toString()}`,\n );\n if (!results || results.length === 0) break;\n allMRs.push(...results.map((mr) => this.mapMergeRequest(mr)));\n if (results.length < perPage) break;\n page++;\n }\n return allMRs;\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n const project = this.encodeProject(owner, repo);\n const allCommits: PullRequestCommit[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/commits?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allCommits.push(...results.map((c) => this.mapGitlabCommit(c)));\n if (results.length < perPage) break;\n page++;\n }\n return allCommits;\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n const project = this.encodeProject(owner, repo);\n const allFiles: ChangedFile[] = [];\n let page = 1;\n const perPage = 100;\n while (true) {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/diffs?page=${page}&per_page=${perPage}`,\n );\n if (!results || results.length === 0) break;\n allFiles.push(...results.map((d) => this.mapDiffToChangedFile(d)));\n if (results.length < perPage) break;\n page++;\n }\n return allFiles;\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n const project = this.encodeProject(owner, repo);\n return this.fetchText(`/projects/${project}/merge_requests/${index}/raw_diffs`);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}`,\n );\n // 获取 commit 的 diff 来填充 files\n let files: ChangedFile[] = [];\n try {\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n files = diffs.map((d) => this.mapDiffToChangedFile(d));\n } catch {\n // diff 获取失败时忽略\n }\n const commit = this.mapGitlabCommit(result);\n return { ...commit, files };\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<{ diffs: Array<Record<string, unknown>> }>(\n \"GET\",\n `/projects/${project}/repository/compare?from=${encodeURIComponent(baseSha)}&to=${encodeURIComponent(headSha)}`,\n );\n // 将 diffs 拼接为 unified diff 文本\n return (result.diffs || [])\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const diffs = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/commits/${sha}/diff`,\n );\n return diffs\n .map((d) => {\n const oldPath = d.old_path as string;\n const newPath = d.new_path as string;\n const diff = d.diff as string;\n return `diff --git a/${oldPath} b/${newPath}\\n${diff}`;\n })\n .join(\"\\n\");\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n const project = this.encodeProject(owner, repo);\n const encodedPath = encodeURIComponent(filepath);\n const query = ref ? `?ref=${encodeURIComponent(ref)}` : \"\";\n try {\n const url = `${this.baseUrl}/api/v4/projects/${project}/repository/files/${encodedPath}/raw${query}`;\n const response = await fetch(url, {\n headers: { \"PRIVATE-TOKEN\": this.token },\n });\n if (!response.ok) {\n if (response.status === 404) {\n return \"\";\n }\n const errorText = await response.text();\n throw new Error(\n `GitLab API error: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n return response.text();\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"404\")) {\n return \"\";\n }\n throw error;\n }\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path = \"\",\n ref?: string,\n ): Promise<RepositoryContent[]> {\n const project = this.encodeProject(owner, repo);\n const params = new URLSearchParams();\n if (path) params.set(\"path\", path);\n if (ref) params.set(\"ref\", ref);\n const result = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/repository/tree?${params.toString()}`,\n );\n return result.map((item) => ({\n name: item.name as string,\n path: item.path as string,\n type: (item.type as string) === \"tree\" ? (\"dir\" as const) : (\"file\" as const),\n }));\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n const project = this.encodeProject(owner, repo);\n const body: Record<string, unknown> = {\n title: options.title,\n description: options.body,\n assignee_ids: options.assignees,\n labels: options.labels?.join(\",\"),\n milestone_id: options.milestone,\n };\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/issues`,\n body,\n );\n return this.mapIssue(result);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab: MR notes 作为 issue comments\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results.filter((n) => !(n.system as boolean)).map((n) => this.mapNote(n));\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n return this.mapNote(result);\n }\n\n async updateIssueComment(\n _owner: string,\n _repo: string,\n _commentId: number,\n _body: string,\n ): Promise<IssueComment> {\n // GitLab 更新 note 需要 noteable_iid,接口签名不含此信息\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 更新评论,请使用 createIssueComment 替代\");\n }\n\n async deleteIssueComment(_owner: string, _repo: string, _commentId: number): Promise<void> {\n throw new Error(\"GitLab 适配器暂不支持通过 commentId 删除评论\");\n }\n\n // ============ MR Review(对应 PR Review) ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 note 模拟\n // 如果有 body,创建一个总体评论\n if (options.body) {\n const result = await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: options.body },\n );\n const note = this.mapNote(result);\n return {\n id: note.id,\n body: note.body,\n state: options.event || REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n }\n // 如果有行级评论,逐个创建\n if (options.comments?.length) {\n for (const comment of options.comments) {\n await this.request<Record<string, unknown>>(\n \"POST\",\n `/projects/${project}/merge_requests/${index}/notes`,\n { body: `**${comment.path}** (line ${comment.new_position})\\n\\n${comment.body}` },\n );\n }\n }\n // 如果是 APPROVE 事件,调用 approve API\n if (options.event === REVIEW_STATE.APPROVE) {\n await this.request<void>(\"POST\", `/projects/${project}/merge_requests/${index}/approve`);\n }\n return {\n id: 0,\n body: options.body || \"\",\n state: options.event || REVIEW_STATE.COMMENT,\n };\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n const project = this.encodeProject(owner, repo);\n // GitLab 没有 review 概念,用 notes 模拟\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !(n.system as boolean))\n .map((n) => {\n const note = this.mapNote(n);\n return {\n id: note.id,\n body: note.body,\n state: REVIEW_STATE.COMMENT,\n user: note.user,\n created_at: note.created_at,\n updated_at: note.updated_at,\n };\n });\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n const project = this.encodeProject(owner, repo);\n const result = await this.request<Record<string, unknown>>(\n \"PUT\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n { body },\n );\n return {\n id: result.id as number,\n body: result.body as string,\n state: REVIEW_STATE.COMMENT,\n user: result.author\n ? {\n id: (result.author as Record<string, unknown>).id as number,\n login: (result.author as Record<string, unknown>).username as string,\n }\n : undefined,\n };\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n const project = this.encodeProject(owner, repo);\n await this.request<void>(\n \"DELETE\",\n `/projects/${project}/merge_requests/${index}/notes/${reviewId}`,\n );\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n _reviewId: number,\n ): Promise<PullReviewComment[]> {\n // GitLab 没有 review 下的 comments 概念,返回所有 diff notes\n const project = this.encodeProject(owner, repo);\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/notes?sort=asc`,\n );\n return results\n .filter((n) => !!(n.position as Record<string, unknown> | undefined))\n .map((n) => {\n const user = (n.author as Record<string, unknown>) || {};\n const position = (n.position as Record<string, unknown>) || {};\n return {\n id: n.id as number,\n body: n.body as string,\n path: (position.new_path || position.old_path) as string,\n position: position.new_line as number,\n original_position: position.old_line as number,\n user: { id: user.id as number, login: user.username as string },\n created_at: n.created_at as string,\n updated_at: n.updated_at as string,\n };\n });\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n // GitLab: 删除 MR note\n const project = this.encodeProject(owner, repo);\n // GitLab 删除 note 需要 merge_request_iid,但此处只有 commentId(note_id)\n // 使用全局 note 删除不可行,需要通过其他方式获取 MR iid\n // 暂时忽略,GitLab 场景下行级评论删除不常用\n console.warn(\n `⚠️ GitLab 暂不支持删除单条 review comment (id: ${commentId}, project: ${project})`,\n );\n }\n\n async listResolvedThreads(): Promise<ResolvedThread[]> {\n return [];\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getPullReviewCommentReactions(\n _owner: string,\n _repo: string,\n _commentId: number,\n ): Promise<Reaction[]> {\n // GitLab: award emoji on notes(需要 noteable_iid,此处简化返回空)\n return [];\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n const project = this.encodeProject(owner, repo);\n try {\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/projects/${project}/merge_requests/${index}/award_emoji`,\n );\n return results.map((r) => {\n const user = r.user as Record<string, unknown> | undefined;\n return {\n user: user ? { id: user.id as number, login: user.username as string } : undefined,\n content: r.name as string,\n created_at: r.created_at as string,\n };\n });\n } catch {\n return [];\n }\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit = 10): Promise<User[]> {\n const params = new URLSearchParams();\n params.set(\"search\", query);\n params.set(\"per_page\", String(limit));\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/users?${params.toString()}`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n email: u.email as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n // GitLab: group members\n const results = await this.request<Array<Record<string, unknown>>>(\n \"GET\",\n `/groups/${teamId}/members`,\n );\n return results.map((u) => ({\n id: u.id as number,\n login: u.username as string,\n full_name: u.name as string,\n avatar_url: u.avatar_url as string,\n }));\n }\n\n // ============ 映射辅助方法 ============\n\n protected mapProtection(data: Record<string, unknown>): BranchProtection {\n const pushAccess = data.push_access_levels as Array<Record<string, unknown>> | undefined;\n return {\n branch_name: data.name as string,\n rule_name: data.name as string,\n enable_push: pushAccess ? pushAccess.some((l) => (l.access_level as number) > 0) : false,\n };\n }\n\n protected mapMergeRequest(data: Record<string, unknown>): PullRequest {\n const author = data.author as Record<string, unknown> | undefined;\n const reviewers = data.reviewers as Array<Record<string, unknown>> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n head: {\n ref: data.source_branch as string,\n sha: data.sha as string,\n },\n base: {\n ref: data.target_branch as string,\n sha: data.diff_refs\n ? ((data.diff_refs as Record<string, unknown>).base_sha as string)\n : undefined,\n },\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n requested_reviewers: reviewers?.map((r) => ({\n id: r.id as number,\n login: r.username as string,\n })),\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n merged_at: data.merged_at as string,\n merge_base: data.merge_commit_sha as string,\n };\n }\n\n protected mapGitlabCommit(data: Record<string, unknown>): PullRequestCommit {\n return {\n sha: (data.id || data.sha) as string,\n commit: {\n message: (data.message || data.title) as string,\n author: {\n name: data.author_name as string,\n email: data.author_email as string,\n date: (data.authored_date || data.created_at) as string,\n },\n },\n author: data.author_name ? { login: data.author_name as string } : undefined,\n committer: data.committer_name ? { login: data.committer_name as string } : undefined,\n };\n }\n\n protected mapDiffToChangedFile(data: Record<string, unknown>): ChangedFile {\n let status = \"modified\";\n if (data.new_file) status = \"added\";\n else if (data.deleted_file) status = \"deleted\";\n else if (data.renamed_file) status = \"renamed\";\n const diff = data.diff as string | undefined;\n // 从 diff 中计算 additions/deletions\n let additions = 0;\n let deletions = 0;\n if (diff) {\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) additions++;\n if (line.startsWith(\"-\") && !line.startsWith(\"---\")) deletions++;\n }\n }\n return {\n filename: (data.new_path || data.old_path) as string,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: diff,\n };\n }\n\n protected mapNote(data: Record<string, unknown>): IssueComment {\n const author = data.author as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n body: data.body as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n };\n }\n\n protected mapIssue(data: Record<string, unknown>): Issue {\n const author = data.author as Record<string, unknown> | undefined;\n const labels = data.labels as string[] | undefined;\n const assignees = data.assignees as Array<Record<string, unknown>> | undefined;\n const milestone = data.milestone as Record<string, unknown> | undefined;\n return {\n id: data.id as number,\n number: data.iid as number,\n title: data.title as string,\n body: data.description as string,\n state: data.state as string,\n user: author ? { id: author.id as number, login: author.username as string } : undefined,\n labels: labels?.map((l) => ({ name: l })),\n assignees: assignees?.map((a) => ({ id: a.id as number, login: a.username as string })),\n milestone: milestone\n ? { id: milestone.id as number, title: milestone.title as string }\n : undefined,\n created_at: data.created_at as string,\n updated_at: data.updated_at as string,\n closed_at: data.closed_at as string,\n html_url: data.web_url as string,\n };\n }\n\n protected mapStateParam(state?: \"open\" | \"closed\" | \"all\"): string | undefined {\n if (!state) return undefined;\n const stateMap: Record<string, string> = {\n open: \"opened\",\n closed: \"closed\",\n all: \"all\",\n };\n return stateMap[state] || state;\n }\n}\n","import type {\n GitProvider,\n LockBranchOptions,\n ListPullRequestsOptions,\n} from \"./git-provider.interface\";\nimport {\n type GitProviderModuleOptions,\n type BranchProtection,\n type CreateBranchProtectionOption,\n type EditBranchProtectionOption,\n type Branch,\n type Repository,\n type PullRequest,\n type PullRequestCommit,\n type ChangedFile,\n type CommitInfo,\n type IssueComment,\n type CreateIssueCommentOption,\n type CreateIssueOption,\n type Issue,\n type CreatePullReviewOption,\n type PullReview,\n type PullReviewComment,\n type Reaction,\n type EditPullRequestOption,\n type User,\n type RepositoryContent,\n type ResolvedThread,\n} from \"./types\";\nimport { GiteaAdapter } from \"./adapters/gitea.adapter\";\nimport { GithubAdapter } from \"./adapters/github.adapter\";\nimport { GitlabAdapter } from \"./adapters/gitlab.adapter\";\n\n/**\n * Git Provider 统一服务\n * 根据配置的 provider 类型代理到对应的适配器实现\n */\nexport class GitProviderService implements GitProvider {\n protected readonly adapter: GitProvider;\n\n constructor(protected readonly options: GitProviderModuleOptions) {\n this.adapter = this.createAdapter(options);\n }\n\n /**\n * 根据 provider 类型创建对应的适配器\n */\n protected createAdapter(options: GitProviderModuleOptions): GitProvider {\n switch (options.provider) {\n case \"gitea\":\n return new GiteaAdapter(options);\n case \"github\":\n return new GithubAdapter(options);\n case \"gitlab\":\n return new GitlabAdapter(options);\n default:\n throw new Error(`不支持的 Git Provider 类型: ${options.provider}`);\n }\n }\n\n // ============ 配置验证 ============\n\n validateConfig(): void {\n this.adapter.validateConfig();\n }\n\n // ============ 仓库操作 ============\n\n async getRepository(owner: string, repo: string): Promise<Repository> {\n return this.adapter.getRepository(owner, repo);\n }\n\n // ============ 分支操作 ============\n\n async getBranch(owner: string, repo: string, branch: string): Promise<Branch> {\n return this.adapter.getBranch(owner, repo, branch);\n }\n\n // ============ 分支保护 ============\n\n async listBranchProtections(owner: string, repo: string): Promise<BranchProtection[]> {\n return this.adapter.listBranchProtections(owner, repo);\n }\n\n async getBranchProtection(owner: string, repo: string, name: string): Promise<BranchProtection> {\n return this.adapter.getBranchProtection(owner, repo, name);\n }\n\n async createBranchProtection(\n owner: string,\n repo: string,\n options: CreateBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.createBranchProtection(owner, repo, options);\n }\n\n async editBranchProtection(\n owner: string,\n repo: string,\n name: string,\n options: EditBranchProtectionOption,\n ): Promise<BranchProtection> {\n return this.adapter.editBranchProtection(owner, repo, name, options);\n }\n\n async deleteBranchProtection(owner: string, repo: string, name: string): Promise<void> {\n return this.adapter.deleteBranchProtection(owner, repo, name);\n }\n\n async lockBranch(\n owner: string,\n repo: string,\n branch: string,\n options?: LockBranchOptions,\n ): Promise<BranchProtection> {\n return this.adapter.lockBranch(owner, repo, branch, options);\n }\n\n async unlockBranch(\n owner: string,\n repo: string,\n branch: string,\n ): Promise<BranchProtection | null> {\n return this.adapter.unlockBranch(owner, repo, branch);\n }\n\n unlockBranchSync(owner: string, repo: string, branch: string): void {\n this.adapter.unlockBranchSync(owner, repo, branch);\n }\n\n // ============ Pull Request 操作 ============\n\n async getPullRequest(owner: string, repo: string, index: number): Promise<PullRequest> {\n return this.adapter.getPullRequest(owner, repo, index);\n }\n\n async editPullRequest(\n owner: string,\n repo: string,\n index: number,\n options: EditPullRequestOption,\n ): Promise<PullRequest> {\n return this.adapter.editPullRequest(owner, repo, index, options);\n }\n\n async listPullRequests(\n owner: string,\n repo: string,\n state?: \"open\" | \"closed\" | \"all\",\n ): Promise<PullRequest[]> {\n return this.adapter.listPullRequests(owner, repo, state);\n }\n\n async listAllPullRequests(\n owner: string,\n repo: string,\n options?: ListPullRequestsOptions,\n ): Promise<PullRequest[]> {\n return this.adapter.listAllPullRequests(owner, repo, options);\n }\n\n async getPullRequestCommits(\n owner: string,\n repo: string,\n index: number,\n ): Promise<PullRequestCommit[]> {\n return this.adapter.getPullRequestCommits(owner, repo, index);\n }\n\n async getPullRequestFiles(owner: string, repo: string, index: number): Promise<ChangedFile[]> {\n return this.adapter.getPullRequestFiles(owner, repo, index);\n }\n\n async getPullRequestDiff(owner: string, repo: string, index: number): Promise<string> {\n return this.adapter.getPullRequestDiff(owner, repo, index);\n }\n\n // ============ Commit 操作 ============\n\n async getCommit(owner: string, repo: string, sha: string): Promise<CommitInfo> {\n return this.adapter.getCommit(owner, repo, sha);\n }\n\n async getCompareDiff(\n owner: string,\n repo: string,\n baseSha: string,\n headSha: string,\n ): Promise<string> {\n return this.adapter.getCompareDiff(owner, repo, baseSha, headSha);\n }\n\n async getCommitDiff(owner: string, repo: string, sha: string): Promise<string> {\n return this.adapter.getCommitDiff(owner, repo, sha);\n }\n\n // ============ 文件操作 ============\n\n async getFileContent(\n owner: string,\n repo: string,\n filepath: string,\n ref?: string,\n ): Promise<string> {\n return this.adapter.getFileContent(owner, repo, filepath, ref);\n }\n\n async listRepositoryContents(\n owner: string,\n repo: string,\n path?: string,\n ref?: string,\n ): Promise<RepositoryContent[]> {\n return this.adapter.listRepositoryContents(owner, repo, path, ref);\n }\n\n // ============ Issue 操作 ============\n\n async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {\n return this.adapter.createIssue(owner, repo, options);\n }\n\n async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {\n return this.adapter.listIssueComments(owner, repo, index);\n }\n\n async createIssueComment(\n owner: string,\n repo: string,\n index: number,\n options: CreateIssueCommentOption,\n ): Promise<IssueComment> {\n return this.adapter.createIssueComment(owner, repo, index, options);\n }\n\n async updateIssueComment(\n owner: string,\n repo: string,\n commentId: number,\n body: string,\n ): Promise<IssueComment> {\n return this.adapter.updateIssueComment(owner, repo, commentId, body);\n }\n\n async deleteIssueComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deleteIssueComment(owner, repo, commentId);\n }\n\n // ============ PR Review 操作 ============\n\n async createPullReview(\n owner: string,\n repo: string,\n index: number,\n options: CreatePullReviewOption,\n ): Promise<PullReview> {\n return this.adapter.createPullReview(owner, repo, index, options);\n }\n\n async listPullReviews(owner: string, repo: string, index: number): Promise<PullReview[]> {\n return this.adapter.listPullReviews(owner, repo, index);\n }\n\n async updatePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n body: string,\n ): Promise<PullReview> {\n return this.adapter.updatePullReview(owner, repo, index, reviewId, body);\n }\n\n async deletePullReview(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<void> {\n return this.adapter.deletePullReview(owner, repo, index, reviewId);\n }\n\n async listPullReviewComments(\n owner: string,\n repo: string,\n index: number,\n reviewId: number,\n ): Promise<PullReviewComment[]> {\n return this.adapter.listPullReviewComments(owner, repo, index, reviewId);\n }\n\n async deletePullReviewComment(owner: string, repo: string, commentId: number): Promise<void> {\n return this.adapter.deletePullReviewComment(owner, repo, commentId);\n }\n\n async listResolvedThreads(owner: string, repo: string, index: number): Promise<ResolvedThread[]> {\n return this.adapter.listResolvedThreads(owner, repo, index);\n }\n\n // ============ Reaction 操作 ============\n\n async getIssueCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getIssueCommentReactions(owner, repo, commentId);\n }\n\n async getPullReviewCommentReactions(\n owner: string,\n repo: string,\n commentId: number,\n ): Promise<Reaction[]> {\n return this.adapter.getPullReviewCommentReactions(owner, repo, commentId);\n }\n\n async getIssueReactions(owner: string, repo: string, index: number): Promise<Reaction[]> {\n return this.adapter.getIssueReactions(owner, repo, index);\n }\n\n // ============ 用户操作 ============\n\n async searchUsers(query: string, limit?: number): Promise<User[]> {\n return this.adapter.searchUsers(query, limit);\n }\n\n async getTeamMembers(teamId: number): Promise<User[]> {\n return this.adapter.getTeamMembers(teamId);\n }\n}\n","export * from \"./gitea.adapter\";\nexport * from \"./github.adapter\";\nexport * from \"./gitlab.adapter\";\n","export * from \"./types\";\nexport * from \"./detect-provider\";\nexport * from \"./parse-repo-url\";\nexport * from \"./git-provider.interface\";\nexport * from \"./git-provider.service\";\nexport * from \"./adapters\";\n","import { spawn, execSync } from \"child_process\";\nimport type { GitCommit, GitChangedFile, GitDiffFile, GitRunOptions } from \"./git-sdk.types\";\nimport { mapGitStatus, parseDiffText } from \"./git-sdk-diff.utils\";\n\nexport class GitSdkService {\n protected readonly defaultOptions: GitRunOptions = {\n cwd: process.cwd(),\n maxBuffer: 10 * 1024 * 1024, // 10MB\n };\n\n runCommand(args: string[], options?: GitRunOptions): Promise<string> {\n const opts = { ...this.defaultOptions, ...options };\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd: opts.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(`Git 命令失败 (${code}): ${stderr}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n\n runCommandSync(args: string[], options?: GitRunOptions): string {\n const opts = { ...this.defaultOptions, ...options };\n return execSync(`git ${args.join(\" \")}`, {\n cwd: opts.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: opts.maxBuffer,\n });\n }\n\n getRemoteUrl(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"remote\", \"get-url\", \"origin\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getCurrentBranch(options?: GitRunOptions): string | null {\n try {\n return this.runCommandSync([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], options).trim();\n } catch {\n return null;\n }\n }\n\n getDefaultBranch(options?: GitRunOptions): string {\n try {\n const result = this.runCommandSync(\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n options,\n ).trim();\n return result.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // 回退到常见默认分支\n for (const branch of [\"main\", \"master\"]) {\n try {\n this.runCommandSync([\"rev-parse\", \"--verify\", `origin/${branch}`], options);\n return branch;\n } catch {\n continue;\n }\n }\n return \"main\";\n }\n }\n\n parseRepositoryFromRemoteUrl(remoteUrl: string): { owner: string; repo: string } | null {\n const match = remoteUrl.match(/[/:]([\\w.-]+)\\/([\\w.-]+?)(?:\\.git)?$/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n return null;\n }\n\n async getChangedFilesBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitChangedFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"diff\", \"--name-status\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const files: GitChangedFile[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [status, filename] = line.split(\"\\t\");\n files.push({\n filename,\n status: mapGitStatus(status),\n });\n }\n\n return files;\n }\n\n /**\n * 获取两个 ref 之间的 diff(包含 patch 信息)\n * @param baseRef 基准 ref\n * @param headRef 目标 ref\n * @param options 运行选项\n * @returns 包含 filename 和 patch 的文件列表\n */\n async getDiffBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitDiffFile[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand([\"diff\", `${resolvedBase}..${resolvedHead}`], options);\n\n return parseDiffText(result);\n }\n\n async getCommitsBetweenRefs(\n baseRef: string,\n headRef: string,\n options?: GitRunOptions,\n ): Promise<GitCommit[]> {\n const resolvedBase = await this.resolveRef(baseRef, options);\n const resolvedHead = await this.resolveRef(headRef, options);\n const result = await this.runCommand(\n [\"log\", \"--format=%H|%s|%an|%ae|%aI\", `${resolvedBase}..${resolvedHead}`],\n options,\n );\n\n const commits: GitCommit[] = [];\n const lines = result.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, authorName, authorEmail, date] = line.split(\"|\");\n commits.push({\n sha,\n message,\n author: {\n name: authorName,\n email: authorEmail,\n date,\n },\n });\n }\n\n return commits;\n }\n\n async getFilesForCommit(sha: string, options?: GitRunOptions): Promise<string[]> {\n const result = await this.runCommand([\"show\", \"--name-only\", \"--format=\", sha], options);\n return result.trim().split(\"\\n\").filter(Boolean);\n }\n\n async getFileContent(ref: string, filename: string, options?: GitRunOptions): Promise<string> {\n return this.runCommand([\"show\", `${ref}:${filename}`], options);\n }\n\n getCommitDiff(sha: string, options?: GitRunOptions): GitDiffFile[] {\n try {\n const output = this.runCommandSync([\"show\", \"--format=\", \"--patch\", sha], options);\n return parseDiffText(output);\n } catch (error) {\n console.warn(`⚠️ git show 失败: ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n }\n\n /**\n * 解析 ref,支持本地分支、远程分支、commit SHA\n * 优先级:commit SHA > 本地分支 > origin/分支 > fetch后重试 > 原始值\n */\n async resolveRef(ref: string, options?: GitRunOptions): Promise<string> {\n if (!ref) {\n throw new Error(`resolveRef: ref 参数不能为空。调用栈: ${new Error().stack}`);\n }\n if (/^[0-9a-f]{7,40}$/i.test(ref)) {\n return ref;\n }\n if (ref.startsWith(\"origin/\")) {\n return ref;\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", ref], options);\n return ref;\n } catch {\n // 本地分支不存在\n }\n try {\n await this.runCommand([\"rev-parse\", \"--verify\", `origin/${ref}`], options);\n return `origin/${ref}`;\n } catch {\n // origin/分支也不存在\n }\n try {\n await this.runCommand(\n [\"fetch\", \"origin\", `${ref}:refs/remotes/origin/${ref}`, \"--depth=1\"],\n options,\n );\n return `origin/${ref}`;\n } catch {\n // fetch 失败\n }\n return ref;\n }\n}\n","export * from \"./git-sdk.types\";\nexport * from \"./git-sdk-diff.utils\";\nexport { GitSdkService } from \"./git-sdk.service\";\n","export interface ClaudeAdapterConfig {\n model?: string;\n baseUrl?: string;\n authToken?: string;\n hasCompletedOnboarding?: boolean;\n}\n\nexport interface OpenAIAdapterConfig {\n model: string;\n baseUrl?: string;\n apiKey: string;\n}\n\nexport interface OpenCodeAdapterConfig {\n model?: string;\n /** OpenCode 服务地址,默认 http://localhost:4096 */\n serverUrl?: string;\n /** 云厂商 API 地址(会动态写入 opencode.json 配置) */\n baseUrl?: string;\n apiKey?: string;\n providerID?: string;\n}\n\nexport type LLMMode = \"claude-code\" | \"openai\" | \"gemini\" | \"open-code\";\n\nexport interface GeminiAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n}\n\nexport interface LlmProxyConfig {\n defaultAdapter?: LLMMode;\n claudeCode?: ClaudeAdapterConfig;\n openai?: OpenAIAdapterConfig;\n openCode?: OpenCodeAdapterConfig;\n gemini?: GeminiAdapterConfig;\n}\n\nexport const LLM_PROXY_CONFIG = Symbol(\"LLM_PROXY_CONFIG\");\n","export * from \"./message.interface\";\nexport * from \"./session.interface\";\nexport * from \"./config.interface\";\nexport type { VerboseLevel } from \"../../verbose\";\n","import type { LlmMessage, LlmRequestOptions, LlmResponse, LlmStreamEvent } from \"../interfaces\";\nimport type { VerboseLevel } from \"../../verbose\";\n\nexport interface LlmAdapterConfig {\n model?: string;\n baseUrl?: string;\n apiKey?: string;\n verbose?: VerboseLevel;\n}\n\nexport interface LlmAdapter {\n readonly name: string;\n\n chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse>;\n\n chatStream(messages: LlmMessage[], options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent>;\n\n isConfigured(): boolean;\n\n isSupportJsonSchema(): boolean;\n}\n\nexport const LLM_ADAPTER = Symbol(\"LLM_ADAPTER\");\n","/**\n * 日志级别(字符串模式)\n * - \"silent\": 静默模式,不输出任何日志\n * - \"info\": 显示过程日志(如 \"开始审查\"、\"完成审查\")\n * - \"verbose\": 显示详细日志\n * - \"debug\": 显示调试日志(包括大模型的输入提示词和输出过程)\n */\nexport type LogLevel = \"silent\" | \"info\" | \"verbose\" | \"debug\";\n\n/**\n * Verbose 日志级别(数字模式,向后兼容)\n * - 0 / false: 静默模式,只返回结果\n * - 1 / true: 显示过程日志\n * - 2: 显示详细日志\n * - 3: 显示调试日志\n */\nexport type VerboseLevel = 0 | 1 | 2 | 3 | false | true;\n\n/** 日志级别优先级映射 */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n silent: 0,\n info: 1,\n verbose: 2,\n debug: 3,\n} as const;\n\n/** VerboseLevel 数字到 LogLevel 字符串的映射 */\nconst VERBOSE_TO_LOG_LEVEL: Record<number, LogLevel> = {\n 0: \"silent\",\n 1: \"info\",\n 2: \"verbose\",\n 3: \"debug\",\n} as const;\n\n/**\n * 将任意级别值统一转为 LogLevel 字符串\n * @param level 日志级别(字符串、数字、布尔值)\n * @returns LogLevel 字符串\n */\nexport const toLogLevel = (level: LogLevel | VerboseLevel | undefined): LogLevel => {\n if (level === undefined) return \"info\";\n if (typeof level === \"string\") return level;\n if (level === true) return \"info\";\n if (level === false) return \"silent\";\n return VERBOSE_TO_LOG_LEVEL[level] ?? \"info\";\n};\n\n/**\n * 将 verbose 值规范化为数字\n * @param verbose verbose 值(支持字符串、数字、布尔值)\n * @returns 规范化后的数字 (0, 1, 2, 3)\n */\nexport function normalizeVerbose(\n verbose: LogLevel | VerboseLevel | boolean | undefined,\n): 0 | 1 | 2 | 3 {\n if (verbose === undefined || verbose === false || verbose === 0 || verbose === \"silent\") return 0;\n if (verbose === true || verbose === 1 || verbose === \"info\") return 1;\n if (verbose === 2 || verbose === \"verbose\") return 2;\n return 3;\n}\n\n/**\n * 判断是否应该打印指定级别的日志\n * @param verbose 当前 verbose 级别(支持字符串或数字)\n * @param requiredLevel 需要的最低级别 (1, 2, 3)\n * @returns 是否应该打印\n */\nexport function shouldLog(\n verbose: LogLevel | VerboseLevel | undefined,\n requiredLevel: 1 | 2 | 3,\n): boolean {\n return normalizeVerbose(verbose) >= requiredLevel;\n}\n\n/**\n * 解析命令行 verbose 参数\n * 支持: -v, -v 2, -v 3, --verbose, --verbose 2, -vvv (计数模式)\n * @param val 命令行参数值(字符串、布尔值、数字或 undefined)\n * @returns 规范化后的 VerboseLevel\n */\nexport function parseVerbose(val: string | boolean | number | undefined): 0 | 1 | 2 | 3 {\n if (val === undefined || val === 0) return 1;\n if (val === true || val === \"\") return 1;\n if (typeof val === \"number\") return normalizeVerbose(val as VerboseLevel);\n const level = parseInt(val as string, 10);\n if (isNaN(level)) return 1;\n return normalizeVerbose(level as VerboseLevel);\n}\n","import { readFile, writeFile, mkdir, copyFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport type { LlmProxyConfig } from \"../llm-proxy/interfaces\";\nimport { shouldLog, type VerboseLevel } from \"../verbose\";\n\nexport class ClaudeSetupService {\n constructor(protected readonly llmConfig?: LlmProxyConfig) {}\n\n private getPaths() {\n const claudeDir = join(homedir(), \".claude\");\n return {\n claudeDir,\n settingsPath: join(claudeDir, \"settings.json\"),\n settingsBackupPath: join(claudeDir, \"settings.json.bak\"),\n claudeJsonPath: join(homedir(), \".claude.json\"),\n claudeJsonBackupPath: join(homedir(), \".claude.json.bak\"),\n };\n }\n\n async backup(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsPath, paths.settingsBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonPath, paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略文件不存在的情况\n }\n }\n\n async restore(): Promise<void> {\n const paths = this.getPaths();\n try {\n await copyFile(paths.settingsBackupPath, paths.settingsPath);\n await unlink(paths.settingsBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n try {\n await copyFile(paths.claudeJsonBackupPath, paths.claudeJsonPath);\n await unlink(paths.claudeJsonBackupPath);\n } catch (e) {\n // 忽略备份文件不存在的情况\n }\n }\n\n /**\n * 使用临时配置执行操作\n * 自动备份现有配置,执行完成后恢复\n */\n async withTemporaryConfig<T>(fn: () => Promise<T>, verbose?: VerboseLevel): Promise<T> {\n await this.backup();\n try {\n await this.configure(verbose);\n return await fn();\n } finally {\n await this.restore();\n }\n }\n\n async configure(verbose?: VerboseLevel): Promise<void> {\n const { claudeDir, settingsPath, claudeJsonPath } = this.getPaths();\n\n const claudeCode = this.llmConfig?.claudeCode;\n\n if (!claudeCode) {\n if (shouldLog(verbose, 1)) {\n console.log(\"未配置 claude 设置,跳过\");\n }\n return;\n }\n\n try {\n await mkdir(claudeDir, { recursive: true });\n } catch {\n // ignore if exists\n }\n\n let existingSettings = {};\n try {\n const content = await readFile(settingsPath, \"utf-8\");\n existingSettings = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n\n const existing = existingSettings as Record<string, Record<string, unknown>>;\n const env: Record<string, string> = { ...(existing.env as Record<string, string>) };\n if (claudeCode.baseUrl) env.ANTHROPIC_BASE_URL = claudeCode.baseUrl;\n if (claudeCode.authToken) {\n env.ANTHROPIC_AUTH_TOKEN = claudeCode.authToken;\n } else {\n throw new Error(\"未配置 claudeCode.authToken 设置\");\n }\n if (claudeCode.model) env.ANTHROPIC_MODEL = claudeCode.model;\n\n const mergedSettings = {\n ...existingSettings,\n env,\n };\n\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${settingsPath}`);\n }\n\n if (claudeCode.hasCompletedOnboarding !== undefined) {\n let claudeJson: Record<string, unknown> = {};\n try {\n const content = await readFile(claudeJsonPath, \"utf-8\");\n claudeJson = JSON.parse(content);\n } catch {\n // file doesn't exist or invalid JSON\n }\n claudeJson.hasCompletedOnboarding = claudeCode.hasCompletedOnboarding;\n await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2), \"utf-8\");\n if (shouldLog(verbose, 1)) {\n console.log(`✅ 已写入 ${claudeJsonPath}`);\n }\n }\n }\n}\n","export * from \"./claude-setup.service\";\n","import { query, type SpawnOptions } from \"@anthropic-ai/claude-agent-sdk\";\nimport { spawn } from \"child_process\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { ClaudeSetupService } from \"../../claude-setup\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class ClaudeCodeAdapter implements LlmAdapter {\n readonly name = \"claude-code\";\n private readonly claudeSetupService: ClaudeSetupService;\n\n constructor(private readonly config: LlmProxyConfig) {\n // 创建 ClaudeSetupService 实例,传入 LLM 配置\n this.claudeSetupService = new ClaudeSetupService(config);\n }\n\n isConfigured(): boolean {\n return !!this.config.claudeCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n // 备份原有配置\n await this.claudeSetupService.backup();\n\n try {\n // 应用临时配置\n await this.claudeSetupService.configure(options?.verbose);\n\n const claudeConf = this.config.claudeCode;\n\n if (!claudeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.ClaudeCodeAdapter.chatStream] 未配置 claude 设置\",\n };\n return;\n }\n\n const model = options?.model || claudeConf.model || \"claude-sonnet-4-5\";\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] 配置: Model=${model}, BaseURL=${claudeConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n const handleUncaughtError = (err: Error) => {\n if ((err as any).code === \"EPIPE\") {\n console.error(\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] EPIPE 错误: Claude CLI 子进程意外退出\",\n );\n throw err;\n }\n };\n process.on(\"uncaughtException\", handleUncaughtError);\n\n try {\n const spawnEnv = { ...process.env };\n if (claudeConf.baseUrl) spawnEnv.ANTHROPIC_BASE_URL = claudeConf.baseUrl;\n if (claudeConf.authToken) spawnEnv.ANTHROPIC_AUTH_TOKEN = claudeConf.authToken;\n\n const spawnClaudeCodeProcess = (spawnOptions: SpawnOptions) => {\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.ClaudeCodeAdapter.chatStream] Spawning: ${spawnOptions.command} ${spawnOptions.args?.join(\" \")}`,\n );\n }\n const child = spawn(spawnOptions.command, spawnOptions.args || [], {\n ...spawnOptions,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: spawnEnv,\n });\n\n child.stderr?.on(\"data\", (data) => {\n console.error(`[LLMProxy.ClaudeCodeAdapter.chatStream] CLI stderr: ${data.toString()}`);\n });\n\n return child;\n };\n\n const queryOptions: Parameters<typeof query>[0][\"options\"] = {\n model,\n systemPrompt,\n permissionMode: \"default\",\n spawnClaudeCodeProcess,\n };\n\n if (options?.allowedTools?.length) {\n queryOptions.allowedTools = options.allowedTools as any;\n }\n\n if (options?.jsonSchema) {\n queryOptions.outputFormat = {\n type: \"json_schema\",\n schema: options.jsonSchema.getSchema(),\n };\n }\n\n const response = query({\n prompt: userPrompt,\n options: queryOptions,\n });\n\n let finalContent = \"\";\n let structuredOutput: unknown = undefined;\n\n for await (const message of response) {\n if (message.type === \"assistant\") {\n const content = message.message.content;\n if (typeof content === \"string\") {\n yield { type: \"text\", content };\n finalContent += content;\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === \"text\") {\n yield { type: \"text\", content: block.text };\n finalContent += block.text;\n } else if (block.type === \"tool_use\") {\n yield { type: \"tool_use\", name: block.name, input: block.input };\n } else if (block.type === (\"thought\" as any)) {\n yield { type: \"thought\", content: (block as any).thought };\n }\n }\n }\n }\n\n if (message.type === \"result\") {\n if (message.subtype === \"success\") {\n if (message.structured_output) {\n structuredOutput = message.structured_output;\n }\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n structuredOutput,\n },\n };\n } else {\n yield {\n type: \"error\",\n message: `[LLMProxy.ClaudeCodeAdapter.chatStream] ${message.errors?.join(\", \") || \"未知错误\"}`,\n };\n }\n }\n }\n } catch (error: any) {\n if (error?.code === \"EPIPE\" || error?.message?.includes(\"EPIPE\")) {\n yield {\n type: \"error\",\n message:\n \"[LLMProxy.ClaudeCodeAdapter.chatStream] 连接中断 (EPIPE)。请检查:\\n\" +\n \"1. ANTHROPIC_AUTH_TOKEN 环境变量是否正确设置\\n\" +\n \"2. ANTHROPIC_BASE_URL 是否与 Claude Agent SDK 兼容\\n\" +\n \"3. Claude CLI 是否已正确安装\",\n };\n } else {\n throw error;\n }\n } finally {\n process.removeListener(\"uncaughtException\", handleUncaughtError);\n }\n } finally {\n // 恢复原有配置\n await this.claudeSetupService.restore();\n }\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return true;\n }\n}\n","import OpenAI from \"openai\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenAIAdapter implements LlmAdapter {\n readonly name = \"openai\";\n\n private client: OpenAI | null = null;\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openai;\n }\n\n private getClient(): OpenAI {\n if (this.client) {\n return this.client;\n }\n\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.getClient] 未配置 openai 设置\");\n }\n\n this.client = new OpenAI({\n apiKey: openaiConf.apiKey,\n baseURL: openaiConf.baseUrl || undefined,\n });\n\n return this.client;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n throw new Error(\"[LLMProxy.OpenAIAdapter.chat] 未配置 openai 设置\");\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 配置: Model=${model}, BaseURL=${openaiConf.baseUrl || \"(默认)\"}`,\n );\n }\n\n try {\n const response = await client.chat.completions.create({\n model,\n messages: messages,\n });\n\n const content = response.choices[0]?.message?.content || \"\";\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenAIAdapter.chat] 响应: Model=${response.model}, Usage=${response.usage?.total_tokens} tokens`,\n );\n }\n\n return {\n content,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n throw new Error(\n `[LLMProxy.OpenAIAdapter.chat] API 错误 (${error.status}): ${error.message}\\n` +\n `请检查:\\n` +\n `1. API Key 是否正确\\n` +\n `2. Base URL 是否正确\\n` +\n `3. 模型名称是否有效`,\n );\n }\n throw error;\n }\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openaiConf = this.config.openai;\n\n if (!openaiConf) {\n yield { type: \"error\", message: \"[LLMProxy.OpenAIAdapter.chatStream] 未配置 openai 设置\" };\n return;\n }\n\n const client = this.getClient();\n const model = options?.model || openaiConf.model;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(`[LLMProxy.OpenAIAdapter.chatStream] 配置: Model=${model}`);\n }\n try {\n const stream = await client.chat.completions.create({\n model,\n messages: messages,\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n yield { type: \"text\", content: delta };\n fullContent += delta;\n }\n }\n\n yield {\n type: \"result\",\n response: {\n content: fullContent,\n },\n };\n } catch (error: any) {\n if (error instanceof OpenAI.APIError) {\n yield {\n type: \"error\",\n message: `[LLMProxy.OpenAIAdapter.chatStream] API 错误 (${error.status}): ${error.message}`,\n };\n } else {\n throw error;\n }\n }\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","import { createOpencode } from \"@opencode-ai/sdk\";\nimport type { LlmAdapter } from \"./llm-adapter.interface\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmProxyConfig,\n OpenCodeAdapterConfig,\n} from \"../interfaces\";\nimport { shouldLog } from \"../../verbose\";\n\nexport class OpenCodeAdapter implements LlmAdapter {\n readonly name = \"open-code\";\n\n constructor(private readonly config: LlmProxyConfig) {}\n\n isConfigured(): boolean {\n return !!this.config.openCode;\n }\n\n async chat(messages: LlmMessage[], options?: LlmRequestOptions): Promise<LlmResponse> {\n let result: LlmResponse = { content: \"\" };\n\n for await (const event of this.chatStream(messages, options)) {\n if (event.type === \"result\") {\n result = event.response;\n } else if (event.type === \"error\") {\n throw new Error(event.message);\n }\n }\n\n return result;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: LlmRequestOptions,\n ): AsyncIterable<LlmStreamEvent> {\n const openCodeConf = this.config.openCode;\n\n if (!openCodeConf) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 未配置 openCode 设置\",\n };\n return;\n }\n\n const providerID = openCodeConf.providerID || \"openai\";\n const configModel = options?.model || openCodeConf.model || \"gpt-4o\";\n const model = configModel.includes(\"/\") ? configModel : `${providerID}/${configModel}`;\n\n if (shouldLog(options?.verbose, 1)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 配置: Model=${model}, ProviderID=${providerID}, BaseURL=${openCodeConf.baseUrl || \"默认\"}`,\n );\n }\n\n // 创建 OpenCode 实例(自动启动服务器,使用动态端口避免冲突)\n let opencode: Awaited<ReturnType<typeof createOpencode>> | null = null;\n const port = 4096 + Math.floor(Math.random() * 1000);\n\n // 确保进程退出时关闭服务器\n const cleanup = () => {\n if (opencode?.server) {\n opencode.server.close();\n opencode = null;\n }\n };\n process.once(\"exit\", cleanup);\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n opencode = await createOpencode({\n port,\n config: this.buildOpenCodeConfig(openCodeConf, model),\n });\n\n const { client } = opencode;\n\n // 设置 provider 认证(使用自定义 provider ID)\n const customProviderID = \"custom-openai\";\n if (openCodeConf.apiKey) {\n await client.auth.set({\n path: { id: customProviderID },\n body: { type: \"api\", key: openCodeConf.apiKey },\n });\n }\n\n const session = await client.session.create({\n body: { title: `spaceflow-${Date.now()}` },\n });\n\n if (!session.data?.id) {\n yield {\n type: \"error\",\n message: \"[LLMProxy.OpenCodeAdapter.chatStream] 创建 session 失败\",\n };\n return;\n }\n\n const sessionId = session.data.id;\n const systemPrompt = this.extractSystemPrompt(messages);\n const userPrompt = this.extractUserPrompt(messages);\n\n if (systemPrompt) {\n await client.session.prompt({\n path: { id: sessionId },\n body: {\n noReply: true,\n parts: [{ type: \"text\", text: systemPrompt }],\n },\n });\n }\n\n // 从原始 model 中提取 modelID,但使用自定义 provider ID\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 发送 prompt: model=${customProviderID}/${modelID}, userPrompt长度=${userPrompt.length}`,\n );\n }\n\n const result = await client.session.prompt({\n path: { id: sessionId },\n body: {\n model: { providerID: customProviderID, modelID },\n parts: [{ type: \"text\", text: userPrompt }],\n },\n });\n\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 完整响应对象:\\n${JSON.stringify(result, null, 2)}`,\n );\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] result.data:\\n${JSON.stringify(result.data, null, 2)}`,\n );\n }\n\n let finalContent = \"\";\n\n if (result.data?.parts) {\n for (const part of result.data.parts) {\n const partType = part.type;\n\n switch (partType) {\n case \"text\": {\n const text = (part as any).text || \"\";\n yield { type: \"text\", content: text };\n finalContent += text;\n break;\n }\n\n case \"tool\": {\n // 工具调用(ToolPart)\n const toolPart = part as any;\n const state = toolPart.state || {};\n yield {\n type: \"tool_use\",\n name: toolPart.tool || \"unknown\",\n input: state.input || {},\n status: state.status,\n output: state.output,\n title: state.title,\n };\n break;\n }\n\n case \"agent\": {\n // 子代理调用(AgentPart)\n const agentPart = part as any;\n yield {\n type: \"agent\",\n name: agentPart.name || \"unknown\",\n source: agentPart.source?.value,\n };\n break;\n }\n\n case \"subtask\": {\n // 子任务\n const subtaskPart = part as any;\n yield {\n type: \"subtask\",\n agent: subtaskPart.agent,\n prompt: subtaskPart.prompt,\n description: subtaskPart.description,\n };\n break;\n }\n\n case \"step-start\": {\n yield {\n type: \"step_start\",\n snapshot: (part as any).snapshot,\n };\n break;\n }\n\n case \"step-finish\": {\n const stepPart = part as any;\n yield {\n type: \"step_finish\",\n reason: stepPart.reason,\n tokens: stepPart.tokens,\n cost: stepPart.cost,\n };\n break;\n }\n\n case \"reasoning\": {\n const reasoningPart = part as any;\n yield {\n type: \"reasoning\",\n content: reasoningPart.text || \"\",\n };\n break;\n }\n\n default:\n // 其他类型(file, snapshot, patch, retry, compaction 等)暂不处理\n if (shouldLog(options?.verbose, 2)) {\n console.log(\n `[LLMProxy.OpenCodeAdapter.chatStream] 未处理的 part 类型: ${partType}`,\n );\n }\n break;\n }\n }\n }\n\n if (shouldLog(options?.verbose, 1) && !finalContent) {\n console.warn(\n `[LLMProxy.OpenCodeAdapter.chatStream] 警告: 响应内容为空,parts=${JSON.stringify(result.data?.parts)}`,\n );\n }\n\n yield {\n type: \"result\",\n response: {\n content: finalContent,\n },\n };\n\n try {\n await client.session.delete({ path: { id: sessionId } });\n } catch {\n // ignore cleanup errors\n }\n } catch (error: any) {\n yield {\n type: \"error\",\n message:\n `[LLMProxy.OpenCodeAdapter.chatStream] 错误: ${error.message}\\n` +\n `请检查:\\n` +\n `1. baseUrl 配置是否正确\\n` +\n `2. apiKey 是否有效\\n` +\n `3. 模型配置是否有效`,\n };\n } finally {\n // 移除事件监听器\n process.removeListener(\"exit\", cleanup);\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n // 关闭服务器\n cleanup();\n }\n }\n\n /**\n * 构建 OpenCode 配置\n */\n private buildOpenCodeConfig(\n openCodeConf: OpenCodeAdapterConfig,\n model: string,\n ): Record<string, any> {\n // 使用自定义 provider ID(如 custom-openai)而不是 openai\n // 因为 OpenCode 会根据 providerID 决定使用哪个 SDK 方法\n // openai provider 会调用 sdk.responses(),而自定义 provider 使用 @ai-sdk/openai-compatible\n const customProviderID = \"custom-openai\";\n const [, modelID] = model.includes(\"/\") ? model.split(\"/\", 2) : [customProviderID, model];\n\n // 使用 @ai-sdk/openai-compatible,使用 Chat Completions API (/chat/completions)\n const config: Record<string, any> = {\n model: `${customProviderID}/${modelID}`,\n provider: {\n [customProviderID]: {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Custom OpenAI Compatible\",\n },\n },\n };\n\n // 配置 provider baseURL\n if (openCodeConf.baseUrl) {\n config.provider[customProviderID].options = {\n baseURL: openCodeConf.baseUrl,\n };\n }\n\n // 注册自定义模型\n config.provider[customProviderID].models = {\n [modelID]: {\n name: modelID,\n attachment: true,\n reasoning: false,\n temperature: true,\n tool_call: true,\n cost: {\n input: 0,\n output: 0,\n },\n limit: {\n context: 128000,\n output: 16000,\n },\n },\n };\n\n return config;\n }\n\n private extractSystemPrompt(messages: LlmMessage[]): string {\n const systemMessage = messages.find((m) => m.role === \"system\");\n return systemMessage?.content || \"\";\n }\n\n private extractUserPrompt(messages: LlmMessage[]): string {\n const userMessages = messages.filter((m) => m.role === \"user\");\n return userMessages.map((m) => m.content).join(\"\\n\\n\");\n }\n\n isSupportJsonSchema(): boolean {\n return false;\n }\n}\n","export * from \"./llm-adapter.interface\";\nexport * from \"./claude-code.adapter\";\nexport * from \"./openai.adapter\";\nexport * from \"./open-code.adapter\";\n","import { randomUUID } from \"crypto\";\nimport type { LlmAdapter } from \"./adapters\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmStreamEvent,\n LlmSession,\n SessionOptions,\n} from \"./interfaces\";\nimport { type VerboseLevel, normalizeVerbose } from \"../verbose\";\n\nexport class LlmSessionImpl implements LlmSession {\n readonly id: string;\n readonly adapterName: string;\n\n private history: LlmMessage[] = [];\n private systemPrompt: string = \"\";\n private defaultModel?: string;\n private verbose: VerboseLevel = 0;\n\n constructor(\n private readonly adapter: LlmAdapter,\n options?: SessionOptions,\n ) {\n this.id = randomUUID();\n this.adapterName = adapter.name;\n\n if (options?.systemPrompt) {\n this.systemPrompt = options.systemPrompt;\n }\n if (options?.model) {\n this.defaultModel = options.model;\n }\n if (options?.verbose !== undefined) {\n this.verbose = normalizeVerbose(options.verbose);\n }\n }\n\n async send(content: string, options?: LlmRequestOptions): Promise<LlmResponse> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n const response = await this.adapter.chat(messages, mergedOptions);\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: response.content };\n this.history.push(assistantMessage);\n\n return response;\n }\n\n async *sendStream(content: string, options?: LlmRequestOptions): AsyncIterable<LlmStreamEvent> {\n const userMessage: LlmMessage = { role: \"user\", content };\n this.history.push(userMessage);\n\n const messages = this.buildMessages();\n const mergedOptions = this.mergeOptions(options);\n\n let fullContent = \"\";\n\n for await (const event of this.adapter.chatStream(messages, mergedOptions)) {\n yield event;\n\n if (event.type === \"text\") {\n fullContent += event.content;\n } else if (event.type === \"result\") {\n fullContent = event.response.content;\n }\n }\n\n const assistantMessage: LlmMessage = { role: \"assistant\", content: fullContent };\n this.history.push(assistantMessage);\n }\n\n getHistory(): LlmMessage[] {\n return [...this.history];\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n setSystemPrompt(prompt: string): void {\n this.systemPrompt = prompt;\n }\n\n private buildMessages(): LlmMessage[] {\n const messages: LlmMessage[] = [];\n\n if (this.systemPrompt) {\n messages.push({ role: \"system\", content: this.systemPrompt });\n }\n\n messages.push(...this.history);\n\n return messages;\n }\n\n private mergeOptions(options?: LlmRequestOptions): LlmRequestOptions {\n return {\n model: options?.model || this.defaultModel,\n verbose: options?.verbose ?? this.verbose,\n ...options,\n };\n }\n}\n","import type { LlmAdapter } from \"./adapters\";\nimport { ClaudeCodeAdapter } from \"./adapters/claude-code.adapter\";\nimport { OpenAIAdapter } from \"./adapters/openai.adapter\";\nimport { OpenCodeAdapter } from \"./adapters/open-code.adapter\";\nimport { LlmSessionImpl } from \"./llm-session\";\nimport type {\n LlmMessage,\n LlmRequestOptions,\n LlmResponse,\n LlmSession,\n SessionOptions,\n LlmProxyConfig,\n LLMMode,\n} from \"./interfaces\";\nimport type { LlmJsonPut } from \"../llm-jsonput\";\n\nexport interface ChatOptions extends LlmRequestOptions {\n adapter?: LLMMode;\n}\n\nexport class LlmProxyService {\n private adapters: Map<LLMMode, LlmAdapter> = new Map();\n\n constructor(private readonly config: LlmProxyConfig) {\n // 适配器接收完整配置,内部自行读取所需部分\n const claudeCodeAdapter = new ClaudeCodeAdapter(config);\n const openaiAdapter = new OpenAIAdapter(config);\n const openCodeAdapter = new OpenCodeAdapter(config);\n this.adapters.set(\"claude-code\", claudeCodeAdapter);\n this.adapters.set(\"openai\", openaiAdapter);\n this.adapters.set(\"open-code\", openCodeAdapter);\n }\n\n createSession(adapterType?: LLMMode, options?: SessionOptions): LlmSession {\n const type = adapterType || this.getDefaultAdapterType();\n const adapter = this.getAdapter(type);\n\n return new LlmSessionImpl(adapter, options);\n }\n\n async chat(messages: LlmMessage[], options?: ChatOptions): Promise<LlmResponse> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n const response = await adapter.chat(messages, options);\n\n if (options?.jsonSchema && response.content && !response.structuredOutput) {\n response.structuredOutput = await options.jsonSchema.parse(response.content);\n }\n\n return response;\n }\n\n async *chatStream(\n messages: LlmMessage[],\n options?: ChatOptions,\n ): AsyncIterable<import(\"./interfaces\").LlmStreamEvent> {\n const adapterType = options?.adapter || this.getDefaultAdapterType();\n const adapter = this.getAdapter(adapterType);\n\n if (!adapter.isSupportJsonSchema() && options?.jsonSchema) {\n messages = this.appendJsonSchemaSystemPrompt(messages, options.jsonSchema);\n }\n\n for await (const event of adapter.chatStream(messages, options)) {\n if (\n event.type === \"result\" &&\n options?.jsonSchema &&\n event.response.content &&\n !event.response.structuredOutput\n ) {\n try {\n event.response.structuredOutput = await options.jsonSchema.parse(event.response.content);\n } catch (error: any) {\n // JSON 解析失败,保持 structuredOutput 为 undefined\n console.error(\"[LLMProxyService.chatStream] JSON 解析失败:\", error);\n }\n }\n yield event;\n }\n }\n\n appendJsonSchemaSystemPrompt(messages: LlmMessage[], jsonSchema: LlmJsonPut): LlmMessage[] {\n const systemMsg = messages.find((msg) => msg.role === \"system\");\n if (jsonSchema.isMatched(systemMsg?.content || \"\")) {\n return messages;\n }\n if (systemMsg) {\n systemMsg.content += `\\n\\n${jsonSchema.jsonFormatInstruction}`;\n } else {\n messages.unshift({ role: \"system\", content: jsonSchema.jsonFormatInstruction });\n }\n return messages;\n }\n\n getAvailableAdapters(): LLMMode[] {\n const available: LLMMode[] = [];\n\n for (const [type, adapter] of this.adapters) {\n if (adapter.isConfigured()) {\n available.push(type);\n }\n }\n\n return available;\n }\n\n private getDefaultAdapterType(): LLMMode {\n return this.config.defaultAdapter || \"openai\";\n }\n\n private getAdapter(type: LLMMode): LlmAdapter {\n const adapter = this.adapters.get(type);\n\n if (!adapter) {\n throw new Error(`[LLMProxy.getAdapter] 不支持的 LLM 类型: ${type}`);\n }\n\n if (!adapter.isConfigured()) {\n throw new Error(`[LLMProxy.getAdapter] 适配器 \"${type}\" 未配置`);\n }\n\n return adapter;\n }\n}\n","import type { LlmStreamEvent } from \"./interfaces\";\n\nexport interface StreamLoggerState {\n isFirstText: boolean;\n}\n\n/**\n * 创建一个新的 StreamLogger 状态\n */\nexport function createStreamLoggerState(): StreamLoggerState {\n return { isFirstText: true };\n}\n\n/**\n * 记录 LLM 流式事件到终端\n * @param event LLM 流式事件\n * @param state 日志状态(用于跟踪是否是第一个文本块)\n */\nexport function logStreamEvent(event: LlmStreamEvent, state: StreamLoggerState): void {\n switch (event.type) {\n case \"text\":\n if (state.isFirstText) {\n process.stdout.write(\"\\n🤖 AI: \");\n state.isFirstText = false;\n }\n process.stdout.write(event.content);\n break;\n case \"tool_use\":\n console.log(`\\n🛠️ 工具调用: ${event.name}`);\n if (event.title) {\n console.log(` 标题: ${event.title}`);\n }\n console.log(` 输入: ${JSON.stringify(event.input)}`);\n if (event.status) {\n console.log(` 状态: ${event.status}`);\n }\n if (event.output) {\n console.log(\n ` 输出: ${event.output.substring(0, 200)}${event.output.length > 200 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"thought\":\n console.log(`\\n💭 思考: ${event.content}`);\n state.isFirstText = true;\n break;\n case \"result\":\n console.log(`\\n✅ 结果已返回`);\n state.isFirstText = true;\n break;\n case \"error\":\n console.error(`\\n❌ 错误: ${event.message}`);\n state.isFirstText = true;\n break;\n case \"agent\":\n console.log(`\\n🤖 子代理: ${event.name}`);\n if (event.source) {\n console.log(\n ` 来源: ${event.source.substring(0, 100)}${event.source.length > 100 ? \"...\" : \"\"}`,\n );\n }\n state.isFirstText = true;\n break;\n case \"subtask\":\n console.log(`\\n📋 子任务: ${event.description}`);\n console.log(` 代理: ${event.agent}`);\n console.log(\n ` 提示: ${event.prompt.substring(0, 100)}${event.prompt.length > 100 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n case \"step_start\":\n console.log(`\\n▶️ 步骤开始`);\n state.isFirstText = true;\n break;\n case \"step_finish\":\n console.log(`\\n⏹️ 步骤结束: ${event.reason}`);\n if (event.tokens) {\n const tokens = event.tokens as any;\n console.log(\n ` Token: 输入=${tokens.input || 0}, 输出=${tokens.output || 0}, 推理=${tokens.reasoning || 0}`,\n );\n }\n if (event.cost !== undefined) {\n console.log(` 成本: $${event.cost.toFixed(6)}`);\n }\n state.isFirstText = true;\n break;\n case \"reasoning\":\n console.log(\n `\\n🧠 推理: ${event.content.substring(0, 200)}${event.content.length > 200 ? \"...\" : \"\"}`,\n );\n state.isFirstText = true;\n break;\n }\n}\n","export * from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./llm-session\";\nexport * from \"./llm-proxy.service\";\nexport * from \"./stream-logger\";\n","/**\n * 飞书 SDK 卡片交互回调相关类型\n */\n\nimport type { I18nLocale } from \"./common\";\nimport type { CardData } from \"./card\";\n\n/** 卡片交互事件名称常量 */\nexport const FEISHU_CARD_ACTION_TRIGGER = \"card.action.trigger\" as const;\n\n/** 回调基本信息 (header) */\nexport interface CardActionHeader {\n /** 回调的唯一标识 */\n event_id: string;\n /** 应用的 Verification Token */\n token: string;\n /** 回调发送的时间,微秒级时间戳 */\n create_time: string;\n /** 回调类型,固定为 \"card.action.trigger\" */\n event_type: typeof FEISHU_CARD_ACTION_TRIGGER;\n /** 应用归属的 tenant key */\n tenant_key: string;\n /** 应用的 App ID */\n app_id: string;\n}\n\n/** 操作者信息 */\nexport interface CardActionOperator {\n /** 回调触发者的 tenant key */\n tenant_key: string;\n /** 回调触发者的 user_id (需开启权限) */\n user_id?: string;\n /** 回调触发者的 open_id */\n open_id: string;\n /** 回调触发者的 union_id */\n union_id?: string;\n}\n\n/** 交互信息 */\nexport interface CardActionInfo {\n /** 交互组件绑定的开发者自定义回传数据 */\n value?: Record<string, unknown> | string;\n /** 交互组件的标签 */\n tag: string;\n /** 用户当前所在地区的时区 */\n timezone?: string;\n /** 组件的自定义唯一标识 */\n name?: string;\n /** 表单容器内用户提交的数据 */\n form_value?: Record<string, unknown>;\n /** 输入框组件提交的数据 (未内嵌在表单中时) */\n input_value?: string;\n /** 单选组件的选项回调值 */\n option?: string;\n /** 多选组件的选项回调值 */\n options?: string[];\n /** 勾选器组件的回调数据 */\n checked?: boolean;\n}\n\n/** 展示场景上下文 */\nexport interface CardActionContext {\n /** 链接地址 (适用于链接预览场景) */\n url?: string;\n /** 链接预览的 token */\n preview_token?: string;\n /** 消息 ID */\n open_message_id: string;\n /** 会话 ID */\n open_chat_id: string;\n}\n\n/** 回调详细信息 (event) */\nexport interface CardActionEventData {\n /** 回调触发者信息 */\n operator: CardActionOperator;\n /** 更新卡片用的凭证,有效期 30 分钟,最多可更新 2 次 */\n token: string;\n /** 交互信息 */\n action: CardActionInfo;\n /** 卡片展示场景 */\n host?: string;\n /** 卡片分发类型,链接预览卡片时为 url_preview */\n delivery_type?: \"url_preview\";\n /** 展示场景上下文 */\n context: CardActionContext;\n}\n\n/** 回调结构体 (schema 2.0) */\nexport interface CardActionTriggerCallback {\n /** 回调版本,固定为 \"2.0\" */\n schema: \"2.0\";\n /** 回调基本信息 */\n header: CardActionHeader;\n /** 回调详细信息 */\n event: CardActionEventData;\n}\n\n/** Toast 提示配置 */\nexport interface CardActionToast {\n /** 弹窗提示的类型 */\n type?: \"info\" | \"success\" | \"error\" | \"warning\";\n /** 单语言提示文案 */\n content?: string;\n /** 多语言提示文案 */\n i18n?: Partial<Record<I18nLocale, string>>;\n}\n\n/** 响应回调的结构体 */\nexport interface CardActionTriggerResponse {\n /** Toast 弹窗提示 */\n toast?: CardActionToast;\n /** 卡片数据 (用于更新卡片) */\n card?: CardData;\n}\n\n/** 交互事件回调接口 */\nexport interface CardActionTriggerEventCallback {\n /** 完成回调,返回响应结果 */\n done: (result: CardActionTriggerResponse) => void;\n}\n\n/** 交互事件 (用于事件监听器),包含回调数据和 done 方法 */\nexport interface CardActionTriggerEvent\n extends CardActionTriggerEventCallback, CardActionTriggerCallback {}\n\n/** 事件注册类型 */\nexport interface CardEvents {\n [FEISHU_CARD_ACTION_TRIGGER]: (\n data: CardActionTriggerCallback,\n ) => Promise<CardActionTriggerResponse>;\n}\n","import { EventEmitter } from \"events\";\nimport * as lark from \"@larksuiteoapi/node-sdk\";\nimport {\n FeishuModuleOptions,\n FeishuUser,\n GetUserParams,\n FEISHU_CARD_ACTION_TRIGGER,\n type CardEvents,\n type CardActionTriggerResponse,\n type CardActionTriggerEvent,\n} from \"./types\";\n\n/**\n * 飞书 API 服务\n */\nexport class FeishuSdkService {\n protected readonly client: lark.Client;\n protected readonly eventEmitter: EventEmitter;\n private eventDispatcher: lark.EventDispatcher | null = null;\n\n constructor(protected readonly options: FeishuModuleOptions) {\n this.eventEmitter = new EventEmitter();\n this.client = new lark.Client({\n appId: options.appId,\n appSecret: options.appSecret,\n appType: options.appType === \"store\" ? lark.AppType.ISV : lark.AppType.SelfBuild,\n domain: options.domain === \"lark\" ? lark.Domain.Lark : lark.Domain.Feishu,\n });\n\n this.initEventDispatcher();\n }\n\n /**\n * 注册事件监听器\n */\n on(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.on(eventName, listener);\n }\n\n /**\n * 移除事件监听器\n */\n off(eventName: string, listener: (...args: any[]) => void): void {\n this.eventEmitter.off(eventName, listener);\n }\n\n private initEventDispatcher(): void {\n this.eventDispatcher = new lark.EventDispatcher({\n encryptKey: \"encrypt key\",\n }).register<CardEvents>({\n [FEISHU_CARD_ACTION_TRIGGER]: async (data) => {\n let done: (result: CardActionTriggerResponse) => void = () => null;\n const p = new Promise<CardActionTriggerResponse>((resolve) => {\n done = resolve;\n });\n\n // 转换为事件监听器友好的格式\n const event: CardActionTriggerEvent = {\n ...data,\n done,\n };\n\n this.eventEmitter.emit(FEISHU_CARD_ACTION_TRIGGER, event);\n return await p;\n },\n });\n }\n\n destroy(): void {\n this.eventEmitter.removeAllListeners();\n }\n\n /**\n * 验证飞书配置\n */\n validateConfig(): void {\n if (!this.options?.appId) {\n throw new Error(\"缺少配置 feishu.appId (环境变量 FEISHU_APP_ID)\");\n }\n\n if (!this.options?.appSecret) {\n throw new Error(\"缺少配置 feishu.appSecret (环境变量 FEISHU_APP_SECRET)\");\n }\n }\n\n /**\n * 获取原始 Lark Client 实例\n * 用于调用 SDK 中未封装的 API\n */\n getClient(): lark.Client {\n return this.client;\n }\n\n /**\n * 获取用户信息\n * @param params 获取用户信息的参数\n * @returns 用户信息\n */\n async getUser(params: GetUserParams): Promise<FeishuUser | null> {\n const { userId, userIdType = \"open_id\", departmentIdType } = params;\n\n const response = await this.client.contact.user.get({\n path: {\n user_id: userId,\n },\n params: {\n user_id_type: userIdType,\n department_id_type: departmentIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return response.data?.user as FeishuUser | null;\n }\n\n /**\n * 批量获取用户信息\n * @param userIds 用户 ID 列表\n * @param userIdType 用户 ID 类型\n * @returns 用户信息列表\n */\n async batchGetUsers(\n userIds: string[],\n userIdType: \"open_id\" | \"union_id\" | \"user_id\" = \"open_id\",\n ): Promise<FeishuUser[]> {\n const response = await this.client.contact.user.batch({\n params: {\n user_ids: userIds,\n user_id_type: userIdType,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书 API 错误: ${response.code} - ${response.msg}`);\n }\n\n return (response.data?.items || []) as FeishuUser[];\n }\n}\n","import { FeishuSdkService } from \"./feishu-sdk.service\";\nimport {\n SendCardParams,\n ReplyCardParams,\n UpdateCardParams,\n SendMessageResponse,\n CardContent,\n type CardActionTriggerCallback,\n} from \"./types\";\nimport { FEISHU_CARD_ACTION_TRIGGER } from \"./types\";\n\n/**\n * 飞书卡片消息服务\n * 提供卡片消息的发送、回复、更新功能\n */\nexport class FeishuCardService {\n constructor(protected readonly feishuSdkService: FeishuSdkService) {\n // 监听卡片动作触发事件\n feishuSdkService.on(FEISHU_CARD_ACTION_TRIGGER, (event) => {\n this.handleCardActionTrigger(event);\n });\n }\n\n async handleCardActionTrigger(event: CardActionTriggerCallback): Promise<void> {\n const _eventHook = event.header.event_type ?? event.event.action.tag;\n\n // console.log(_eventHook);\n }\n\n /**\n * 将卡片内容转换为字符串\n */\n protected serializeCard(card: CardContent): string {\n return typeof card === \"string\" ? card : JSON.stringify(card);\n }\n\n /**\n * 转换 API 响应为统一格式\n */\n protected transformMessageResponse(data: any): SendMessageResponse {\n return {\n messageId: data.message_id,\n rootId: data.root_id,\n parentId: data.parent_id,\n msgType: data.msg_type,\n createTime: data.create_time,\n updateTime: data.update_time,\n deleted: data.deleted,\n updated: data.updated,\n chatId: data.chat_id,\n sender: {\n id: data.sender?.id,\n idType: data.sender?.id_type,\n senderType: data.sender?.sender_type,\n tenantKey: data.sender?.tenant_key,\n },\n };\n }\n\n /**\n * 发送卡片消息\n * @param params 发送卡片消息的参数\n * @returns 发送结果\n */\n async sendCard(params: SendCardParams): Promise<SendMessageResponse> {\n const { receiveId, receiveIdType, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.create({\n params: {\n receive_id_type: receiveIdType,\n },\n data: {\n receive_id: receiveId,\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书发送卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 回复卡片消息\n * @param params 回复卡片消息的参数\n * @returns 回复结果\n */\n async replyCard(params: ReplyCardParams): Promise<SendMessageResponse> {\n const { messageId, card, uuid } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.reply({\n path: {\n message_id: messageId,\n },\n data: {\n msg_type: \"interactive\",\n content: this.serializeCard(card),\n uuid,\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书回复卡片失败: ${response.code} - ${response.msg}`);\n }\n\n return this.transformMessageResponse(response.data);\n }\n\n /**\n * 更新卡片消息\n * @param params 更新卡片消息的参数\n * @returns 更新是否成功\n */\n async updateCard(params: UpdateCardParams): Promise<void> {\n const { messageId, card } = params;\n const client = this.feishuSdkService.getClient();\n\n const response = await client.im.message.patch({\n path: {\n message_id: messageId,\n },\n data: {\n content: this.serializeCard(card),\n },\n });\n\n if (response.code !== 0) {\n throw new Error(`飞书更新卡片失败: ${response.code} - ${response.msg}`);\n }\n }\n}\n","/**\n * 飞书 SDK 模块配置类型\n */\n\nexport const FEISHU_MODULE_OPTIONS = \"FEISHU_MODULE_OPTIONS\";\n\nexport interface FeishuModuleOptions {\n /** 应用 ID */\n appId: string;\n /** 应用密钥 */\n appSecret: string;\n /** 应用类型:自建应用或商店应用 */\n appType?: \"self_build\" | \"store\";\n /** 域名:飞书或 Lark */\n domain?: \"feishu\" | \"lark\";\n}\n\nexport interface FeishuModuleAsyncOptions {\n useFactory: (...args: any[]) => Promise<FeishuModuleOptions> | FeishuModuleOptions;\n inject?: any[];\n}\n","/**\n * 飞书 SDK 类型定义\n */\n\n// Module - 模块配置\nexport {\n FEISHU_MODULE_OPTIONS,\n type FeishuModuleOptions,\n type FeishuModuleAsyncOptions,\n} from \"./module\";\n\n// Common - 通用类型\nexport { type I18nLocale } from \"./common\";\n\n// User - 用户相关\nexport { type UserIdType, type FeishuUser, type GetUserParams } from \"./user\";\n\n// Message - 消息相关\nexport { type ReceiveIdType, type SendMessageResponse } from \"./message\";\n\n// Card - 卡片消息\nexport {\n type CardContent,\n type SendCardParams,\n type ReplyCardParams,\n type UpdateCardParams,\n type CardDataRaw,\n type CardDataTemplate,\n type CardData,\n} from \"./card\";\n\n// CardAction - 卡片交互回调\nexport {\n FEISHU_CARD_ACTION_TRIGGER,\n type CardActionHeader,\n type CardActionOperator,\n type CardActionInfo,\n type CardActionContext,\n type CardActionEventData,\n type CardActionTriggerCallback,\n type CardActionToast,\n type CardActionTriggerResponse,\n type CardActionTriggerEventCallback,\n type CardActionTriggerEvent,\n type CardEvents,\n} from \"./card-action\";\n","export * from \"./feishu-sdk.service\";\nexport * from \"./fieshu-card.service\";\nexport * from \"./types/index\";\n","import { type StorageAdapter } from \"./adapters/storage-adapter.interface\";\nimport type { IStorageService } from \"../../extension-system/types\";\n\n/**\n * Storage 服务配置选项\n */\nexport interface StorageServiceOptions {\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl?: number;\n /** 最大 key 数量,超过时会淘汰最早过期的 key,0 或 undefined 表示不限制 */\n maxKeys?: number;\n}\n\n/**\n * Storage 服务\n * 提供统一的键值存储接口,支持过期时间和层级 key\n *\n * Key 使用 : 作为层级分隔符,例如:\n * - user:123:profile\n * - cache:api:users\n */\nexport class StorageService implements IStorageService {\n protected cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n protected readonly adapter: StorageAdapter,\n protected readonly options: StorageServiceOptions = {},\n ) {\n // 启动定期清理过期项的定时器\n this.startCleanupTimer();\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n }\n\n /**\n * 启动定期清理过期项的定时器\n */\n protected startCleanupTimer(): void {\n // 每分钟清理一次过期项\n this.cleanupTimer = setInterval(() => {\n this.cleanup().catch(console.error);\n }, 60 * 1000);\n // 使用 unref() 让定时器不阻止进程退出\n this.cleanupTimer.unref();\n }\n\n /**\n * 清理所有过期项\n */\n async cleanup(): Promise<number> {\n const now = Date.now();\n const allKeys = await this.adapter.keys();\n let cleaned = 0;\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && item.expireAt && item.expireAt <= now) {\n await this.adapter.delete(key);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n /**\n * 获取值\n * @param key 键名,支持 : 分隔的层级结构\n * @returns 值,如果不存在或已过期返回 undefined\n */\n async get<T = any>(key: string): Promise<T | undefined> {\n const item = await this.adapter.get<T>(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n /**\n * 设置值\n * @param key 键名,支持 : 分隔的层级结构\n * @param value 值\n * @param ttl 过期时间(毫秒),0 或 undefined 表示使用默认值\n */\n async set<T = any>(key: string, value: T, ttl?: number): Promise<void> {\n const effectiveTtl = ttl ?? this.options.defaultTtl ?? 0;\n\n // 检查是否需要淘汰\n if (this.options.maxKeys && this.options.maxKeys > 0) {\n const exists = await this.adapter.has(key);\n if (!exists) {\n await this.evictIfNeeded();\n }\n }\n\n await this.adapter.set(key, {\n value,\n expireAt: effectiveTtl > 0 ? Date.now() + effectiveTtl : undefined,\n });\n }\n\n /**\n * 如果超过最大 key 数量,淘汰最早过期的 key\n */\n protected async evictIfNeeded(): Promise<void> {\n const maxKeys = this.options.maxKeys;\n if (!maxKeys || maxKeys <= 0) return;\n\n const currentSize = await this.adapter.size();\n if (currentSize < maxKeys) return;\n\n // 先清理过期的 key\n await this.cleanup();\n\n // 再次检查\n const sizeAfterCleanup = await this.adapter.size();\n if (sizeAfterCleanup < maxKeys) return;\n\n // 仍然超过限制,淘汰最早过期的 key\n const allKeys = await this.adapter.keys();\n const keyWithExpire: { key: string; expireAt: number }[] = [];\n\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item) {\n keyWithExpire.push({\n key,\n expireAt: item.expireAt ?? Infinity, // 永不过期的放最后\n });\n }\n }\n\n // 按过期时间排序,最早过期的在前面\n keyWithExpire.sort((a, b) => a.expireAt - b.expireAt);\n\n // 淘汰超出的 key\n const toEvict = sizeAfterCleanup - maxKeys + 1; // +1 为新 key 腾出空间\n for (let i = 0; i < toEvict && i < keyWithExpire.length; i++) {\n await this.adapter.delete(keyWithExpire[i].key);\n }\n }\n\n /**\n * 删除值\n * @param key 键名\n * @returns 是否删除成功\n */\n async del(key: string): Promise<boolean> {\n return this.adapter.delete(key);\n }\n\n /**\n * 检查键是否存在(且未过期)\n * @param key 键名\n */\n async has(key: string): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * 获取匹配的键名列表\n * @param pattern 匹配模式,支持 * 通配符\n *\n * 示例:\n * - keys('user:*') 获取所有以 user: 开头的键\n * - keys('*:profile') 获取所有以 :profile 结尾的键\n * - keys('user:*:settings') 获取匹配模式的键\n */\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = await this.adapter.keys(pattern);\n const now = Date.now();\n const validKeys: string[] = [];\n\n // 过滤掉已过期的键\n for (const key of allKeys) {\n const item = await this.adapter.get(key);\n if (item && (!item.expireAt || item.expireAt > now)) {\n validKeys.push(key);\n }\n }\n\n return validKeys;\n }\n\n /**\n * 获取指定前缀下的所有键\n * @param prefix 前缀,例如 'user:123'\n */\n async keysWithPrefix(prefix: string): Promise<string[]> {\n return this.keys(`${prefix}:*`);\n }\n\n /**\n * 删除指定前缀下的所有键\n * @param prefix 前缀\n * @returns 删除的键数量\n */\n async delByPrefix(prefix: string): Promise<number> {\n const keysToDelete = await this.keysWithPrefix(prefix);\n let deleted = 0;\n\n for (const key of keysToDelete) {\n if (await this.adapter.delete(key)) {\n deleted++;\n }\n }\n\n return deleted;\n }\n\n /**\n * 设置过期时间\n * @param key 键名\n * @param ttl 过期时间(毫秒)\n * @returns 是否设置成功\n */\n async expire(key: string, ttl: number): Promise<boolean> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return false;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return false;\n }\n\n await this.adapter.set(key, {\n ...item,\n expireAt: ttl > 0 ? Date.now() + ttl : undefined,\n });\n\n return true;\n }\n\n /**\n * 获取剩余过期时间\n * @param key 键名\n * @returns 剩余时间(毫秒),-1 表示永不过期,undefined 表示键不存在\n */\n async ttl(key: string): Promise<number | undefined> {\n const item = await this.adapter.get(key);\n\n if (!item) {\n return undefined;\n }\n\n // 检查是否已过期\n if (item.expireAt && item.expireAt <= Date.now()) {\n await this.adapter.delete(key);\n return undefined;\n }\n\n if (!item.expireAt) {\n return -1; // 永不过期\n }\n\n return item.expireAt - Date.now();\n }\n\n /**\n * 清空所有存储\n */\n async clear(): Promise<void> {\n await this.adapter.clear();\n }\n\n /**\n * 获取当前存储的 key 数量\n */\n async size(): Promise<number> {\n return this.adapter.size();\n }\n}\n","import { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 内存存储适配器\n * 数据存储在内存中,进程重启后数据丢失\n */\nexport class MemoryAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageItem } from \"../types\";\nimport { StorageAdapter } from \"./storage-adapter.interface\";\n\n/**\n * 文件存储适配器\n * 数据持久化到 JSON 文件,支持进程重启后恢复\n */\nexport class FileAdapter implements StorageAdapter {\n protected store = new Map<string, StorageItem>();\n protected filePath: string;\n protected saveTimer: ReturnType<typeof setTimeout> | null = null;\n protected readonly debounceMs = 100; // 防抖延迟\n\n constructor(filePath: string) {\n this.filePath = filePath;\n this.load();\n }\n\n /**\n * 从文件加载数据\n */\n protected load(): void {\n try {\n if (fs.existsSync(this.filePath)) {\n const data = fs.readFileSync(this.filePath, \"utf-8\");\n const parsed = JSON.parse(data) as Record<string, StorageItem>;\n this.store = new Map(Object.entries(parsed));\n }\n } catch {\n // 文件不存在或解析失败,使用空存储\n this.store = new Map();\n }\n }\n\n /**\n * 保存数据到文件(防抖)\n */\n protected save(): void {\n if (this.saveTimer) {\n clearTimeout(this.saveTimer);\n }\n\n this.saveTimer = setTimeout(() => {\n this.saveSync();\n this.saveTimer = null;\n }, this.debounceMs);\n }\n\n /**\n * 同步保存数据到文件\n */\n protected saveSync(): void {\n try {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const data = Object.fromEntries(this.store);\n fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), \"utf-8\");\n } catch (error) {\n console.error(\"Failed to save storage file:\", error);\n }\n }\n\n async get<T = any>(key: string): Promise<StorageItem<T> | undefined> {\n return this.store.get(key) as StorageItem<T> | undefined;\n }\n\n async set<T = any>(key: string, item: StorageItem<T>): Promise<void> {\n this.store.set(key, item);\n this.save();\n }\n\n async delete(key: string): Promise<boolean> {\n const result = this.store.delete(key);\n if (result) {\n this.save();\n }\n return result;\n }\n\n async has(key: string): Promise<boolean> {\n return this.store.has(key);\n }\n\n async keys(pattern?: string): Promise<string[]> {\n const allKeys = Array.from(this.store.keys());\n\n if (!pattern) {\n return allKeys;\n }\n\n // 将通配符模式转换为正则表达式\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // 转义特殊字符\n .replace(/\\*/g, \".*\"); // * 转换为 .*\n\n const regex = new RegExp(`^${regexPattern}$`);\n return allKeys.filter((key) => regex.test(key));\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n this.save();\n }\n\n async size(): Promise<number> {\n return this.store.size;\n }\n}\n","export * from \"./storage-adapter.interface\";\nexport * from \"./memory.adapter\";\nexport * from \"./file.adapter\";\n","export * from \"./storage.service\";\nexport * from \"./types\";\nexport * from \"./adapters\";\n","export interface ParallelTask<T, R> {\n id: string;\n data: T;\n execute: (data: T) => Promise<R>;\n}\n\nexport interface ParallelResult<R> {\n id: string;\n success: boolean;\n result?: R;\n error?: Error;\n}\n\nexport interface ParallelExecutorOptions {\n concurrency?: number;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n onProgress?: (completed: number, total: number, taskId: string) => void;\n onTaskStart?: (taskId: string) => void;\n onTaskComplete?: (taskId: string, success: boolean) => void;\n onRetry?: (taskId: string, attempt: number, error: Error) => void;\n stopOnError?: boolean;\n}\n\nexport class ParallelExecutor {\n private readonly concurrency: number;\n private readonly timeout?: number;\n private readonly retries: number;\n private readonly retryDelay: number;\n private readonly onProgress?: (completed: number, total: number, taskId: string) => void;\n private readonly onTaskStart?: (taskId: string) => void;\n private readonly onTaskComplete?: (taskId: string, success: boolean) => void;\n private readonly onRetry?: (taskId: string, attempt: number, error: Error) => void;\n private readonly stopOnError: boolean;\n\n constructor(options: ParallelExecutorOptions = {}) {\n this.concurrency = options.concurrency ?? 5;\n this.timeout = options.timeout;\n this.retries = options.retries ?? 0;\n this.retryDelay = options.retryDelay ?? 1000;\n this.onProgress = options.onProgress;\n this.onTaskStart = options.onTaskStart;\n this.onTaskComplete = options.onTaskComplete;\n this.onRetry = options.onRetry;\n this.stopOnError = options.stopOnError ?? false;\n }\n\n async execute<T, R>(tasks: ParallelTask<T, R>[]): Promise<ParallelResult<R>[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult<R>[] = [];\n const total = tasks.length;\n let completed = 0;\n let shouldStop = false;\n\n const executeTask = async (task: ParallelTask<T, R>): Promise<ParallelResult<R>> => {\n if (shouldStop) {\n return { id: task.id, success: false, error: new Error(\"Execution stopped\") };\n }\n\n this.onTaskStart?.(task.id);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n this.onRetry?.(task.id, attempt, lastError!);\n await this.delay(this.retryDelay);\n }\n\n try {\n const result = await this.executeWithTimeout(task, task.data);\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, true);\n return { id: task.id, success: true, result };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n completed++;\n this.onProgress?.(completed, total, task.id);\n this.onTaskComplete?.(task.id, false);\n\n if (this.stopOnError) {\n shouldStop = true;\n }\n\n return {\n id: task.id,\n success: false,\n error: lastError,\n };\n };\n\n // 使用滑动窗口并发控制\n const pending: Promise<void>[] = [];\n const taskQueue = [...tasks];\n\n while (taskQueue.length > 0 || pending.length > 0) {\n // 填充到并发上限\n while (pending.length < this.concurrency && taskQueue.length > 0 && !shouldStop) {\n const task = taskQueue.shift()!;\n const promise = executeTask(task).then((result) => {\n results.push(result);\n // 从 pending 中移除\n const index = pending.indexOf(promise);\n if (index > -1) {\n pending.splice(index, 1);\n }\n });\n pending.push(promise);\n }\n\n // 等待任意一个完成\n if (pending.length > 0) {\n await Promise.race(pending);\n }\n }\n\n // 按原始顺序排序结果\n const taskIdOrder = new Map(tasks.map((t, i) => [t.id, i]));\n results.sort((a, b) => (taskIdOrder.get(a.id) ?? 0) - (taskIdOrder.get(b.id) ?? 0));\n\n return results;\n }\n\n async map<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n getId?: (item: T, index: number) => string,\n ): Promise<ParallelResult<R>[]> {\n const tasks: ParallelTask<{ item: T; index: number }, R>[] = items.map((item, index) => ({\n id: getId ? getId(item, index) : String(index),\n data: { item, index },\n execute: async ({ item, index }) => fn(item, index),\n }));\n\n return this.execute(tasks);\n }\n\n private async executeWithTimeout<T, R>(task: ParallelTask<T, R>, data: T): Promise<R> {\n if (!this.timeout) {\n return task.execute(data);\n }\n\n return Promise.race([\n task.execute(data),\n new Promise<R>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Task ${task.id} timed out after ${this.timeout}ms`)),\n this.timeout,\n ),\n ),\n ]);\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport function parallel(options?: ParallelExecutorOptions): ParallelExecutor {\n return new ParallelExecutor(options);\n}\n","export * from \"./parallel-executor\";\n","import { randomUUID } from \"crypto\";\nimport type { IOutputService } from \"../../extension-system/types\";\n\nconst OUTPUT_MARKER_START = \"::spaceflow-output::\";\nconst OUTPUT_MARKER_END = \"::end::\";\n\n/**\n * OutputService - 用于标准化命令输出\n *\n * 命令可以通过此服务设置输出值,这些值会在命令执行完成后\n * 以特定格式输出到 stdout,供 CI 流程中的其他步骤使用。\n *\n * 输出格式: ::spaceflow-output::{\"key\":\"value\",\"_cacheId\":\"uuid\"}::end::\n *\n * _cacheId 用于 actions/cache 在不同 job 之间传递数据\n *\n * 使用示例:\n * ```typescript\n * const output = new OutputService();\n * output.set(\"version\", \"1.0.0\");\n * output.set(\"tag\", \"v1.0.0\");\n * output.flush();\n * ```\n */\nexport class OutputService implements IOutputService {\n protected outputs: Record<string, string> = {};\n protected cacheId: string = randomUUID();\n\n /**\n * 设置单个输出值\n */\n set(key: string, value: string | number | boolean): void {\n this.outputs[key] = String(value);\n }\n\n /**\n * 批量设置输出值\n */\n setAll(values: Record<string, string | number | boolean>): void {\n for (const [key, value] of Object.entries(values)) {\n this.set(key, value);\n }\n }\n\n /**\n * 获取所有输出值\n */\n getAll(): Record<string, string> {\n return { ...this.outputs };\n }\n\n /**\n * 清空所有输出值\n */\n clear(): void {\n this.outputs = {};\n }\n\n /**\n * 输出所有值到 stdout(带标记格式)\n * 通常在命令执行完成后调用\n * _cacheId 会被 actions 捕获并用于 actions/cache\n */\n flush(): void {\n if (Object.keys(this.outputs).length === 0) {\n return;\n }\n\n // 输出到 stdout,包含 cacheId 供 actions/cache 使用\n const outputWithCache = { ...this.outputs, _cacheId: this.cacheId };\n const json = JSON.stringify(outputWithCache);\n console.log(`${OUTPUT_MARKER_START}${json}${OUTPUT_MARKER_END}`);\n }\n\n /**\n * 检查是否有输出值\n */\n hasOutputs(): boolean {\n return Object.keys(this.outputs).length > 0;\n }\n\n /**\n * 获取当前 cacheId\n */\n getCacheId(): string {\n return this.cacheId;\n }\n\n /**\n * 输出信息\n */\n info(message: string): void {\n console.log(message);\n }\n\n /**\n * 输出成功信息\n */\n success(message: string): void {\n console.log(`✅ ${message}`);\n }\n\n /**\n * 输出警告\n */\n warn(message: string): void {\n console.warn(`⚠️ ${message}`);\n }\n\n /**\n * 输出错误\n */\n error(message: string): void {\n console.error(`❌ ${message}`);\n }\n\n /**\n * 输出调试信息\n */\n debug(message: string): void {\n if (process.env.DEBUG) {\n console.debug(`🔍 ${message}`);\n }\n }\n}\n\nexport { OUTPUT_MARKER_START, OUTPUT_MARKER_END };\n","export * from \"./output.service\";\n","/**\n * 编辑器配置目录映射\n * key: 编辑器名称(用于配置文件)\n * value: 编辑器配置目录名(以 . 开头)\n */\nexport const EDITOR_DIR_MAPPING: Record<string, string> = {\n claudeCode: \".claude\",\n windsurf: \".windsurf\",\n cursor: \".cursor\",\n opencode: \".opencode\",\n};\n\n/**\n * 默认支持的编辑器\n */\nexport const DEFAULT_EDITOR = \"claudeCode\";\n\n/**\n * 根据编辑器名称获取配置目录名\n */\nexport function getEditorDirName(editor: string): string {\n return EDITOR_DIR_MAPPING[editor] || `.${editor}`;\n}\n","import { jsonrepair } from \"jsonrepair\";\nimport type { LlmJsonPutSchema, LlmJsonSchema } from \"./types\";\n\nexport type { LlmJsonPutSchema, LlmJsonSchema, LlmJsonSchemaType } from \"./types\";\n\nexport interface ParseOptions {\n disableRequestRetry?: boolean;\n}\n\nexport interface LlmJsonPutOptions {\n llmRequest?: (prompt: { systemPrompt: string; userPrompt: string }) => Promise<string>;\n systemPrompt?: string;\n}\n\nconst JSON_FORMAT_INSTRUCTION = `请严格以 JSON 格式输出结果,不要输出任何其他内容,格式如下:`;\n\nexport class LlmJsonPut<T = any> {\n public readonly jsonFormatInstruction: string;\n constructor(\n protected schema: LlmJsonPutSchema,\n protected opts?: LlmJsonPutOptions,\n ) {\n this.jsonFormatInstruction = this.getJsonFormatInstruction(schema);\n }\n\n isMatched(prompt: string): boolean {\n return prompt.includes(JSON_FORMAT_INSTRUCTION);\n }\n\n getSchema(): Record<string, unknown> {\n return this.schema as unknown as Record<string, unknown>;\n }\n\n getJsonFormatInstruction(schema: LlmJsonPutSchema): string {\n const generateExample = (s: LlmJsonSchema): any => {\n if (s.type === \"object\") {\n const obj: any = {};\n for (const [key, value] of Object.entries(s.properties || {})) {\n obj[key] = generateExample(value);\n }\n return obj;\n } else if (s.type === \"array\") {\n return [generateExample(s.items!)];\n }\n return s.description || `<${s.type}>`;\n };\n\n const example = JSON.stringify(generateExample(schema), null, 2);\n\n return `${JSON_FORMAT_INSTRUCTION}\\n\\`\\`\\`json\\n${example}\\`\\`\\`\\n注意:只输出 JSON,不要包含 markdown 代码块或其他文字。`;\n }\n\n async parse(input: string, opts?: ParseOptions): Promise<T> {\n let content = input.trim();\n\n // 尝试移除 markdown 代码块\n if (content.startsWith(\"```\")) {\n content = content.replace(/^```(?:json)?\\n?/, \"\").replace(/\\n?```$/, \"\");\n }\n\n try {\n try {\n return JSON.parse(content);\n } catch {\n // 如果原生解析失败,尝试修复\n const repaired = jsonrepair(content);\n return JSON.parse(repaired);\n }\n } catch (err) {\n // 如果以上都不行就都丢给大模型,然后在重新走parse,但是要记录重新执行的次数,最多5次\n let retryCount = 0;\n while (retryCount < 5 && !opts?.disableRequestRetry) {\n const response = await this.request(input);\n return response;\n }\n throw new Error(\n `无法解析或修复 LLM 返回的 JSON: ${err instanceof Error ? err.message : String(err)}\\n原始内容: ${input}`,\n );\n }\n }\n\n async request(userPrompt: string): Promise<T> {\n if (!this.opts?.llmRequest) {\n throw new Error(\"未配置 llmRequest 方法,无法发起请求\");\n }\n\n const systemPrompt = `${this.opts.systemPrompt ? this.opts.systemPrompt + \"\\n\" : \"\"}${this.jsonFormatInstruction}`;\n const response = await this.opts.llmRequest({\n systemPrompt,\n userPrompt,\n });\n return this.parse(response, { disableRequestRetry: true });\n }\n}\n","/**\n * Source 类型定义\n */\nexport type SourceType = \"npm\" | \"git\" | \"local\";\n\n/**\n * 判断是否为 Git URL\n * 支持: git@xxx.git, https://xxx.git, git+ssh://xxx, git+https://xxx\n */\nexport function isGitUrl(source: string): boolean {\n return (\n source.startsWith(\"git@\") ||\n source.startsWith(\"git+\") ||\n (source.startsWith(\"https://\") && source.endsWith(\".git\")) ||\n source.endsWith(\".git\")\n );\n}\n\n/**\n * 判断是否为本地路径\n * 支持: ./path, ../path, /path, link:./path, skills/\n */\nexport function isLocalPath(source: string): boolean {\n return (\n source.startsWith(\"workspace:\") ||\n source.startsWith(\"link:\") ||\n source.startsWith(\"./\") ||\n source.startsWith(\"../\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"skills/\")\n );\n}\n\n/**\n * 获取 source 类型\n */\nexport function getSourceType(source: string): SourceType {\n if (isLocalPath(source)) return \"local\";\n if (isGitUrl(source)) return \"git\";\n return \"npm\";\n}\n\n/**\n * 规范化 source(移除 link: 前缀等)\n */\nexport function normalizeSource(source: string): string {\n if (source.startsWith(\"link:\")) {\n return source.substring(5); // 移除 \"link:\" 前缀\n }\n return source;\n}\n\n/**\n * 从 npm 包名中提取纯包名(去除版本号后缀)\n * 例如: @spaceflow/review@0.10.0 → @spaceflow/review\n * some-package@1.2.3 → some-package\n */\nexport function extractNpmPackageName(source: string): string {\n // 处理 scoped 包: @scope/name@version\n if (source.startsWith(\"@\")) {\n const slashIndex = source.indexOf(\"/\");\n if (slashIndex !== -1) {\n const afterSlash = source.substring(slashIndex + 1);\n const atIndex = afterSlash.indexOf(\"@\");\n if (atIndex !== -1) {\n return source.substring(0, slashIndex + 1 + atIndex);\n }\n }\n return source;\n }\n // 处理普通包: name@version\n const atIndex = source.indexOf(\"@\");\n if (atIndex !== -1) {\n return source.substring(0, atIndex);\n }\n return source;\n}\n\n/**\n * 从 source 提取名称\n * npm 包: @scope/package -> package\n * git URL: git@git.example.com:org/repo.git -> repo\n * 本地路径: ./skills/publish -> publish\n */\nexport function extractName(source: string): string {\n if (isLocalPath(source)) {\n // 本地路径:取最后一个目录名\n const parts = source.replace(/\\/$/, \"\").split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"unknown\";\n } else if (isGitUrl(source)) {\n let path = source;\n path = path.replace(/\\.git$/, \"\");\n path = path.replace(/^git@[^:]+:/, \"\");\n path = path.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n const parts = path.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"unknown\";\n } else {\n // npm 包名:先去除版本号后缀,再提取名称\n // @spaceflow/review@0.10.0 → @spaceflow/review → review\n const packageName = extractNpmPackageName(source);\n const parts = packageName.split(\"/\");\n const lastPart = parts[parts.length - 1];\n // 移除 spaceflow-plugin- 或 plugin- 前缀\n return lastPart.replace(/^spaceflow-plugin-/, \"\").replace(/^plugin-/, \"\");\n }\n}\n\n/**\n * 构建 git 仓库的 package spec(用于 pnpm add)\n * git@xxx.git -> git+ssh://git@xxx.git\n * https://xxx.git -> git+https://xxx.git\n */\nexport function buildGitPackageSpec(source: string, ref?: string): string {\n let spec: string;\n if (source.startsWith(\"git@\")) {\n // SSH 格式: git@host:org/repo.git -> git+ssh://git@host/org/repo.git\n const sshUrl = source.replace(\":\", \"/\").replace(\"git@\", \"git+ssh://git@\");\n spec = sshUrl;\n } else if (source.startsWith(\"https://\")) {\n spec = `git+${source}`;\n } else {\n spec = source;\n }\n\n // 添加 ref(分支/tag/commit)\n if (ref) {\n spec += `#${ref}`;\n }\n\n return spec;\n}\n","import { execSync } from \"child_process\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * 检测项目使用的包管理器\n * 必须同时满足:命令可用 AND lock 文件存在\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getPackageManager(cwd?: string): string {\n const workDir = cwd || process.cwd();\n\n // pnpm: 命令可用 + pnpm-lock.yaml 存在\n if (existsSync(join(workDir, \"pnpm-lock.yaml\"))) {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n // pnpm 命令不可用,继续检测其他\n }\n }\n\n // yarn: 命令可用 + yarn.lock 存在\n if (existsSync(join(workDir, \"yarn.lock\"))) {\n try {\n execSync(\"yarn --version\", { stdio: \"ignore\" });\n return \"yarn\";\n } catch {\n // yarn 命令不可用,继续检测其他\n }\n }\n\n // npm: 命令可用 + package-lock.json 存在\n if (existsSync(join(workDir, \"package-lock.json\"))) {\n try {\n execSync(\"npm --version\", { stdio: \"ignore\" });\n return \"npm\";\n } catch {\n // npm 命令不可用\n }\n }\n\n // 默认回退到 npm\n return \"npm\";\n}\n\n/**\n * 检测指定目录使用的包管理器(基于 lock 文件)\n * 如果没有 lock 文件,尝试检测 pnpm 是否可用\n * @param dir 目标目录\n */\nexport function detectPackageManager(dir: string): string {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(dir, \"yarn.lock\"))) {\n return \"yarn\";\n }\n if (existsSync(join(dir, \"package-lock.json\"))) {\n return \"npm\";\n }\n // 默认使用 pnpm(如果可用)\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch {\n return \"npm\";\n }\n}\n\n/**\n * 检测当前目录是否为 pnpm workspace\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function isPnpmWorkspace(cwd?: string): boolean {\n const workDir = cwd || process.cwd();\n return existsSync(join(workDir, \"pnpm-workspace.yaml\"));\n}\n\n/**\n * 将 .spaceflow 添加到根项目的 devDependencies 中\n * 使用 file: 协议,兼容 npm 和 pnpm\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否成功添加(如果已存在则返回 false)\n */\nexport function addSpaceflowToDevDependencies(cwd?: string): boolean {\n const { readFileSync, writeFileSync } = require(\"fs\");\n const workDir = cwd || process.cwd();\n const packageJsonPath = join(workDir, \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content);\n\n // 检查是否已存在\n if (pkg.devDependencies?.[\"spaceflow\"]) {\n return false;\n }\n\n // 添加到 devDependencies\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n pkg.devDependencies[\"spaceflow\"] = \"file:.spaceflow\";\n\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n return true;\n } catch {\n return false;\n }\n}\n","import { existsSync, readFileSync, mkdirSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { SPACEFLOW_DIR, PACKAGE_JSON } from \"../../extension-system/extension.interface\";\n\n/**\n * 获取 .spaceflow 目录路径\n * @param isGlobal 是否为全局目录(~/.spaceflow)\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getSpaceflowDir(isGlobal: boolean, cwd?: string): string {\n if (isGlobal) {\n return join(homedir(), SPACEFLOW_DIR);\n }\n return join(cwd || process.cwd(), SPACEFLOW_DIR);\n}\n\n/**\n * 确保 .spaceflow 目录存在\n * @param spaceflowDir .spaceflow 目录路径\n */\nexport function ensureSpaceflowDir(spaceflowDir: string): void {\n if (!existsSync(spaceflowDir)) {\n mkdirSync(spaceflowDir, { recursive: true });\n }\n\n // 创建 .gitignore\n const gitignorePath = join(spaceflowDir, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n const gitignoreContent = `# Spaceflow Extension dependencies\nnode_modules/\npnpm-lock.yaml\nconfig-schema.json\n`;\n writeFileSync(gitignorePath, gitignoreContent);\n }\n\n}\n\n/**\n * 获取 @spaceflow/core 的版本号\n * 从 process.argv[1](cli 入口)向上找到 @spaceflow/cli 的 package.json\n * 读取其中声明的 @spaceflow/core 依赖版本,保证 cli 和 core 版本一致\n */\nexport function getSpaceflowCoreVersion(): string {\n const cliEntryPath = process.argv[1];\n if (cliEntryPath) {\n // cli 入口: .../node_modules/@spaceflow/cli/dist/cli.js → 往上两级是包根目录\n const cliDir = join(cliEntryPath, \"..\", \"..\");\n const cliPkgPath = join(cliDir, PACKAGE_JSON);\n if (existsSync(cliPkgPath)) {\n try {\n const cliPkg = JSON.parse(readFileSync(cliPkgPath, \"utf-8\"));\n if (cliPkg.name === \"@spaceflow/cli\") {\n const coreVersion = cliPkg.dependencies?.[\"@spaceflow/core\"];\n if (coreVersion) {\n return coreVersion;\n }\n }\n } catch {\n // ignore\n }\n }\n }\n return \"latest\";\n}\n\n/**\n * 确保 .spaceflow 目录及 package.json 存在,并保持 @spaceflow/core 版本与 cli 一致\n * @param spaceflowDir .spaceflow 目录路径\n */\nexport function ensureSpaceflowPackageJson(spaceflowDir: string): void {\n ensureSpaceflowDir(spaceflowDir);\n\n const packageJsonPath = join(spaceflowDir, PACKAGE_JSON);\n const coreVersion = getSpaceflowCoreVersion();\n\n if (existsSync(packageJsonPath)) {\n // 已存在:检查并更新 @spaceflow/core 版本\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n if (pkg.dependencies?.[\"@spaceflow/core\"] !== coreVersion) {\n pkg.dependencies = pkg.dependencies || {};\n pkg.dependencies[\"@spaceflow/core\"] = coreVersion;\n writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n }\n } catch {\n // ignore\n }\n } else {\n // 不存在:创建\n const packageJson = {\n name: \"spaceflow\",\n private: true,\n dependencies: {\n \"@spaceflow/core\": coreVersion,\n },\n };\n writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n }\n}\n\n/**\n * 确保编辑器目录有 .gitignore 文件,并将生成的文件加入忽略列表\n * @param editorRoot 编辑器根目录(如 .claude)\n * @param itemType 项目类型 (skills 或 commands)\n * @param itemName 项目名称\n */\nexport async function ensureEditorGitignore(\n editorRoot: string,\n itemType: \"skills\" | \"commands\",\n itemName: string,\n): Promise<void> {\n const { readFile, writeFile } = await import(\"fs/promises\");\n const gitignorePath = join(editorRoot, \".gitignore\");\n const ignoreEntry = itemType === \"skills\" ? `skills/${itemName}` : `commands/${itemName}.md`;\n\n let content = \"\";\n if (existsSync(gitignorePath)) {\n content = await readFile(gitignorePath, \"utf-8\");\n // 检查是否已包含该条目\n const lines = content.split(\"\\n\").map((l) => l.trim());\n if (lines.includes(ignoreEntry)) {\n return;\n }\n // 确保末尾有换行\n if (!content.endsWith(\"\\n\")) {\n content += \"\\n\";\n }\n } else {\n content = \"# 自动生成的 .gitignore - spaceflow 安装的 skills 和 commands\\n\";\n }\n\n content += `${ignoreEntry}\\n`;\n await writeFile(gitignorePath, content);\n}\n","import { resolve } from \"path\";\nimport type { Configuration, RuleSetRule } from \"@rspack/core\";\n\n/**\n * 插件构建配置选项\n */\nexport interface PluginBuildOptions {\n /** 插件名称 */\n name: string;\n /** 插件根目录路径 */\n path: string;\n /** 入口文件路径,默认 ./src/index.ts */\n entry?: string;\n /** 输出目录,默认 dist */\n outDir?: string;\n /** 是否压缩,默认 false */\n minimize?: boolean;\n /** 额外的外部依赖 */\n externals?: Configuration[\"externals\"];\n /** 额外的 resolve alias */\n alias?: Record<string, string>;\n /** 自定义 module rules */\n rules?: RuleSetRule[];\n}\n\n/**\n * 核心框架路径配置\n */\nexport interface CorePathOptions {\n /** core 包根目录 */\n coreRoot: string;\n}\n\n/**\n * 默认的外部依赖列表\n */\nexport const DEFAULT_EXTERNALS: Configuration[\"externals\"] = [\n // Spaceflow 核心 - 运行时从 core 加载\n { \"@spaceflow/core\": \"module @spaceflow/core\" },\n // 排除所有 node_modules(除了相对路径和 src/ 别名)\n /^(?!\\.\\/|\\.\\.\\/|src\\/)[^./]/,\n];\n\n/**\n * 默认的 TypeScript 编译规则\n */\nexport const DEFAULT_TS_RULE: RuleSetRule = {\n test: /\\.ts$/,\n exclude: /node_modules/,\n loader: \"builtin:swc-loader\",\n options: {\n jsc: {\n parser: {\n syntax: \"typescript\",\n decorators: true,\n },\n transform: {\n legacyDecorator: true,\n decoratorMetadata: true,\n },\n target: \"es2022\",\n },\n },\n};\n\n/**\n * 创建插件构建的 rspack 配置\n */\nexport function createPluginConfig(\n options: PluginBuildOptions,\n coreOptions: CorePathOptions,\n): Configuration {\n const {\n name,\n path: pluginPath,\n entry = \"./src/index.ts\",\n outDir = \"dist\",\n minimize = false,\n externals: customExternals = [],\n alias: customAlias = {},\n rules: customRules = [],\n } = options;\n\n const { coreRoot } = coreOptions;\n\n // 合并外部依赖\n const mergedExternals = Array.isArray(customExternals)\n ? [...(DEFAULT_EXTERNALS as any[]), ...customExternals]\n : [...(DEFAULT_EXTERNALS as any[]), customExternals];\n\n // 合并 alias\n const alias = {\n \"@spaceflow/core\": resolve(coreRoot, \"src\", \"index.ts\"),\n ...customAlias,\n };\n\n // 合并 rules\n const rules = [DEFAULT_TS_RULE, ...customRules];\n\n return {\n name,\n context: pluginPath,\n optimization: {\n minimize,\n },\n entry: {\n index: entry,\n },\n target: \"node\",\n mode: process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n output: {\n filename: \"[name].js\",\n path: resolve(pluginPath, outDir),\n library: { type: \"module\" },\n chunkFormat: \"module\",\n clean: true,\n },\n experiments: {\n outputModule: true,\n },\n externalsType: \"module-import\",\n externals: mergedExternals,\n resolve: {\n extensions: [\".ts\", \".js\"],\n extensionAlias: {\n \".js\": [\".ts\", \".js\"],\n },\n alias,\n },\n module: {\n rules,\n },\n };\n}\n\n/**\n * 创建多入口插件配置\n */\nexport function createMultiEntryPluginConfig(\n options: Omit<PluginBuildOptions, \"entry\"> & {\n entries: Record<string, string>;\n },\n coreOptions: CorePathOptions,\n): Configuration {\n const config = createPluginConfig({ ...options, entry: \"./src/index.ts\" }, coreOptions);\n\n return {\n ...config,\n entry: options.entries,\n };\n}\n","export * from \"./rspack-config\";\n","/**\n * MCP (Model Context Protocol) 支持模块\n *\n * 提供装饰器和基础设施,用于在服务中定义 MCP 工具\n *\n * 使用方式:\n * ```typescript\n * class ListRulesInput {\n * @ApiPropertyOptional({ description: \"项目目录\" })\n * @IsString()\n * @IsOptional()\n * cwd?: string;\n * }\n *\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({\n * name: \"list_rules\",\n * description: \"获取所有审查规则\",\n * dto: ListRulesInput,\n * })\n * async listRules(input: ListRulesInput) {\n * return { rules: [...] };\n * }\n * }\n * ```\n */\n\nimport \"reflect-metadata\";\n\n/** MCP 服务元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_SERVER_METADATA = Symbol.for(\"spaceflow:mcp:server\");\n\n/** MCP 工具元数据 key(使用 Symbol 确保唯一性) */\nexport const MCP_TOOL_METADATA = Symbol.for(\"spaceflow:mcp:tool\");\n\n/** JSON Schema 类型 */\nexport interface JsonSchema {\n type: string;\n properties?: Record<string, JsonSchema & { description?: string }>;\n required?: string[];\n items?: JsonSchema;\n description?: string;\n}\n\n/** MCP 服务定义 */\nexport interface McpServerDefinition {\n /** 服务名称 */\n name: string;\n /** 服务版本 */\n version?: string;\n /** 服务描述 */\n description?: string;\n}\n\n/** Swagger 元数据常量 */\nconst SWAGGER_API_MODEL_PROPERTIES = \"swagger/apiModelProperties\";\nconst SWAGGER_API_MODEL_PROPERTIES_ARRAY = \"swagger/apiModelPropertiesArray\";\n\n/**\n * 从 @nestjs/swagger 的 @ApiProperty / @ApiPropertyOptional 元数据生成 JSON Schema\n * 直接读取 swagger 装饰器存储的 reflect-metadata,无需自定义装饰器\n */\nexport function dtoToJsonSchema(dtoClass: new (...args: any[]) => any): JsonSchema {\n const prototype = dtoClass.prototype;\n\n // 读取属性名列表(swagger 存储格式为 \":propertyName\")\n const propertyKeys: string[] = (\n Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES_ARRAY, prototype) || []\n ).map((key: string) => key.replace(/^:/, \"\"));\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key of propertyKeys) {\n const meta = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES, prototype, key) || {};\n\n // 推断 JSON Schema type\n const typeMap: Record<string, string> = {\n String: \"string\",\n Number: \"number\",\n Boolean: \"boolean\",\n Array: \"array\",\n Object: \"object\",\n };\n\n let schemaType = meta.type;\n // meta.type 可能是构造函数(如 Boolean)或字符串(如 \"boolean\")\n if (typeof schemaType === \"function\") {\n schemaType = typeMap[schemaType.name] || \"string\";\n }\n // 从 reflect-metadata 的 design:type 推断\n if (!schemaType) {\n const reflectedType = Reflect.getMetadata(\"design:type\", prototype, key);\n if (reflectedType) {\n schemaType = typeMap[reflectedType.name] || \"string\";\n }\n }\n\n const prop: Record<string, any> = {};\n if (schemaType) prop.type = schemaType;\n if (meta.description) prop.description = meta.description;\n if (meta.default !== undefined) prop.default = meta.default;\n if (meta.enum) prop.enum = meta.enum;\n if (meta.example !== undefined) prop.example = meta.example;\n\n properties[key] = prop;\n\n // required 判断:swagger 的 @ApiProperty 默认 required=true,@ApiPropertyOptional 为 false\n if (meta.required !== false) {\n required.push(key);\n }\n }\n\n const schema: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) schema.required = required;\n return schema;\n}\n\n/** MCP 工具定义 */\nexport interface McpToolDefinition {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 schema (JSON Schema 格式,与 dto 二选一) */\n inputSchema?: JsonSchema;\n /** 输入参数 DTO 类(与 inputSchema 二选一,优先级高于 inputSchema) */\n dto?: new (...args: any[]) => any;\n}\n\n/** 存储的工具元数据 */\nexport interface McpToolMetadata extends McpToolDefinition {\n /** 方法名 */\n methodName: string;\n}\n\n/**\n * MCP 服务装饰器\n * 标记一个类为 MCP 服务,内部自动应用 @Injectable()\n *\n * @example\n * ```typescript\n * @McpServer({ name: \"review-rules\", version: \"1.0.0\" })\n * export class ReviewMcpService {\n * @McpTool({ name: \"list_rules\", description: \"获取规则\" })\n * async listRules() { ... }\n * }\n * ```\n */\nexport function McpServer(definition: McpServerDefinition): ClassDecorator {\n return (target: Function) => {\n // 使用静态属性存储元数据(跨模块可访问)\n (target as any).__mcp_server__ = definition;\n };\n}\n\n/**\n * MCP 工具装饰器\n * 标记一个方法为 MCP 工具\n */\nexport function McpTool(definition: McpToolDefinition): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor as any;\n // 使用静态属性存储工具列表(跨模块可访问)\n if (!constructor.__mcp_tools__) {\n constructor.__mcp_tools__ = [];\n }\n\n // 如果提供了 dto,自动从 swagger 元数据生成 inputSchema\n const resolvedDefinition = { ...definition };\n if (resolvedDefinition.dto) {\n resolvedDefinition.inputSchema = dtoToJsonSchema(resolvedDefinition.dto);\n }\n\n constructor.__mcp_tools__.push({\n ...resolvedDefinition,\n methodName: String(propertyKey),\n });\n };\n}\n\n/**\n * 检查一个类是否是 MCP 服务\n */\nexport function isMcpServer(target: any): boolean {\n const constructor = target?.constructor || target;\n return !!constructor?.__mcp_server__;\n}\n\n/**\n * 获取 MCP 服务元数据\n */\nexport function getMcpServerMetadata(target: any): McpServerDefinition | undefined {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_server__;\n}\n\n/**\n * 从服务类获取所有 MCP 工具定义\n */\nexport function getMcpTools(target: any): McpToolMetadata[] {\n const constructor = target?.constructor || target;\n return constructor?.__mcp_tools__ || [];\n}\n\n/**\n * MCP Server 运行器\n * 收集服务中的 MCP 工具并启动 stdio 服务\n */\nexport async function runMcpServer(\n service: any,\n serverInfo: { name: string; version: string },\n): Promise<void> {\n const tools = getMcpTools(service);\n\n if (tools.length === 0) {\n console.error(\"没有找到 MCP 工具定义\");\n process.exit(1);\n }\n\n // 动态导入 MCP SDK(避免在不需要时加载)\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const server = new McpServer(serverInfo);\n\n // 注册所有工具(使用 v1 API: server.tool)\n for (const tool of tools) {\n // v1 API: server.tool(name, description, schema, callback)\n // 使用工具定义中的 inputSchema 转为 zod,如果没有则传空对象\n const schema = tool.inputSchema ? jsonSchemaToZod(tool.inputSchema) : {};\n server.tool(tool.name, tool.description, schema, async (args: any) => {\n try {\n const result = await service[tool.methodName](args || {});\n return {\n content: [\n {\n type: \"text\" as const,\n text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n });\n }\n\n /**\n * 将 JSON Schema 转换为简单的 zod 对象(MCP SDK 需要 zod)\n * 仅处理顶层 properties,满足 MCP 工具注册需求\n */\n function jsonSchemaToZod(jsonSchema: JsonSchema): Record<string, any> {\n const { z } = require(\"zod\") as typeof import(\"zod\");\n if (!jsonSchema.properties) return {};\n\n const shape: Record<string, any> = {};\n const requiredFields = jsonSchema.required || [];\n\n for (const [key, prop] of Object.entries(jsonSchema.properties)) {\n let field: any;\n switch (prop.type) {\n case \"number\":\n field = z.number();\n break;\n case \"boolean\":\n field = z.boolean();\n break;\n case \"array\":\n field = z.array(z.any());\n break;\n case \"object\":\n field = z.object({});\n break;\n default:\n field = z.string();\n }\n if (prop.description) field = field.describe(prop.description);\n if (!requiredFields.includes(key)) field = field.optional();\n shape[key] = field;\n }\n\n return shape;\n }\n\n // 启动 stdio 传输\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`MCP Server \"${serverInfo.name}\" started with ${tools.length} tools`);\n}\n","import { readFileSync, existsSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\n\n/** 默认语言 */\nconst DEFAULT_LOCALE = \"zh-CN\";\n\n/** 配置文件名 */\nconst CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** .spaceflow 目录名 */\nconst SPACEFLOW_DIR = \".spaceflow\";\n\n/**\n * 标准化 locale 字符串为 BCP 47 格式\n * @example \"zh_CN\" → \"zh-CN\", \"zh-Hans\" → \"zh-CN\", \"en_US.UTF-8\" → \"en-US\"\n */\nfunction normalizeLocale(raw: string): string | undefined {\n const cleaned = raw.replace(/\\..*$/, \"\").trim();\n // 处理 Apple 格式:zh-Hans → zh-CN, zh-Hant → zh-TW\n if (/^zh[-_]?Hans/i.test(cleaned)) return \"zh-CN\";\n if (/^zh[-_]?Hant/i.test(cleaned)) return \"zh-TW\";\n // 处理标准格式:zh_CN / zh-CN / en_US / en-US\n const match = cleaned.match(/^([a-z]{2})[-_]([A-Z]{2})/i);\n if (match) return `${match[1].toLowerCase()}-${match[2].toUpperCase()}`;\n // 处理纯语言代码:zh → zh-CN, en → en\n const langOnly = cleaned.match(/^([a-z]{2})$/i);\n if (langOnly) {\n const lang = langOnly[1].toLowerCase();\n return lang === \"zh\" ? \"zh-CN\" : lang;\n }\n return undefined;\n}\n\n/**\n * 从 spaceflow.json 读取 lang 字段\n * 按优先级从高到低查找:项目 > 全局\n */\nfunction readLangFromConfig(): string | undefined {\n const paths = [\n join(process.cwd(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n join(homedir(), SPACEFLOW_DIR, CONFIG_FILE_NAME),\n ];\n for (const configPath of paths) {\n if (!existsSync(configPath)) continue;\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(content) as Record<string, unknown>;\n if (typeof config.lang === \"string\" && config.lang.length > 0) {\n return normalizeLocale(config.lang) ?? config.lang;\n }\n } catch {\n // 忽略解析错误\n }\n }\n return undefined;\n}\n\n/**\n * 从系统环境变量推断 locale\n * 解析 LANG 格式如 \"zh_CN.UTF-8\" → \"zh-CN\"\n */\nfunction readEnvLocale(): string | undefined {\n const raw = process.env.LC_ALL || process.env.LANG;\n if (!raw) return undefined;\n return normalizeLocale(raw);\n}\n\n/**\n * macOS:通过 defaults read 获取系统首选语言\n * AppleLanguages 比 LANG 环境变量更准确地反映用户实际语言偏好\n */\nfunction readMacOSLocale(): string | undefined {\n try {\n const output = execSync(\"defaults read -g AppleLanguages\", {\n encoding: \"utf-8\",\n timeout: 500,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // 输出格式: (\\n \"zh-Hans-CN\",\\n \"en-CN\"\\n)\n const match = output.match(/\"([^\"]+)\"/);\n if (!match) return undefined;\n return normalizeLocale(match[1]);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Windows:通过 PowerShell 获取系统 UI 语言\n */\nfunction readWindowsLocale(): string | undefined {\n try {\n const output = execSync('powershell -NoProfile -Command \"(Get-Culture).Name\"', {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const trimmed = output.trim();\n if (!trimmed) return undefined;\n return normalizeLocale(trimmed);\n } catch {\n return undefined;\n }\n}\n\n/**\n * 读取操作系统级别的语言偏好\n * macOS: defaults read -g AppleLanguages\n * Windows: PowerShell Get-Culture\n */\nfunction readOSLocale(): string | undefined {\n const os = platform();\n if (os === \"darwin\") return readMacOSLocale();\n if (os === \"win32\") return readWindowsLocale();\n return undefined;\n}\n\n/**\n * 检测当前语言\n *\n * 优先级:\n * 1. 环境变量 SPACEFLOW_LANG\n * 2. spaceflow.json 中的 lang 字段(项目 > 全局)\n * 3. 操作系统语言偏好(macOS AppleLanguages / Windows Get-Culture)\n * 4. 系统环境变量 LC_ALL / LANG\n * 5. 回退到 zh-CN\n */\nexport function detectLocale(): string {\n const envLang = process.env.SPACEFLOW_LANG;\n if (envLang) return normalizeLocale(envLang) ?? envLang;\n return readLangFromConfig() || readOSLocale() || readEnvLocale() || DEFAULT_LOCALE;\n}\n","import * as i18nextModule from \"i18next\";\nimport type { TOptions, i18n } from \"i18next\";\n\n// 兼容 CJS/ESM 混合环境\nconst i18next: i18n =\n (i18nextModule as unknown as { default: i18n }).default || (i18nextModule as unknown as i18n);\nimport { detectLocale } from \"./locale-detect\";\nimport zhCN from \"../../locales/zh-cn/translation.json\";\nimport en from \"../../locales/en/translation.json\";\n\n/** 默认命名空间 */\nconst DEFAULT_NS = \"translation\";\n\n/** globalThis 上的 key,确保多份 core 实例共享同一个 i18n 状态 */\nconst GLOBAL_I18N_KEY = \"__spaceflow_i18n__\";\n\ninterface GlobalI18nState {\n instance: i18n;\n initialized: boolean;\n}\n\n/**\n * 获取全局 i18n 状态(单例)\n * 无论有几份 @spaceflow/core 实例,都共享同一个 i18next 实例\n */\nfunction getGlobalState(): GlobalI18nState {\n const g = globalThis as Record<string, unknown>;\n if (!g[GLOBAL_I18N_KEY]) {\n g[GLOBAL_I18N_KEY] = {\n instance: i18next,\n initialized: false,\n } satisfies GlobalI18nState;\n }\n return g[GLOBAL_I18N_KEY] as GlobalI18nState;\n}\n\n/**\n * 初始化 i18n\n * 当提供 resources 且无后端加载器时,i18next.init() 同步完成\n * @param lang 指定语言,不传则自动检测\n */\nexport function initI18n(lang?: string): void {\n const state = getGlobalState();\n if (state.initialized) return;\n const lng = lang || detectLocale();\n // i18next v25+ 移除了 initSync,但提供内联 resources 时 init() 同步完成\n void state.instance.init({\n lng,\n fallbackLng: \"zh-CN\",\n defaultNS: DEFAULT_NS,\n ns: [DEFAULT_NS],\n resources: {\n \"zh-CN\": { [DEFAULT_NS]: zhCN },\n en: { [DEFAULT_NS]: en },\n },\n interpolation: {\n escapeValue: false,\n },\n returnNull: false,\n returnEmptyString: false,\n // 确保 init 同步完成(默认 initImmediate: true 会将加载推到 setTimeout)\n initImmediate: false,\n // i18next v25.8+ 会在 init 时输出 locize.com 推广日志\n showSupportNotice: false,\n });\n state.initialized = true;\n}\n\n/**\n * 重置 i18n 状态(仅用于测试)\n */\nexport function resetI18n(): void {\n const state = getGlobalState();\n state.initialized = false;\n}\n\n/**\n * 翻译函数\n * 通过 globalThis 共享 i18next 实例,确保多份 core 实例下翻译一致\n * @param key 翻译 key\n * @param options 插值参数\n */\nexport function t(key: string, options?: TOptions): string {\n const state = getGlobalState();\n if (!state.initialized) {\n initI18n();\n }\n return state.instance.t(key, options) as string;\n}\n\n/**\n * 为外部 Extension 注册语言资源\n * @param ns 命名空间(通常为 Extension name)\n * @param resources 语言资源,key 为语言代码,值为翻译对象\n */\nexport function addLocaleResources(\n ns: string,\n resources: Record<string, Record<string, unknown>>,\n): void {\n const state = getGlobalState();\n if (!state.initialized) {\n initI18n();\n }\n for (const [lng, translations] of Object.entries(resources)) {\n state.instance.addResourceBundle(lng, ns, translations, true, true);\n }\n if (!state.instance.options.ns) {\n state.instance.options.ns = [DEFAULT_NS, ns];\n } else if (Array.isArray(state.instance.options.ns) && !state.instance.options.ns.includes(ns)) {\n state.instance.options.ns.push(ns);\n }\n}\n","export { initI18n, t, addLocaleResources } from \"./i18n\";\n","import type {\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"../logger.interface\";\n\n/** 时间戳格式化 */\nconst timestamp = (): string => {\n const now = new Date();\n return `${now.toLocaleTimeString()}`;\n};\n\n/** plain 模式渲染器:纯文本输出,适合 CI / 管道 */\nexport class PlainRenderer implements LogRenderer {\n info(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n success(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ✅ ${message}`);\n }\n\n warn(prefix: string, message: string): void {\n console.warn(`${timestamp()} ${prefix} ⚠️ ${message}`);\n }\n\n error(prefix: string, message: string): void {\n console.error(`${timestamp()} ${prefix} ❌ ${message}`);\n }\n\n debug(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} [DEBUG] ${message}`);\n }\n\n verbose(prefix: string, message: string): void {\n console.log(`${timestamp()} ${prefix} ${message}`);\n }\n\n createSpinner(prefix: string, message: string): Spinner {\n console.log(`${timestamp()} ${prefix} ⏳ ${message}`);\n return {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ⏳ ${msg}`);\n },\n succeed: (msg?: string) => {\n console.log(`${timestamp()} ${prefix} ✅ ${msg ?? message}`);\n },\n fail: (msg?: string) => {\n console.error(`${timestamp()} ${prefix} ❌ ${msg ?? message}`);\n },\n stop: () => {},\n };\n }\n\n createProgressBar(prefix: string, options: ProgressBarOptions): ProgressBar {\n const { total, label = \"\" } = options;\n const tag = label ? `${label} ` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}0/${total}`);\n return {\n update: (current: number, msg?: string) => {\n const pct = Math.round((current / total) * 100);\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ${tag}${current}/${total} (${pct}%)${suffix}`);\n },\n finish: (msg?: string) => {\n const suffix = msg ? ` ${msg}` : \"\";\n console.log(`${timestamp()} ${prefix} ✅ ${tag}${total}/${total} (100%)${suffix}`);\n },\n };\n }\n\n async runTasks<T>(prefix: string, items: TaskItem<T>[]): Promise<T[]> {\n const results: T[] = [];\n for (const item of items) {\n if (item.enabled === false) {\n console.log(`${timestamp()} ${prefix} ⏭️ [跳过] ${item.title}`);\n continue;\n }\n console.log(`${timestamp()} ${prefix} ▶ ${item.title}`);\n let skipped = false;\n let skipReason = \"\";\n const control: TaskControl = {\n update: (msg: string) => {\n console.log(`${timestamp()} ${prefix} ${msg}`);\n },\n skip: (reason?: string) => {\n skipped = true;\n skipReason = reason ?? \"\";\n },\n };\n try {\n const ctx = (results.length > 0 ? results[results.length - 1] : undefined) as T;\n const result = await item.task(ctx, control);\n if (skipped) {\n const suffix = skipReason ? `: ${skipReason}` : \"\";\n console.log(`${timestamp()} ${prefix} ⏭️ ${item.title}${suffix}`);\n } else {\n console.log(`${timestamp()} ${prefix} ✅ ${item.title}`);\n }\n results.push(result);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.error(`${timestamp()} ${prefix} ❌ ${item.title}: ${errMsg}`);\n throw err;\n }\n }\n return results;\n }\n\n table(_prefix: string, data: Record<string, unknown>[]): void {\n console.table(data);\n }\n}\n","import type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n LogRenderer,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n} from \"./logger.interface\";\nimport { LOG_LEVEL_PRIORITY } from \"./logger.interface\";\nimport { PlainRenderer } from \"./renderers/plain.renderer\";\n\n/** 检测是否为 TUI 环境 */\nconst detectMode = (): RenderMode => {\n if (process.env.CI || !process.stdout.isTTY) return \"plain\";\n return \"tui\";\n};\n\n/** TUI 渲染器缓存(延迟加载,避免 ESM 兼容问题) */\nlet tuiRendererCache: LogRenderer | null = null;\n\n/** 延迟加载 TUI 渲染器(chalk/ora/log-update 均为纯 ESM 包) */\nconst loadTuiRenderer = async (): Promise<LogRenderer> => {\n if (tuiRendererCache) return tuiRendererCache;\n const { TuiRenderer } = await import(\"./renderers/tui.renderer\");\n tuiRendererCache = new TuiRenderer();\n return tuiRendererCache;\n};\n\n/** 解析渲染模式,返回实际模式标识 */\nconst resolveMode = (mode: RenderMode): \"plain\" | \"tui\" => {\n if (mode === \"auto\") return detectMode() === \"tui\" ? \"tui\" : \"plain\";\n return mode;\n};\n\n/**\n * 全局日志工具类\n *\n * 每个子命令创建独立实例,支持 plain / tui 两种输出模式。\n * TUI 模式提供 Spinner、进度条、任务列表等富交互能力,\n * plain 模式下自动降级为普通文本输出。\n *\n * @example\n * ```typescript\n * const logger = new Logger(\"build\");\n * logger.info(\"开始构建\");\n * const s = logger.spin(\"编译中...\");\n * s.succeed(\"编译完成\");\n * ```\n */\nexport class Logger {\n private readonly name: string;\n private readonly level: LogLevel;\n private readonly resolvedMode: \"plain\" | \"tui\";\n private readonly plainRenderer: PlainRenderer;\n private tuiRenderer: LogRenderer | null = null;\n\n constructor(options: LoggerOptions | string) {\n const opts = typeof options === \"string\" ? { name: options } : options;\n this.name = opts.name;\n this.level = opts.level ?? \"info\";\n this.resolvedMode = resolveMode(opts.mode ?? \"auto\");\n this.plainRenderer = new PlainRenderer();\n }\n\n /** 格式化前缀 */\n private get prefix(): string {\n return `[${this.name}]`;\n }\n\n /** 获取当前渲染器(TUI 未加载时降级为 plain) */\n private get renderer(): LogRenderer {\n if (this.resolvedMode === \"tui\" && this.tuiRenderer) return this.tuiRenderer;\n return this.plainRenderer;\n }\n\n /**\n * 初始化 TUI 渲染器(异步)\n * 在使用 TUI 特有功能前调用,确保渲染器已加载\n */\n async init(): Promise<void> {\n if (this.resolvedMode === \"tui\" && !this.tuiRenderer) {\n this.tuiRenderer = await loadTuiRenderer();\n }\n }\n\n /** 判断是否应输出指定级别的日志 */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.level];\n }\n\n /** 输出 info 级别日志 */\n info(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.info(this.prefix, message);\n }\n }\n\n /** 输出 success 级别日志 */\n success(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.success(this.prefix, message);\n }\n }\n\n /** 输出 warn 级别日志 */\n warn(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.warn(this.prefix, message);\n }\n }\n\n /** 输出 error 级别日志 */\n error(message: string): void {\n if (this.shouldLog(\"info\")) {\n this.renderer.error(this.prefix, message);\n }\n }\n\n /** 输出 verbose 级别日志(level >= verbose 才输出) */\n verbose(message: string): void {\n if (this.shouldLog(\"verbose\")) {\n this.renderer.verbose(this.prefix, message);\n }\n }\n\n /** 输出 debug 级别日志(level >= debug 才输出) */\n debug(message: string): void {\n if (this.shouldLog(\"debug\")) {\n this.renderer.debug(this.prefix, message);\n }\n }\n\n /**\n * 创建 Spinner\n * TUI 模式下显示动画 spinner,plain 模式下降级为普通日志\n */\n spin(message: string): Spinner {\n return this.renderer.createSpinner(this.prefix, message);\n }\n\n /**\n * 创建进度条\n * TUI 模式下显示实时进度条,plain 模式下降级为百分比日志\n */\n progress(options: ProgressBarOptions): ProgressBar {\n return this.renderer.createProgressBar(this.prefix, options);\n }\n\n /**\n * 执行任务列表\n * TUI 模式下多行实时更新,plain 模式下顺序输出\n */\n async tasks<T>(items: TaskItem<T>[]): Promise<T[]> {\n return this.renderer.runTasks<T>(this.prefix, items);\n }\n\n /** 输出表格 */\n table(data: Record<string, unknown>[]): void {\n this.renderer.table(this.prefix, data);\n }\n\n /**\n * 创建子 Logger\n * 命名空间自动拼接,如 \"build\" → \"build:compile\"\n */\n child(name: string): Logger {\n return new Logger({\n name: `${this.name}:${name}`,\n level: this.level,\n mode: this.resolvedMode,\n });\n }\n}\n","export { Logger } from \"./logger\";\nexport type {\n LoggerOptions,\n LogLevel,\n RenderMode,\n Spinner,\n ProgressBar,\n ProgressBarOptions,\n TaskItem,\n TaskControl,\n} from \"./logger.interface\";\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/** Schema 注册信息 */\nexport interface SchemaRegistry {\n /** 配置 key */\n configKey: string;\n /** zod schema 工厂函数 */\n schemaFactory: () => z.ZodType;\n /** 描述 */\n description?: string;\n}\n\n/** 全局 schema 注册表 */\nconst schemaRegistry = new Map<string, SchemaRegistry>();\n\n/**\n * 注册插件配置 schema(由插件加载器调用)\n */\nexport function registerPluginSchema(registry: SchemaRegistry): void {\n schemaRegistry.set(registry.configKey, registry);\n}\n\n/**\n * 获取所有已注册的 schema\n */\nexport function getRegisteredSchemas(): Map<string, SchemaRegistry> {\n return schemaRegistry;\n}\n\n/**\n * Schema 生成服务\n * 用于生成 JSON Schema 文件\n */\nexport class SchemaGeneratorService {\n /**\n * 生成完整的 spaceflow.json 的 JSON Schema\n * @param outputPath 输出路径\n */\n generateJsonSchema(outputPath: string): void {\n const properties: Record<string, unknown> = {\n dependencies: {\n type: \"object\",\n description: \"已安装的技能包注册表\",\n additionalProperties: { type: \"string\" },\n },\n support: {\n type: \"array\",\n description: \"支持的编辑器列表\",\n items: { type: \"string\" },\n },\n };\n\n // 添加所有插件的 schema\n for (const [configKey, registry] of schemaRegistry) {\n try {\n const schema = registry.schemaFactory();\n const jsonSchema = z.toJSONSchema(schema, {\n target: \"draft-07\",\n });\n properties[configKey] = {\n ...jsonSchema,\n description: registry.description || `${configKey} 插件配置`,\n };\n } catch (error) {\n console.warn(`⚠️ 无法转换 ${configKey} 的 schema:`, error);\n }\n }\n\n const fullSchema = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"Spaceflow Configuration\",\n description: \"Spaceflow 配置文件 schema\",\n type: \"object\",\n properties,\n additionalProperties: true,\n };\n\n // 确保目录存在\n const dir = path.dirname(outputPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // 写入文件\n fs.writeFileSync(outputPath, JSON.stringify(fullSchema, null, 2), \"utf-8\");\n\n // 自动添加到 .gitignore\n this.addToGitignore(dir, path.basename(outputPath));\n }\n\n /**\n * 生成 JSON Schema 到默认路径 (.spaceflow/config-schema.json)\n */\n generate(): void {\n const outputPath = path.join(process.cwd(), \".spaceflow\", \"config-schema.json\");\n this.generateJsonSchema(outputPath);\n }\n\n /**\n * 将文件添加到 .gitignore(如果不存在)\n */\n private addToGitignore(dir: string, filename: string): void {\n const gitignorePath = path.join(dir, \".gitignore\");\n let content = \"\";\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, \"utf-8\");\n // 检查是否已存在\n const lines = content.split(\"\\n\").map((line) => line.trim());\n if (lines.includes(filename)) {\n return;\n }\n } else {\n content = \"# 自动生成的 .gitignore\\n\";\n }\n\n // 追加文件名\n const newContent = content.endsWith(\"\\n\")\n ? `${content}${filename}\\n`\n : `${content}\\n${filename}\\n`;\n\n fs.writeFileSync(gitignorePath, newContent, \"utf-8\");\n }\n}\n","import { readFileSync, existsSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport stringify from \"json-stringify-pretty-compact\";\nimport { z } from \"zod\";\nimport type { LLMMode } from \"../shared/llm-proxy\";\nimport { registerPluginSchema } from \"./schema-generator.service\";\n\n/** 默认编辑器 */\nexport const DEFAULT_SUPPORT_EDITOR = \"claudeCode\";\n\n/** 配置文件名 */\nexport const CONFIG_FILE_NAME = \"spaceflow.json\";\n\n/** RC 配置文件名(位于 .spaceflow 同级目录) */\nexport const RC_FILE_NAME = \".spaceflowrc\";\n\n/** Spaceflow 核心配置 Schema */\nconst SpaceflowCoreConfigSchema = z.object({\n /** 界面语言,如 zh-CN、en */\n lang: z.string().optional().describe(\"界面语言,如 zh-CN、en\"),\n /** 已安装的技能包注册表 */\n dependencies: z.record(z.string(), z.string()).optional().describe(\"已安装的技能包注册表\"),\n /** 支持的编辑器列表,用于安装 skills 和 commands 时关联目录 */\n support: z.array(z.string()).default([DEFAULT_SUPPORT_EDITOR]).describe(\"支持的编辑器列表\"),\n});\n\n// 注册 spaceflow 核心配置 schema\nregisterPluginSchema({\n configKey: \"spaceflow\",\n schemaFactory: () => SpaceflowCoreConfigSchema,\n description: \"Spaceflow 核心配置\",\n});\n\n/**\n * SpaceflowConfig - 通用配置\n * 子命令的配置由各自模块定义和管理\n */\nexport type SpaceflowConfig = z.infer<typeof SpaceflowCoreConfigSchema> & {\n /** 子命令配置,由各子命令模块自行定义类型 */\n [key: string]: unknown;\n};\n\n// ============ 配置文件操作工具函数 ============\n\n// 不应该被深度合并的字段,这些字段应该直接覆盖而非合并\nconst NO_MERGE_FIELDS = [\"dependencies\"];\n\n/**\n * 深度合并对象\n * 后面的对象会覆盖前面的对象,数组会被替换而非合并\n * NO_MERGE_FIELDS 中的字段不会被深度合并,而是直接覆盖\n */\nfunction deepMerge<T extends Record<string, unknown>>(...objects: Partial<T>[]): Partial<T> {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n for (const key in obj) {\n const value = obj[key];\n const existing = result[key];\n\n // 对于 NO_MERGE_FIELDS 中的字段,直接覆盖而非合并\n if (NO_MERGE_FIELDS.includes(key)) {\n if (value !== undefined) {\n result[key] = value;\n }\n } else if (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ) {\n result[key] = deepMerge(\n existing as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n\n return result as Partial<T>;\n}\n\n/**\n * 获取主配置文件路径(用于写入)\n * 配置文件统一存放在 .spaceflow/ 目录下\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getConfigPath(cwd?: string): string {\n return join(cwd || process.cwd(), \".spaceflow\", CONFIG_FILE_NAME);\n}\n\n/**\n * 获取所有配置文件路径(按优先级从低到高排列)\n * 优先级: ~/.spaceflow/spaceflow.json < ~/.spaceflowrc < ./.spaceflow/spaceflow.json < ./.spaceflowrc\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getConfigPaths(cwd?: string): string[] {\n const workDir = cwd || process.cwd();\n return [\n join(homedir(), \".spaceflow\", CONFIG_FILE_NAME),\n join(homedir(), RC_FILE_NAME),\n join(workDir, \".spaceflow\", CONFIG_FILE_NAME),\n join(workDir, RC_FILE_NAME),\n ];\n}\n\n/** .env 文件名 */\nconst ENV_FILE_NAME = \".env\";\n\n/**\n * 获取所有 .env 文件路径(按优先级从高到低排列,供 ConfigModule.envFilePath 使用)\n *\n * NestJS ConfigModule 中 envFilePath 数组靠前的优先级更高(先读到的变量不会被后面覆盖)\n * 因此返回顺序为从高到低:\n * 1. ./.env (程序启动目录,最高优先级)\n * 2. ./.spaceflow/.env (项目配置目录)\n * 3. ~/.env (全局 home 目录)\n * 4. ~/.spaceflow/.env (全局配置目录,最低优先级)\n *\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getEnvFilePaths(cwd?: string): string[] {\n const workDir = cwd || process.cwd();\n return [\n join(workDir, ENV_FILE_NAME),\n join(workDir, \".spaceflow\", ENV_FILE_NAME),\n join(homedir(), ENV_FILE_NAME),\n join(homedir(), \".spaceflow\", ENV_FILE_NAME),\n ];\n}\n\n/**\n * 读取单个配置文件(同步)\n * @param configPath 配置文件路径\n */\nfunction readSingleConfigSync(configPath: string): Partial<SpaceflowConfig> {\n if (!existsSync(configPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n console.warn(`警告: 无法解析配置文件 ${configPath}`);\n return {};\n }\n}\n\n/**\n * 读取配置文件(同步)\n * 按优先级从低到高读取并合并配置:\n * 1. ~/.spaceflow/spaceflow.json (全局配置,最低优先级)\n * 2. ~/.spaceflowrc (全局 RC 配置)\n * 3. ./.spaceflow/spaceflow.json (项目配置)\n * 4. ./.spaceflowrc (项目根目录 RC 配置,最高优先级)\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function readConfigSync(cwd?: string): Partial<SpaceflowConfig> {\n const configPaths = getConfigPaths(cwd);\n const configs = configPaths.map((p) => readSingleConfigSync(p));\n return deepMerge(...configs);\n}\n\n/**\n * 写入配置文件(同步)\n * @param config 配置对象\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function writeConfigSync(config: Partial<SpaceflowConfig>, cwd?: string): void {\n const configPath = getConfigPath(cwd);\n writeFileSync(configPath, stringify(config, { indent: 2 }) + \"\\n\");\n}\n\n/**\n * 获取支持的编辑器列表\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getSupportedEditors(cwd?: string): string[] {\n const config = readConfigSync(cwd);\n return config.support || [DEFAULT_SUPPORT_EDITOR];\n}\n\n/**\n * 获取 dependencies\n * @param cwd 工作目录,默认为 process.cwd()\n */\nexport function getDependencies(cwd?: string): Record<string, string> {\n const config = readConfigSync(cwd);\n return (config.dependencies as Record<string, string>) || {};\n}\n\n/**\n * 找到包含指定字段的最高优先级配置文件路径\n * 如果没有找到,返回项目级 .spaceflowrc 路径(默认写入位置)\n * @param field 要查找的字段名\n * @param cwd 工作目录\n */\nexport function findConfigFileWithField(field: string, cwd?: string): string {\n const workDir = cwd || process.cwd();\n // 按优先级从高到低查找,找到第一个包含该字段的文件\n const candidates = [\n join(workDir, RC_FILE_NAME),\n join(workDir, \".spaceflow\", CONFIG_FILE_NAME),\n join(homedir(), RC_FILE_NAME),\n join(homedir(), \".spaceflow\", CONFIG_FILE_NAME),\n ];\n\n for (const filePath of candidates) {\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const config = JSON.parse(content);\n if (config[field] !== undefined) {\n return filePath;\n }\n } catch {\n // 解析失败,跳过\n }\n }\n }\n\n // 默认写入项目级 .spaceflowrc\n return join(workDir, RC_FILE_NAME);\n}\n\n/**\n * 更新单个 dependency\n * 找到 dependencies 所在的配置文件并原地更新,默认写入 .spaceflowrc\n * @param name 依赖名称\n * @param source 依赖来源\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否有更新(false 表示已存在相同配置)\n */\nexport function updateDependency(name: string, source: string, cwd?: string): boolean {\n const targetFile = findConfigFileWithField(\"dependencies\", cwd);\n const config = existsSync(targetFile)\n ? (JSON.parse(readFileSync(targetFile, \"utf-8\")) as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n if (!config.dependencies) {\n config.dependencies = {};\n }\n\n const dependencies = config.dependencies as Record<string, string>;\n\n // 检查是否已存在相同配置\n if (dependencies[name] === source) {\n return false;\n }\n\n dependencies[name] = source;\n writeFileSync(targetFile, stringify(config, { indent: 2 }) + \"\\n\");\n return true;\n}\n\n/**\n * 删除单个 dependency\n * 找到 dependencies 所在的配置文件并原地更新\n * @param name 依赖名称\n * @param cwd 工作目录,默认为 process.cwd()\n * @returns 是否有删除(false 表示不存在)\n */\nexport function removeDependency(name: string, cwd?: string): boolean {\n const targetFile = findConfigFileWithField(\"dependencies\", cwd);\n if (!existsSync(targetFile)) {\n return false;\n }\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(targetFile, \"utf-8\"));\n } catch {\n return false;\n }\n\n if (!config.dependencies) {\n return false;\n }\n\n const dependencies = config.dependencies as Record<string, string>;\n\n if (!(name in dependencies)) {\n return false;\n }\n\n delete dependencies[name];\n writeFileSync(targetFile, stringify(config, { indent: 2 }) + \"\\n\");\n return true;\n}\n\n/**\n * 获取 spaceflow 配置(兼容旧 API)\n * @deprecated 请使用 loadSpaceflowConfig()\n */\nexport function spaceflowConfig(): SpaceflowConfig {\n return loadSpaceflowConfig();\n}\n\n/**\n * 加载 spaceflow.json 配置(用于 CLI 启动时)\n * 使用 zod 验证配置\n */\nexport function loadSpaceflowConfig(): SpaceflowConfig {\n const fileConfig = readConfigSync();\n\n // 使用 zod 验证核心配置\n const result = SpaceflowCoreConfigSchema.safeParse(fileConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Spaceflow 配置验证失败:\\n${errors}`);\n }\n\n return {\n ...fileConfig,\n ...result.data,\n } as SpaceflowConfig;\n}\n\nexport type { LLMMode };\n","import { z } from \"zod\";\nimport { readConfigSync } from \"./spaceflow.config\";\nimport { registerPluginSchema } from \"./schema-generator.service\";\n\n/**\n * 配置加载器选项\n */\nexport interface ConfigLoaderOptions<T extends z.ZodObject<z.ZodRawShape>> {\n /** 配置 key(用于从 spaceflow.json 读取) */\n configKey: string;\n /** zod schema(应包含 .default() 设置默认值) */\n schemaFactory: () => T;\n /** 配置描述(用于生成 JSON Schema) */\n description?: string;\n}\n\n/**\n * 创建配置加载器\n * 统一使用 zod 进行配置验证和默认值填充\n *\n * @example\n * ```ts\n * const GitProviderConfigSchema = z.object({\n * serverUrl: z.string().default(process.env.GITHUB_SERVER_URL || \"\"),\n * token: z.string().default(process.env.GITHUB_TOKEN || \"\"),\n * });\n *\n * export type GitProviderConfig = z.infer<typeof GitProviderConfigSchema>;\n *\n * export const gitProviderConfig = createConfigLoader({\n * configKey: \"gitProvider\",\n * schemaFactory: GitProviderConfigSchema,\n * description: \"Git Provider 服务配置\",\n * });\n * ```\n */\nexport function createConfigLoader<T extends z.ZodObject<z.ZodRawShape>>(\n options: ConfigLoaderOptions<T>,\n) {\n const { configKey, schemaFactory, description } = options;\n\n // 创建配置加载器\n return (): z.infer<T> => {\n const schema = schemaFactory();\n // 注册 schema 用于 JSON Schema 生成\n registerPluginSchema({\n configKey,\n schemaFactory: () => schema,\n description,\n });\n\n const fileConfig = readConfigSync();\n const rawConfig = fileConfig[configKey] ?? {};\n\n // 使用 zod 验证并填充默认值\n const result = schema.safeParse(rawConfig);\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`配置 \"${configKey}\" 验证失败:\\n${errors}`);\n }\n\n return result.data;\n };\n}\n\n/**\n * 创建简单配置加载器(仅从环境变量读取,不读取配置文件)\n * 适用于 CI 等纯环境变量配置\n */\nexport function createEnvConfigLoader<T extends z.ZodObject<z.ZodRawShape>>(\n options: Omit<ConfigLoaderOptions<T>, \"description\"> & { description?: string },\n) {\n const { configKey, schemaFactory, description } = options;\n\n return (): z.infer<T> => {\n const schema = schemaFactory();\n // 注册 schema(如果有描述)\n if (description) {\n registerPluginSchema({\n configKey,\n schemaFactory: () => schema,\n description,\n });\n }\n // 直接使用空对象,让 schema 的 default 值生效\n const result = schema.safeParse({});\n\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`配置 \"${configKey}\" 验证失败:\\n${errors}`);\n }\n\n return result.data;\n };\n}\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\nimport { detectProvider } from \"../shared/git-provider/detect-provider\";\n\n/** 从环境自动检测的默认值 */\nconst detected = detectProvider();\n\n/** Git Provider 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** Git Provider 类型(自动检测或手动指定) */\n provider: z\n .enum([\"gitea\", \"github\", \"gitlab\"])\n .default(detected.provider)\n .describe(\"Git Provider 类型 (github | gitea | gitlab),未指定时自动检测\"),\n /** Git Provider 服务器 URL */\n serverUrl: z.string().default(detected.serverUrl).describe(\"Git Provider 服务器 URL\"),\n /** Git Provider API Token */\n token: z.string().default(detected.token).describe(\"Git Provider API Token\"),\n });\n\n/** Git Provider 配置类型 */\nexport type GitProviderConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const gitProviderConfig = createConfigLoader({\n configKey: \"gitProvider\",\n schemaFactory,\n description: \"Git Provider 服务配置\",\n});\n","import { z } from \"zod\";\nimport { createEnvConfigLoader } from \"./config-loader\";\n\n/** CI 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** 仓库名称 (owner/repo 格式) */\n repository: z\n .string()\n .default(process.env.GITHUB_REPOSITORY || \"\")\n .describe(\"仓库名称 (owner/repo 格式)\"),\n /** 当前分支名称 */\n refName: z\n .string()\n .default(process.env.GITHUB_REF_NAME || \"\")\n .describe(\"当前分支名称\"),\n actor: z\n .string()\n .default(process.env.GITHUB_ACTOR || \"\")\n .describe(\"当前操作者\"),\n });\n\n/** CI 配置类型 */\nexport type CiConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const ciConfig = createEnvConfigLoader({\n configKey: \"ci\",\n schemaFactory,\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\nconst schemaFactory = () => {\n /** Claude Code 适配器配置 Schema */\n const ClaudeCodeConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.CLAUDE_CODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n authToken: z\n .string()\n .default(process.env.CLAUDE_CODE_AUTH_TOKEN || \"\")\n .describe(\"认证令牌\"),\n model: z\n .string()\n .default(process.env.CLAUDE_CODE_MODEL || \"claude-sonnet-4-5\")\n .describe(\"模型名称\"),\n hasCompletedOnboarding: z.boolean().optional().describe(\"是否已完成 Claude Code 引导流程\"),\n });\n\n /** OpenAI 适配器配置 Schema */\n const OpenAIConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.OPENAI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENAI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.OPENAI_MODEL || \"gpt-4o\")\n .describe(\"模型名称\"),\n });\n\n /** OpenCode 适配器配置 Schema */\n const OpenCodeConfigSchema = z.object({\n serverUrl: z\n .string()\n .default(process.env.OPENCODE_SERVER_URL || \"http://localhost:4096\")\n .describe(\"服务器 URL\"),\n baseUrl: z\n .string()\n .default(process.env.OPENCODE_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.OPENCODE_API_KEY || \"\")\n .describe(\"API Key\"),\n providerID: z\n .string()\n .default(process.env.OPENCODE_PROVIDER_ID || \"openai\")\n .describe(\"Provider ID\"),\n model: z\n .string()\n .default(process.env.OPENCODE_MODEL || \"\")\n .describe(\"模型名称\"),\n });\n\n /** Gemini 适配器配置 Schema */\n const GeminiConfigSchema = z.object({\n baseUrl: z\n .string()\n .default(process.env.GEMINI_BASE_URL || \"\")\n .describe(\"API 基础 URL\"),\n apiKey: z\n .string()\n .default(process.env.GEMINI_API_KEY || \"\")\n .describe(\"API Key\"),\n model: z\n .string()\n .default(process.env.GEMINI_MODEL || \"\")\n .describe(\"模型名称\"),\n });\n\n /** LLM 配置 Schema */\n const LlmConfigSchema = z.object({\n claudeCode: z\n .preprocess((v) => v ?? {}, ClaudeCodeConfigSchema)\n .describe(\"Claude Code 适配器配置\"),\n openai: z.preprocess((v) => v ?? {}, OpenAIConfigSchema).describe(\"OpenAI 适配器配置\"),\n openCode: z.preprocess((v) => v ?? {}, OpenCodeConfigSchema).describe(\"OpenCode 适配器配置\"),\n gemini: z.preprocess((v) => v ?? {}, GeminiConfigSchema).describe(\"Gemini 适配器配置\"),\n });\n\n return LlmConfigSchema;\n};\n\n/** LLM 系统配置类型 */\nexport type LlmConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\n/** Claude Code 适配器配置类型 */\nexport type ClaudeCodeConfig = z.infer<LlmConfig[\"claudeCode\"]>;\n\n/** OpenAI 适配器配置类型 */\nexport type OpenAIConfig = z.infer<LlmConfig[\"openai\"]>;\n\n/** OpenCode 适配器配置类型 */\nexport type OpenCodeConfig = z.infer<LlmConfig[\"openCode\"]>;\n\n/** Gemini 适配器配置类型 */\nexport type GeminiConfig = z.infer<LlmConfig[\"gemini\"]>;\n\nexport const llmConfig = createConfigLoader({\n configKey: \"llm\",\n schemaFactory,\n description: \"LLM 服务配置\",\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\nconst schemaFactory = () =>\n z.object({\n /** 飞书应用 ID */\n appId: z\n .string()\n .default(process.env.FEISHU_APP_ID || \"\")\n .describe(\"飞书应用 ID\"),\n /** 飞书应用密钥 */\n appSecret: z\n .string()\n .default(process.env.FEISHU_APP_SECRET || \"\")\n .describe(\"飞书应用密钥\"),\n /** 应用类型:自建应用或商店应用 */\n appType: z\n .enum([\"self_build\", \"store\"])\n .default((process.env.FEISHU_APP_TYPE as \"self_build\" | \"store\") || \"self_build\")\n .describe(\"应用类型\"),\n /** 域名:飞书或 Lark */\n domain: z\n .enum([\"feishu\", \"lark\"])\n .default((process.env.FEISHU_DOMAIN as \"feishu\" | \"lark\") || \"feishu\")\n .describe(\"域名\"),\n });\n\n/** 飞书配置类型 */\nexport type FeishuConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const feishuConfig = createConfigLoader({\n configKey: \"feishu\",\n schemaFactory,\n description: \"飞书 SDK 配置\",\n});\n","import { z } from \"zod\";\nimport { createConfigLoader } from \"./config-loader\";\n\n/** Storage 配置 Schema */\nconst schemaFactory = () =>\n z.object({\n /** 适配器类型:memory 或 file */\n adapter: z\n .enum([\"memory\", \"file\"])\n .default((process.env.STORAGE_ADAPTER as \"memory\" | \"file\") || \"memory\")\n .describe(\"适配器类型\"),\n /** 文件适配器的存储路径(仅 file 适配器需要) */\n filePath: z.string().optional().describe(\"文件存储路径\"),\n /** 默认过期时间(毫秒),0 表示永不过期 */\n defaultTtl: z\n .number()\n .default(process.env.STORAGE_DEFAULT_TTL ? parseInt(process.env.STORAGE_DEFAULT_TTL, 10) : 0)\n .describe(\"默认过期时间(毫秒)\"),\n /** 最大 key 数量,0 表示不限制 */\n maxKeys: z\n .number()\n .default(process.env.STORAGE_MAX_KEYS ? parseInt(process.env.STORAGE_MAX_KEYS, 10) : 0)\n .describe(\"最大 key 数量\"),\n });\n\n/** Storage 配置类型 */\nexport type StorageConfig = z.infer<ReturnType<typeof schemaFactory>>;\n\nexport const storageConfig = createConfigLoader({\n configKey: \"storage\",\n schemaFactory,\n description: \"存储服务配置\",\n});\n","/**\n * 系统配置(不包含插件配置)\n */\nexport interface SystemConfig {\n /** 已安装的技能包注册表 */\n dependencies?: Record<string, string>;\n /** 支持的编辑器列表 */\n support?: string[];\n}\n\n/**\n * 插件配置注册信息\n */\nexport interface PluginConfigRegistry {\n /** 插件名称 */\n name: string;\n /** 配置 key */\n configKey?: string;\n /** 依赖的其他插件配置 */\n configDependencies?: string[];\n /** 配置 schema 工厂函数 */\n configSchema?: () => unknown;\n}\n\n/** 全局插件配置注册表(使用 global 确保跨模块共享) */\nconst PLUGIN_REGISTRY_KEY = Symbol.for(\"spaceflow.pluginRegistry\");\nconst globalAny = global as any;\nif (!globalAny[PLUGIN_REGISTRY_KEY]) {\n globalAny[PLUGIN_REGISTRY_KEY] = new Map<string, PluginConfigRegistry>();\n}\nconst pluginRegistry: Map<string, PluginConfigRegistry> = globalAny[PLUGIN_REGISTRY_KEY];\n\n/**\n * 注册插件配置(由插件加载器调用)\n */\nexport function registerPluginConfig(registry: PluginConfigRegistry): void {\n if (registry.configKey) {\n pluginRegistry.set(registry.configKey, registry);\n }\n}\n\n/**\n * 获取已注册的插件配置\n */\nexport function getRegisteredPluginConfig(configKey: string): PluginConfigRegistry | undefined {\n return pluginRegistry.get(configKey);\n}\n\n/**\n * 配置读取服务\n * 提供三种配置读取方式:\n * 1. getPluginConfig - 读取指定插件的配置\n * 2. getOtherPluginConfig - 读取其他插件的配置(需要在 metadata 中声明依赖)\n * 3. getSystemConfig - 读取系统配置\n */\nexport class ConfigReaderService {\n constructor() {}\n\n /**\n * 读取插件的配置\n * 使用 schema 验证并合并默认值\n * @param configKey 插件的配置 key\n * @returns 验证后的插件配置\n */\n getPluginConfig<T>(configKey: string): T {\n const rawConfig = (global as any).spaceflowConfig || {};\n const userConfig = rawConfig[configKey] ?? {};\n\n // 从注册表获取 schema 工厂函数\n const registry = pluginRegistry.get(configKey);\n const schemaFactory = registry?.configSchema;\n\n if (!schemaFactory || typeof schemaFactory !== \"function\") {\n return userConfig as T;\n }\n\n // 调用工厂函数获取 schema\n const schema = schemaFactory();\n if (!schema || typeof (schema as any).parse !== \"function\") {\n return userConfig as T;\n }\n\n // 使用 schema.parse() 验证并填充默认值\n try {\n return (schema as any).parse(userConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${configKey}\" 验证失败:`, error);\n return userConfig as T;\n }\n }\n\n /**\n * 读取其他插件的配置\n * 必须在插件的 metadata.configDependencies 中声明依赖\n * @param fromConfigKey 当前插件的配置 key\n * @param targetConfigKey 目标插件的配置 key\n * @returns 合并后的插件配置\n */\n getOtherPluginConfig<T>(fromConfigKey: string, targetConfigKey: string): T {\n const fromRegistry = pluginRegistry.get(fromConfigKey);\n if (!fromRegistry) {\n throw new Error(`插件 \"${fromConfigKey}\" 未注册`);\n }\n\n // 检查是否已声明依赖\n const dependencies = fromRegistry.configDependencies ?? [];\n if (!dependencies.includes(targetConfigKey)) {\n throw new Error(\n `插件 \"${fromRegistry.name}\" 未声明对 \"${targetConfigKey}\" 配置的依赖。` +\n `请在插件 metadata 的 configDependencies 中添加 \"${targetConfigKey}\"`,\n );\n }\n\n return this.getPluginConfig<T>(targetConfigKey);\n }\n\n /**\n * 读取系统配置(不包含插件配置)\n * @returns 系统配置\n */\n getSystemConfig(): SystemConfig {\n const rawConfig = (global as any).spaceflowConfig || {};\n return {\n dependencies: rawConfig.dependencies,\n support: rawConfig.support,\n };\n }\n}\n","import type { ZodSchema } from \"zod\";\nimport { readConfigSync } from \"./spaceflow.config\";\nimport type { IConfigReader } from \"../extension-system/types\";\n\n/**\n * 配置读取器\n * 不依赖 NestJS,直接读取配置文件\n */\nexport class ConfigReader implements IConfigReader {\n private config: Record<string, unknown>;\n private schemas = new Map<string, ZodSchema>();\n\n constructor(cwd?: string) {\n this.config = readConfigSync(cwd) as Record<string, unknown>;\n }\n\n /**\n * 获取配置值\n * @param key 配置路径(支持点分隔,如 \"gitProvider.token\")\n */\n get<T>(key: string): T | undefined {\n const parts = key.split(\".\");\n let current: unknown = this.config;\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current as T | undefined;\n }\n\n /**\n * 获取插件配置\n * 使用已注册的 schema 验证并填充默认值\n * @param key 插件配置 key\n */\n getPluginConfig<T>(key: string): T | undefined {\n const rawConfig = this.config[key] ?? {};\n const schema = this.schemas.get(key);\n if (!schema) {\n return rawConfig as T;\n }\n try {\n return schema.parse(rawConfig) as T;\n } catch (error) {\n console.warn(`⚠️ 配置 \"${key}\" 验证失败:`, error);\n return rawConfig as T;\n }\n }\n\n /**\n * 注册配置 schema\n * @param key 配置 key\n * @param schema Zod schema\n */\n registerSchema(key: string, schema: ZodSchema): void {\n this.schemas.set(key, schema);\n }\n\n /**\n * 重新加载配置\n * @param cwd 工作目录\n */\n reload(cwd?: string): void {\n this.config = readConfigSync(cwd) as Record<string, unknown>;\n }\n\n /**\n * 获取原始配置对象\n */\n getRawConfig(): Record<string, unknown> {\n return this.config;\n }\n}\n","import { config } from \"dotenv\";\nimport { existsSync } from \"fs\";\n\n/**\n * 加载 .env 文件\n * 按优先级从高到低加载,先加载的变量不会被后加载的覆盖\n * @param paths .env 文件路径列表(按优先级从高到低排列)\n */\nexport function loadEnvFiles(paths: string[]): void {\n for (const envPath of paths) {\n if (existsSync(envPath)) {\n config({ path: envPath, override: false });\n }\n }\n}\n","export * from \"./git-provider.config\";\nexport * from \"./ci.config\";\nexport * from \"./llm.config\";\nexport * from \"./feishu.config\";\nexport * from \"./storage.config\";\nexport * from \"./spaceflow.config\";\nexport * from \"./config-reader.service\";\nexport * from \"./schema-generator.service\";\nexport * from \"./config-loader\";\n\n// 新版配置系统(不依赖 NestJS)\nexport { ConfigReader } from \"./config-reader\";\nexport { loadEnvFiles } from \"./load-env\";\n\nimport { gitProviderConfig } from \"./git-provider.config\";\nimport { ciConfig } from \"./ci.config\";\nimport { llmConfig } from \"./llm.config\";\nimport { feishuConfig } from \"./feishu.config\";\nimport { storageConfig } from \"./storage.config\";\nimport { spaceflowConfig } from \"./spaceflow.config\";\n\n/**\n * 所有配置加载器\n */\nexport const configLoaders = [\n gitProviderConfig,\n ciConfig,\n llmConfig,\n feishuConfig,\n storageConfig,\n spaceflowConfig,\n];\n","// ============ 插件系统 ============\nexport * from \"./extension-system\";\n\n// ============ 基础能力模块 ============\n// Git Provider - 多平台 Git 托管 API 操作(GitHub、Gitea、GitLab)\nexport * from \"./shared/git-provider\";\n\n// Git SDK - Git 命令操作\nexport * from \"./shared/git-sdk\";\n\n// LLM Proxy - 多 LLM 适配器\nexport * from \"./shared/llm-proxy\";\n\n// Feishu SDK - 飞书 API 操作\nexport * from \"./shared/feishu-sdk\";\n\n// Storage - 存储服务\nexport * from \"./shared/storage\";\n\n// Claude Setup - Claude Agent 配置\nexport * from \"./shared/claude-setup\";\n\n// Parallel - 并行执行工具\nexport * from \"./shared/parallel\";\n\n// Output - 输出服务\nexport * from \"./shared/output\";\n\n// Verbose - 日志级别\nexport * from \"./shared/verbose\";\n\n// Editor Config - 编辑器配置\nexport * from \"./shared/editor-config\";\n\n// LLM JsonPut - JSON 结构化输出\nexport * from \"./shared/llm-jsonput\";\n\n// Source Utils - 源类型判断工具\nexport * from \"./shared/source-utils\";\n\n// Package Manager - 包管理器检测\nexport * from \"./shared/package-manager\";\n\n// Spaceflow Dir - .spaceflow 目录管理\nexport * from \"./shared/spaceflow-dir\";\n\n// Rspack Config - Rspack 配置工具\nexport * from \"./shared/rspack-config\";\n\n// MCP - Model Context Protocol 支持\n// 注意:McpServerDefinition 和 McpToolDefinition 已在 extension-system/types.ts 中定义\n// 这里只导出装饰器和工具函数,避免重复导出\nexport {\n MCP_SERVER_METADATA,\n MCP_TOOL_METADATA,\n type JsonSchema,\n dtoToJsonSchema,\n type McpToolMetadata,\n McpServer,\n McpTool,\n isMcpServer,\n getMcpServerMetadata,\n getMcpTools,\n runMcpServer,\n} from \"./shared/mcp\";\n\n// I18n - 国际化\nexport * from \"./shared/i18n\";\n\n// Logger - 全局日志工具\nexport * from \"./shared/logger\";\n\n// ============ 配置相关 ============\nexport * from \"./config\";\n\n// ============ Zod 重导出 ============\nexport { z } from \"zod\";\n"],"names":["SPACEFLOW_DIR","PACKAGE_JSON","resolveSpaceflowConfig","config","packageName","packagePath","join","require","Object","name","exportConfig","defineExtension","definition","defineMcpServer","GIT_PROVIDER_MODULE_OPTIONS","REVIEW_STATE","DIFF_SIDE","detectProvider","env","process","explicit","isValidProvider","buildResult","value","provider","source","serverUrl","resolveServerUrl","token","resolveToken","GITHUB_HOSTS","Set","GITLAB_HOSTS","parseRepoUrl","url","trimmed","parseSshUrl","parseGitSshUrl","parseHttpUrl","parsed","URL","hostname","segments","Boolean","owner","repo","isGithub","isGithubHost","isGitlab","isGitlabHost","detectProviderForHost","ref","path","refType","match","host","pathPart","detected","GIT_STATUS_MAP","mapGitStatus","status","parseChangedLinesFromPatch","patch","changedLines","lines","currentLine","line","hunkMatch","parseInt","parseHunksFromPatch","hunks","calculateNewLineNumber","oldLine","offset","hunk","oldEnd","lineOffsetInHunk","calculateLineOffsets","oldLines","result","Map","parseDiffText","diffText","files","fileDiffs","fileDiff","headerMatch","filename","patchStart","execSync","GiteaAdapter","options","Error","method","body","headers","response","fetch","JSON","undefined","errorText","branch","encodeURIComponent","protections","existing","p","pushWhitelistUsernames","hasWhitelist","protectionOptions","listResult","ruleName","console","error","index","state","query","allPRs","page","limit","params","URLSearchParams","String","prs","allCommits","commits","needsPatch","f","diffFiles","patchMap","file","sha","baseSha","headSha","filepath","encodedPath","item","commentId","reviewId","teamId","GithubAdapter","variables","graphqlUrl","json","rules","rule","branchName","results","pr","perPage","c","allFiles","commit","Buffer","r","comments","resolvedMap","comment","u","data","commitObj","head","base","user","reviewers","teams","t","author","ghAuthor","ghCommitter","labels","assignees","milestone","l","a","prNumber","threads","thread","firstComment","QUERY","requiredReviews","event","eventMap","sort","sortMap","GitlabAdapter","project","namespace","pushLevel","glState","mr","allMRs","d","diffs","oldPath","newPath","diff","n","_owner","_repo","_commentId","_body","note","_reviewId","position","pushAccess","additions","deletions","stateMap","GitProviderService","spawn","GitSdkService","args","opts","Promise","resolve","reject","child","stdout","stderr","code","err","remoteUrl","baseRef","headRef","resolvedBase","resolvedHead","message","authorName","authorEmail","date","output","LLM_PROXY_CONFIG","Symbol","LLM_ADAPTER","LOG_LEVEL_PRIORITY","VERBOSE_TO_LOG_LEVEL","toLogLevel","level","normalizeVerbose","verbose","shouldLog","requiredLevel","parseVerbose","val","isNaN","readFile","writeFile","mkdir","copyFile","unlink","homedir","ClaudeSetupService","llmConfig","claudeDir","paths","e","fn","settingsPath","claudeJsonPath","claudeCode","existingSettings","content","mergedSettings","claudeJson","ClaudeCodeAdapter","messages","claudeConf","model","systemPrompt","userPrompt","handleUncaughtError","spawnEnv","spawnClaudeCodeProcess","spawnOptions","queryOptions","finalContent","structuredOutput","Array","block","systemMessage","m","userMessages","OpenAI","OpenAIAdapter","openaiConf","client","stream","fullContent","chunk","delta","createOpencode","OpenCodeAdapter","openCodeConf","providerID","configModel","opencode","port","Math","cleanup","customProviderID","session","Date","sessionId","modelID","part","partType","text","toolPart","agentPart","subtaskPart","stepPart","reasoningPart","randomUUID","LlmSessionImpl","adapter","userMessage","mergedOptions","assistantMessage","prompt","LlmProxyService","claudeCodeAdapter","openaiAdapter","openCodeAdapter","adapterType","type","jsonSchema","systemMsg","msg","available","createStreamLoggerState","logStreamEvent","tokens","FEISHU_CARD_ACTION_TRIGGER","EventEmitter","lark","FeishuSdkService","eventName","listener","done","userId","userIdType","departmentIdType","userIds","FeishuCardService","feishuSdkService","_eventHook","card","receiveId","receiveIdType","uuid","messageId","FEISHU_MODULE_OPTIONS","StorageService","clearInterval","setInterval","now","allKeys","cleaned","key","ttl","effectiveTtl","exists","maxKeys","currentSize","sizeAfterCleanup","keyWithExpire","Infinity","b","toEvict","i","pattern","validKeys","prefix","keysToDelete","deleted","MemoryAdapter","regexPattern","regex","RegExp","fs","FileAdapter","filePath","clearTimeout","setTimeout","dir","ParallelExecutor","tasks","total","completed","shouldStop","executeTask","task","lastError","attempt","pending","taskQueue","promise","taskIdOrder","items","getId","_","ms","parallel","OUTPUT_MARKER_START","OUTPUT_MARKER_END","OutputService","values","outputWithCache","EDITOR_DIR_MAPPING","DEFAULT_EDITOR","getEditorDirName","editor","jsonrepair","JSON_FORMAT_INSTRUCTION","LlmJsonPut","schema","generateExample","s","obj","example","input","repaired","retryCount","isGitUrl","isLocalPath","getSourceType","normalizeSource","extractNpmPackageName","slashIndex","afterSlash","atIndex","extractName","parts","lastPart","buildGitPackageSpec","spec","sshUrl","existsSync","getPackageManager","cwd","workDir","detectPackageManager","isPnpmWorkspace","addSpaceflowToDevDependencies","readFileSync","writeFileSync","packageJsonPath","pkg","mkdirSync","getSpaceflowDir","isGlobal","ensureSpaceflowDir","spaceflowDir","gitignorePath","gitignoreContent","getSpaceflowCoreVersion","cliEntryPath","cliDir","cliPkgPath","cliPkg","coreVersion","ensureSpaceflowPackageJson","packageJson","ensureEditorGitignore","editorRoot","itemType","itemName","ignoreEntry","DEFAULT_EXTERNALS","DEFAULT_TS_RULE","createPluginConfig","coreOptions","pluginPath","entry","outDir","minimize","customExternals","customAlias","customRules","coreRoot","mergedExternals","alias","createMultiEntryPluginConfig","MCP_SERVER_METADATA","MCP_TOOL_METADATA","SWAGGER_API_MODEL_PROPERTIES","SWAGGER_API_MODEL_PROPERTIES_ARRAY","dtoToJsonSchema","dtoClass","prototype","propertyKeys","Reflect","properties","required","meta","typeMap","schemaType","reflectedType","prop","McpServer","target","McpTool","propertyKey","_descriptor","constructor","resolvedDefinition","isMcpServer","getMcpServerMetadata","getMcpTools","runMcpServer","service","serverInfo","tools","StdioServerTransport","server","tool","jsonSchemaToZod","z","shape","requiredFields","field","transport","platform","DEFAULT_LOCALE","CONFIG_FILE_NAME","normalizeLocale","raw","langOnly","lang","readLangFromConfig","configPath","readEnvLocale","readMacOSLocale","readWindowsLocale","readOSLocale","os","detectLocale","envLang","i18nextModule","i18next","zhCN","en","DEFAULT_NS","GLOBAL_I18N_KEY","getGlobalState","g","globalThis","initI18n","lng","resetI18n","addLocaleResources","ns","resources","translations","timestamp","PlainRenderer","label","tag","current","pct","suffix","skipped","skipReason","control","reason","ctx","errMsg","_prefix","detectMode","tuiRendererCache","loadTuiRenderer","TuiRenderer","resolveMode","mode","Logger","schemaRegistry","registerPluginSchema","registry","getRegisteredSchemas","SchemaGeneratorService","outputPath","configKey","fullSchema","newContent","stringify","DEFAULT_SUPPORT_EDITOR","RC_FILE_NAME","SpaceflowCoreConfigSchema","NO_MERGE_FIELDS","deepMerge","objects","getConfigPath","getConfigPaths","ENV_FILE_NAME","getEnvFilePaths","readSingleConfigSync","readConfigSync","configPaths","configs","writeConfigSync","getSupportedEditors","getDependencies","findConfigFileWithField","candidates","updateDependency","targetFile","dependencies","removeDependency","spaceflowConfig","loadSpaceflowConfig","fileConfig","errors","createConfigLoader","schemaFactory","description","rawConfig","createEnvConfigLoader","gitProviderConfig","ciConfig","ClaudeCodeConfigSchema","OpenAIConfigSchema","OpenCodeConfigSchema","GeminiConfigSchema","LlmConfigSchema","v","feishuConfig","storageConfig","PLUGIN_REGISTRY_KEY","globalAny","global","pluginRegistry","registerPluginConfig","getRegisteredPluginConfig","ConfigReaderService","userConfig","fromConfigKey","targetConfigKey","fromRegistry","ConfigReader","loadEnvFiles","envPath","configLoaders"],"mappings":"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"}