@arizeai/phoenix-cli 0.0.1 → 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.
- package/README.md +181 -18
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +21 -0
- package/build/cli.js.map +1 -0
- package/build/client.d.ts +31 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +57 -0
- package/build/client.js.map +1 -0
- package/build/commands/formatProjects.d.ts +19 -0
- package/build/commands/formatProjects.d.ts.map +1 -0
- package/build/commands/formatProjects.js +21 -0
- package/build/commands/formatProjects.js.map +1 -0
- package/build/commands/formatTraces.d.ts +25 -0
- package/build/commands/formatTraces.d.ts.map +1 -0
- package/build/commands/formatTraces.js +165 -0
- package/build/commands/formatTraces.js.map +1 -0
- package/build/commands/index.d.ts +4 -0
- package/build/commands/index.d.ts.map +1 -0
- package/build/commands/index.js +4 -0
- package/build/commands/index.js.map +1 -0
- package/build/commands/projects.d.ts +6 -0
- package/build/commands/projects.d.ts.map +1 -0
- package/build/commands/projects.js +87 -0
- package/build/commands/projects.js.map +1 -0
- package/build/commands/trace.d.ts +6 -0
- package/build/commands/trace.d.ts.map +1 -0
- package/build/commands/trace.js +143 -0
- package/build/commands/trace.js.map +1 -0
- package/build/commands/traces.d.ts +6 -0
- package/build/commands/traces.d.ts.map +1 -0
- package/build/commands/traces.js +239 -0
- package/build/commands/traces.js.map +1 -0
- package/build/config.d.ts +70 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +77 -0
- package/build/config.js.map +1 -0
- package/{dist/src → build}/index.d.ts.map +1 -1
- package/{dist/esm → build}/index.js +0 -0
- package/build/index.js.map +1 -0
- package/build/io.d.ts +49 -0
- package/build/io.d.ts.map +1 -0
- package/build/io.js +29 -0
- package/build/io.js.map +1 -0
- package/build/trace.d.ts +41 -0
- package/build/trace.d.ts.map +1 -0
- package/build/trace.js +55 -0
- package/build/trace.js.map +1 -0
- package/package.json +27 -15
- package/dist/esm/cli.d.ts.map +0 -1
- package/dist/esm/cli.js +0 -17
- package/dist/esm/cli.js.map +0 -1
- package/dist/esm/commands/index.d.ts +0 -1
- package/dist/esm/commands/index.d.ts.map +0 -1
- package/dist/esm/commands/index.js +0 -8
- package/dist/esm/commands/index.js.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/esm/utils/index.d.ts +0 -1
- package/dist/esm/utils/index.d.ts.map +0 -1
- package/dist/esm/utils/index.js +0 -8
- package/dist/esm/utils/index.js.map +0 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -20
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/index.d.ts +0 -1
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js +0 -8
- package/dist/src/commands/index.js.map +0 -1
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.js +0 -8
- package/dist/src/index.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -1
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -8
- package/dist/src/utils/index.js.map +0 -1
- package/dist/test/cli.test.d.ts +0 -2
- package/dist/test/cli.test.d.ts.map +0 -1
- package/dist/test/cli.test.js +0 -12
- package/dist/test/cli.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/cli.ts +0 -22
- package/src/commands/index.ts +0 -7
- package/src/index.ts +0 -7
- package/src/utils/index.ts +0 -7
- /package/{dist/esm → build}/cli.d.ts +0 -0
- /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":"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"}
|
|
@@ -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":"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,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAazB;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,iBAAyB,EACzB,OAAe;IAEf,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,IAAI,MAA0B,CAAC;IAE/B,yDAAyD;IACzD,qFAAqF;IACrF,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,IAAI;iBACZ;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,8BAA8B;QAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAC1C,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAC5C,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAE7B,mDAAmD;QACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM;QACR,CAAC;QAED,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC;IAClD,CAAC,QAAQ,MAAM,EAAE;IAEjB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,OAAqB;IAErB,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,cAAc;QACd,aAAa,CAAC;YACZ,OAAO,EAAE,kBAAkB,OAAO,KAAK;YACvC,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,EAAE,oBAAoB,OAAO,EAAE,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,aAAa,CAAC;YACZ,OAAO,EAAE,SAAS,KAAK,CAAC,MAAM,UAAU;YACxC,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,cAAc;QACd,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpC,eAAe;QACf,MAAM,YAAY,GAAiB,OAAO,CAAC,IAAI;YAC7C,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;QAE/B,IAAI,OAAO,CAAC,IAAI,IAAI,mBAAmB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrE,UAAU,CAAC;gBACT,OAAO,EAAE,wEAAwE,OAAO,CAAC,IAAI,EAAE;aAChG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,aAAa,CAAC;gBACZ,OAAO,EAAE,kBAAkB,OAAO,CAAC,IAAI,EAAE;gBACzC,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ;aAC9B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC;YACT,OAAO,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC3F,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO;SACJ,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,YAAY,EAAE,4CAA4C,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,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -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"}
|