@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
package/README.md CHANGED
@@ -1,44 +1,207 @@
1
- # @arizeai/phoenix-cli
2
-
3
- A command-line interface for [Arize Phoenix](https://github.com/Arize-ai/phoenix).
4
-
5
- > **Note:** This package is currently under development and not yet ready for use.
1
+ <h1 align="center" style="border-bottom: none">
2
+ <div>
3
+ <a href="https://phoenix.arize.com/?utm_medium=github&utm_content=header_img&utm_campaign=phoenix-cli">
4
+ <picture>
5
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Arize-ai/phoenix-assets/refs/heads/main/logos/Phoenix/phoenix.svg">
6
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Arize-ai/phoenix-assets/refs/heads/main/logos/Phoenix/phoenix-white.svg">
7
+ <img alt="Arize Phoenix logo" src="https://raw.githubusercontent.com/Arize-ai/phoenix-assets/refs/heads/main/logos/Phoenix/phoenix.svg" width="100" />
8
+ </picture>
9
+ </a>
10
+ <br>
11
+ @arizeai/phoenix-cli
12
+ </div>
13
+ </h1>
14
+
15
+ <p align="center">
16
+ <a href="https://www.npmjs.com/package/@arizeai/phoenix-cli">
17
+ <img src="https://img.shields.io/npm/v/%40arizeai%2Fphoenix-cli" alt="NPM Version">
18
+ </a>
19
+ <a href="https://arize.com/docs/phoenix/">
20
+ <img src="https://img.shields.io/badge/docs-blue?logo=typescript&logoColor=white" alt="Documentation">
21
+ </a>
22
+ <img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=8e8e8b34-7900-43fa-a38f-1f070bd48c64&page=js/packages/phoenix-cli/README.md" />
23
+ </p>
24
+
25
+ A command-line interface for retrieving trace data from [Arize Phoenix](https://github.com/Arize-ai/phoenix). Fetch, debug, and export traces directly from your terminal—or pipe them into AI coding agents like Claude Code, Cursor, Codex, and Gemini CLI.
6
26
 
7
27
  ## Installation
8
28
 
9
29
  ```bash
10
- # Install globally
11
30
  npm install -g @arizeai/phoenix-cli
31
+ ```
12
32
 
13
- # Or use with npx
33
+ Or run directly with npx:
34
+
35
+ ```bash
14
36
  npx @arizeai/phoenix-cli
15
37
  ```
16
38
 
17
- ## Usage
39
+ ## Quick Start
18
40
 
19
41
  ```bash
20
- # View help
21
- phoenix-cli --help
42
+ # Configure your Phoenix instance
43
+ export PHOENIX_HOST=http://localhost:6006
44
+ export PHOENIX_PROJECT=my-project
45
+ export PHOENIX_API_KEY=your-api-key # if authentication is enabled
46
+
47
+ # Fetch the most recent trace
48
+ px traces --limit 1
22
49
 
23
- # TODO: Add usage examples here
50
+ # Fetch a specific trace by ID
51
+ px trace abc123def456
52
+
53
+ # Export traces to a directory
54
+ px traces ./my-traces --limit 50
24
55
  ```
25
56
 
57
+ ## Environment Variables
58
+
59
+ | Variable | Description |
60
+ | ------------------------ | ---------------------------------------------------- |
61
+ | `PHOENIX_HOST` | Phoenix API endpoint (e.g., `http://localhost:6006`) |
62
+ | `PHOENIX_PROJECT` | Project name or ID |
63
+ | `PHOENIX_API_KEY` | API key for authentication (if required) |
64
+ | `PHOENIX_CLIENT_HEADERS` | Custom headers as JSON string |
65
+
66
+ CLI flags take priority over environment variables.
67
+
26
68
  ## Commands
27
69
 
28
- > **Coming Soon:** Commands will be added to interact with Phoenix prompts, datasets, experiments, and more.
70
+ ### `px projects`
71
+
72
+ List all available projects.
73
+
74
+ ```bash
75
+ px projects
76
+ px projects --format raw # JSON output for piping
77
+ ```
78
+
79
+ ### `px traces [directory]`
80
+
81
+ Fetch recent traces from the configured project.
82
+
83
+ ```bash
84
+ px traces --limit 10 # Output to stdout
85
+ px traces ./my-traces --limit 10 # Save to directory
86
+ px traces --last-n-minutes 60 --limit 20 # Filter by time
87
+ px traces --since 2026-01-13T10:00:00Z # Since timestamp
88
+ px traces --format raw --no-progress | jq # Pipe to jq
89
+ ```
90
+
91
+ | Option | Description | Default |
92
+ | --------------------------- | ----------------------------------------- | -------- |
93
+ | `[directory]` | Save traces as JSON files to directory | stdout |
94
+ | `-n, --limit <number>` | Number of traces to fetch (newest first) | 10 |
95
+ | `--last-n-minutes <number>` | Only fetch traces from the last N minutes | — |
96
+ | `--since <timestamp>` | Fetch traces since ISO timestamp | — |
97
+ | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
98
+ | `--no-progress` | Disable progress output | — |
99
+
100
+ ### `px trace <trace-id>`
101
+
102
+ Fetch a specific trace by ID.
29
103
 
30
- ## Development
104
+ ```bash
105
+ px trace abc123def456
106
+ px trace abc123def456 --file trace.json # Save to file
107
+ px trace abc123def456 --format raw | jq # Pipe to jq
108
+ ```
109
+
110
+ | Option | Description | Default |
111
+ | ------------------- | ------------------------------ | -------- |
112
+ | `--file <path>` | Save to file instead of stdout | stdout |
113
+ | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
114
+
115
+ ## Output Formats
116
+
117
+ **`pretty`** (default) — Human-readable tree view:
118
+
119
+ ```
120
+ ┌─ Trace: abc123def456
121
+
122
+ │ Input: What is the weather in San Francisco?
123
+ │ Output: The weather is currently sunny...
124
+
125
+ │ Spans:
126
+ │ └─ ✓ agent_run (CHAIN) - 1250ms
127
+ │ ├─ ✓ llm_call (LLM) - 800ms
128
+ │ └─ ✓ tool_execution (TOOL) - 400ms
129
+ └─
130
+ ```
131
+
132
+ **`json`** — Formatted JSON with indentation.
133
+
134
+ **`raw`** — Compact JSON for piping to `jq` or other tools.
135
+
136
+ ## JSON Structure
137
+
138
+ ```json
139
+ {
140
+ "traceId": "abc123def456",
141
+ "spans": [
142
+ {
143
+ "name": "chat_completion",
144
+ "context": {
145
+ "trace_id": "abc123def456",
146
+ "span_id": "span-1"
147
+ },
148
+ "span_kind": "LLM",
149
+ "parent_id": null,
150
+ "start_time": "2026-01-17T10:00:00.000Z",
151
+ "end_time": "2026-01-17T10:00:01.250Z",
152
+ "status_code": "OK",
153
+ "attributes": {
154
+ "llm.model_name": "gpt-4",
155
+ "llm.token_count.prompt": 512,
156
+ "llm.token_count.completion": 256,
157
+ "input.value": "What is the weather?",
158
+ "output.value": "The weather is sunny..."
159
+ }
160
+ }
161
+ ],
162
+ "rootSpan": { ... },
163
+ "startTime": "2026-01-17T10:00:00.000Z",
164
+ "endTime": "2026-01-17T10:00:01.250Z",
165
+ "duration": 1250,
166
+ "status": "OK"
167
+ }
168
+ ```
169
+
170
+ Spans include [OpenInference](https://github.com/Arize-ai/openinference) semantic attributes like `llm.model_name`, `llm.token_count.*`, `input.value`, `output.value`, `tool.name`, and `exception.*`.
31
171
 
32
- This package is part of the Phoenix monorepo and uses the existing `@arizeai/phoenix-client` library.
172
+ ## Examples
33
173
 
34
- ### Building
174
+ ### Debug failed traces
35
175
 
36
176
  ```bash
37
- pnpm build
177
+ px traces --limit 20 --format raw --no-progress | jq '.[] | select(.status == "ERROR")'
38
178
  ```
39
179
 
40
- ### Testing
180
+ ### Find slowest traces
41
181
 
42
182
  ```bash
43
- pnpm test
183
+ px traces --limit 10 --format raw --no-progress | jq 'sort_by(-.duration) | .[0:3]'
44
184
  ```
185
+
186
+ ### Extract LLM models used
187
+
188
+ ```bash
189
+ px traces --limit 50 --format raw --no-progress | \
190
+ jq -r '.[].spans[] | select(.span_kind == "LLM") | .attributes["llm.model_name"]' | sort -u
191
+ ```
192
+
193
+ ### Count errors
194
+
195
+ ```bash
196
+ px traces --limit 100 --format raw --no-progress | jq '[.[] | select(.status == "ERROR")] | length'
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Community
202
+
203
+ - 🌍 [Slack community](https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg)
204
+ - 📚 [Documentation](https://arize.com/docs/phoenix)
205
+ - 🌟 [GitHub](https://github.com/Arize-ai/phoenix)
206
+ - 🐞 [Report bugs](https://github.com/Arize-ai/phoenix/issues)
207
+ - 𝕏 [@ArizePhoenix](https://twitter.com/ArizePhoenix)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAWA,wBAAgB,IAAI,SAmBnB"}
package/build/cli.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { createProjectsCommand, createTraceCommand, createTracesCommand, } from "./commands/index.js";
3
+ import { Command } from "commander";
4
+ // Phoenix CLI Main Logic
5
+ export function main() {
6
+ const program = new Command();
7
+ program
8
+ .name("px")
9
+ .description("Phoenix CLI - AI observability from the command line")
10
+ .version("0.0.4");
11
+ // Register commands
12
+ program.addCommand(createProjectsCommand());
13
+ program.addCommand(createTracesCommand());
14
+ program.addCommand(createTraceCommand());
15
+ // Show help if no command provided
16
+ if (process.argv.length === 2) {
17
+ program.help();
18
+ }
19
+ program.parse();
20
+ }
21
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,yBAAyB;AACzB,MAAM,UAAU,IAAI;IAClB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,IAAI,CAAC;SACV,WAAW,CAAC,sDAAsD,CAAC;SACnE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,oBAAoB;IACpB,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzC,mCAAmC;IACnC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type PhoenixClient } from "@arizeai/phoenix-client";
2
+ import type { PhoenixConfig } from "./config.js";
3
+ export interface CreatePhoenixClientOptions {
4
+ /**
5
+ * Resolved Phoenix CLI configuration.
6
+ */
7
+ config: PhoenixConfig;
8
+ }
9
+ /**
10
+ * Create a Phoenix client from configuration
11
+ */
12
+ export declare function createPhoenixClient({ config, }: CreatePhoenixClientOptions): PhoenixClient;
13
+ export interface ResolveProjectIdOptions {
14
+ /**
15
+ * Phoenix API client.
16
+ */
17
+ client: PhoenixClient;
18
+ /**
19
+ * Project identifier to resolve.
20
+ *
21
+ * Phoenix project IDs are hex-encoded strings. If `projectIdentifier` looks like a hex string,
22
+ * it's treated as an ID; otherwise it's treated as a name and resolved via the API.
23
+ */
24
+ projectIdentifier: string;
25
+ }
26
+ /**
27
+ * Resolve project identifier to project ID
28
+ * If the identifier looks like a Phoenix project ID (hex string), returns it as-is; otherwise fetches by name.
29
+ */
30
+ export declare function resolveProjectId({ client, projectIdentifier, }: ResolveProjectIdOptions): Promise<string>;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,GACP,EAAE,0BAA0B,GAAG,aAAa,CAqB5C;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAWD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,MAAM,EACN,iBAAiB,GAClB,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B3C"}
@@ -0,0 +1,57 @@
1
+ import { createClient } from "@arizeai/phoenix-client";
2
+ /**
3
+ * Create a Phoenix client from configuration
4
+ */
5
+ export function createPhoenixClient({ config, }) {
6
+ const baseUrl = config.endpoint;
7
+ if (!baseUrl) {
8
+ throw new Error("Phoenix endpoint not configured");
9
+ }
10
+ const headers = {
11
+ ...(config.headers || {}),
12
+ };
13
+ if (config.apiKey) {
14
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
15
+ }
16
+ return createClient({
17
+ options: {
18
+ baseUrl,
19
+ headers,
20
+ },
21
+ });
22
+ }
23
+ function looksLikePhoenixProjectId(projectIdentifier) {
24
+ // Project IDs are hex-encoded strings (e.g., "a1b2c3d4e5f6...")
25
+ const trimmed = projectIdentifier.trim();
26
+ if (!trimmed)
27
+ return false;
28
+ // Check if the string is a valid hex string (only 0-9, a-f, A-F)
29
+ return /^[0-9a-fA-F]+$/.test(trimmed);
30
+ }
31
+ /**
32
+ * Resolve project identifier to project ID
33
+ * If the identifier looks like a Phoenix project ID (hex string), returns it as-is; otherwise fetches by name.
34
+ */
35
+ export async function resolveProjectId({ client, projectIdentifier, }) {
36
+ if (looksLikePhoenixProjectId(projectIdentifier)) {
37
+ return projectIdentifier;
38
+ }
39
+ // Otherwise, fetch the project by name to get its ID
40
+ try {
41
+ const response = await client.GET("/v1/projects/{project_identifier}", {
42
+ params: {
43
+ path: {
44
+ project_identifier: projectIdentifier,
45
+ },
46
+ },
47
+ });
48
+ if (response.error || !response.data) {
49
+ throw new Error(`Failed to resolve project "${projectIdentifier}": ${response.error}`);
50
+ }
51
+ return response.data.data.id;
52
+ }
53
+ catch (error) {
54
+ throw new Error(`Failed to resolve project "${projectIdentifier}": ${error instanceof Error ? error.message : String(error)}`);
55
+ }
56
+ }
57
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,yBAAyB,CAAC;AAW3E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,GACqB;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEhC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;KAC1B,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE;YACP,OAAO;YACP,OAAO;SACR;KACF,CAAC,CAAC;AACL,CAAC;AAgBD,SAAS,yBAAyB,CAAC,iBAAyB;IAC1D,gEAAgE;IAChE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,iEAAiE;IACjE,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EACrC,MAAM,EACN,iBAAiB,GACO;IACxB,IAAI,yBAAyB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACjD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,qDAAqD;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mCAAmC,EAAE;YACrE,MAAM,EAAE;gBACN,IAAI,EAAE;oBACJ,kBAAkB,EAAE,iBAAiB;iBACtC;aACF;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,8BAA8B,iBAAiB,MAAM,QAAQ,CAAC,KAAK,EAAE,CACtE,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,8BAA8B,iBAAiB,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type OutputFormat = "pretty" | "json" | "raw";
2
+ type ProjectLike = {
3
+ id: string;
4
+ name: string;
5
+ description?: string | null;
6
+ };
7
+ export interface FormatProjectsOutputOptions {
8
+ /**
9
+ * Projects to format.
10
+ */
11
+ projects: ProjectLike[];
12
+ /**
13
+ * Output format. Defaults to `"pretty"`.
14
+ */
15
+ format?: OutputFormat;
16
+ }
17
+ export declare function formatProjectsOutput({ projects, format, }: FormatProjectsOutputOptions): string;
18
+ export {};
19
+ //# sourceMappingURL=formatProjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatProjects.d.ts","sourceRoot":"","sources":["../../src/commands/formatProjects.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,GACP,EAAE,2BAA2B,GAAG,MAAM,CAqBtC"}
@@ -0,0 +1,21 @@
1
+ export function formatProjectsOutput({ projects, format, }) {
2
+ const selected = format || "pretty";
3
+ if (selected === "raw") {
4
+ return JSON.stringify(projects);
5
+ }
6
+ if (selected === "json") {
7
+ return JSON.stringify(projects, null, 2);
8
+ }
9
+ const lines = [];
10
+ lines.push("Projects:");
11
+ for (const p of projects) {
12
+ const desc = p.description === null ||
13
+ p.description === undefined ||
14
+ p.description === ""
15
+ ? ""
16
+ : ` — ${p.description}`;
17
+ lines.push(`- ${p.name} (${p.id})${desc}`);
18
+ }
19
+ return lines.join("\n");
20
+ }
21
+ //# sourceMappingURL=formatProjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatProjects.js","sourceRoot":"","sources":["../../src/commands/formatProjects.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,GACsB;IAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC;IACpC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GACR,CAAC,CAAC,WAAW,KAAK,IAAI;YACtB,CAAC,CAAC,WAAW,KAAK,SAAS;YAC3B,CAAC,CAAC,WAAW,KAAK,EAAE;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Trace } from "../trace.js";
2
+ export type OutputFormat = "pretty" | "json" | "raw";
3
+ export interface FormatTraceOutputOptions {
4
+ /**
5
+ * Trace to format.
6
+ */
7
+ trace: Trace;
8
+ /**
9
+ * Output format. Defaults to `"pretty"`.
10
+ */
11
+ format?: OutputFormat;
12
+ }
13
+ export declare function formatTraceOutput({ trace, format, }: FormatTraceOutputOptions): string;
14
+ export interface FormatTracesOutputOptions {
15
+ /**
16
+ * Traces to format.
17
+ */
18
+ traces: Trace[];
19
+ /**
20
+ * Output format. Defaults to `"pretty"`.
21
+ */
22
+ format?: OutputFormat;
23
+ }
24
+ export declare function formatTracesOutput({ traces, format, }: FormatTracesOutputOptions): string;
25
+ //# sourceMappingURL=formatTraces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatTraces.d.ts","sourceRoot":"","sources":["../../src/commands/formatTraces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAMrD,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,MAAM,GACP,EAAE,wBAAwB,GAAG,MAAM,CASnC;AAED,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,MAAM,GACP,EAAE,yBAAyB,GAAG,MAAM,CAcpC"}
@@ -0,0 +1,165 @@
1
+ const INPUT_VALUE_ATTRIBUTE = "input.value";
2
+ const OUTPUT_VALUE_ATTRIBUTE = "output.value";
3
+ const VALUE_PREVIEW_MAX_CHARS = 200;
4
+ export function formatTraceOutput({ trace, format, }) {
5
+ const selected = format || "pretty";
6
+ if (selected === "raw") {
7
+ return JSON.stringify(trace);
8
+ }
9
+ if (selected === "json") {
10
+ return JSON.stringify(trace, null, 2);
11
+ }
12
+ return formatTracePretty(trace);
13
+ }
14
+ export function formatTracesOutput({ traces, format, }) {
15
+ const selected = format || "pretty";
16
+ if (selected === "raw") {
17
+ return JSON.stringify(traces);
18
+ }
19
+ if (selected === "json") {
20
+ return JSON.stringify(traces, null, 2);
21
+ }
22
+ if (traces.length === 0) {
23
+ return "No traces found";
24
+ }
25
+ return traces
26
+ .map((t) => formatTracePretty(t))
27
+ .join("\n\n" + "=".repeat(80) + "\n\n");
28
+ }
29
+ function formatTracePretty(trace) {
30
+ const lines = [];
31
+ lines.push(`┌─ Trace: ${trace.traceId}`);
32
+ lines.push(`│`);
33
+ const forest = buildSpanForest(trace.spans);
34
+ const rootWithIo = forest.find((n) => {
35
+ const attrs = n.span.attributes;
36
+ return (previewAttributeValue(attrs?.[INPUT_VALUE_ATTRIBUTE]) !== undefined ||
37
+ previewAttributeValue(attrs?.[OUTPUT_VALUE_ATTRIBUTE]) !== undefined);
38
+ });
39
+ if (rootWithIo) {
40
+ const inputPreview = previewAttributeValue(rootWithIo.span.attributes?.[INPUT_VALUE_ATTRIBUTE]);
41
+ const outputPreview = previewAttributeValue(rootWithIo.span.attributes?.[OUTPUT_VALUE_ATTRIBUTE]);
42
+ if (inputPreview)
43
+ lines.push(`│ Input: ${inputPreview}`);
44
+ if (outputPreview)
45
+ lines.push(`│ Output: ${outputPreview}`);
46
+ if (inputPreview || outputPreview)
47
+ lines.push(`│`);
48
+ }
49
+ lines.push(`│ Spans:`);
50
+ for (let i = 0; i < forest.length; i++) {
51
+ renderSpanNode(lines, forest[i], {
52
+ ancestors: [],
53
+ isLast: i === forest.length - 1,
54
+ });
55
+ }
56
+ lines.push(`└─`);
57
+ return lines.join("\n");
58
+ }
59
+ function buildSpanForest(spans) {
60
+ const spanIdToSpan = new Map();
61
+ const spanIdToNode = new Map();
62
+ const parentIdToChildren = new Map();
63
+ for (const span of spans) {
64
+ const spanId = span.context?.span_id;
65
+ if (!spanId)
66
+ continue;
67
+ spanIdToSpan.set(spanId, span);
68
+ }
69
+ for (const span of spans) {
70
+ const parentId = span.parent_id ?? null;
71
+ if (!parentId)
72
+ continue;
73
+ if (!parentIdToChildren.has(parentId)) {
74
+ parentIdToChildren.set(parentId, []);
75
+ }
76
+ parentIdToChildren.get(parentId).push(span);
77
+ }
78
+ const getNode = (span) => {
79
+ const spanId = span.context.span_id;
80
+ const existing = spanIdToNode.get(spanId);
81
+ if (existing)
82
+ return existing;
83
+ const node = { span, children: [] };
84
+ spanIdToNode.set(spanId, node);
85
+ return node;
86
+ };
87
+ // roots: no parent_id, or parent_id not present in this trace
88
+ const roots = [];
89
+ for (const span of spans) {
90
+ const parentId = span.parent_id ?? null;
91
+ if (!parentId || !spanIdToSpan.has(parentId)) {
92
+ roots.push(span);
93
+ }
94
+ }
95
+ const sortByStartTime = (a, b) => {
96
+ const aStart = Date.parse(a.start_time);
97
+ const bStart = Date.parse(b.start_time);
98
+ if (!Number.isNaN(aStart) && !Number.isNaN(bStart)) {
99
+ return aStart - bStart;
100
+ }
101
+ return String(a.name).localeCompare(String(b.name));
102
+ };
103
+ const buildNodeRec = (span) => {
104
+ const node = getNode(span);
105
+ const children = parentIdToChildren.get(span.context.span_id) ?? [];
106
+ children.sort(sortByStartTime);
107
+ node.children = children.map(buildNodeRec);
108
+ return node;
109
+ };
110
+ roots.sort(sortByStartTime);
111
+ return roots.map(buildNodeRec);
112
+ }
113
+ function renderSpanNode(lines, node, opts) {
114
+ const { span, children } = node;
115
+ const baseIndent = "│ ";
116
+ const treePrefix = opts.ancestors
117
+ .map((ancestorIsLast) => (ancestorIsLast ? " " : "│ "))
118
+ .join("");
119
+ const connector = opts.isLast ? "└─" : "├─";
120
+ const status = span.status_code === "ERROR" ? "✗" : "✓";
121
+ const kind = span.span_kind;
122
+ const duration = formatDurationMs(span.start_time, span.end_time);
123
+ lines.push(`${baseIndent}${treePrefix}${connector} ${status} ${span.name} (${kind}) - ${duration}`);
124
+ const nextAncestors = [...opts.ancestors, opts.isLast];
125
+ for (let i = 0; i < children.length; i++) {
126
+ renderSpanNode(lines, children[i], {
127
+ ancestors: nextAncestors,
128
+ isLast: i === children.length - 1,
129
+ });
130
+ }
131
+ }
132
+ function formatDurationMs(startTime, endTime) {
133
+ const startMs = Date.parse(startTime);
134
+ const endMs = Date.parse(endTime);
135
+ if (Number.isNaN(startMs) || Number.isNaN(endMs)) {
136
+ return "n/a";
137
+ }
138
+ return `${Math.max(0, endMs - startMs)}ms`;
139
+ }
140
+ function previewAttributeValue(value) {
141
+ if (value === undefined || value === null) {
142
+ return undefined;
143
+ }
144
+ let str;
145
+ if (typeof value === "string") {
146
+ str = value;
147
+ }
148
+ else {
149
+ try {
150
+ str = JSON.stringify(value);
151
+ }
152
+ catch {
153
+ str = String(value);
154
+ }
155
+ }
156
+ str = str.replace(/\s+/g, " ").trim();
157
+ if (!str) {
158
+ return undefined;
159
+ }
160
+ if (str.length > VALUE_PREVIEW_MAX_CHARS) {
161
+ return `${str.slice(0, VALUE_PREVIEW_MAX_CHARS)}…`;
162
+ }
163
+ return str;
164
+ }
165
+ //# sourceMappingURL=formatTraces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatTraces.js","sourceRoot":"","sources":["../../src/commands/formatTraces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./projects.js";
2
+ export * from "./traces.js";
3
+ export * from "./trace.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./projects.js";
2
+ export * from "./traces.js";
3
+ export * from "./trace.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Create the projects command
4
+ */
5
+ export declare function createProjectsCommand(): Command;
6
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6FpC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAqB/C"}