{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-S75VJS4B.cjs","../../src/services/workflow-task-runner.service.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACOO,IAAM,mBAAA,EAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAA,CACC,WAAA,EACA,kBAAA,EACA,SAAA,EACC;AACD,IAAA,IAAA,CAAK,YAAA,EAAc,WAAA;AACnB,IAAA,IAAA,CAAK,mBAAA,EAAqB,kBAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,EAAY,SAAA;AAAA,EAClB;AAAA,EAEA,MAAA,CAAO,WAAA,CACN,IAAA,EACA,MAAA,EACA,WAAA,EAC2D;AAC3D,IAAA,MAAM,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA;AAC3B,IAAA,MAAM;AAAA,MACL,KAAA,EAAO,kBAAA;AAAA,MACP,IAAA,EAAM;AAAA,QACL,KAAA,EAAO,CAAA,4DAAA,EAAkB,iDAAA,IAAsB,CAAC,CAAA,CAAA;AAElB,QAAA;AAEpB,QAAA;AACF,UAAA;AACM,UAAA;AACD,UAAA;AACb,QAAA;AACD,MAAA;AACD,IAAA;AAEI,IAAA;AACA,IAAA;AAGO,MAAA;AAEG,MAAA;AACC,QAAA;AACgB,QAAA;AACjB,QAAA;AACJ,QAAA;AACR,QAAA;AACA,QAAA;AACsB,QAAA;AACvB,MAAA;AACe,IAAA;AAE+C,MAAA;AACO,MAAA;AACxD,MAAA;AACC,QAAA;AACgB,QAAA;AACjB,QAAA;AACJ,QAAA;AACC,QAAA;AACF,QAAA;AACP,QAAA;AACsB,QAAA;AACvB,MAAA;AACD,IAAA;AAEM,IAAA;AACE,MAAA;AACD,MAAA;AACQ,QAAA;AACgB,QAAA;AACV,QAAA;AACA,QAAA;AACD,QAAA;AACnB,MAAA;AACD,IAAA;AACO,IAAA;AACR,EAAA;AAMgD,EAAA;AACP,IAAA;AACA,IAAA;AACM,MAAA;AAE5C,MAAA;AACD,IAAA;AAEoD,IAAA;AAEnD,MAAA;AACK,MAAA;AACN,IAAA;AAC0C,IAAA;AAC1C,MAAA;AACA,MAAA;AACY,MAAA;AACZ,MAAA;AACY,MAAA;AACZ,IAAA;AAEa,IAAA;AACiB,IAAA;AACV,IAAA;AACqB,MAAA;AACX,QAAA;AACiC,QAAA;AACxD,MAAA;AACO,QAAA;AACd,MAAA;AAC2B,MAAA;AAC5B,IAAA;AACO,IAAA;AACR,EAAA;AAMgD,EAAA;AACX,IAAA;AACmC,MAAA;AACvE,IAAA;AAE4D,IAAA;AACW,MAAA;AACvE,IAAA;AAEsD,IAAA;AACkB,IAAA;AAC1D,MAAA;AACa,MAAA;AACT,MAAA;AACM,MAAA;AACa,MAAA;AACpC,IAAA;AAEa,IAAA;AACyB,IAAA;AACZ,MAAA;AAC1B,MAAA;AACiB,MAAA;AACP,MAAA;AACT,QAAA;AACmB,QAAA;AACN,QAAA;AACd,MAAA;AACA,IAAA;AAE8B,IAAA;AACV,IAAA;AACqB,MAAA;AACX,QAAA;AACiC,QAAA;AACxD,MAAA;AACO,QAAA;AACd,MAAA;AAC2B,MAAA;AAC5B,IAAA;AAEyB,IAAA;AAC1B,EAAA;AAKU,EAAA;AAC8D,IAAA;AAE3C,IAAA;AAA0C;AAAA;AAAW;AACtE;AACZ,EAAA;AAKkD,EAAA;AAC1C,IAAA;AACC,MAAA;AACD,MAAA;AACQ,QAAA;AACgB,QAAA;AAC7B,QAAA;AACmB,QAAA;AACpB,MAAA;AACD,IAAA;AACD,EAAA;AACD;ADhDsG;AACA;AACA;AACA","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-S75VJS4B.cjs","sourcesContent":[null,"import type { A2AModule, ModelModule } from \"@/modules\";\nimport {\n\ttype ThreadObject,\n\tThreadType,\n\ttype WorkflowTask,\n\ttype WorkflowTaskResult,\n} from \"@/types/memory.js\";\nimport type { StreamEvent } from \"@/types/stream.js\";\nimport { loggers } from \"@/utils/logger.js\";\nimport {\n\tserializeTaskResults,\n\tworkflowTaskLabel,\n} from \"@/utils/workflow-task-results.js\";\nimport type { ToolCallingService } from \"./tool-calling.service.js\";\n\nexport class WorkflowTaskRunner {\n\tprivate modelModule: ModelModule;\n\tprivate toolCallingService: ToolCallingService;\n\tprivate a2aModule?: A2AModule;\n\n\tconstructor(\n\t\tmodelModule: ModelModule,\n\t\ttoolCallingService: ToolCallingService,\n\t\ta2aModule?: A2AModule,\n\t) {\n\t\tthis.modelModule = modelModule;\n\t\tthis.toolCallingService = toolCallingService;\n\t\tthis.a2aModule = a2aModule;\n\t}\n\n\tasync *executeTask(\n\t\ttask: WorkflowTask,\n\t\tthread: ThreadObject,\n\t\ttaskResults: Record<string, WorkflowTaskResult>,\n\t): AsyncGenerator<StreamEvent, WorkflowTaskResult, unknown> {\n\t\tconst startedAt = Date.now();\n\t\tyield {\n\t\t\tevent: \"thinking_process\",\n\t\t\tdata: {\n\t\t\t\ttitle: `[워크플로우] 작업 실행: ${workflowTaskLabel(task)}`,\n\t\t\t\tdescription: task.agent\n\t\t\t\t\t? `${task.agent.connectorName} 에이전트에 작업을 위임합니다.`\n\t\t\t\t\t: \"로컬에서 작업을 실행합니다.\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tphase: \"task\",\n\t\t\t\t\ttaskId: task.taskId,\n\t\t\t\t\tagent: task.agent,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tlet taskResult: WorkflowTaskResult;\n\t\ttry {\n\t\t\tconst content = task.agent\n\t\t\t\t? yield* this.executeA2ATask(task, thread, taskResults)\n\t\t\t\t: yield* this.executeLocalTask(task, thread, taskResults);\n\n\t\t\ttaskResult = {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\ttitle: workflowTaskLabel(task),\n\t\t\t\tagent: task.agent,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tcontent,\n\t\t\t\tstartedAt,\n\t\t\t\tcompletedAt: Date.now(),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : JSON.stringify(error);\n\t\t\tloggers.agent.error(`Workflow task failed: ${task.taskId}`, { error });\n\t\t\ttaskResult = {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\ttitle: workflowTaskLabel(task),\n\t\t\t\tagent: task.agent,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcontent: \"\",\n\t\t\t\terror: message,\n\t\t\t\tstartedAt,\n\t\t\t\tcompletedAt: Date.now(),\n\t\t\t};\n\t\t}\n\n\t\tyield {\n\t\t\tevent: \"task_result\",\n\t\t\tdata: {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\ttitle: workflowTaskLabel(task),\n\t\t\t\tstatus: taskResult.status,\n\t\t\t\tagent: task.agent?.connectorName,\n\t\t\t\terror: taskResult.error,\n\t\t\t},\n\t\t};\n\t\treturn taskResult;\n\t}\n\n\tprivate async *executeLocalTask(\n\t\ttask: WorkflowTask,\n\t\tthread: ThreadObject,\n\t\ttaskResults: Record<string, WorkflowTaskResult>,\n\t): AsyncGenerator<StreamEvent, string, unknown> {\n\t\tconst model = this.modelModule.getModel();\n\t\tconst messages = model.generateMessages({\n\t\t\tquery: this.buildTaskPrompt(task, taskResults),\n\t\t\tsystemPrompt:\n\t\t\t\t\"You execute one local workflow task. Use MCP tools when useful, use the provided previous task results as context, and return only the task result.\",\n\t\t});\n\n\t\tconst tools = await this.toolCallingService.getTools({\n\t\t\ttoolPrompt:\n\t\t\t\t\"이 MCP 도구를 호출하는 이유와 기대하는 결과를 한두줄 분량의 한국어로 간단히 작성하세요. 이전 작업 결과나 입력 프롬프트 내용을 그대로 복사하지 마세요.\",\n\t\t\tmode: \"mcp\",\n\t\t});\n\t\tconst stream = this.toolCallingService.run({\n\t\t\tmessages,\n\t\t\ttools,\n\t\t\tquery: task.prompt,\n\t\t\tthread,\n\t\t\ttoolChoice: \"auto\",\n\t\t});\n\n\t\tlet content = \"\";\n\t\tlet result = await stream.next();\n\t\twhile (!result.done) {\n\t\t\tif (result.value.event === \"text_chunk\") {\n\t\t\t\tcontent += result.value.data.delta;\n\t\t\t\tyield this.createTaskOutputEvent(task, result.value.data.delta);\n\t\t\t} else {\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t\tresult = await stream.next();\n\t\t}\n\t\treturn content;\n\t}\n\n\tprivate async *executeA2ATask(\n\t\ttask: WorkflowTask,\n\t\tthread: ThreadObject,\n\t\ttaskResults: Record<string, WorkflowTaskResult>,\n\t): AsyncGenerator<StreamEvent, string, unknown> {\n\t\tif (!this.a2aModule || !task.agent) {\n\t\t\tthrow new Error(\"A2A module is not configured for this workflow task.\");\n\t\t}\n\n\t\tif (!this.a2aModule.hasConnector(task.agent.connectorName)) {\n\t\t\tthrow new Error(`A2A connector not found: ${task.agent.connectorName}`);\n\t\t}\n\n\t\tconst message = this.buildTaskPrompt(task, taskResults);\n\t\tloggers.agent.debug(`Delegating workflow task via A2A: ${task.taskId}`, {\n\t\t\ttaskId: task.taskId,\n\t\t\tconnectorName: task.agent.connectorName,\n\t\t\tthreadId: thread.threadId,\n\t\t\tmessageLength: message.length,\n\t\t\tmessagePreview: message.slice(0, 500),\n\t\t});\n\n\t\tlet content = \"\";\n\t\tconst stream = this.a2aModule.sendTask({\n\t\t\tconnectorName: task.agent.connectorName,\n\t\t\tmessage,\n\t\t\tthreadId: thread.threadId,\n\t\t\tmetadata: {\n\t\t\t\ttype: ThreadType.WORKFLOW,\n\t\t\t\tworkflowId: thread.workflowId,\n\t\t\t\ttaskId: task.taskId,\n\t\t\t},\n\t\t});\n\n\t\tlet result = await stream.next();\n\t\twhile (!result.done) {\n\t\t\tif (result.value.event === \"text_chunk\") {\n\t\t\t\tcontent += result.value.data.delta;\n\t\t\t\tyield this.createTaskOutputEvent(task, result.value.data.delta);\n\t\t\t} else {\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t\tresult = await stream.next();\n\t\t}\n\n\t\treturn content || result.value;\n\t}\n\n\tprivate buildTaskPrompt(\n\t\ttask: WorkflowTask,\n\t\ttaskResults: Record<string, WorkflowTaskResult>,\n\t): string {\n\t\tconst previousResults = serializeTaskResults(Object.values(taskResults));\n\n\t\treturn `${previousResults ? `Previous task results:\\n${previousResults}\\n\\n` : \"\"}Task:\n${task.prompt}`;\n\t}\n\n\tprivate createTaskOutputEvent(\n\t\ttask: WorkflowTask,\n\t\tdelta: string,\n\t): Extract<StreamEvent, { event: \"task_output\" }> {\n\t\treturn {\n\t\t\tevent: \"task_output\",\n\t\t\tdata: {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\ttitle: workflowTaskLabel(task),\n\t\t\t\tdelta,\n\t\t\t\tagent: task.agent?.connectorName,\n\t\t\t},\n\t\t};\n\t}\n}\n"]}