@arizeai/phoenix-cli 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +181 -18
  2. package/build/cli.d.ts.map +1 -0
  3. package/build/cli.js +21 -0
  4. package/build/cli.js.map +1 -0
  5. package/build/client.d.ts +31 -0
  6. package/build/client.d.ts.map +1 -0
  7. package/build/client.js +57 -0
  8. package/build/client.js.map +1 -0
  9. package/build/commands/formatProjects.d.ts +19 -0
  10. package/build/commands/formatProjects.d.ts.map +1 -0
  11. package/build/commands/formatProjects.js +21 -0
  12. package/build/commands/formatProjects.js.map +1 -0
  13. package/build/commands/formatTraces.d.ts +25 -0
  14. package/build/commands/formatTraces.d.ts.map +1 -0
  15. package/build/commands/formatTraces.js +165 -0
  16. package/build/commands/formatTraces.js.map +1 -0
  17. package/build/commands/index.d.ts +4 -0
  18. package/build/commands/index.d.ts.map +1 -0
  19. package/build/commands/index.js +4 -0
  20. package/build/commands/index.js.map +1 -0
  21. package/build/commands/projects.d.ts +6 -0
  22. package/build/commands/projects.d.ts.map +1 -0
  23. package/build/commands/projects.js +87 -0
  24. package/build/commands/projects.js.map +1 -0
  25. package/build/commands/trace.d.ts +6 -0
  26. package/build/commands/trace.d.ts.map +1 -0
  27. package/build/commands/trace.js +143 -0
  28. package/build/commands/trace.js.map +1 -0
  29. package/build/commands/traces.d.ts +6 -0
  30. package/build/commands/traces.d.ts.map +1 -0
  31. package/build/commands/traces.js +239 -0
  32. package/build/commands/traces.js.map +1 -0
  33. package/build/config.d.ts +70 -0
  34. package/build/config.d.ts.map +1 -0
  35. package/build/config.js +77 -0
  36. package/build/config.js.map +1 -0
  37. package/{dist/src → build}/index.d.ts.map +1 -1
  38. package/{dist/esm → build}/index.js +0 -0
  39. package/build/index.js.map +1 -0
  40. package/build/io.d.ts +49 -0
  41. package/build/io.d.ts.map +1 -0
  42. package/build/io.js +29 -0
  43. package/build/io.js.map +1 -0
  44. package/build/trace.d.ts +41 -0
  45. package/build/trace.d.ts.map +1 -0
  46. package/build/trace.js +55 -0
  47. package/build/trace.js.map +1 -0
  48. package/package.json +19 -15
  49. package/dist/esm/cli.d.ts.map +0 -1
  50. package/dist/esm/cli.js +0 -17
  51. package/dist/esm/cli.js.map +0 -1
  52. package/dist/esm/commands/index.d.ts +0 -1
  53. package/dist/esm/commands/index.d.ts.map +0 -1
  54. package/dist/esm/commands/index.js +0 -8
  55. package/dist/esm/commands/index.js.map +0 -1
  56. package/dist/esm/index.d.ts.map +0 -1
  57. package/dist/esm/index.js.map +0 -1
  58. package/dist/esm/package.json +0 -1
  59. package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
  60. package/dist/esm/utils/index.d.ts +0 -1
  61. package/dist/esm/utils/index.d.ts.map +0 -1
  62. package/dist/esm/utils/index.js +0 -8
  63. package/dist/esm/utils/index.js.map +0 -1
  64. package/dist/src/cli.d.ts +0 -3
  65. package/dist/src/cli.d.ts.map +0 -1
  66. package/dist/src/cli.js +0 -20
  67. package/dist/src/cli.js.map +0 -1
  68. package/dist/src/commands/index.d.ts +0 -2
  69. package/dist/src/commands/index.d.ts.map +0 -1
  70. package/dist/src/commands/index.js +0 -9
  71. package/dist/src/commands/index.js.map +0 -1
  72. package/dist/src/index.d.ts +0 -3
  73. package/dist/src/index.js +0 -8
  74. package/dist/src/index.js.map +0 -1
  75. package/dist/src/utils/index.d.ts +0 -2
  76. package/dist/src/utils/index.d.ts.map +0 -1
  77. package/dist/src/utils/index.js +0 -9
  78. package/dist/src/utils/index.js.map +0 -1
  79. package/dist/test/cli.test.d.ts +0 -2
  80. package/dist/test/cli.test.d.ts.map +0 -1
  81. package/dist/test/cli.test.js +0 -12
  82. package/dist/test/cli.test.js.map +0 -1
  83. package/dist/tsconfig.tsbuildinfo +0 -1
  84. package/src/cli.ts +0 -22
  85. package/src/commands/index.ts +0 -7
  86. package/src/index.ts +0 -7
  87. package/src/utils/index.ts +0 -7
  88. /package/{dist/esm → build}/cli.d.ts +0 -0
  89. /package/{dist/esm → build}/index.d.ts +0 -0
@@ -0,0 +1,87 @@
1
+ import { createPhoenixClient } from "../client.js";
2
+ import { getConfigErrorMessage, resolveConfig } from "../config.js";
3
+ import { writeError, writeOutput } from "../io.js";
4
+ import { formatProjectsOutput } from "./formatProjects.js";
5
+ import { Command } from "commander";
6
+ /**
7
+ * Fetch all projects from Phoenix
8
+ */
9
+ async function fetchProjects(client, options = {}) {
10
+ const allProjects = [];
11
+ let cursor;
12
+ const limit = options.limit || 100;
13
+ do {
14
+ const response = await client.GET("/v1/projects", {
15
+ params: {
16
+ query: {
17
+ cursor,
18
+ limit,
19
+ include_experiment_projects: false,
20
+ },
21
+ },
22
+ });
23
+ if (response.error || !response.data) {
24
+ throw new Error(`Failed to fetch projects: ${response.error}`);
25
+ }
26
+ allProjects.push(...response.data.data);
27
+ cursor = response.data.next_cursor || undefined;
28
+ } while (cursor);
29
+ return allProjects;
30
+ }
31
+ /**
32
+ * Projects command handler
33
+ */
34
+ async function projectsHandler(options) {
35
+ try {
36
+ // Resolve configuration
37
+ const config = resolveConfig({
38
+ cliOptions: {
39
+ endpoint: options.endpoint,
40
+ project: options.project,
41
+ apiKey: options.apiKey,
42
+ },
43
+ });
44
+ // Validate that we have endpoint (project not required for listing projects)
45
+ if (!config.endpoint) {
46
+ const errors = [
47
+ "Phoenix endpoint not configured. Set PHOENIX_HOST environment variable or use --endpoint flag.",
48
+ ];
49
+ writeError({ message: getConfigErrorMessage({ errors }) });
50
+ process.exit(1);
51
+ }
52
+ // Create client
53
+ const client = createPhoenixClient({ config });
54
+ // Fetch projects
55
+ const projects = await fetchProjects(client, {
56
+ limit: options.limit,
57
+ });
58
+ // Output projects
59
+ const output = formatProjectsOutput({
60
+ projects: projects,
61
+ format: options.format,
62
+ });
63
+ writeOutput({ message: output });
64
+ }
65
+ catch (error) {
66
+ writeError({
67
+ message: `Error fetching projects: ${error instanceof Error ? error.message : String(error)}`,
68
+ });
69
+ process.exit(1);
70
+ }
71
+ }
72
+ /**
73
+ * Create the projects command
74
+ */
75
+ export function createProjectsCommand() {
76
+ const command = new Command("projects");
77
+ command
78
+ .description("List all available Phoenix projects")
79
+ .option("--endpoint <url>", "Phoenix API endpoint")
80
+ .option("--api-key <key>", "Phoenix API key for authentication")
81
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
82
+ .option("--no-progress", "Disable progress indicators")
83
+ .option("--limit <number>", "Maximum number of projects to fetch per page", parseInt)
84
+ .action(projectsHandler);
85
+ return command;
86
+ }
87
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAqB,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAqB,EACrB,UAA8B,EAAE;IAEhC,MAAM,WAAW,GAAc,EAAE,CAAC;IAClC,IAAI,MAA0B,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;IAEnC,GAAG,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YAChD,MAAM,EAAE;gBACN,KAAK,EAAE;oBACL,MAAM;oBACN,KAAK;oBACL,2BAA2B,EAAE,KAAK;iBACnC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;IAClD,CAAC,QAAQ,MAAM,EAAE;IAEjB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,OAAwB;IACrD,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,UAAU,EAAE;gBACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB;SACF,CAAC,CAAC;QAEH,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG;gBACb,gGAAgG;aACjG,CAAC;YACF,UAAU,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,iBAAiB;QACjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;YAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,QAAQ,EAAE,QAIR;YACF,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC;YACT,OAAO,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC9F,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO;SACJ,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CACL,mBAAmB,EACnB,qCAAqC,EACrC,QAAQ,CACT;SACA,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CACL,kBAAkB,EAClB,8CAA8C,EAC9C,QAAQ,CACT;SACA,MAAM,CAAC,eAAe,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Create the trace command
4
+ */
5
+ export declare function createTraceCommand(): Command;
6
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwKpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAmB5C"}
@@ -0,0 +1,143 @@
1
+ import { createPhoenixClient, resolveProjectId } from "../client.js";
2
+ import { getConfigErrorMessage, resolveConfig, validateConfig, } from "../config.js";
3
+ import { writeError, writeOutput, writeProgress } from "../io.js";
4
+ import { buildTrace } from "../trace.js";
5
+ import { formatTraceOutput } from "./formatTraces.js";
6
+ import { Command } from "commander";
7
+ import * as fs from "fs";
8
+ /**
9
+ * Fetch spans for a specific trace
10
+ */
11
+ async function fetchTraceSpans(client, projectIdentifier, traceId) {
12
+ const allSpans = [];
13
+ let cursor;
14
+ // Fetch all spans for the project and filter by trace ID
15
+ // Note: This is a workaround since there's no direct trace-by-ID endpoint with spans
16
+ do {
17
+ const response = await client.GET("/v1/projects/{project_identifier}/spans", {
18
+ params: {
19
+ path: {
20
+ project_identifier: projectIdentifier,
21
+ },
22
+ query: {
23
+ cursor,
24
+ limit: 1000,
25
+ },
26
+ },
27
+ });
28
+ if (response.error || !response.data) {
29
+ throw new Error(`Failed to fetch spans: ${response.error}`);
30
+ }
31
+ // Filter spans for this trace
32
+ const traceSpans = response.data.data.filter((span) => span.context.trace_id === traceId ||
33
+ span.context.trace_id.startsWith(traceId));
34
+ allSpans.push(...traceSpans);
35
+ // If we found spans for this trace, stop searching
36
+ if (allSpans.length > 0) {
37
+ break;
38
+ }
39
+ cursor = response.data.next_cursor || undefined;
40
+ } while (cursor);
41
+ return allSpans;
42
+ }
43
+ /**
44
+ * Trace command handler
45
+ */
46
+ async function traceHandler(traceId, options) {
47
+ try {
48
+ const userSpecifiedFormat = process.argv.includes("--format") ||
49
+ process.argv.some((arg) => arg.startsWith("--format="));
50
+ // Resolve configuration
51
+ const config = resolveConfig({
52
+ cliOptions: {
53
+ endpoint: options.endpoint,
54
+ project: options.project,
55
+ apiKey: options.apiKey,
56
+ },
57
+ });
58
+ // Validate configuration
59
+ const validation = validateConfig({ config });
60
+ if (!validation.valid) {
61
+ writeError({
62
+ message: getConfigErrorMessage({ errors: validation.errors }),
63
+ });
64
+ process.exit(1);
65
+ }
66
+ // Create client
67
+ const client = createPhoenixClient({ config });
68
+ // Resolve project ID
69
+ const projectIdentifier = config.project;
70
+ if (!projectIdentifier) {
71
+ writeError({ message: "Project not configured" });
72
+ process.exit(1);
73
+ }
74
+ writeProgress({
75
+ message: `Resolving project: ${projectIdentifier}`,
76
+ noProgress: !options.progress,
77
+ });
78
+ const projectId = await resolveProjectId({
79
+ client,
80
+ projectIdentifier,
81
+ });
82
+ // Fetch trace
83
+ writeProgress({
84
+ message: `Fetching trace ${traceId}...`,
85
+ noProgress: !options.progress,
86
+ });
87
+ const spans = await fetchTraceSpans(client, projectId, traceId);
88
+ if (spans.length === 0) {
89
+ writeError({ message: `Trace not found: ${traceId}` });
90
+ process.exit(1);
91
+ }
92
+ writeProgress({
93
+ message: `Found ${spans.length} span(s)`,
94
+ noProgress: !options.progress,
95
+ });
96
+ // Build trace
97
+ const trace = buildTrace({ spans });
98
+ // Output trace
99
+ const outputFormat = options.file
100
+ ? "json"
101
+ : options.format || "pretty";
102
+ if (options.file && userSpecifiedFormat && options.format !== "json") {
103
+ writeError({
104
+ message: `Warning: --format is ignored when writing to a file; writing JSON to ${options.file}`,
105
+ });
106
+ }
107
+ const output = formatTraceOutput({ trace, format: outputFormat });
108
+ if (options.file) {
109
+ fs.writeFileSync(options.file, output, "utf-8");
110
+ writeProgress({
111
+ message: `Wrote trace to ${options.file}`,
112
+ noProgress: !options.progress,
113
+ });
114
+ }
115
+ else {
116
+ writeOutput({ message: output });
117
+ }
118
+ }
119
+ catch (error) {
120
+ writeError({
121
+ message: `Error fetching trace: ${error instanceof Error ? error.message : String(error)}`,
122
+ });
123
+ process.exit(1);
124
+ }
125
+ }
126
+ /**
127
+ * Create the trace command
128
+ */
129
+ export function createTraceCommand() {
130
+ const command = new Command("trace");
131
+ command
132
+ .description("Fetch a specific trace by ID")
133
+ .argument("<trace-id>", "Trace identifier (OTEL trace ID or prefix)")
134
+ .option("--endpoint <url>", "Phoenix API endpoint")
135
+ .option("--project <name>", "Project name or ID")
136
+ .option("--api-key <key>", "Phoenix API key for authentication")
137
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
138
+ .option("--no-progress", "Disable progress indicators")
139
+ .option("--file <path>", "Save trace to file instead of stdout")
140
+ .action(traceHandler);
141
+ return command;
142
+ }
143
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Create the traces command
4
+ */
5
+ export declare function createTracesCommand(): Command;
6
+ //# sourceMappingURL=traces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../src/commands/traces.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiSpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAoC7C"}
@@ -0,0 +1,239 @@
1
+ import { createPhoenixClient, resolveProjectId } from "../client.js";
2
+ import { getConfigErrorMessage, resolveConfig, validateConfig, } from "../config.js";
3
+ import { writeError, writeOutput, writeProgress } from "../io.js";
4
+ import { buildTrace, groupSpansByTrace } from "../trace.js";
5
+ import { formatTracesOutput } from "./formatTraces.js";
6
+ import { Command } from "commander";
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ /**
10
+ * Fetch spans for a project within a time range
11
+ */
12
+ async function fetchSpans(client, projectIdentifier, options = {}) {
13
+ const allSpans = [];
14
+ let cursor;
15
+ const pageLimit = 1000; // Max per page
16
+ do {
17
+ const response = await client.GET("/v1/projects/{project_identifier}/spans", {
18
+ params: {
19
+ path: {
20
+ project_identifier: projectIdentifier,
21
+ },
22
+ query: {
23
+ cursor,
24
+ limit: pageLimit,
25
+ start_time: options.startTime,
26
+ end_time: options.endTime,
27
+ },
28
+ },
29
+ });
30
+ if (response.error || !response.data) {
31
+ throw new Error(`Failed to fetch spans: ${response.error}`);
32
+ }
33
+ allSpans.push(...response.data.data);
34
+ cursor = response.data.next_cursor || undefined;
35
+ // Stop if we have enough spans for the requested number of traces
36
+ if (options.limit && allSpans.length >= options.limit * 10) {
37
+ break;
38
+ }
39
+ } while (cursor);
40
+ return allSpans;
41
+ }
42
+ /**
43
+ * Get the last N traces
44
+ */
45
+ async function getLastNTraces(client, projectIdentifier, limit, options = {}) {
46
+ // Calculate time range
47
+ let startTime;
48
+ if (options.since) {
49
+ startTime = options.since;
50
+ }
51
+ else if (options.lastNMinutes) {
52
+ const now = new Date();
53
+ const start = new Date(now.getTime() - options.lastNMinutes * 60 * 1000);
54
+ startTime = start.toISOString();
55
+ }
56
+ // Fetch spans
57
+ const spans = await fetchSpans(client, projectIdentifier, {
58
+ startTime,
59
+ limit,
60
+ });
61
+ // Group spans by trace
62
+ const traceGroups = groupSpansByTrace({ spans });
63
+ // Build trace objects
64
+ const traces = [];
65
+ for (const [traceId, traceSpans] of traceGroups.entries()) {
66
+ try {
67
+ const trace = buildTrace({ spans: traceSpans });
68
+ traces.push(trace);
69
+ }
70
+ catch (error) {
71
+ writeProgress({
72
+ message: `Warning: Failed to build trace ${traceId}: ${error instanceof Error ? error.message : String(error)}`,
73
+ noProgress: false,
74
+ });
75
+ }
76
+ }
77
+ // Sort by start time (newest first)
78
+ traces.sort((a, b) => {
79
+ if (!a.startTime || !b.startTime)
80
+ return 0;
81
+ return new Date(b.startTime).getTime() - new Date(a.startTime).getTime();
82
+ });
83
+ // Return last N traces
84
+ return traces.slice(0, limit);
85
+ }
86
+ /**
87
+ * Write traces to directory
88
+ */
89
+ async function writeTracesToDirectory(traces, directory, options = {}) {
90
+ // Create directory if it doesn't exist
91
+ if (!fs.existsSync(directory)) {
92
+ fs.mkdirSync(directory, { recursive: true });
93
+ }
94
+ const maxConcurrent = options.maxConcurrent || 10;
95
+ const chunks = [];
96
+ // Split into chunks for concurrent processing
97
+ for (let i = 0; i < traces.length; i += maxConcurrent) {
98
+ chunks.push(traces.slice(i, i + maxConcurrent));
99
+ }
100
+ let completed = 0;
101
+ for (const chunk of chunks) {
102
+ await Promise.all(chunk.map(async (trace) => {
103
+ try {
104
+ // Write to file
105
+ const filename = `${trace.traceId}.json`;
106
+ const filepath = path.join(directory, filename);
107
+ // Always write JSON when writing to files.
108
+ const content = JSON.stringify(trace, null, 2);
109
+ fs.writeFileSync(filepath, content, "utf-8");
110
+ completed++;
111
+ writeProgress({
112
+ message: `[${completed}/${traces.length}] Wrote ${filename}`,
113
+ noProgress: options.noProgress,
114
+ });
115
+ }
116
+ catch (error) {
117
+ writeProgress({
118
+ message: `Warning: Failed to write trace ${trace.traceId}: ${error instanceof Error ? error.message : String(error)}`,
119
+ noProgress: options.noProgress,
120
+ });
121
+ }
122
+ }));
123
+ }
124
+ }
125
+ /**
126
+ * Traces command handler
127
+ */
128
+ async function tracesHandler(directory, options) {
129
+ try {
130
+ const userSpecifiedFormat = process.argv.includes("--format") ||
131
+ process.argv.some((arg) => arg.startsWith("--format="));
132
+ // Resolve configuration
133
+ const config = resolveConfig({
134
+ cliOptions: {
135
+ endpoint: options.endpoint,
136
+ project: options.project,
137
+ apiKey: options.apiKey,
138
+ },
139
+ });
140
+ // Validate configuration
141
+ const validation = validateConfig({ config });
142
+ if (!validation.valid) {
143
+ writeError({
144
+ message: getConfigErrorMessage({ errors: validation.errors }),
145
+ });
146
+ process.exit(1);
147
+ }
148
+ // Create client
149
+ const client = createPhoenixClient({ config });
150
+ // Resolve project ID
151
+ const projectIdentifier = config.project;
152
+ if (!projectIdentifier) {
153
+ writeError({ message: "Project not configured" });
154
+ process.exit(1);
155
+ }
156
+ writeProgress({
157
+ message: `Resolving project: ${projectIdentifier}`,
158
+ noProgress: !options.progress,
159
+ });
160
+ const projectId = await resolveProjectId({
161
+ client,
162
+ projectIdentifier,
163
+ });
164
+ // Fetch traces
165
+ const limit = options.limit || 10;
166
+ writeProgress({
167
+ message: `Fetching last ${limit} trace(s)...`,
168
+ noProgress: !options.progress,
169
+ });
170
+ const traces = await getLastNTraces(client, projectId, limit, {
171
+ lastNMinutes: options.lastNMinutes,
172
+ since: options.since,
173
+ });
174
+ if (traces.length === 0) {
175
+ writeProgress({
176
+ message: "No traces found",
177
+ noProgress: !options.progress,
178
+ });
179
+ return;
180
+ }
181
+ writeProgress({
182
+ message: `Found ${traces.length} trace(s)`,
183
+ noProgress: !options.progress,
184
+ });
185
+ // Output traces
186
+ if (directory) {
187
+ if (userSpecifiedFormat && options.format && options.format !== "json") {
188
+ writeError({
189
+ message: `Warning: --format is ignored when writing traces to a directory; writing JSON files to ${directory}`,
190
+ });
191
+ }
192
+ // Write to directory
193
+ writeProgress({
194
+ message: `Writing traces to ${directory}...`,
195
+ noProgress: !options.progress,
196
+ });
197
+ await writeTracesToDirectory(traces, directory, {
198
+ noProgress: !options.progress,
199
+ maxConcurrent: options.maxConcurrent,
200
+ });
201
+ writeProgress({
202
+ message: `Done! Wrote ${traces.length} trace(s) to ${directory}`,
203
+ noProgress: !options.progress,
204
+ });
205
+ }
206
+ else {
207
+ // Write to stdout
208
+ const output = formatTracesOutput({ traces, format: options.format });
209
+ writeOutput({ message: output });
210
+ }
211
+ }
212
+ catch (error) {
213
+ writeError({
214
+ message: `Error fetching traces: ${error instanceof Error ? error.message : String(error)}`,
215
+ });
216
+ process.exit(1);
217
+ }
218
+ }
219
+ /**
220
+ * Create the traces command
221
+ */
222
+ export function createTracesCommand() {
223
+ const command = new Command("traces");
224
+ command
225
+ .description("Fetch recent traces for the configured project")
226
+ .argument("[directory]", "Directory to write trace files (optional)")
227
+ .option("--endpoint <url>", "Phoenix API endpoint")
228
+ .option("--project <name>", "Project name or ID")
229
+ .option("--api-key <key>", "Phoenix API key for authentication")
230
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
231
+ .option("--no-progress", "Disable progress indicators")
232
+ .option("-n, --limit <number>", "Fetch the last N traces (newest first)", parseInt, 10)
233
+ .option("--last-n-minutes <number>", "Only fetch traces from the last N minutes", parseInt)
234
+ .option("--since <timestamp>", "Fetch traces since this ISO timestamp")
235
+ .option("--max-concurrent <number>", "Maximum concurrent fetches for bulk operations", parseInt, 10)
236
+ .action(tracesHandler);
237
+ return command;
238
+ }
239
+ //# sourceMappingURL=traces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.js","sourceRoot":"","sources":["../../src/commands/traces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAc,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAgB7B;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,MAAqB,EACrB,iBAAyB,EACzB,UAII,EAAE;IAEN,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,IAAI,MAA0B,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,eAAe;IAEvC,GAAG,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,yCAAyC,EACzC;YACE,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,kBAAkB,EAAE,iBAAiB;iBACtC;gBACD,KAAK,EAAE;oBACL,MAAM;oBACN,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,OAAO,CAAC,SAAS;oBAC7B,QAAQ,EAAE,OAAO,CAAC,OAAO;iBAC1B;aACF;SACF,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;QAEhD,kEAAkE;QAClE,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;YAC3D,MAAM;QACR,CAAC;IACH,CAAC,QAAQ,MAAM,EAAE;IAEjB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAqB,EACrB,iBAAyB,EACzB,KAAa,EACb,UAGI,EAAE;IAEN,uBAAuB;IACvB,IAAI,SAA6B,CAAC;IAElC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACzE,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,cAAc;IACd,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE;QACxD,SAAS;QACT,KAAK;KACN,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC;gBACZ,OAAO,EAAE,kCAAkC,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC/G,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACnC,MAAe,EACf,SAAiB,EACjB,UAGI,EAAE;IAEN,uCAAuC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,8CAA8C;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,gBAAgB;gBAChB,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAChD,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE7C,SAAS,EAAE,CAAC;gBACZ,aAAa,CAAC;oBACZ,OAAO,EAAE,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,WAAW,QAAQ,EAAE;oBAC5D,UAAU,EAAE,OAAO,CAAC,UAAU;iBAC/B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,CAAC;oBACZ,OAAO,EAAE,kCAAkC,KAAK,CAAC,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;oBACrH,UAAU,EAAE,OAAO,CAAC,UAAU;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,SAA6B,EAC7B,OAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,mBAAmB,GACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAE1D,wBAAwB;QACxB,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,UAAU,EAAE;gBACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB;SACF,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,UAAU,CAAC;gBACT,OAAO,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,qBAAqB;QACrB,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC;QACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,aAAa,CAAC;YACZ,OAAO,EAAE,sBAAsB,iBAAiB,EAAE;YAClD,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC;YACvC,MAAM;YACN,iBAAiB;SAClB,CAAC,CAAC;QAEH,eAAe;QACf,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAElC,aAAa,CAAC;YACZ,OAAO,EAAE,iBAAiB,KAAK,cAAc;YAC7C,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;YAC5D,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,aAAa,CAAC;gBACZ,OAAO,EAAE,iBAAiB;gBAC1B,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;aAC9B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,aAAa,CAAC;YACZ,OAAO,EAAE,SAAS,MAAM,CAAC,MAAM,WAAW;YAC1C,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,mBAAmB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvE,UAAU,CAAC;oBACT,OAAO,EAAE,0FAA0F,SAAS,EAAE;iBAC/G,CAAC,CAAC;YACL,CAAC;YAED,qBAAqB;YACrB,aAAa,CAAC;gBACZ,OAAO,EAAE,qBAAqB,SAAS,KAAK;gBAC5C,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;aAC9B,CAAC,CAAC;YAEH,MAAM,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE;gBAC9C,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;gBAC7B,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YAEH,aAAa,CAAC;gBACZ,OAAO,EAAE,eAAe,MAAM,CAAC,MAAM,gBAAgB,SAAS,EAAE;gBAChE,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;aAC9B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC;YACT,OAAO,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC5F,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,gDAAgD,CAAC;SAC7D,QAAQ,CAAC,aAAa,EAAE,2CAA2C,CAAC;SACpE,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CACL,mBAAmB,EACnB,qCAAqC,EACrC,QAAQ,CACT;SACA,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;SACtD,MAAM,CACL,sBAAsB,EACtB,wCAAwC,EACxC,QAAQ,EACR,EAAE,CACH;SACA,MAAM,CACL,2BAA2B,EAC3B,2CAA2C,EAC3C,QAAQ,CACT;SACA,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CACL,2BAA2B,EAC3B,gDAAgD,EAChD,QAAQ,EACR,EAAE,CACH;SACA,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Configuration for the Phoenix CLI
3
+ */
4
+ export interface PhoenixConfig {
5
+ /**
6
+ * The Phoenix API endpoint
7
+ */
8
+ endpoint?: string;
9
+ /**
10
+ * The project name or ID
11
+ */
12
+ project?: string;
13
+ /**
14
+ * API key for authentication
15
+ */
16
+ apiKey?: string;
17
+ /**
18
+ * Custom headers
19
+ */
20
+ headers?: Record<string, string>;
21
+ }
22
+ /**
23
+ * Load configuration from environment variables
24
+ */
25
+ export declare function loadConfigFromEnvironment(): PhoenixConfig;
26
+ /**
27
+ * Resolve configuration from supported sources
28
+ * Priority: CLI flags > Environment variables
29
+ */
30
+ export interface ResolveConfigOptions {
31
+ /**
32
+ * CLI-provided config values (typically from Commander). `undefined` values are ignored.
33
+ */
34
+ cliOptions: Partial<PhoenixConfig>;
35
+ }
36
+ /**
37
+ * Resolve configuration from supported sources.
38
+ * Priority: CLI flags > Environment variables.
39
+ */
40
+ export declare function resolveConfig({ cliOptions, }: ResolveConfigOptions): PhoenixConfig;
41
+ /**
42
+ * Validate that required configuration is present
43
+ */
44
+ export interface ValidateConfigOptions {
45
+ /**
46
+ * Resolved Phoenix CLI configuration.
47
+ */
48
+ config: PhoenixConfig;
49
+ }
50
+ /**
51
+ * Validate that required configuration is present.
52
+ */
53
+ export declare function validateConfig({ config }: ValidateConfigOptions): {
54
+ valid: boolean;
55
+ errors: string[];
56
+ };
57
+ /**
58
+ * Get error message with actionable instructions
59
+ */
60
+ export interface GetConfigErrorMessageOptions {
61
+ /**
62
+ * Validation errors to include in the message.
63
+ */
64
+ errors: string[];
65
+ }
66
+ /**
67
+ * Get error message with actionable instructions.
68
+ */
69
+ export declare function getConfigErrorMessage({ errors, }: GetConfigErrorMessageOptions): string;
70
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,aAAa,CAyBzD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAU,GACX,EAAE,oBAAoB,GAAG,aAAa,CAatC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,qBAAqB,GAAG;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAkBA;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,GACP,EAAE,4BAA4B,GAAG,MAAM,CAiBvC"}