@trydying/opencode-feishu-notifier 0.3.1 → 0.3.3

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/context/progress.ts","../src/context/project.ts","../src/feishu/templates.ts"],"sourcesContent":["import type { ProgressInfo } from \"../types\";\n\n/**\n * 从事件负载中提取进度信息\n * @param eventPayload 事件负载\n * @returns 进度信息\n */\nexport function extractProgressInfo(eventPayload?: unknown): ProgressInfo {\n const timestamp = new Date().toISOString();\n\n // 尝试从事件负载中提取信息\n let lastAction: string | undefined;\n let currentTask: string | undefined;\n\n if (eventPayload && typeof eventPayload === \"object\") {\n const payload = eventPayload as Record<string, unknown>;\n\n // 尝试从常见字段提取信息\n if (typeof payload.message === \"string\") {\n lastAction = payload.message;\n } else if (typeof payload.description === \"string\") {\n lastAction = payload.description;\n } else if (typeof payload.action === \"string\") {\n lastAction = payload.action;\n }\n\n if (typeof payload.task === \"string\") {\n currentTask = payload.task;\n } else if (typeof payload.currentTask === \"string\") {\n currentTask = payload.currentTask;\n }\n }\n\n // 如果没有从负载中提取到信息,提供默认值\n if (!lastAction) {\n lastAction = \"OpenCode 正在处理任务\";\n }\n\n return {\n lastAction,\n currentTask,\n timestamp,\n // 文件变更信息需要从 Git 或其他来源获取,这里暂时留空\n };\n}\n\n/**\n * 从 Git 状态中提取文件变更信息\n * @param directory 工作目录\n * @returns 文件变更信息\n */\nexport function extractFileChanges(directory: string):\n | {\n added?: number;\n modified?: number;\n deleted?: number;\n }\n | undefined {\n try {\n const { execSync } = require(\"child_process\");\n\n // 获取 Git 状态摘要\n const statusOutput = execSync(\"git status --porcelain\", {\n cwd: directory,\n encoding: \"utf-8\",\n });\n\n let added = 0;\n let modified = 0;\n let deleted = 0;\n\n const lines = statusOutput.trim().split(\"\\n\");\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const status = line.substring(0, 2).trim();\n if (status === \"A\" || status.startsWith(\"A\")) {\n added++;\n } else if (status === \"M\" || status.startsWith(\"M\")) {\n modified++;\n } else if (status === \"D\" || status.startsWith(\"D\")) {\n deleted++;\n } else if (status === \"??\") {\n added++; // 未跟踪的文件视为新增\n }\n }\n\n if (added > 0 || modified > 0 || deleted > 0) {\n return { added, modified, deleted };\n }\n } catch (error) {\n // Git 命令失败或不是 Git 仓库\n }\n\n return undefined;\n}\n\n/**\n * 创建带文件变更信息的进度信息\n * @param eventPayload 事件负载\n * @param directory 工作目录\n * @returns 完整的进度信息\n */\nexport function createProgressInfo(\n eventPayload?: unknown,\n directory?: string\n): ProgressInfo {\n const baseInfo = extractProgressInfo(eventPayload);\n\n // 如果提供了目录,尝试获取文件变更信息\n if (directory) {\n const fileChanges = extractFileChanges(directory);\n if (fileChanges) {\n return {\n ...baseInfo,\n fileChanges,\n };\n }\n }\n\n return baseInfo;\n}\n\n/**\n * 格式化进度信息为可读文本\n * @param progress 进度信息\n * @returns 格式化后的文本\n */\nexport function formatProgressInfo(progress: ProgressInfo): string {\n const lines: string[] = [];\n\n // 格式化时间戳\n const time = new Date(progress.timestamp);\n const timeStr = time.toLocaleString(\"zh-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n\n lines.push(`• 时间:${timeStr}`);\n\n if (progress.lastAction) {\n lines.push(`• 最近操作:${progress.lastAction}`);\n }\n\n if (progress.currentTask) {\n lines.push(`• 当前任务:${progress.currentTask}`);\n }\n\n // 添加文件变更信息\n if (progress.fileChanges) {\n const changes = progress.fileChanges;\n const changeParts: string[] = [];\n\n if (changes.added && changes.added > 0) {\n changeParts.push(`新增 ${changes.added} 个文件`);\n }\n if (changes.modified && changes.modified > 0) {\n changeParts.push(`修改 ${changes.modified} 个文件`);\n }\n if (changes.deleted && changes.deleted > 0) {\n changeParts.push(`删除 ${changes.deleted} 个文件`);\n }\n\n if (changeParts.length > 0) {\n lines.push(`• 文件变更:${changeParts.join(\",\")}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { execSync } from \"child_process\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport type { ProjectContext } from \"../types\";\n\n/**\n * 提取项目上下文信息\n * @param directory 工作目录路径\n * @returns 项目上下文信息\n */\nexport async function extractProjectContext(\n directory: string\n): Promise<ProjectContext> {\n const workingDir = path.resolve(directory);\n\n // 从 package.json 提取项目名称,否则使用目录名\n const projectName = await extractProjectName(workingDir);\n\n // 检查是否为 Git 仓库并提取信息\n const gitInfo = await extractGitInfo(workingDir);\n\n return {\n projectName,\n branch: gitInfo.branch,\n workingDir,\n repoUrl: gitInfo.repoUrl,\n isGitRepo: gitInfo.isGitRepo,\n hostname: os.hostname(),\n };\n}\n\n/**\n * 从 package.json 或目录名提取项目名称\n */\nasync function extractProjectName(directory: string): Promise<string> {\n const packageJsonPath = path.join(directory, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n try {\n const content = await fs.promises.readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n if (packageJson.name) {\n return packageJson.name;\n }\n } catch {\n // 如果读取失败,使用目录名\n }\n }\n\n // 使用目录名作为项目名\n return path.basename(directory);\n}\n\n/**\n * 提取 Git 仓库信息\n */\nasync function extractGitInfo(directory: string): Promise<{\n isGitRepo: boolean;\n branch?: string;\n repoUrl?: string;\n}> {\n const gitDir = path.join(directory, \".git\");\n\n if (!fs.existsSync(gitDir)) {\n return { isGitRepo: false };\n }\n\n try {\n // 获取当前分支\n const branch = execSync(\"git branch --show-current\", {\n cwd: directory,\n encoding: \"utf-8\",\n }).trim();\n\n // 获取远程仓库 URL\n let repoUrl: string | undefined;\n try {\n const remoteUrl = execSync(\"git config --get remote.origin.url\", {\n cwd: directory,\n encoding: \"utf-8\",\n }).trim();\n\n if (remoteUrl) {\n // 转换 SSH URL 为 HTTPS URL(如果适用)\n repoUrl = convertGitUrlToWeb(remoteUrl);\n }\n } catch {\n // 无法获取远程 URL,忽略\n }\n\n return {\n isGitRepo: true,\n branch: branch || undefined,\n repoUrl,\n };\n } catch (error) {\n // Git 命令失败,但目录中有 .git 文件夹\n return { isGitRepo: true };\n }\n}\n\n/**\n * 转换 Git URL 为可访问的 Web URL\n */\nfunction convertGitUrlToWeb(gitUrl: string): string {\n // 移除 .git 后缀\n let url = gitUrl.replace(/\\.git$/, \"\");\n\n // 转换 SSH URL 为 HTTPS URL\n // git@github.com:user/repo -> https://github.com/user/repo\n if (url.startsWith(\"git@\")) {\n url = url.replace(\":\", \"/\").replace(\"git@\", \"https://\");\n }\n\n return url;\n}\n\n/**\n * 简化版:同步提取项目上下文(用于简单场景)\n */\nexport function extractProjectContextSync(directory: string): ProjectContext {\n const workingDir = path.resolve(directory);\n const projectName = extractProjectNameSync(workingDir);\n const gitInfo = extractGitInfoSync(workingDir);\n\n return {\n projectName,\n branch: gitInfo.branch,\n workingDir,\n repoUrl: gitInfo.repoUrl,\n isGitRepo: gitInfo.isGitRepo,\n hostname: os.hostname(),\n };\n}\n\n/**\n * 同步提取项目名称\n */\nfunction extractProjectNameSync(directory: string): string {\n const packageJsonPath = path.join(directory, \"package.json\");\n\n if (fs.existsSync(packageJsonPath)) {\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n if (packageJson.name) {\n return packageJson.name;\n }\n } catch {\n // 如果读取失败,使用目录名\n }\n }\n\n return path.basename(directory);\n}\n\n/**\n * 同步提取 Git 信息\n */\nfunction extractGitInfoSync(directory: string): {\n isGitRepo: boolean;\n branch?: string;\n repoUrl?: string;\n} {\n const gitDir = path.join(directory, \".git\");\n\n if (!fs.existsSync(gitDir)) {\n return { isGitRepo: false };\n }\n\n try {\n // 获取当前分支\n const branch = execSync(\"git branch --show-current\", {\n cwd: directory,\n encoding: \"utf-8\",\n }).trim();\n\n // 获取远程仓库 URL\n let repoUrl: string | undefined;\n try {\n const remoteUrl = execSync(\"git config --get remote.origin.url\", {\n cwd: directory,\n encoding: \"utf-8\",\n }).trim();\n\n if (remoteUrl) {\n repoUrl = convertGitUrlToWeb(remoteUrl);\n }\n } catch {\n // 无法获取远程 URL,忽略\n }\n\n return {\n isGitRepo: true,\n branch: branch || undefined,\n repoUrl,\n };\n } catch (error) {\n return { isGitRepo: true };\n }\n}\n","import type {\n MessageContext,\n MessageTemplate,\n ReasonConfig,\n ReasonConfigMap,\n} from \"../types\";\nimport type { NotificationType } from \"./messages\";\n\nimport { createProgressInfo, formatProgressInfo } from \"../context/progress\";\nimport { extractProjectContext } from \"../context/project\";\n\n/**\n * 事件原因配置映射\n */\nconst REASON_CONFIGS = {\n session_idle: {\n category: \"闲暇等待\",\n description: \"已完成当前任务,等待下一步指示\",\n requiresAction: true,\n emoji: \"💤\",\n },\n permission_required: {\n category: \"需要权限\",\n description: \"需要访问文件权限才能继续\",\n requiresAction: true,\n emoji: \"🔐\",\n },\n question_asked: {\n category: \"需要选择\",\n description: \"提供了多个方案,需要你选择\",\n requiresAction: true,\n emoji: \"❓\",\n },\n interaction_required: {\n category: \"需要输入\",\n description: \"需要你提供额外信息\",\n requiresAction: true,\n emoji: \"✏️\",\n },\n command_args_required: {\n category: \"参数缺失\",\n description: \"命令需要额外参数才能执行\",\n requiresAction: true,\n emoji: \"⚙️\",\n },\n confirmation_required: {\n category: \"需要确认\",\n description: \"需要你确认是否继续操作\",\n requiresAction: true,\n emoji: \"✅\",\n },\n setup_test: {\n category: \"测试通知\",\n description: \"飞书通知功能测试\",\n requiresAction: false,\n emoji: \"🧪\",\n },\n} as const satisfies ReasonConfigMap;\n\n/**\n * 获取事件类型的中文标题\n */\nfunction getEventTitle(eventType: NotificationType): string {\n const titles: Record<NotificationType, string> = {\n interaction_required: \"需要交互\",\n permission_required: \"需要权限\",\n command_args_required: \"缺少参数\",\n confirmation_required: \"需要确认\",\n session_idle: \"任务完成\",\n question_asked: \"请做选择\",\n setup_test: \"测试通知\",\n };\n\n return titles[eventType];\n}\n\n/**\n * 权限类型中文映射\n */\nconst PERMISSION_TYPE_LABELS: Record<string, string> = {\n read: \"读取\",\n write: \"写入\",\n execute: \"执行\",\n edit: \"编辑\",\n bash: \"命令行\",\n webfetch: \"网络请求\",\n external_directory: \"外部目录\",\n};\n\n/**\n * 从事件负载中提取具体操作说明\n * 根据不同事件类型提取对应的详细信息\n */\nfunction extractActionDetails(\n eventPayload?: unknown,\n originalEventType?: string\n): string[] {\n const details: string[] = [];\n\n if (!eventPayload) {\n return details;\n }\n\n if (typeof eventPayload !== \"object\" || eventPayload === null) {\n return details;\n }\n\n const payload = eventPayload as Record<string, unknown>;\n\n // ========== permission.updated / permission.asked ==========\n if (\n originalEventType === \"permission.updated\" ||\n originalEventType === \"permission.asked\"\n ) {\n const permType = payload.type as string | undefined;\n const pattern = payload.pattern as string | string[] | undefined;\n const title = payload.title as string | undefined;\n\n if (title) {\n details.push(`- ${title}`);\n }\n\n if (permType) {\n const typeLabel = PERMISSION_TYPE_LABELS[permType] || permType;\n details.push(`- 权限类型: ${typeLabel}`);\n }\n\n if (pattern) {\n if (Array.isArray(pattern)) {\n details.push(`- 涉及路径:`);\n pattern.forEach((p) => {\n details.push(` - ${p}`);\n });\n } else {\n details.push(`- 涉及路径: ${pattern}`);\n }\n }\n\n return details;\n }\n\n // ========== tui.prompt.append ==========\n if (originalEventType === \"tui.prompt.append\") {\n const text = payload.text as string | undefined;\n if (text) {\n details.push(`- 提示内容: ${text}`);\n }\n return details;\n }\n\n // ========== tui.command.execute ==========\n if (originalEventType === \"tui.command.execute\") {\n const command = payload.command as string | undefined;\n if (command) {\n details.push(`- 命令: ${command}`);\n }\n return details;\n }\n\n // ========== tui.toast.show ==========\n if (originalEventType === \"tui.toast.show\") {\n const title = payload.title as string | undefined;\n const message = payload.message as string | undefined;\n\n if (title) {\n details.push(`- 标题: ${title}`);\n }\n if (message) {\n details.push(`- 内容: ${message}`);\n }\n return details;\n }\n\n // ========== session.status ==========\n if (originalEventType === \"session.status\") {\n const status = payload.status as Record<string, unknown> | undefined;\n if (status) {\n const statusType = status.type as string | undefined;\n if (statusType === \"idle\") {\n details.push(`- 状态: 空闲,等待指令`);\n } else if (statusType === \"busy\") {\n details.push(`- 状态: 忙碌中`);\n } else if (statusType === \"retry\") {\n const attempt = status.attempt as number | undefined;\n const message = status.message as string | undefined;\n details.push(`- 状态: 重试中 (第 ${attempt || \"?\"} 次)`);\n if (message) {\n details.push(`- 原因: ${message}`);\n }\n }\n }\n return details;\n }\n\n // ========== question.asked (通用选项处理) ==========\n if (payload.options && Array.isArray(payload.options)) {\n const options = payload.options as Array<{\n label?: string;\n description?: string;\n }>;\n if (options.length > 0) {\n details.push(`可选方案:`);\n options.forEach((option, index) => {\n const label = option.label || `选项 ${index + 1}`;\n const desc = option.description ? ` - ${option.description}` : \"\";\n details.push(` ${index + 1}. ${label}${desc}`);\n });\n }\n return details;\n }\n\n // ========== 通用字段处理 ==========\n\n if (payload.prompt && typeof payload.prompt === \"string\") {\n details.push(`- 提示: ${payload.prompt}`);\n }\n\n if (payload.message && typeof payload.message === \"string\") {\n details.push(`- 消息: ${payload.message}`);\n }\n\n if (payload.title && typeof payload.title === \"string\" && details.length === 0) {\n details.push(`- ${payload.title}`);\n }\n\n if (payload.action && typeof payload.action === \"string\") {\n details.push(`- 操作: ${payload.action}`);\n }\n\n if (payload.args && Array.isArray(payload.args)) {\n const args = payload.args as string[];\n if (args.length > 0) {\n details.push(`- 参数:`);\n args.forEach((arg) => {\n details.push(` - --${arg}`);\n });\n }\n }\n\n return details;\n}\n\n/**\n * 构建头部区域 - 醒目的标题行\n */\nfunction buildHeader(context: MessageContext): string {\n const { eventType } = context;\n const config = REASON_CONFIGS[eventType];\n const title = getEventTitle(eventType);\n\n return `${config.emoji} **${title}**`;\n}\n\n/**\n * 构建环境信息区域\n */\nfunction buildEnvironment(context: MessageContext): string {\n const { project, sessionTitle, sessionID, agentName } = context;\n const lines: string[] = [];\n\n lines.push(\"**🖥️ 环境**\");\n\n if (project.hostname) {\n lines.push(`- 主机: ${project.hostname}`);\n }\n\n lines.push(`- 项目: ${project.projectName}`);\n\n if (project.branch) {\n lines.push(`- 分支: ${project.branch}`);\n }\n\n if (sessionTitle || sessionID) {\n const sessionLabel = sessionTitle || sessionID || \"\";\n lines.push(`- 会话: ${sessionLabel}`);\n }\n\n if (agentName) {\n lines.push(`- Agent: ${agentName}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 构建原因说明区域\n */\nfunction buildReason(context: MessageContext): string {\n const { eventType, eventPayload, originalEventType } = context;\n const config = REASON_CONFIGS[eventType];\n const lines: string[] = [];\n\n lines.push(\"**💡 说明**\");\n lines.push(config.description);\n\n // 添加具体操作说明\n const actionDetails = extractActionDetails(eventPayload, originalEventType);\n if (actionDetails.length > 0) {\n lines.push(\"\");\n actionDetails.forEach((detail) => lines.push(detail));\n }\n\n // 对于需要确认的操作,添加警告\n if (eventType === \"confirmation_required\") {\n lines.push(\"\");\n lines.push(\"⚠️ 请谨慎确认此操作\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 构建工作目录信息\n */\nfunction buildWorkdir(context: MessageContext): string {\n const { project } = context;\n const lines: string[] = [];\n\n lines.push(\"**📂 路径**\");\n lines.push(`- 目录: ${project.workingDir}`);\n\n if (project.isGitRepo && project.repoUrl) {\n lines.push(`- 仓库: ${project.repoUrl}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 构建时间戳\n */\nfunction buildTimestamp(): string {\n const now = new Date();\n const timeStr = now.toLocaleString(\"zh-CN\", {\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n return `⏰ ${timeStr}`;\n}\n\n/**\n * 美观消息模板实现\n */\nexport class BeautifulMessageTemplate implements MessageTemplate {\n buildTitle(context: MessageContext): string {\n return buildHeader(context);\n }\n\n buildReason(context: MessageContext): string {\n return buildReason(context);\n }\n\n buildProgress(context: MessageContext): string {\n return buildEnvironment(context);\n }\n\n buildFullMessage(context: MessageContext): string {\n const header = buildHeader(context);\n const environment = buildEnvironment(context);\n const reason = buildReason(context);\n const workdir = buildWorkdir(context);\n const timestamp = buildTimestamp();\n\n // 组装完整消息\n const sections = [\n header,\n \"\",\n environment,\n \"\",\n reason,\n \"\",\n workdir,\n \"\",\n timestamp,\n ];\n\n return sections.join(\"\\n\");\n }\n}\n\n/**\n * 默认消息模板实现(保留向后兼容)\n */\nexport class DefaultMessageTemplate implements MessageTemplate {\n buildTitle(context: MessageContext): string {\n const { project, eventType } = context;\n const eventTitle = getEventTitle(eventType);\n\n let title = `📦 [${project.projectName}]`;\n\n if (project.branch) {\n title += ` ${project.branch}`;\n }\n\n if (project.hostname) {\n title += ` @${project.hostname}`;\n }\n\n title += ` | ${eventTitle}`;\n\n return title;\n }\n\n buildReason(context: MessageContext): string {\n const { eventType, eventPayload, originalEventType } = context;\n const config = REASON_CONFIGS[eventType];\n\n const lines: string[] = [];\n lines.push(`🔔 原因:${config.category}`);\n lines.push(config.description);\n\n const actionDetails = extractActionDetails(eventPayload, originalEventType);\n if (actionDetails.length > 0) {\n lines.push(\"\");\n actionDetails.forEach((detail) => lines.push(detail));\n }\n\n if (eventType === \"confirmation_required\") {\n lines.push(\"\");\n lines.push(\"⚠️ 此操作可能需要谨慎确认。\");\n }\n\n return lines.join(\"\\n\");\n }\n\n buildProgress(context: MessageContext): string {\n const { project, progress, sessionID, sessionTitle, agentName } = context;\n\n const lines: string[] = [];\n lines.push(\"📊 进度摘要\");\n\n lines.push(`• 工作目录:${project.workingDir}`);\n\n if (sessionTitle || sessionID) {\n const label = sessionTitle ?? sessionID ?? \"\";\n const suffix = sessionTitle && sessionID ? ` (${sessionID})` : \"\";\n lines.push(`• 会话:${label}${suffix}`);\n }\n\n if (agentName) {\n lines.push(`• Agent:${agentName}`);\n }\n\n const progressText = formatProgressInfo(progress);\n if (progressText) {\n const progressLines = progressText.split(\"\\n\");\n progressLines.forEach((line: string) => {\n if (line.trim()) {\n lines.push(line);\n }\n });\n }\n\n if (project.isGitRepo && project.repoUrl) {\n lines.push(`• 仓库地址:${project.repoUrl}`);\n }\n\n return lines.join(\"\\n\");\n }\n\n buildFullMessage(context: MessageContext): string {\n const title = this.buildTitle(context);\n const reason = this.buildReason(context);\n const progress = this.buildProgress(context);\n\n return `${title}\\n\\n${reason}\\n\\n${progress}`;\n }\n}\n\n/**\n * 创建消息模板实例(默认使用美观模板)\n */\nexport function createMessageTemplate(): MessageTemplate {\n return new BeautifulMessageTemplate();\n}\n\n/**\n * 根据事件类型获取原因配置\n */\nexport function getReasonConfig(eventType: NotificationType): ReasonConfig {\n return REASON_CONFIGS[eventType] as ReasonConfig;\n}\n\n/**\n * 构建完整的消息上下文\n */\nexport async function buildMessageContext(\n eventType: NotificationType,\n eventPayload?: unknown,\n originalEventType?: string,\n directory?: string,\n sessionContext?: {\n sessionID?: string;\n sessionTitle?: string;\n agentName?: string;\n }\n): Promise<MessageContext> {\n const project = await extractProjectContext(directory || process.cwd());\n const progress = createProgressInfo(eventPayload, directory || process.cwd());\n\n return {\n project,\n progress,\n eventType,\n eventPayload,\n originalEventType,\n sessionID: sessionContext?.sessionID,\n sessionTitle: sessionContext?.sessionTitle,\n agentName: sessionContext?.agentName,\n };\n}\n\n/**\n * 快速构建消息(简化接口)\n */\nexport async function buildStructuredMessage(\n eventType: NotificationType,\n eventPayload?: unknown,\n originalEventType?: string,\n directory?: string,\n sessionContext?: {\n sessionID?: string;\n sessionTitle?: string;\n agentName?: string;\n }\n): Promise<string> {\n const context = await buildMessageContext(\n eventType,\n eventPayload,\n originalEventType,\n directory,\n sessionContext\n );\n\n const template = createMessageTemplate();\n return template.buildFullMessage(context);\n}\n"],"mappings":"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","names":["execSync"]}