{"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map, Observable } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { BaseEvent, RawEvent } from \"@ag-ui/core\";\nimport {\n  LangGraphAgent as AGUILangGraphAgent,\n  LangGraphHttpAgent,\n  type LangGraphAgentConfig,\n  ProcessedEvents,\n  SchemaKeys,\n  type State,\n  StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n  copilotkit: {\n    actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n    context: StateEnrichment[\"ag-ui\"][\"context\"];\n  };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n  CustomEventNames,\n  TextMessageEvents,\n  ToolCallEvents,\n  PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n  constructor(config: LangGraphAgentConfig) {\n    super(config);\n  }\n\n  dispatchEvent(event: ProcessedEvents) {\n    if (event.type === EventType.CUSTOM) {\n      // const event = processedEvent as unknown as CustomEvent;\n      const customEvent = event as unknown as CustomEvent;\n\n      if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n        this.subscriber.next({\n          type: EventType.TEXT_MESSAGE_START,\n          role: \"assistant\",\n          messageId: customEvent.value.message_id,\n          rawEvent: event,\n        });\n        this.subscriber.next({\n          type: EventType.TEXT_MESSAGE_CONTENT,\n          messageId: customEvent.value.message_id,\n          delta: customEvent.value.message,\n          rawEvent: event,\n        });\n        this.subscriber.next({\n          type: EventType.TEXT_MESSAGE_END,\n          messageId: customEvent.value.message_id,\n          rawEvent: event,\n        });\n        return true;\n      }\n\n      if (\n        customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n      ) {\n        this.subscriber.next({\n          type: EventType.TOOL_CALL_START,\n          toolCallId: customEvent.value.id,\n          toolCallName: customEvent.value.name,\n          parentMessageId: customEvent.value.id,\n          rawEvent: event,\n        });\n        this.subscriber.next({\n          type: EventType.TOOL_CALL_ARGS,\n          toolCallId: customEvent.value.id,\n          delta: customEvent.value.args,\n          rawEvent: event,\n        });\n        this.subscriber.next({\n          type: EventType.TOOL_CALL_END,\n          toolCallId: customEvent.value.id,\n          rawEvent: event,\n        });\n        return true;\n      }\n\n      if (\n        customEvent.name ===\n        CustomEventNames.CopilotKitManuallyEmitIntermediateState\n      ) {\n        this.activeRun.manuallyEmittedState = customEvent.value;\n        this.dispatchEvent({\n          type: EventType.STATE_SNAPSHOT,\n          snapshot: this.getStateSnapshot({\n            values: this.activeRun.manuallyEmittedState,\n          } as ThreadState<State>),\n          rawEvent: event,\n        });\n        return true;\n      }\n\n      if (customEvent.name === CustomEventNames.CopilotKitExit) {\n        this.subscriber.next({\n          type: EventType.CUSTOM,\n          name: \"Exit\",\n          value: true,\n        });\n        return true;\n      }\n    }\n\n    // Intercept all text message and tool call events and check if should disable\n    const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n    if (!rawEvent) {\n      this.subscriber.next(event);\n      return true;\n    }\n\n    const isMessageEvent =\n      event.type === EventType.TEXT_MESSAGE_START ||\n      event.type === EventType.TEXT_MESSAGE_CONTENT ||\n      event.type === EventType.TEXT_MESSAGE_END;\n    const isToolEvent =\n      event.type === EventType.TOOL_CALL_START ||\n      event.type === EventType.TOOL_CALL_ARGS ||\n      event.type === EventType.TOOL_CALL_END;\n    if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n      if (\n        rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n        isToolEvent\n      ) {\n        return false;\n      }\n    }\n    if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n      if (\n        rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n        isMessageEvent\n      ) {\n        // Clean up tracked message state to prevent stale records from\n        // leaking into subsequent nodes that have emit-messages enabled.\n        if (this.activeRun?.id) {\n          this.messagesInProcess[this.activeRun.id] = null;\n        }\n        return false;\n      }\n    }\n\n    this.subscriber.next(event);\n    return true;\n  }\n\n  // @ts-ignore\n  run(input: RunAgentInput): Observable<BaseEvent> {\n    return super.run(input).pipe(\n      map((processedEvent) => {\n        // Turn raw event into emit state snapshot from tool call event\n        if (processedEvent.type === EventType.RAW) {\n          // Get the LangGraph event from the AGUI event.\n          const event =\n            (processedEvent as RawEvent).event ??\n            (processedEvent as RawEvent).rawEvent;\n\n          const eventType = event.event;\n          const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n          const toolCallUsedToPredictState = event.metadata?.[\n            \"copilotkit:emit-intermediate-state\"\n          ]?.some(\n            (predictStateTool: PredictStateTool) =>\n              predictStateTool.tool === toolCallData?.name,\n          );\n\n          if (\n            eventType === LangGraphEventTypes.OnChatModelStream &&\n            toolCallUsedToPredictState\n          ) {\n            return {\n              type: EventType.CUSTOM,\n              name: \"PredictState\",\n              value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n            };\n          }\n        }\n\n        return processedEvent;\n      }),\n    );\n  }\n\n  langGraphDefaultMergeState(\n    state: State,\n    messages: LangGraphMessage[],\n    input: RunAgentInput,\n  ): State<StateEnrichment & CopilotKitStateEnrichment> {\n    const aguiMergedState = super.langGraphDefaultMergeState(\n      state,\n      messages,\n      input,\n    );\n    const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n    // tolerate undefined and de-duplicate by stable key (id | name | key)\n    const rawCombinedTools = [\n      ...((returnedTools as any[]) ?? []),\n      ...((agui?.tools as any[]) ?? []),\n    ];\n    const combinedTools = Array.from(\n      new Map(\n        rawCombinedTools.map((t: any) => [\n          t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n          t,\n        ]),\n      ).values(),\n    );\n\n    return {\n      ...aguiMergedState,\n      copilotkit: {\n        actions: combinedTools,\n        context: agui?.context ?? [],\n      },\n    };\n  }\n\n  async getSchemaKeys(): Promise<SchemaKeys> {\n    const CONSTANT_KEYS = [\"copilotkit\"];\n    const schemaKeys = await super.getSchemaKeys();\n    return {\n      config: schemaKeys.config,\n      input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n      output: schemaKeys.output\n        ? [...schemaKeys.output, ...CONSTANT_KEYS]\n        : null,\n      context: schemaKeys.context\n        ? [...schemaKeys.context, ...CONSTANT_KEYS]\n        : null,\n    };\n  }\n}\n\nexport { LangGraphHttpAgent };\n"],"mappings":";;;;;;;;AAiCA,IAAaA,mBAAb,cAAoCC,eAAmB;CACrD,YAAY,QAA8B;AACxC,QAAM,OAAO;;CAGf,cAAc,OAAwB;AACpC,MAAI,MAAM,SAAS,UAAU,QAAQ;GAEnC,MAAM,cAAc;AAEpB,OAAI,YAAY,SAAS,iBAAiB,+BAA+B;AACvE,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,MAAM;KACN,WAAW,YAAY,MAAM;KAC7B,UAAU;KACX,CAAC;AACF,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,WAAW,YAAY,MAAM;KAC7B,OAAO,YAAY,MAAM;KACzB,UAAU;KACX,CAAC;AACF,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,WAAW,YAAY,MAAM;KAC7B,UAAU;KACX,CAAC;AACF,WAAO;;AAGT,OACE,YAAY,SAAS,iBAAiB,gCACtC;AACA,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,YAAY,YAAY,MAAM;KAC9B,cAAc,YAAY,MAAM;KAChC,iBAAiB,YAAY,MAAM;KACnC,UAAU;KACX,CAAC;AACF,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,YAAY,YAAY,MAAM;KAC9B,OAAO,YAAY,MAAM;KACzB,UAAU;KACX,CAAC;AACF,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,YAAY,YAAY,MAAM;KAC9B,UAAU;KACX,CAAC;AACF,WAAO;;AAGT,OACE,YAAY,SACZ,iBAAiB,yCACjB;AACA,SAAK,UAAU,uBAAuB,YAAY;AAClD,SAAK,cAAc;KACjB,MAAM,UAAU;KAChB,UAAU,KAAK,iBAAiB,EAC9B,QAAQ,KAAK,UAAU,sBACxB,CAAuB;KACxB,UAAU;KACX,CAAC;AACF,WAAO;;AAGT,OAAI,YAAY,SAAS,iBAAiB,gBAAgB;AACxD,SAAK,WAAW,KAAK;KACnB,MAAM,UAAU;KAChB,MAAM;KACN,OAAO;KACR,CAAC;AACF,WAAO;;;EAKX,MAAM,WAAY,MAA6C;AAC/D,MAAI,CAAC,UAAU;AACb,QAAK,WAAW,KAAK,MAAM;AAC3B,UAAO;;EAGT,MAAM,iBACJ,MAAM,SAAS,UAAU,sBACzB,MAAM,SAAS,UAAU,wBACzB,MAAM,SAAS,UAAU;EAC3B,MAAM,cACJ,MAAM,SAAS,UAAU,mBACzB,MAAM,SAAS,UAAU,kBACzB,MAAM,SAAS,UAAU;AAC3B,MAAI,iCAAiC,SAAS,YAAY,EAAE,GAC1D;OACE,SAAS,SAAS,kCAAkC,SACpD,YAEA,QAAO;;AAGX,MAAI,+BAA+B,SAAS,YAAY,EAAE,GACxD;OACE,SAAS,SAAS,gCAAgC,SAClD,gBACA;AAGA,QAAI,KAAK,WAAW,GAClB,MAAK,kBAAkB,KAAK,UAAU,MAAM;AAE9C,WAAO;;;AAIX,OAAK,WAAW,KAAK,MAAM;AAC3B,SAAO;;CAIT,IAAI,OAA6C;AAC/C,SAAO,MAAM,IAAI,MAAM,CAAC,KACtB,KAAK,mBAAmB;AAEtB,OAAI,eAAe,SAAS,UAAU,KAAK;IAEzC,MAAM,QACH,eAA4B,SAC5B,eAA4B;IAE/B,MAAM,YAAY,MAAM;IACxB,MAAM,eAAe,MAAM,MAAM,OAAO,mBAAmB;IAC3D,MAAM,6BAA6B,MAAM,WACvC,uCACC,MACA,qBACC,iBAAiB,SAAS,cAAc,KAC3C;AAED,QACE,cAAc,oBAAoB,qBAClC,2BAEA,QAAO;KACL,MAAM,UAAU;KAChB,MAAM;KACN,OAAO,MAAM,SAAS;KACvB;;AAIL,UAAO;IACP,CACH;;CAGH,2BACE,OACA,UACA,OACoD;EACpD,MAAM,kBAAkB,MAAM,2BAC5B,OACA,UACA,MACD;EACD,MAAM,EAAE,OAAO,eAAe,SAAS,SAAS;EAEhD,MAAM,mBAAmB,CACvB,GAAK,iBAA2B,EAAE,EAClC,GAAK,MAAM,SAAmB,EAAE,CACjC;EACD,MAAM,gBAAgB,MAAM,KAC1B,IAAI,IACF,iBAAiB,KAAK,MAAW,CAC/B,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,UAAU,EAAE,EAC/C,EACD,CAAC,CACH,CAAC,QAAQ,CACX;AAED,SAAO;GACL,GAAG;GACH,YAAY;IACV,SAAS;IACT,SAAS,MAAM,WAAW,EAAE;IAC7B;GACF;;CAGH,MAAM,gBAAqC;EACzC,MAAM,gBAAgB,CAAC,aAAa;EACpC,MAAM,aAAa,MAAM,MAAM,eAAe;AAC9C,SAAO;GACL,QAAQ,WAAW;GACnB,OAAO,WAAW,QAAQ,CAAC,GAAG,WAAW,OAAO,GAAG,cAAc,GAAG;GACpE,QAAQ,WAAW,SACf,CAAC,GAAG,WAAW,QAAQ,GAAG,cAAc,GACxC;GACJ,SAAS,WAAW,UAChB,CAAC,GAAG,WAAW,SAAS,GAAG,cAAc,GACzC;GACL"}