{"version":3,"sources":["../src/patch-n8n.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from \"module\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { getLangWatchTracer } from \"langwatch\";\nimport { SemConvAttributes, SpanType, spanTypes } from \"langwatch/observability\";\nimport {\n  AttributeValue,\n  SpanStatusCode,\n  type Exception,\n} from \"@opentelemetry/api\";\nimport { flatten } from \"flat\";\nimport type { IExecuteData, INodeExecutionData } from \"n8n-workflow\";\n\ntype AnyFunction = (...args: unknown[]) => unknown;\n\ntype WorkflowMeta = { id?: string; name?: string };\n\ntype WorkflowExecutePatchable = {\n  processRunExecutionData?: AnyFunction;\n  processRunData?: AnyFunction;\n  runNode?: AnyFunction;\n};\n\ntype WorkflowExecuteInstance = {\n  workflow?: WorkflowMeta;\n};\n\nconst patchedFunctions = new WeakSet<AnyFunction>();\n\nexport async function applyPatches(): Promise<void> {\n  // Track if any patch attempt succeeded; avoid early returns so we can patch the exact instance n8n uses\n  let patchedAny = false;\n\n  // First, try patching relative to the n8n main module entry (most reliable to match running instance)\n  try {\n    const localRequire = makeLocalRequire();\n    const n8nEntry = localRequire.resolve(\"n8n\");\n    const requireFromN8n = createRequire(n8nEntry);\n    const resolvedCorePath = requireFromN8n.resolve(\"n8n-core\");\n\n    debug(`Attempting to patch via n8n entry: ${resolvedCorePath}`);\n\n    const coreFromN8n = requireFromN8n(\"n8n-core\");\n\n    if (coreFromN8n && typeof coreFromN8n === \"object\") {\n      if (patchWorkflowExecute(coreFromN8n)) patchedAny = true;\n    }\n  } catch (e) {\n    debug(\"Patch via n8n entry failed:\", errorMessage(e));\n  }\n\n  // Second, try to find n8n installation and patch it directly\n  const n8nPaths = [\n    // Common global locations\n    \"/usr/local/lib/node_modules/n8n\",\n    \"/usr/lib/node_modules/n8n\",\n    // From CLI path\n    process.argv?.[1] ? path.resolve(process.argv[1], \"..\", \"..\") : null,\n    // Current working directory\n    path.resolve(process.cwd(), \"node_modules\", \"n8n\"),\n    path.resolve(process.cwd(), \"..\", \"node_modules\", \"n8n\"),\n  ].filter((p): p is string => Boolean(p));\n\n  for (const n8nPath of n8nPaths) {\n    try {\n      if (fs.existsSync(path.join(n8nPath, \"package.json\"))) {\n        const packageJson = JSON.parse(\n          fs.readFileSync(path.join(n8nPath, \"package.json\"), \"utf8\")\n        );\n        if (packageJson.name === \"n8n\") {\n          debug(`Found n8n installation at: ${n8nPath}`);\n\n          // Try to patch n8n directly using the specific dist/index.js file\n          try {\n            const n8nIndexPath = path.join(n8nPath, \"dist\", \"index.js\");\n            if (fs.existsSync(n8nIndexPath)) {\n              const n8nModule = await import(n8nIndexPath);\n              if (n8nModule && typeof n8nModule === \"object\") {\n                debug(`Attempting to patch n8n directly from: ${n8nIndexPath}`);\n                debug(`n8n module keys:`, Object.keys(n8nModule));\n\n                // Try to patch the main module\n                if (patchWorkflowExecute(n8nModule)) {\n                  return;\n                }\n\n                // Try to patch the default export\n                if (\n                  n8nModule.default &&\n                  typeof n8nModule.default === \"object\"\n                ) {\n                  debug(\n                    `Trying default export, keys:`,\n                    Object.keys(n8nModule.default)\n                  );\n                  if (patchWorkflowExecute(n8nModule.default)) {\n                    return;\n                  }\n                }\n              }\n            }\n          } catch (e) {\n            debug(\n              `Failed to patch n8n directly from ${n8nPath}/dist/index.js:`,\n              errorMessage(e)\n            );\n          }\n\n          // Try to find WorkflowExecute in n8n-core\n          // Look for n8n-core/dist/execution-engine/workflow-execute.js\n          const workflowExecutePaths = [\n            path.join(\n              n8nPath,\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.mjs\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.mjs\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"execution-engine\",\n              \"workflow-execute.mjs\"\n            ),\n            // Also try the main n8n-core index\n            path.join(n8nPath, \"node_modules\", \"n8n-core\", \"dist\", \"index.js\"),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"index.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"dist\",\n              \"index.js\"\n            ),\n            // Try lib directory\n            path.join(\n              n8nPath,\n              \"node_modules\",\n              \"n8n-core\",\n              \"lib\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"lib\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n            path.join(\n              n8nPath,\n              \"..\",\n              \"..\",\n              \"node_modules\",\n              \"n8n-core\",\n              \"lib\",\n              \"execution-engine\",\n              \"workflow-execute.js\"\n            ),\n          ];\n\n          for (const corePath of workflowExecutePaths) {\n            try {\n              debug(\n                `Checking path: ${corePath}, exists: ${fs.existsSync(corePath)}`\n              );\n\n              if (fs.existsSync(corePath)) {\n                debug(`Trying to import WorkflowExecute from: ${corePath}`);\n                const core = await import(corePath);\n                if (core && typeof core === \"object\") {\n                  debug(`Successfully imported from: ${corePath}`);\n                  if (patchWorkflowExecute(core)) {\n                    patchedAny = true;\n                  }\n                }\n              }\n            } catch (e) {\n              debug(`Failed to load from ${corePath}:`, errorMessage(e));\n            }\n          }\n\n          // Try to find n8n-core in pnpm structure\n          const pnpmPaths = [\n            path.join(n8nPath, \"node_modules\", \".pnpm\"),\n            path.join(n8nPath, \"..\", \".pnpm\"),\n            path.join(n8nPath, \"..\", \"..\", \".pnpm\"),\n          ];\n\n          for (const pnpmPath of pnpmPaths) {\n            if (fs.existsSync(pnpmPath)) {\n              try {\n                const pnpmDirs = fs.readdirSync(pnpmPath);\n                const n8nCoreDir = pnpmDirs.find((dir) =>\n                  dir.includes(\"n8n-core@\")\n                );\n                if (n8nCoreDir) {\n                  debug(`Found n8n-core directory: ${n8nCoreDir}`);\n                  const corePath = path.join(\n                    pnpmPath,\n                    n8nCoreDir,\n                    \"node_modules\",\n                    \"n8n-core\"\n                  );\n                  const workflowExecutePath = path.join(\n                    corePath,\n                    \"dist\",\n                    \"execution-engine\",\n                    \"workflow-execute.js\"\n                  );\n                  debug(\n                    `Checking workflow-execute path: ${workflowExecutePath}, exists: ${fs.existsSync(workflowExecutePath)}`\n                  );\n                  if (fs.existsSync(workflowExecutePath)) {\n                    const core = await import(workflowExecutePath);\n                    if (core && typeof core === \"object\") {\n                      debug(`Found WorkflowExecute at: ${workflowExecutePath}`);\n                      if (patchWorkflowExecute(core)) {\n                        patchedAny = true;\n                      }\n                    }\n                  }\n                }\n              } catch (e) {\n                debug(\n                  `Failed to search pnpm path ${pnpmPath}:`,\n                  errorMessage(e)\n                );\n              }\n            }\n          }\n\n          // Try to find n8n-core package in node_modules\n          const nodeModulesPaths = [\n            path.join(n8nPath, \"node_modules\", \"n8n-core\"),\n            path.join(n8nPath, \"..\", \"node_modules\", \"n8n-core\"),\n            path.join(n8nPath, \"..\", \"..\", \"node_modules\", \"n8n-core\"),\n          ];\n\n          for (const corePath of nodeModulesPaths) {\n            try {\n              if (fs.existsSync(corePath)) {\n                const coreIndexPath = path.join(corePath, \"dist\", \"index.js\");\n                if (fs.existsSync(coreIndexPath)) {\n                  debug(`Trying to import n8n-core from: ${coreIndexPath}`);\n                  const core = await import(coreIndexPath);\n                  if (core && typeof core === \"object\") {\n                    debug(\n                      `Successfully imported n8n-core from: ${coreIndexPath}`\n                    );\n                    if (patchWorkflowExecute(core)) {\n                      patchedAny = true;\n                    }\n                  }\n                }\n              }\n            } catch (e) {\n              debug(\n                `Failed to load n8n-core from ${corePath}:`,\n                errorMessage(e)\n              );\n            }\n          }\n        }\n      }\n    } catch (e) {\n      debug(`Failed to check n8n path ${n8nPath}:`, errorMessage(e));\n    }\n  }\n\n  // Third, try direct approach as fallback\n  try {\n    try {\n      const resolved = makeLocalRequire().resolve(\"n8n-core\");\n      debug(\"Dynamic import resolving to:\", resolved);\n    } catch {}\n    const core = await import(\"n8n-core\");\n    if (core && typeof core === \"object\") {\n      debug(\"Found n8n-core via dynamic import\");\n      if (patchWorkflowExecute(core)) {\n        patchedAny = true;\n      }\n    }\n  } catch (e) {\n    debug(\"Dynamic import of n8n-core failed:\", errorMessage(e));\n  }\n\n  // Fourth, try require as fallback\n  try {\n    const req = makeLocalRequire();\n    debug(\"Require resolving to:\", req.resolve(\"n8n-core\"));\n    const core = req(\"n8n-core\");\n    if (core && typeof core === \"object\") {\n      debug(\"Found n8n-core via require\");\n      if (patchWorkflowExecute(core)) {\n        patchedAny = true;\n      }\n    }\n  } catch (e) {\n    debug(\"Require of n8n-core failed:\", errorMessage(e));\n  }\n\n  if (!patchedAny) {\n    console.warn(\n      \"No n8n-core instance patched, so observability has not been enabled. Set N8N_OTEL_DEBUG=1 for more details.\"\n    );\n  }\n}\n\nfunction patchWorkflowExecute(core: unknown): boolean {\n  const WorkflowExecute =\n    core && typeof core === \"object\" && \"WorkflowExecute\" in core\n      ? (core as { WorkflowExecute?: unknown }).WorkflowExecute\n      : void 0;\n\n  if (\n    !WorkflowExecute ||\n    typeof (WorkflowExecute as { prototype?: unknown }).prototype !== \"object\"\n  ) {\n    debug(\n      \"[@langwatch/n8n-observability] WorkflowExecute missing in this module\"\n    );\n    return false;\n  }\n\n  const tracer = getLangWatchTracer(\"langwatch.n8n\");\n  const proto = (WorkflowExecute as { prototype: WorkflowExecutePatchable })\n    .prototype;\n\n  for (const name of [\"processRunExecutionData\", \"processRunData\"] as const) {\n    const current = proto?.[name];\n    if (!isFunction(current) || patchedFunctions.has(current)) continue;\n\n    proto[name] = function (...args: unknown[]) {\n      const self = this as unknown as WorkflowExecuteInstance;\n      const workflow: WorkflowMeta =\n        (args?.[0] as WorkflowMeta) ?? self?.workflow ?? {};\n\n      debug(\n        `[PATCH] ${name} called for workflow: ${workflow?.id || \"unknown\"}`\n      );\n\n      return tracer.withActiveSpan(\n        `${workflow?.name ?? \"Unnamed workflow\"}`,\n        {\n          attributes: {\n            \"n8n.workflow.id\": workflow?.id ?? \"\",\n            \"n8n.workflow.name\": workflow?.name ?? \"\",\n            \"langwatch.span.type\": \"workflow\" satisfies SpanType,\n          },\n        },\n        async (span) => {\n          debug(`[PATCH] Created workflow span: ${name || \"unknown\"}`);\n          try {\n            // Attempt to capture chat trigger from the WorkflowExecute instance\n            const selfChat = extractChatMessagesFromObject(self);\n            if (Array.isArray(selfChat) && selfChat.length > 0) {\n              span.setInput(\"chat_messages\", selfChat);\n            }\n\n            const res: unknown = await current.apply(this, args);\n            const err = (\n              res as { data?: { resultData?: { error?: unknown } } } | undefined\n            )?.data?.resultData?.error;\n            if (err) {\n              span.recordException(toException(err));\n              span.setStatus({\n                code: SpanStatusCode.ERROR,\n                message: errorMessage(err),\n              });\n            }\n            return res;\n          } catch (err) {\n            debug(`[PATCH] ${name} threw: ${errorMessage(err)}`);\n            span.recordException(toException(err));\n            span.setStatus({\n              code: SpanStatusCode.ERROR,\n              message: errorMessage(err),\n            });\n            throw err;\n          } finally {\n            span.end();\n          }\n        }\n      );\n    };\n\n    patchedFunctions.add(proto[name] as AnyFunction);\n    debug(\"patched root:\", name);\n  }\n\n  for (const name of [\"runNode\"] as const) {\n    const current = proto?.[name];\n    if (!isFunction(current) || patchedFunctions.has(current)) continue;\n\n    proto[name] = async function (...args: unknown[]) {\n      const workflowArg = args[0] as WorkflowMeta | undefined;\n      const executionData = args[1] as IExecuteData | undefined;\n      const runIndex = args[3] as number | undefined;\n\n      const node = executionData?.node ?? {};\n      const nodeName = (node as { name?: string })?.name ?? \"\";\n      const nodeType = (node as { type?: string })?.type ?? \"\";\n\n      debug(`[PATCH] ${name} called for node: ${nodeName} (${nodeType})`);\n\n      if (!shouldIncludeNode(nodeName, nodeType)) {\n        debug(`[PATCH] Skipping node ${nodeName} due to filtering`);\n        return current.apply(this, args);\n      }\n\n      const workflowMeta = workflowArg ?? {};\n      const attributes: SemConvAttributes = {\n        \"n8n.workflow.id\": workflowMeta.id ?? \"unknown\",\n      };\n\n      const flattenedNode = flatten(node as Record<string, unknown>, {\n        delimiter: \".\",\n      }) as Record<string, unknown>;\n      for (const [key, value] of Object.entries(flattenedNode)) {\n        attributes[`n8n.node.${key}`] = toAttrValue(value);\n      }\n\n      // LangWatch + OpenTelemetry GenAI semantic attributes (pre-execution)\n      const spanType = classifySpanType(nodeType, nodeName);\n      if (spanType) attributes[\"langwatch.span.type\"] = spanType;\n      if (spanType === \"llm\") attributes[\"langwatch.streaming\"] = false;\n\n      const preModel = findModelInInputs(executionData);\n      if (preModel?.system) attributes[\"gen_ai.system\"] = preModel.system;\n      if (preModel?.model) attributes[\"gen_ai.request.model\"] = preModel.model;\n\n      const spanName = nodeName && nodeName.length > 0 ? nodeName : `n8n.node.execute (${name})`;\n      return tracer.startActiveSpan(\n        spanName,\n        { attributes },\n        async (span) => {\n          try {\n            const result: unknown = await current.apply(this, args);\n\n            if (\n              process.env.N8N_OTEL_CAPTURE_INPUT !== \"false\" &&\n              typeof runIndex === \"number\"\n            ) {\n              const outRaw = (result as { data?: unknown[] } | undefined)\n                ?.data?.[runIndex];\n              if (Array.isArray(outRaw)) {\n                let chatOutputSet = false;\n                if (classifySpanType(nodeType, nodeName) === \"llm\") {\n                  const assistantText = extractAssistantTextFromOutRaw(outRaw as Array<INodeExecutionData | undefined>);\n                  if (assistantText && typeof assistantText === \"string\") {\n                    const chat = [{ role: \"assistant\", content: assistantText }];\n                    span.setOutput(\"chat_messages\", chat);\n                    chatOutputSet = true;\n                  }\n                }\n\n                if (!chatOutputSet) {\n                  const finalJson = (\n                    outRaw as Array<INodeExecutionData | undefined>\n                  ).map((item) => item?.json);\n                  const s = safeJSON(finalJson);\n                  if (s) span.setOutput(s);\n                }\n\n                // Post-execution enrichment: map prompt/evaluation info and model from outputs\n                const firstJson = (outRaw as Array<INodeExecutionData | undefined>)[0]?.json as\n                  | Record<string, unknown>\n                  | undefined;\n\n                if (firstJson && typeof firstJson === \"object\") {\n                  const compiled =\n                    (firstJson[\"compiledPrompt\"] as Record<string, unknown> | undefined) ??\n                    (firstJson[\"prompt\"] as Record<string, unknown> | undefined);\n\n                  const extraAttrs: SemConvAttributes = {};\n\n                  if (compiled && typeof compiled === \"object\") {\n                    Object.assign(\n                      extraAttrs,\n                      extractPromptAttributesFromCompiled(compiled)\n                    );\n                    const pm = parseModelString(\n                      (compiled as Record<string, unknown>)[\"model\"]\n                    );\n                    if (pm.system) extraAttrs[\"gen_ai.system\"] = pm.system;\n                    if (pm.model) extraAttrs[\"gen_ai.request.model\"] = pm.model;\n                  }\n\n                  if (classifySpanType(nodeType, nodeName) === \"evaluation\") {\n                    const p = (node as { parameters?: Record<string, unknown> })\n                      ?.parameters;\n                    if (p) {\n                      extraAttrs[\"langwatch.evaluation.custom\"] = toAttrValue({\n                        datasetSlug: p[\"datasetSlug\"],\n                        evaluatorId: p[\"evaluatorId\"],\n                        name: p[\"name\"],\n                        asGuardrail: p[\"asGuardrail\"],\n                        format: p[\"format\"],\n                      });\n                    }\n                  }\n\n                  if (Object.keys(extraAttrs).length) {\n                    span.setAttributes(extraAttrs);\n                  }\n                }\n              }\n            }\n\n            if (process.env.N8N_OTEL_CAPTURE_INPUT !== \"false\") {\n              const main0 = executionData?.data?.main?.[0];\n              if (Array.isArray(main0)) {\n                let chatInputSet = false;\n                if (classifySpanType(nodeType, nodeName) === \"llm\") {\n                  const chatMessages = extractChatMessagesFromInputs(main0 as Array<INodeExecutionData | undefined>);\n                  if (Array.isArray(chatMessages) && chatMessages.length > 0) {\n                    span.setInput(\"chat_messages\", chatMessages);\n                    chatInputSet = true;\n                  }\n                }\n\n                if (!chatInputSet) {\n                  const inputData = (\n                    main0 as Array<INodeExecutionData | undefined>\n                  ).map((d) => d?.json);\n\n                  const si = safeJSON(inputData);\n                  if (si) span.setInput(si);\n                }\n              }\n            }\n\n            return result;\n          } catch (err) {\n            debug(`[PATCH] ${name} threw: ${errorMessage(err)}`);\n            span.recordException(toException(err));\n            span.setStatus({\n              code: SpanStatusCode.ERROR,\n              message: errorMessage(err),\n            });\n            throw err;\n          } finally {\n            span.end();\n          }\n        }\n      );\n    };\n\n    patchedFunctions.add(proto[name] as AnyFunction);\n    debug(\"patched node:\", name);\n  }\n\n  debug(\"Successfully patched WorkflowExecute\");\n  return true;\n}\n\nfunction makeLocalRequire(): NodeJS.Require {\n  try {\n    // Works in ESM builds\n    const meta = import.meta as unknown as { url?: string };\n    const url = meta?.url;\n    if (url && typeof url === \"string\" && url.length > 0)\n      return createRequire(url);\n  } catch {}\n\n  // Fallbacks for CJS builds\n  const g = globalThis as unknown as { __filename?: string };\n  const filename =\n    typeof g.__filename === \"string\" && g.__filename.length > 0\n      ? g.__filename\n      : void 0;\n\n  if (filename) return createRequire(filename);\n\n  return createRequire(process.cwd());\n}\n\nconst debug = (...args: unknown[]) =>\n  process.env.N8N_OTEL_DEBUG &&\n  console.log(\"[@langwatch/n8n-observability]\", ...args);\n\nfunction csvSet(name: string): Set<string> {\n  return new Set(\n    (process.env[name] || \"\")\n      .split(\",\")\n      .map((s) => s.trim())\n      .filter(Boolean)\n  );\n}\n\nfunction shouldIncludeNode(nodeName: string, nodeType: string): boolean {\n  const include = csvSet(\"N8N_OTEL_NODE_INCLUDE\");\n  const exclude = csvSet(\"N8N_OTEL_NODE_EXCLUDE\");\n\n  if (exclude.size && (exclude.has(nodeName) || exclude.has(nodeType)))\n    return false;\n  if (include.size && !(include.has(nodeName) || include.has(nodeType)))\n    return false;\n\n  return true;\n}\n\nfunction safeJSON(value: unknown): string | undefined {\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return void 0;\n  }\n}\n\nfunction toAttrValue(value: unknown): AttributeValue {\n  if (value === null || value === void 0) return \"\";\n  if (\n    typeof value === \"string\" ||\n    typeof value === \"number\" ||\n    typeof value === \"boolean\"\n  )\n    return value;\n\n  const s = safeJSON(value);\n  return s ?? String(value);\n}\n\nfunction toException(err: unknown): Exception {\n  if (err instanceof Error || typeof err === \"string\") return err;\n  const msg = safeJSON(err) ?? String(err);\n  return { message: msg };\n}\n\nfunction errorMessage(err: unknown): string {\n  return err instanceof Error ? err.message : String(err);\n}\n\nfunction isFunction(value: unknown): value is AnyFunction {\n  return typeof value === \"function\";\n}\n\n// --- Helpers for LangWatch + GenAI semantic conventions ---\ntype ChatMessage = { role: \"system\" | \"user\" | \"assistant\" | string; content: string };\n\nfunction extractAssistantTextFromOutRaw(\n  outRaw: Array<INodeExecutionData | undefined>\n): string | undefined {\n  for (const item of outRaw) {\n    const json = item?.json as Record<string, unknown> | undefined;\n    if (!json) continue;\n    // Common shapes in n8n LangChain LLM node output\n    const text =\n      (json[\"text\"] as string | undefined) ||\n      (json[\"output_text\"] as string | undefined) ||\n      (json[\"response\"] as string | undefined) ||\n      (json[\"content\"] as string | undefined);\n    if (typeof text === \"string\" && text.length > 0) return text;\n  }\n}\n\n// Recursively find chat trigger shape on any object (e.g., on WorkflowExecute instance)\nfunction extractChatMessagesFromObject(obj: unknown): ChatMessage[] | undefined {\n  if (!obj || typeof obj !== \"object\") return;\n\n  const visited = new WeakSet<object>();\n  const dfs = (o: unknown): ChatMessage[] | undefined => {\n    if (!o || typeof o !== \"object\") return;\n    const ro = o as Record<string, unknown>;\n    if (visited.has(ro as object)) return;\n    visited.add(ro as object);\n\n    // Direct shape\n    const sessionId = ro[\"sessionId\"];\n    const action = ro[\"action\"];\n    const chatInput = ro[\"chatInput\"];\n    if (\n      typeof sessionId === \"string\" &&\n      typeof action === \"string\" &&\n      typeof chatInput === \"string\" &&\n      action.toLowerCase() === \"sendmessage\"\n    ) {\n      return [{ role: \"user\", content: chatInput }];\n    }\n\n    // Arrays inside\n    const arrayLike = ro[\"json\"] ?? ro[\"payload\"] ?? ro[\"data\"] ?? ro[\"body\"] ?? ro[\"items\"];\n    if (Array.isArray(arrayLike)) {\n      for (const item of arrayLike) {\n        const res = dfs(item);\n        if (res?.length) return res;\n      }\n    }\n\n    // Explore nested objects.\n    for (const v of Object.values(ro)) {\n      const res = dfs(v);\n      if (res?.length) return res;\n    }\n  };\n\n  return dfs(obj);\n}\n\nfunction extractChatMessagesFromInputs(\n  main0: Array<INodeExecutionData | undefined>\n): ChatMessage[] | undefined {\n  // Try to locate compiledPrompt.messages or prompt.messages\n  for (const item of main0) {\n    const json = item?.json as Record<string, unknown> | undefined;\n    if (!json) continue;\n    const compiled = json[\"compiledPrompt\"] as Record<string, unknown> | undefined;\n    const prompt = json[\"prompt\"] as Record<string, unknown> | undefined;\n    const messages =\n      (compiled?.[\"messages\"] as Array<Record<string, unknown>> | undefined) ||\n      (prompt?.[\"messages\"] as Array<Record<string, unknown>> | undefined);\n    if (Array.isArray(messages) && messages.length > 0) {\n      const chat: ChatMessage[] = [];\n      for (const m of messages) {\n        const role = (m?.[\"role\"] as string | undefined) ?? \"user\";\n        const content = m?.[\"content\"] as string | undefined;\n        if (typeof content === \"string\" && content.length > 0) {\n          chat.push({ role, content });\n        }\n      }\n      if (chat.length > 0) return chat;\n    }\n  }\n  // Fallback: look for a single user input string under common keys\n  for (const item of main0) {\n    const json = item?.json as Record<string, unknown> | undefined;\n    if (!json) continue;\n    const flat = flatten(json, { delimiter: \".\" }) as Record<string, unknown>;\n    const userText =\n      (flat[\"compiledPrompt.messages.1.content\"] as string | undefined) ||\n      (flat[\"prompt.messages.1.content\"] as string | undefined) ||\n      (flat[\"input\"] as string | undefined) ||\n      (flat[\"messages.1.content\"] as string | undefined) ||\n      (flat[\"request.messages.1.content\"] as string | undefined) ||\n      (flat[\"chatInput\"] as string | undefined) ||\n      (flat[\"query\"] as string | undefined);\n    if (typeof userText === \"string\" && userText.length > 0) {\n      return [{ role: \"user\", content: userText }];\n    }\n  }\n}\nfunction classifySpanType(\n  nodeType?: string,\n  nodeName?: string\n): \"llm\" | \"prompt\" | \"evaluation\" | undefined {\n  const t = (nodeType || \"\").toLowerCase();\n  const n = (nodeName || \"\").toLowerCase();\n\n  if (t.includes(\"langwatchprompt\") || n.includes(\"langwatch_prompt_retrieval\"))\n    return \"prompt\";\n  if (t.includes(\"langwatchevaluation\")) return \"evaluation\";\n  if (t.includes(\"langchain\") || t.includes(\"openai\") || n.includes(\"llm\"))\n    return \"llm\";\n\n  return void 0;\n}\n\nfunction parseModelString(model: unknown): { system?: string; model?: string } {\n  if (typeof model !== \"string\" || !model) return {};\n  const [system, rest] = model.split(\"/\", 2);\n  return rest ? { system, model: rest } : { model: system };\n}\n\nfunction findModelInInputs(\n  executionData?: IExecuteData\n): { system?: string; model?: string } | undefined {\n  const main0 = executionData?.data?.main?.[0];\n  if (!Array.isArray(main0)) return;\n\n  for (const item of main0 as Array<INodeExecutionData | undefined>) {\n    const json = item?.json as Record<string, unknown> | undefined;\n    if (!json) continue;\n\n    const flat = flatten(json, { delimiter: \".\" }) as Record<string, unknown>;\n    const candidate =\n      flat[\"compiledPrompt.model\"] ??\n      flat[\"prompt.model\"] ??\n      flat[\"model\"] ??\n      flat[\"request.model\"];\n    const parsed = parseModelString(candidate);\n    if (parsed.system || parsed.model) return parsed;\n  }\n}\n\nfunction extractPromptAttributesFromCompiled(\n  compiledOrPrompt: Record<string, unknown>\n): SemConvAttributes {\n  const out: SemConvAttributes = {};\n  const id = compiledOrPrompt?.[\"id\"];\n  const handle = compiledOrPrompt?.[\"handle\"];\n  const version = compiledOrPrompt?.[\"version\"];\n  const versionId = compiledOrPrompt?.[\"versionId\"];\n\n  if (typeof id === \"string\") out[\"langwatch.prompt.id\"] = id;\n  if (typeof handle === \"string\") out[\"langwatch.prompt.handle\"] = handle;\n\n  if (typeof version === \"number\") out[\"langwatch.prompt.version.number\"] = version;\n  else if (typeof version === \"string\" && !Number.isNaN(Number(version)))\n    out[\"langwatch.prompt.version.number\"] = Number(version);\n\n  if (typeof versionId === \"string\") out[\"langwatch.prompt.version.id\"] = versionId;\n\n  return out;\n}\n","// Main entry point for the package\nexport { applyPatches } from \"./patch-n8n.js\";\nexport { setupObservability } from \"langwatch/observability/node\";\n\n// For programmatic setup\nexport async function setupN8nObservability(options?: { serviceName?: string; debug?: boolean }) {\n  const { setupObservability } = await import(\"langwatch/observability/node\");\n  const { applyPatches } = await import(\"./patch-n8n.js\");\n\n  try {\n    setupObservability({\n      serviceName: options?.serviceName || process.env.N8N_OTEL_SERVICE_NAME || \"n8n\",\n      debug: options?.debug || process.env.N8N_OTEL_DEBUG ? { consoleLogging: true, logLevel: \"info\" } : void 0,\n    });\n  } catch (err) {\n    console.warn(\"[@langwatch/n8n-observability] setupObservability failed:\", (err as Error)?.message || err);\n  }\n\n  try {\n    await applyPatches();\n  } catch (err) {\n    console.warn(\"[@langwatch/n8n-observability] patching failed:\", (err as Error)?.message || err);\n  }\n}\n"],"mappings":"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","names":["path","fs","setupObservability","applyPatches"]}