{"version":3,"sources":["../src/cli/commands/traces/search.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { TracesApiService } from \"@/client-sdk/services/traces/traces-api.service\";\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { formatTable, formatRelativeTime } from \"../../utils/formatting\";\nimport { failSpinner } from \"../../utils/spinnerError\";\n\nexport const searchTracesCommand = async (options: {\n  query?: string;\n  startDate?: string;\n  endDate?: string;\n  limit?: string;\n  format?: string;\n}): Promise<void> => {\n  checkApiKey();\n\n  const service = new TracesApiService();\n  const spinner = ora(\"Searching traces...\").start();\n\n  try {\n    const now = Date.now();\n    const oneDayAgo = now - 24 * 60 * 60 * 1000;\n\n    const startDate = options.startDate\n      ? new Date(options.startDate).getTime()\n      : oneDayAgo;\n    const endDate = options.endDate\n      ? new Date(options.endDate).getTime()\n      : now;\n    const pageSize = options.limit ? parseInt(options.limit, 10) : 25;\n\n    // The `format` option controls CLI output (table vs json); the API's\n    // `format` parameter controls server response shape (\"digest\" | \"json\").\n    // Always request the richer \"json\" shape and render locally.\n    const result = await service.search({\n      query: options.query,\n      startDate,\n      endDate,\n      pageSize,\n      format: \"json\",\n    });\n\n    const traces = result.traces as Array<Record<string, unknown>>;\n\n    spinner.succeed(\n      `Found ${result.pagination.totalHits} trace${result.pagination.totalHits !== 1 ? \"s\" : \"\"} (showing ${traces.length})`,\n    );\n\n    if (traces.length === 0) {\n      console.log();\n      console.log(chalk.gray(\"No traces found matching your criteria.\"));\n      console.log(chalk.gray(\"Try widening your date range or search query.\"));\n      return;\n    }\n\n    if (options.format === \"json\") {\n      console.log(JSON.stringify(result, null, 2));\n      return;\n    }\n\n    console.log();\n\n    const tableData = traces.map((trace) => {\n      const traceId = (trace.traceId ?? trace.trace_id ?? trace.id ?? \"—\") as string;\n      const rawInput = trace.input ?? trace.ComputedInput ?? \"—\";\n      const rawOutput = trace.output ?? trace.ComputedOutput ?? \"—\";\n      const input = truncate(typeof rawInput === \"string\" ? rawInput : JSON.stringify(rawInput), 60);\n      const output = truncate(typeof rawOutput === \"string\" ? rawOutput : JSON.stringify(rawOutput), 40);\n      const timestamps = trace.timestamps as Record<string, unknown> | undefined;\n      const startedAt = timestamps?.started_at ?? trace.StartedAt ?? trace.startedAt;\n      const timeStr = startedAt ? formatRelativeTime(new Date(startedAt as number).toISOString()) : \"—\";\n\n      return {\n        \"Trace ID\": traceId.substring(0, 20),\n        Input: input,\n        Output: output,\n        Time: timeStr,\n      };\n    });\n\n    formatTable({\n      data: tableData,\n      headers: [\"Trace ID\", \"Input\", \"Output\", \"Time\"],\n      colorMap: {\n        \"Trace ID\": chalk.green,\n        Input: chalk.cyan,\n      },\n    });\n\n    console.log();\n    if (result.pagination.totalHits > traces.length) {\n      console.log(\n        chalk.gray(\n          `Showing ${traces.length} of ${result.pagination.totalHits} total. Use --limit to see more.`,\n        ),\n      );\n    }\n    console.log(\n      chalk.gray(\n        `Use ${chalk.cyan(\"langwatch trace get <traceId>\")} to view full details`,\n      ),\n    );\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"search traces\" });\n    process.exit(1);\n  }\n};\n\nfunction truncate(str: string, maxLen: number): string {\n  const cleaned = str.replace(/\\n/g, \" \").trim();\n  if (cleaned.length <= maxLen) return cleaned;\n  return cleaned.substring(0, maxLen - 1) + \"…\";\n}\n"],"mappings":"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","names":[]}