{"version":3,"sources":["../src/index.ts","../src/automation.module.ts","../src/controllers/automation.controller.ts","../src/services/automation.service.ts","../src/client/types.ts","../src/client/utils.ts","../src/client/trigger-client.ts","../src/constants.ts","../src/services/automation-discovery.service.ts","../src/decorators/automation.decorator.ts","../src/decorators/bind-trigger.decorator.ts"],"sourcesContent":["export * from './automation.module';\nexport * from './services/automation.service';\nexport * from './services/automation-discovery.service';\nexport * from './decorators';\nexport * from './client';\nexport * from './dto/trigger.dto';\nexport { AutomationController } from './controllers/automation.controller';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Module, Logger, DynamicModule, Provider } from '@nestjs/common';\nimport { DiscoveryModule, Reflector } from '@nestjs/core';\nimport { AutomationController } from '@/controllers/automation.controller';\nimport { AutomationService } from '@/services/automation.service';\nimport { AutomationDiscoveryService } from '@/services/automation-discovery.service';\nimport { TriggerClient } from '@/client/trigger-client';\nimport type { TriggerClientOptions } from '@/client/types';\n\n/**\n * AutomationModule\n * \n * 自动化任务模块，提供声明式任务注册与执行能力\n */\n@Module({})\nexport class AutomationModule {\n  /**\n   * 创建并配置 AutomationModule\n   * \n   * @param options - TriggerClient 配置选项\n   * @returns 配置好的 DynamicModule\n   */\n  static forRoot(options: TriggerClientOptions = {}): DynamicModule {\n    const providers: Provider[] = [\n      {\n        provide: TriggerClient,\n        useFactory: () => {\n          const logger = new Logger(TriggerClient.name);\n          const client = new TriggerClient(logger);\n          return client;\n        },\n      },\n      Reflector,\n      AutomationDiscoveryService,\n      AutomationService,\n    ];\n\n    return {\n      module: AutomationModule,\n      imports: [DiscoveryModule, ...(options.imports || [])],\n      controllers: [AutomationController],\n      providers,\n    };\n  }\n}\n","import {\n  Controller,\n  Post,\n  Body,\n  HttpCode,\n  HttpStatus,\n} from '@nestjs/common';\nimport { AutomationService } from '@/services/automation.service';\nimport type {\n  TriggerExecutionDto,\n  TriggerExecutionResponseDto,\n} from '@/dto/trigger.dto';\nimport { ActionContext, ENUM_PHASE, ENUM_STATUS } from '@/client';\nimport { ApiExcludeController } from '@nestjs/swagger';\nimport { ERROR_CODE_PAIR } from '@/constants';\n\n/**\n * AutomationController\n * \n * 接收来自 Trigger Server 的自动化任务执行请求\n */\n@ApiExcludeController()\n@Controller('/__innerapi__/automation/invoke')\nexport class AutomationController {\n  constructor(private readonly automationService: AutomationService) {}\n\n  /**\n   * Trigger Server 执行接口\n   * \n   * POST /__innerapi__/automation/invoke\n   * \n   * 执行流程：\n   * 1. 验证请求参数完整性\n   * 2. 构建任务执行上下文\n   * 3. 调用 AutomationService 执行任务\n   * 4. 返回执行结果\n   * \n   * @param req - HTTP 请求对象\n   * @param dto - 任务执行数据传输对象\n   * @returns 任务执行响应\n   */\n  @Post()\n  @HttpCode(HttpStatus.OK)\n  async execute(\n    @Body() dto: TriggerExecutionDto\n  ): Promise<TriggerExecutionResponseDto> {\n    try {\n      const { trigger, triggerID, triggerType, instanceID, startAt, parameter = null } = dto;\n\n      // 构建任务执行上下文\n      const context: ActionContext = {\n        attributes: {\n          trigger: trigger ?? 'unknown',\n          triggerID: triggerID ?? 'unknown',\n          triggerType: triggerType ?? 'unknown',\n          instanceID: instanceID ?? 'unknown',\n          startAt: startAt ?? Date.now(),\n        },\n        content: JSON.stringify({ input: parameter }),\n      };\n      \n      // 验证必填字段\n      if (!trigger || !instanceID) {\n        const responseCode = 400;\n        const responseMessage = '缺少必填字段: trigger 或 instanceID 为空';\n        const startTime = context.attributes.startAt;\n        const endTime = Date.now();\n        // 上报验证失败\n        this.automationService.report(JSON.stringify({\n          input: parameter,\n          output: { error: responseMessage },\n        }), {\n          trigger: context.attributes.trigger,\n          trigger_id: context.attributes.triggerID,\n          trigger_type: context.attributes.triggerType,\n          instance_id: context.attributes.instanceID,\n          phase: ENUM_PHASE.Trigger,\n          status: ENUM_STATUS.FAILED,\n          start_at: startTime,\n          end_at: endTime,\n          duration_ms: startTime ? endTime - startTime : undefined,\n        });\n        return { code: responseCode, message: responseMessage };\n      }\n\n      // 异步执行任务，返回值为 触发 结果\n      const ret = this.automationService.executeAction(\n        trigger,\n        instanceID,\n        context,\n      );\n\n      // 处理执行结果\n      if (ret.attributes.status === ENUM_STATUS.FAILED) {\n        const output = JSON.parse(ret.content ?? '{}')?.output;\n        return {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          code: (ERROR_CODE_PAIR as any)[output?.error] ?? 500,\n          message: output?.message ?? 'Internal error',\n        };\n      }\n      \n      return {\n        code: 200,\n        message: 'success',\n      };\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      return {\n        code: 500,\n        message: `Internal error: ${errorMessage}`,\n      };\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Injectable, NotFoundException } from '@nestjs/common';\nimport { TriggerClient } from '@/client/trigger-client';\nimport { ActionContext, ILogAttributes, TLogContent } from '@/client';\n\n/**\n * 任务执行结果接口\n */\nexport interface ActionExecutionResult {\n  trigger: string;\n  success: boolean;\n  result?: any;\n  error?: string;\n  startTime: Date;\n  endTime: Date;\n  duration: number;\n}\n\n/**\n * AutomationService\n * \n * 提供自动化任务的执行、查询和管理功能\n */\n@Injectable()\nexport class AutomationService {\n  constructor(\n    private readonly triggerClient: TriggerClient) { }\n\n  /**\n   * 执行指定的自动化任务\n   * \n   * @param trigger - 任务触发器标识\n   * @param instanceID - 任务实例ID\n   * @param context - 任务执行上下文\n   * @returns 任务执行报告数据\n   */\n  executeAction(trigger: string, instanceID: string, context: ActionContext): ActionContext {\n    return this.triggerClient.executeAction(trigger, instanceID, context);\n  }\n\n  /**\n   * 上报任务执行结果\n   */\n  report(msg: TLogContent, attributes: ILogAttributes) {\n    this.triggerClient.report(msg, attributes);\n  }\n\n  /**\n   * 获取指定任务的元数据信息\n   * \n   * @param trigger - 任务触发器标识\n   * @returns 任务元数据\n   * @throws NotFoundException - 当任务不存在时抛出异常\n   */\n  getActionInfo(trigger: string) {\n    const metadata = this.triggerClient.getActionMetadata(trigger);\n    if (!metadata) {\n      throw new NotFoundException(`Action not found: ${trigger}`);\n    }\n    return metadata;\n  }\n\n  /**\n   * 检查指定任务是否存在\n   * \n   * @param trigger - 任务触发器标识\n   * @returns 存在返回 true，否则返回 false\n   */\n  hasAction(trigger: string): boolean {\n    return this.triggerClient.getAction(trigger) !== undefined;\n  }\n\n  /**\n   * 获取指定任务的处理器\n   * \n   * @param trigger - 任务触发器标识\n   * @returns 任务处理器\n   */\n  getAction(trigger: string) {\n    return this.triggerClient.getAction(trigger);\n  }\n\n  /**\n   * 获取所有已注册的任务\n   * \n   * @returns 所有任务映射\n   */\n  getAllActions() {\n    return this.triggerClient.getAllActions();\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Action handler function type\n */\nexport interface ActionHandler {\n  (...args: any[]): any | Promise<any>;\n}\n\n/**\n * Action definition\n */\nexport interface Action extends ActionMetadata {\n  handler: ActionHandler;\n}\n\nexport enum ENUM_STATUS {\n  SUCCEEDED = 'succeed',\n  FAILED = 'failed',\n}\n\nexport enum ENUM_PHASE {\n  Trigger = 'trigger',\n  Action = 'action',\n}\n\nexport enum ENUM_ENV {\n  DEV = 'development',\n  PROD = 'production',\n}\n\nexport interface ActionContext {\n  attributes: {\n    trigger: string;\n    triggerID?: string;\n    triggerType?: string;\n    instanceID: string;\n    status?: ENUM_STATUS;\n    phase?: ENUM_PHASE;\n    startAt?: number;\n    endAt?: number;\n    duration_ms?: number;\n  };\n  content?: string; // '{ input: {}, output: {} }'\n}\n\n\nexport type TLogContent = string; // stringified { input, output }\nexport interface ILogAttributes {\n  trigger?: string;\n  trigger_id?: string;\n  trigger_type?: string;\n  instance_id?: string;\n  status?: ENUM_STATUS;\n  phase?: ENUM_PHASE;\n  start_at?: number;\n  end_at?: number;\n  duration_ms?: number;\n}\n\n/**\n * Action metadata (without handler)\n */\nexport interface ActionMetadata {\n  name?: string;\n  path?: string;\n  desc?: string;\n}\n\n/**\n * Logger interface for client SDK\n */\nexport interface Logger {\n  debug(message: string, extra?: any): void;\n  info(message: string, extra?: any): void;\n  warn(message: string, extra?: any): void;\n  error(message: string, extra?: any): void;\n}\n\n/**\n * TriggerClient configuration options\n */\nexport interface TriggerClientOptions {\n  /**\n   * Timeout for action execution (ms)\n   */\n  timeout?: number;\n  imports?: any[];\n}\n\nexport enum ENUM_ERROR {\n  NOT_EXIST = 'NOT_EXIST',\n  TIMEOUT = 'TIMEOUT',\n  PARAM_INVALID = 'PARAM_INVALID',\n  TRY_CATCH = 'TRY_CATCH',\n}\n\nexport interface ILogContentParsed {\n  /** 触发器名称 (例如 'cron-daily') */\n  trigger?: string;\n  /** 触发器定义 ID */\n  trigger_id?: string;\n  /** 触发器类型 (例如 定时任务、记录变更) */\n  trigger_type?: string;\n  /** 执行实例 ID */\n  instance_id?: string;\n  /** 阶段：触发阶段或动作执行阶段 */\n  phase?: ENUM_PHASE;\n  /** 状态：成功或失败 */\n  status?: ENUM_STATUS;\n  /** 执行耗时 (毫秒)。计算逻辑：(endAt - startAt) 或内部计时器 */\n  duration_ms?: number;\n  /** 核心内容 */\n  content?: {\n    /** 动作入参 */\n    input?: any;\n    /** 动作出参 */\n    output?: any;\n  };\n  /** 错误信息，仅在 status 为 failed 时填充，否则为空字符串 */\n  error_message?: string;\n}\n","import { ActionContext, ILogAttributes, TLogContent } from './types';\n\nexport const convertActionContextToReportData = (actionCtx: ActionContext): [TLogContent, ILogAttributes] => {\n  const { attributes, content } = actionCtx;\n  return [\n    content || '',\n    {\n      trigger: attributes?.trigger,\n      trigger_id: attributes?.triggerID,\n      trigger_type: attributes?.triggerType,\n      instance_id: attributes?.instanceID,\n      status: attributes?.status,\n      phase: attributes?.phase,\n      start_at: attributes?.startAt,\n      end_at: attributes?.endAt,\n      duration_ms: attributes?.duration_ms,\n    },\n  ];\n};","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Logger } from '@nestjs/common';\nimport {\n  ENUM_STATUS,\n  ENUM_PHASE,\n  type Action,\n  type ActionHandler,\n  type ActionMetadata,\n  ENUM_ERROR,\n  ActionContext,\n  TLogContent,\n  ILogAttributes,\n  ILogContentParsed,\n} from './types';\nimport { convertActionContextToReportData } from './utils';\n\nconst INTERNAL = 'AUTOMATION_INTERNAL';\n\n/**\n * TriggerClient\n *\n * 自动化触发器管理客户端核心类\n *\n * 负责管理触发器注册、执行和生命周期事件\n * 提供中间件支持和与 trigger-server 的回调集成\n */\nexport class TriggerClient {\n  private _triggerActionMap: Map<string, Action> = new Map();\n  private _logger: Logger;\n\n  /**\n   * 创建 TriggerClient 实例\n   *\n   * @param logger - 日志记录器\n   */\n  public constructor(logger: Logger) {\n    this._logger = logger;\n  }\n\n  /**\n   * 为指定的 trigger 注册动作\n   *\n   * @param trigger - 触发器标识\n   * @param action - 动作配置\n   */\n  public registerAction(trigger: string, action: Action): void {\n    this._logger.debug(\n      `[${INTERNAL}] Registering action for trigger: ${trigger}`,\n      {\n        actionName: action.name,\n        path: action.path,\n        desc: action.desc,\n      }\n    );\n\n    if (this._triggerActionMap.has(trigger)) {\n      this._logger.debug(\n        `[${INTERNAL}] Trigger ${trigger} already registered, overwriting`\n      );\n    }\n\n    const wrappedHandler = this._wrapHandler(action.handler);\n    const wrappedAction: Action = {\n      ...action,\n      handler: wrappedHandler,\n    };\n\n    this._triggerActionMap.set(trigger, wrappedAction);\n    this._logger.debug(\n      `[${INTERNAL}] Action registered successfully for trigger: ${trigger}`\n    );\n  }\n\n  /**\n   * 执行指定的 trigger 动作\n   *\n   * @param trigger - 触发器标识\n   * @param instanceID - 实例ID\n   * @param context - 执行上下文\n   * @returns 执行报告数据\n   */\n  public executeAction(\n    trigger: string,\n    instanceID: string,\n    context: ActionContext\n  ): ActionContext {\n    let input;\n\n    // 解析输入参数\n    try {\n      const parsed = JSON.parse(context.content || '{}');\n      input = parsed?.input ?? null;\n    } catch (error) {\n      input = undefined;\n      const content = JSON.stringify({\n        input,\n        output: {\n          error: ENUM_ERROR.PARAM_INVALID,\n          message: `参数解析失败(trigger: ${trigger}, instanceID: ${instanceID})`,\n        },\n      });\n      const actionCtx: ActionContext = {\n        ...context,\n        attributes: {\n          ...context.attributes,\n          phase: ENUM_PHASE.Trigger,\n          status: ENUM_STATUS.FAILED,\n          endAt: Date.now(),\n          duration_ms: this._computeDuration(context.attributes.startAt),\n        },\n        content,\n      };\n      this.report(...convertActionContextToReportData(actionCtx));\n      return actionCtx;\n    }\n\n    try {\n      // 获取动作处理器\n      const action = this.getAction(trigger);\n\n      // 如果动作不存在，返回错误\n      if (!action) {\n        const actionCtx: ActionContext = {\n          ...context,\n          attributes: {\n            ...context.attributes,\n            phase: ENUM_PHASE.Trigger,\n            status: ENUM_STATUS.FAILED,\n            endAt: Date.now(),\n            duration_ms: this._computeDuration(context.attributes.startAt),\n          },\n          content: JSON.stringify({\n            input,\n            output: {\n              error: ENUM_ERROR.NOT_EXIST,\n              message: `执行动作不存在: ${trigger}`,\n            },\n          }),\n        };\n        // 上报 trigger 结果{成功/失败}\n        this.report(...convertActionContextToReportData(actionCtx));\n        return actionCtx;\n      }\n\n      // 直接执行 _wrapHandler(handler)，不会等待执行结束\n      action.handler(context);\n\n      const actionCtx: ActionContext = {\n        ...context,\n        attributes: {\n          ...context.attributes,\n          phase: ENUM_PHASE.Trigger,\n          status: ENUM_STATUS.SUCCEEDED,\n          endAt: Date.now(),\n          duration_ms: this._computeDuration(context.attributes.startAt),\n        },\n        content: JSON.stringify({ input, output: null }),\n      };\n      // 上报 trigger 结果{成功/失败}\n      this.report(...convertActionContextToReportData(actionCtx));\n\n      return actionCtx;\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n\n      const actionCtx: ActionContext = {\n        ...context,\n        attributes: {\n          ...context.attributes,\n          phase: ENUM_PHASE.Trigger,\n          status: ENUM_STATUS.FAILED,\n          endAt: Date.now(),\n          duration_ms: this._computeDuration(context.attributes.startAt),\n        },\n        content: JSON.stringify({\n          input,\n          output: { error: ENUM_ERROR.TRY_CATCH, message: errorMessage },\n        }),\n      };\n      // 上报 trigger 结果{成功/失败}\n      this.report(...convertActionContextToReportData(actionCtx));\n\n      return actionCtx;\n    }\n  }\n\n  /**\n   * 根据 trigger 获取对应的动作\n   *\n   * @param trigger - 触发器标识\n   * @returns 动作实例，如果不存在返回 undefined\n   */\n  public getAction(trigger: string): Action | undefined {\n    const action = this._triggerActionMap.get(trigger);\n\n    if (!action) {\n      this._logger.debug(`No action found for trigger: ${trigger}`);\n      return undefined;\n    }\n\n    this._logger.debug(`Retrieved action for trigger: ${trigger}`, {\n      actionName: action.name,\n      path: action.path,\n    });\n\n    return action;\n  }\n\n  /**\n   * 获取所有已注册的动作\n   *\n   * @returns 动作映射表\n   */\n  public getAllActions(): Map<string, Action> {\n    return this._triggerActionMap;\n  }\n\n  /**\n   * 根据 trigger 获取动作的元数据\n   *\n   * @param trigger - 触发器标识\n   * @returns 动作元数据，如果不存在返回 undefined\n   */\n  public getActionMetadata(trigger: string): ActionMetadata | undefined {\n    const action = this.getAction(trigger);\n\n    if (!action) {\n      return undefined;\n    }\n\n    return {\n      name: action.name,\n      path: action.path,\n      desc: action.desc,\n    };\n  }\n\n  /**\n   * 获取所有已注册的 trigger 标识\n   *\n   * @returns trigger 标识数组\n   */\n  public getAllTriggers(): string[] {\n    const triggers = Array.from(this._triggerActionMap.keys());\n    this._logger.debug(`Retrieved all triggers`, {\n      count: triggers.length,\n    });\n    return triggers;\n  }\n\n  /**\n   * 根据 trigger 移除对应的动作\n   *\n   * @param trigger - 触发器标识\n   * @returns 如果成功移除返回 true，如果不存在返回 false\n   */\n  public removeAction(trigger: string): boolean {\n    const existed = this._triggerActionMap.has(trigger);\n\n    if (existed) {\n      this._triggerActionMap.delete(trigger);\n      this._logger.debug(`Removed action for trigger: ${trigger}`);\n    } else {\n      this._logger.debug(\n        `Attempted to remove non-existent trigger: ${trigger}`\n      );\n    }\n\n    return existed;\n  }\n\n  /**\n   * 清空所有已注册的动作\n   */\n  public clearAllActions(): void {\n    const count = this._triggerActionMap.size;\n    this._triggerActionMap.clear();\n    this._logger.debug(`Cleared all actions`, { count });\n  }\n\n  /**\n   * 上报执行数据，用于日志记录和调试\n   */\n  public report(msg: TLogContent, extra: ILogAttributes): void {\n    const {\n      status,\n      phase,\n      start_at,\n      end_at,\n      trigger,\n      trigger_id,\n      instance_id,\n      trigger_type,\n    } = extra;\n\n    let contentObj: { input: any; output: any } = { input: null, output: null };\n    try {\n      contentObj = JSON.parse(msg);\n    } catch (error) {\n      this._logger.debug(`Failed to parse log content as JSON: ${msg}`);\n    }\n\n    const duration_ms = end_at && start_at ? end_at - start_at : 0;\n\n    let error_message;\n    if (status === ENUM_STATUS.FAILED && contentObj?.output?.message) {\n      error_message = contentObj.output.message;\n    }\n\n    const logContent: ILogContentParsed = {\n      trigger,\n      trigger_id,\n      trigger_type,\n      instance_id,\n      phase,\n      status,\n      duration_ms,\n      content: contentObj,\n      error_message,\n    };\n\n    // for 观测\n    const signature = {\n      sourceType: 'platform',\n      paas_attributes_module: 'trigger',\n    };\n    const newMsg = JSON.stringify(logContent);\n\n    // msg\n    if (status === ENUM_STATUS.FAILED) {\n      this._logger.error(newMsg, { ...extra, ...signature });\n    } else {\n      this._logger.log(newMsg, { ...extra, ...signature });\n    }\n  }\n\n  /**\n   * 包装处理器，添加日志记录和计时功能\n   *\n   * @param handler - 原始处理器\n   * @returns 包装后的处理器\n   */\n  private _computeDuration(startAt?: number): number | undefined {\n    return startAt ? Date.now() - startAt : undefined;\n  }\n\n  private _wrapHandler(handler: Action['handler']): ActionHandler {\n    return async (context: ActionContext): Promise<ActionContext> => {\n      let input;\n\n      // 解析输入参数\n      try {\n        input = JSON.parse(context.content || '{}').input;\n      } catch (error) {\n        input = undefined;\n      }\n\n      try {\n        const actionStartAt = Date.now();\n        const output = await Promise.resolve(\n          handler({\n            attributes: {\n              ...context.attributes,\n              startAt: actionStartAt,\n            },\n            content: {\n              input,\n            },\n          })\n        );\n\n        const actionCtx: ActionContext = {\n          ...context,\n          attributes: {\n            ...context.attributes,\n            startAt: actionStartAt,\n            phase: ENUM_PHASE.Action,\n            status: ENUM_STATUS.SUCCEEDED,\n            endAt: Date.now(),\n            duration_ms: this._computeDuration(actionStartAt),\n          },\n          content: JSON.stringify({\n            input,\n            output,\n          }),\n        };\n        this.report(...convertActionContextToReportData(actionCtx));\n\n        return actionCtx;\n      } catch (error) {\n        const errorMessage =\n          error instanceof Error ? error.message : String(error);\n\n        const actionCtx: ActionContext = {\n          ...context,\n          attributes: {\n            ...context.attributes,\n            phase: ENUM_PHASE.Action,\n            status: ENUM_STATUS.FAILED,\n            endAt: Date.now(),\n            duration_ms: this._computeDuration(context.attributes.startAt),\n          },\n          content: JSON.stringify({\n            input,\n            output: { error: ENUM_ERROR.TRY_CATCH, message: errorMessage },\n          }),\n        };\n        this.report(...convertActionContextToReportData(actionCtx));\n        return actionCtx;\n      }\n    };\n  }\n}\n","import { ENUM_ERROR } from './client';\n\nexport const ERROR_CODE_PAIR = {\n  [ENUM_ERROR.PARAM_INVALID]: 400,\n  [ENUM_ERROR.NOT_EXIST]: 404,\n  [ENUM_ERROR.TIMEOUT]: 504,\n}","/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Injectable, Logger, OnModuleInit } from '@nestjs/common';\nimport { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';\nimport { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';\nimport { TriggerClient } from '@/client/trigger-client';\nimport { AUTOMATION_METADATA_KEY } from '@/decorators/automation.decorator';\nimport { BIND_ACTION_METADATA_KEY, BindActionMetadata } from '@/decorators/bind-trigger.decorator';\n\n/**\n * AutomationDiscoveryService\n * \n * 自动化任务发现服务，负责扫描并注册所有标记了 @Automation 和 @BindTrigger 的任务\n */\n@Injectable()\nexport class AutomationDiscoveryService implements OnModuleInit {\n  private readonly logger = new Logger(AutomationDiscoveryService.name);\n\n  constructor(\n    private readonly discoveryService: DiscoveryService,\n    private readonly metadataScanner: MetadataScanner,\n    private readonly reflector: Reflector,\n    private readonly triggerClient: TriggerClient,\n  ) {}\n\n  /**\n   * 模块初始化时触发任务发现\n   */\n  async onModuleInit() {\n    await this.discover();\n  }\n\n  /**\n   * 发现并注册所有自动化任务\n   * \n   * 扫描流程：\n   * 1. 获取所有 providers 和 controllers\n   * 2. 筛选出标记了 @Automation 的类\n   * 3. 扫描类中标记了 @BindTrigger 的方法\n   * 4. 将任务注册到 TriggerClient\n   */\n  private async discover(): Promise<void> {\n    this.logger.debug('Starting automation trigger discovery...');\n\n    const providers = this.discoveryService.getProviders();\n    const controllers = this.discoveryService.getControllers();\n\n    const allWrappers = [...providers, ...controllers];\n    let registeredCount = 0;\n\n    for (const wrapper of allWrappers) {\n      const { instance } = wrapper;\n\n      if (!instance || typeof instance !== 'object') {\n        continue;\n      }\n\n      const isAutomationController = this.reflector.get<boolean>(\n        AUTOMATION_METADATA_KEY,\n        instance.constructor,\n      );\n\n      if (!isAutomationController) {\n        continue;\n      }\n\n      this.logger.debug(`Found automation controller: ${instance.constructor.name}`);\n\n      const methodNames = this.metadataScanner.getAllMethodNames(\n        Object.getPrototypeOf(instance),\n      );\n\n      for (const methodName of methodNames) {\n        const method = (instance as any)[methodName];\n        if (typeof method !== 'function') continue;\n\n        const actionMetadata = this.reflector.get<BindActionMetadata>(\n          BIND_ACTION_METADATA_KEY,\n          method,\n        );\n        if (!actionMetadata) continue;\n\n        await this.registerAction(instance, methodName, method, actionMetadata, wrapper);\n        registeredCount++;\n      }\n    }\n\n    this.logger.debug(\n      `Automation trigger discovery completed. Registered ${registeredCount} triggers.`,\n    );\n  }\n\n  /**\n   * 注册单个自动化任务\n   * \n   * @param instance - 任务实例\n   * @param methodName - 方法名称\n   * @param method - 方法引用\n   * @param metadata - 任务元数据\n   * @param _wrapper - 实例包装器\n   */\n  private async registerAction(\n    instance: any,\n    methodName: string,\n    method: Function,\n    metadata: BindActionMetadata,\n    _wrapper: InstanceWrapper,\n  ): Promise<void> {\n    const { trigger, actionName, actionDesc } = metadata;\n\n    const name = actionName || `${instance.constructor.name}.${methodName}`;\n    const actionPath = `${instance.constructor.name}:${methodName}`;\n\n    this.logger.debug(`Registering action: ${trigger} -> ${name} (${actionPath})`);\n\n\n    const handler = async (...args: any[]) => {\n      this.logger.debug(`Executing action: ${trigger} with args:`, args);\n      return await method.apply(instance, args);\n    };\n\n    this.triggerClient.registerAction(trigger, {\n      name,\n      handler,\n      path: actionPath,\n      desc: actionDesc,\n    });\n\n    this.logger.debug(`Action registered successfully: ${trigger}`);\n  }\n}\n","import { Injectable, SetMetadata } from '@nestjs/common';\n\n/**\n * 自动化控制器元数据键\n */\nexport const AUTOMATION_METADATA_KEY = 'automation:controller';\n\n/**\n * @Automation 装饰器\n * \n * 类装饰器，用于标记一个类为自动化任务控制器\n * 自动包含 @Injectable()，无需额外添加\n * \n * @example\n * ```typescript\n * @Automation()\n * export class MyAutomation {\n *   // 任务方法\n * }\n * ```\n */\nexport const Automation = (): ClassDecorator => {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return (target: any) => {\n    // 应用 Injectable 装饰器\n    Injectable()(target);\n    // 设置自动化元数据\n    SetMetadata(AUTOMATION_METADATA_KEY, true)(target);\n    return target;\n  };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SetMetadata } from '@nestjs/common';\n\n/**\n * 绑定动作元数据键\n */\nexport const BIND_ACTION_METADATA_KEY = 'automation:action';\n\n/**\n * 绑定动作元数据接口\n */\nexport interface BindActionMetadata {\n  trigger: string;\n  actionName?: string;\n  actionDesc?: string;\n}\n\n/**\n * Trigger 注册表\n * \n * 用于确保每个 trigger 只能绑定一个方法，实现 1:1 绑定约束\n */\nconst TRIGGER_REGISTRY = new Map<string, { className: string; methodName: string }>();\n\n/**\n * 获取已注册的 triggers\n */\nexport const getRegisteredTriggers = () => TRIGGER_REGISTRY;\n\n/**\n * 清空 trigger 注册表\n */\nexport const clearTriggerRegistry = () => TRIGGER_REGISTRY.clear();\n\n/**\n * @BindTrigger 装饰器\n * \n * 方法装饰器，将方法绑定到指定的 trigger\n * \n * 重要特性：\n * - 1:1 绑定约束：每个 trigger 只能绑定一个方法\n * - 重复绑定会抛出错误\n * \n * @param trigger - Trigger 唯一标识符\n * @param options - 可选配置\n * @param options.actionName - 任务名称\n * @param options.actionDesc - 任务描述\n * \n * @example\n * ```typescript\n * @Automation()\n * @Injectable()\n * export class EmailAutomation {\n *   @BindTrigger('send-email', {\n *     actionName: 'SendEmail',\n *     actionDesc: '发送邮件通知'\n *   })\n *   async sendEmail(to: string, subject: string) {\n *     // 邮件发送逻辑\n *   }\n * }\n * ```\n */\nexport const BindTrigger = (\n  trigger: string,\n  options?: { actionName?: string; actionDesc?: string },\n): MethodDecorator => {\n  return (target: any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\n    const className = target.constructor.name;\n    const methodName = String(propertyKey);\n\n    // 检查 trigger 是否已被注册\n    if (TRIGGER_REGISTRY.has(trigger)) {\n      const existing = TRIGGER_REGISTRY.get(trigger)!;\n      throw new Error(\n        `\\n❌ @BindTrigger binding violation detected!\\n` +\n          `\\nTrigger '${trigger}' is already bound to another method:\\n` +\n          `  Existing: ${existing.className}.${existing.methodName}\\n` +\n          `  Attempted: ${className}.${methodName}\\n` +\n          `\\n@BindTrigger enforces strict 1-to-1 binding. Each trigger can only be bound to one method.\\n`,\n      );\n    }\n\n    // 注册 trigger\n    TRIGGER_REGISTRY.set(trigger, { className, methodName });\n\n    const metadata: BindActionMetadata = {\n      trigger,\n      actionName: options?.actionName,\n      actionDesc: options?.actionDesc,\n    };\n\n    return SetMetadata(BIND_ACTION_METADATA_KEY, metadata)(target, propertyKey!, descriptor!);\n  };\n};\n"],"mappings":"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","names":["import_common","import_core","import_common","ENUM_STATUS","ENUM_PHASE","ENUM_ENV","ENUM_ERROR","convertActionContextToReportData","actionCtx","attributes","content","trigger","trigger_id","triggerID","trigger_type","triggerType","instance_id","instanceID","status","phase","start_at","startAt","end_at","endAt","duration_ms","INTERNAL","TriggerClient","_triggerActionMap","Map","_logger","logger","registerAction","trigger","action","debug","actionName","name","path","desc","has","wrappedHandler","_wrapHandler","handler","wrappedAction","set","executeAction","instanceID","context","input","parsed","JSON","parse","content","error","undefined","stringify","output","ENUM_ERROR","PARAM_INVALID","message","actionCtx","attributes","phase","ENUM_PHASE","Trigger","status","ENUM_STATUS","FAILED","endAt","Date","now","duration_ms","_computeDuration","startAt","report","convertActionContextToReportData","getAction","NOT_EXIST","SUCCEEDED","errorMessage","Error","String","TRY_CATCH","get","getAllActions","getActionMetadata","getAllTriggers","triggers","Array","from","keys","count","length","removeAction","existed","delete","clearAllActions","size","clear","msg","extra","start_at","end_at","trigger_id","instance_id","trigger_type","contentObj","error_message","logContent","signature","sourceType","paas_attributes_module","newMsg","log","actionStartAt","Promise","resolve","Action","AutomationService","triggerClient","executeAction","trigger","instanceID","context","report","msg","attributes","getActionInfo","metadata","getActionMetadata","NotFoundException","hasAction","getAction","undefined","getAllActions","ERROR_CODE_PAIR","ENUM_ERROR","PARAM_INVALID","NOT_EXIST","TIMEOUT","AutomationController","automationService","execute","dto","trigger","triggerID","triggerType","instanceID","startAt","parameter","context","attributes","Date","now","content","JSON","stringify","input","responseCode","responseMessage","startTime","endTime","report","output","error","trigger_id","trigger_type","instance_id","phase","ENUM_PHASE","Trigger","status","ENUM_STATUS","FAILED","start_at","end_at","duration_ms","undefined","code","message","ret","executeAction","parse","ERROR_CODE_PAIR","errorMessage","Error","String","OK","import_common","import_common","AUTOMATION_METADATA_KEY","Automation","target","Injectable","SetMetadata","import_common","BIND_ACTION_METADATA_KEY","TRIGGER_REGISTRY","Map","getRegisteredTriggers","clearTriggerRegistry","clear","BindTrigger","trigger","options","target","propertyKey","descriptor","className","name","methodName","String","has","existing","get","Error","set","metadata","actionName","actionDesc","SetMetadata","AutomationDiscoveryService","logger","Logger","name","discoveryService","metadataScanner","reflector","triggerClient","onModuleInit","discover","debug","providers","getProviders","controllers","getControllers","allWrappers","registeredCount","wrapper","instance","isAutomationController","get","AUTOMATION_METADATA_KEY","methodNames","getAllMethodNames","Object","getPrototypeOf","methodName","method","actionMetadata","BIND_ACTION_METADATA_KEY","registerAction","metadata","_wrapper","trigger","actionName","actionDesc","actionPath","handler","args","apply","path","desc","AutomationModule","forRoot","options","providers","provide","TriggerClient","useFactory","logger","Logger","name","client","Reflector","AutomationDiscoveryService","AutomationService","module","imports","DiscoveryModule","controllers","AutomationController"]}