{"version":3,"file":"agent/execution-controller.mjs","sources":["webpack://@multimodal/agent/./src/agent/execution-controller.ts"],"sourcesContent":["import { getLogger } from '../utils/logger';\nimport { AgentStatus } from '@multimodal/agent-interface';\n\n/**\n * Controls the execution state of an Agent and manages abort functionality\n *\n * This class provides:\n * 1. Status management to prevent concurrent executions\n * 2. Abort signal handling to cancel running tasks\n * 3. Cleanup hooks for proper resource management\n */\nexport class AgentExecutionController {\n  private abortController: AbortController | null = null;\n  private status: AgentStatus = AgentStatus.IDLE;\n  private logger = getLogger('ExecutionController');\n  private cleanupHandlers: (() => Promise<void> | void)[] = [];\n\n  /**\n   * Get the current execution status\n   */\n  getStatus(): AgentStatus {\n    return this.status;\n  }\n\n  /**\n   * Check if the agent is currently executing\n   */\n  isExecuting(): boolean {\n    return this.status === AgentStatus.EXECUTING;\n  }\n\n  /**\n   * Get the current abort signal\n   * @returns The current abort signal or undefined if not executing\n   */\n  getAbortSignal(): AbortSignal | undefined {\n    return this.abortController?.signal;\n  }\n\n  /**\n   * Begin a new execution session\n   * @returns abort signal for the new session\n   * @throws Error if another execution is already in progress\n   */\n  beginExecution(): AbortSignal {\n    if (this.isExecuting()) {\n      throw new Error(\n        'Agent is already executing a task. Complete or abort the current task before starting a new one.',\n      );\n    }\n\n    // Clean up any previous abort controller\n    this.abortController?.abort();\n\n    // Create new abort controller for this execution\n    this.abortController = new AbortController();\n    this.status = AgentStatus.EXECUTING;\n    this.cleanupHandlers = [];\n\n    this.logger.info(`Agent execution started with status: ${this.status}`);\n    return this.abortController.signal;\n  }\n\n  /**\n   * End the current execution session\n   * @param status The final status to set\n   */\n  async endExecution(status: AgentStatus = AgentStatus.IDLE): Promise<void> {\n    // Run cleanup handlers in reverse order they were added\n    for (const handler of this.cleanupHandlers.reverse()) {\n      try {\n        await handler();\n      } catch (error) {\n        this.logger.error(`Error in cleanup handler: ${error}`);\n      }\n    }\n\n    this.cleanupHandlers = [];\n    this.status = status;\n    this.logger.info(`Agent execution ended with status: ${this.status}`);\n  }\n\n  /**\n   * Abort the current execution\n   * @returns True if execution was aborted, false if there was no execution to abort\n   */\n  abort(): boolean {\n    if (!this.isExecuting() || !this.abortController) {\n      this.logger.info(\n        `Abort called but no execution in progress (current status: ${this.status})`,\n      );\n      return false;\n    }\n\n    this.logger.info('Aborting agent execution');\n    this.abortController.abort();\n    this.status = AgentStatus.ABORTED;\n    return true;\n  }\n\n  /**\n   * Register a cleanup handler to be called when execution ends\n   * @param handler Function to call during cleanup\n   */\n  registerCleanupHandler(handler: () => Promise<void> | void): void {\n    this.cleanupHandlers.push(handler);\n  }\n\n  /**\n   * Check if the current execution has been aborted\n   */\n  isAborted(): boolean {\n    return this.status === AgentStatus.ABORTED;\n  }\n}\n"],"names":["AgentExecutionController","AgentStatus","_this_abortController","Error","AbortController","status","handler","error","getLogger"],"mappings":";;;;;;;;;;;;;;;;AAWO,MAAMA;IASX,YAAyB;QACvB,OAAO,IAAI,CAAC,MAAM;IACpB;IAKA,cAAuB;QACrB,OAAO,IAAI,CAAC,MAAM,KAAKC,YAAY,SAAS;IAC9C;IAMA,iBAA0C;YACjCC;QAAP,OAAO,QAAAA,CAAAA,wBAAAA,IAAI,CAAC,eAAe,AAAD,IAAnBA,KAAAA,IAAAA,sBAAsB,MAAM;IACrC;IAOA,iBAA8B;YAQ5BA;QAPA,IAAI,IAAI,CAAC,WAAW,IAClB,MAAM,IAAIC,MACR;gBAKJD,CAAAA,wBAAAA,IAAI,CAAC,eAAe,AAAD,KAAnBA,sBAAsB,KAAK;QAG3B,IAAI,CAAC,eAAe,GAAG,IAAIE;QAC3B,IAAI,CAAC,MAAM,GAAGH,YAAY,SAAS;QACnC,IAAI,CAAC,eAAe,GAAG,EAAE;QAEzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,qCAAqC,EAAE,IAAI,CAAC,MAAM,EAAE;QACtE,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM;IACpC;IAMA,MAAM,aAAaI,SAAsBJ,YAAY,IAAI,EAAiB;QAExE,KAAK,MAAMK,WAAW,IAAI,CAAC,eAAe,CAAC,OAAO,GAChD,IAAI;YACF,MAAMA;QACR,EAAE,OAAOC,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,0BAA0B,EAAEA,OAAO;QACxD;QAGF,IAAI,CAAC,eAAe,GAAG,EAAE;QACzB,IAAI,CAAC,MAAM,GAAGF;QACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,mCAAmC,EAAE,IAAI,CAAC,MAAM,EAAE;IACtE;IAMA,QAAiB;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,CAAC,2DAA2D,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9E,OAAO;QACT;QAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,KAAK;QAC1B,IAAI,CAAC,MAAM,GAAGJ,YAAY,OAAO;QACjC,OAAO;IACT;IAMA,uBAAuBK,OAAmC,EAAQ;QAChE,IAAI,CAAC,eAAe,CAAC,IAAI,CAACA;IAC5B;IAKA,YAAqB;QACnB,OAAO,IAAI,CAAC,MAAM,KAAKL,YAAY,OAAO;IAC5C;;QArGA,uBAAQ,mBAA0C;QAClD,uBAAQ,UAAsBA,YAAY,IAAI;QAC9C,uBAAQ,UAASO,UAAU;QAC3B,uBAAQ,mBAAkD,EAAE;;AAmG9D"}