@arizeai/phoenix-cli 0.5.2 → 0.7.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 (55) hide show
  1. package/README.md +165 -172
  2. package/build/cli.d.ts.map +1 -1
  3. package/build/cli.js +4 -1
  4. package/build/cli.js.map +1 -1
  5. package/build/commands/api.d.ts +10 -0
  6. package/build/commands/api.d.ts.map +1 -0
  7. package/build/commands/api.js +103 -0
  8. package/build/commands/api.js.map +1 -0
  9. package/build/commands/auth.d.ts.map +1 -1
  10. package/build/commands/auth.js +1 -1
  11. package/build/commands/auth.js.map +1 -1
  12. package/build/commands/dataset.d.ts.map +1 -1
  13. package/build/commands/dataset.js +2 -2
  14. package/build/commands/dataset.js.map +1 -1
  15. package/build/commands/datasets.d.ts.map +1 -1
  16. package/build/commands/datasets.js +1 -1
  17. package/build/commands/datasets.js.map +1 -1
  18. package/build/commands/experiment.d.ts.map +1 -1
  19. package/build/commands/experiment.js +2 -2
  20. package/build/commands/experiment.js.map +1 -1
  21. package/build/commands/experiments.d.ts.map +1 -1
  22. package/build/commands/experiments.js +3 -3
  23. package/build/commands/experiments.js.map +1 -1
  24. package/build/commands/formatSessions.d.ts +17 -0
  25. package/build/commands/formatSessions.d.ts.map +1 -0
  26. package/build/commands/formatSessions.js +121 -0
  27. package/build/commands/formatSessions.js.map +1 -0
  28. package/build/commands/index.d.ts +3 -0
  29. package/build/commands/index.d.ts.map +1 -1
  30. package/build/commands/index.js +3 -0
  31. package/build/commands/index.js.map +1 -1
  32. package/build/commands/projects.d.ts.map +1 -1
  33. package/build/commands/projects.js +1 -1
  34. package/build/commands/projects.js.map +1 -1
  35. package/build/commands/prompt.d.ts.map +1 -1
  36. package/build/commands/prompt.js +1 -1
  37. package/build/commands/prompt.js.map +1 -1
  38. package/build/commands/prompts.d.ts.map +1 -1
  39. package/build/commands/prompts.js +1 -1
  40. package/build/commands/prompts.js.map +1 -1
  41. package/build/commands/session.d.ts +6 -0
  42. package/build/commands/session.d.ts.map +1 -0
  43. package/build/commands/session.js +149 -0
  44. package/build/commands/session.js.map +1 -0
  45. package/build/commands/sessions.d.ts +6 -0
  46. package/build/commands/sessions.d.ts.map +1 -0
  47. package/build/commands/sessions.js +126 -0
  48. package/build/commands/sessions.js.map +1 -0
  49. package/build/commands/trace.d.ts.map +1 -1
  50. package/build/commands/trace.js +2 -2
  51. package/build/commands/trace.js.map +1 -1
  52. package/build/commands/traces.d.ts.map +1 -1
  53. package/build/commands/traces.js +3 -3
  54. package/build/commands/traces.js.map +1 -1
  55. package/package.json +26 -27
package/README.md CHANGED
@@ -22,287 +22,280 @@
22
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
23
  </p>
24
24
 
25
- A command-line interface for [Arize Phoenix](https://github.com/Arize-ai/phoenix). Fetch traces, list datasets, and export experiment results directly from your terminal—or pipe them into AI coding agents like Claude Code, Cursor, Codex, and Gemini CLI.
25
+ A command-line interface for [Arize Phoenix](https://github.com/Arize-ai/phoenix). Fetch traces, inspect datasets, query experiments, and access prompts directly from your terminal—or pipe them into AI coding agents like Claude Code, Cursor, Codex, and Gemini CLI.
26
26
 
27
27
  ## Installation
28
28
 
29
29
  ```bash
30
30
  npm install -g @arizeai/phoenix-cli
31
- ```
32
-
33
- Or run directly with npx:
34
-
35
- ```bash
31
+ # or run without installing:
36
32
  npx @arizeai/phoenix-cli
37
33
  ```
38
34
 
39
- ## Quick Start
35
+ ## Configuration
40
36
 
41
37
  ```bash
42
- # Configure your Phoenix instance
43
38
  export PHOENIX_HOST=http://localhost:6006
44
39
  export PHOENIX_PROJECT=my-project
45
40
  export PHOENIX_API_KEY=your-api-key # if authentication is enabled
46
-
47
- # Fetch the most recent trace
48
- px traces --limit 1
49
-
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
55
41
  ```
56
42
 
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 |
43
+ CLI flags (`--endpoint`, `--project`, `--api-key`) override environment variables.
65
44
 
66
- CLI flags take priority over environment variables.
45
+ | Variable | Description |
46
+ | ------------------------ | ----------------------------- |
47
+ | `PHOENIX_HOST` | Phoenix API endpoint |
48
+ | `PHOENIX_PROJECT` | Project name or ID |
49
+ | `PHOENIX_API_KEY` | API key (if auth is enabled) |
50
+ | `PHOENIX_CLIENT_HEADERS` | Custom headers as JSON string |
67
51
 
68
52
  ## Commands
69
53
 
70
- ### `px projects`
54
+ ### `px traces [directory]`
71
55
 
72
- List all available projects.
56
+ Fetch recent traces from the configured project. All output is JSON.
73
57
 
74
58
  ```bash
75
- px projects
76
- px projects --format raw # JSON output for piping
59
+ px traces --limit 10 # stdout (pretty)
60
+ px traces --format raw --no-progress | jq # pipe-friendly compact JSON
61
+ px traces ./my-traces --limit 50 # save as JSON files to directory
62
+ px traces --last-n-minutes 60 --limit 20 # filter by time window
63
+ px traces --since 2026-01-13T10:00:00Z # since ISO timestamp
77
64
  ```
78
65
 
79
- ### `px traces [directory]`
80
-
81
- Fetch recent traces from the configured project.
66
+ | Option | Description | Default |
67
+ | --------------------------- | -------------------------------------- | -------- |
68
+ | `[directory]` | Save traces as JSON files to directory | stdout |
69
+ | `-n, --limit <number>` | Number of traces (newest first) | 10 |
70
+ | `--last-n-minutes <number>` | Only traces from the last N minutes | — |
71
+ | `--since <timestamp>` | Traces since ISO timestamp | — |
72
+ | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
73
+ | `--no-progress` | Suppress progress output | — |
74
+ | `--include-annotations` | Include span annotations | — |
82
75
 
83
76
  ```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
77
+ # Find ERROR traces
78
+ px traces --limit 50 --format raw --no-progress | jq '.[] | select(.status == "ERROR")'
79
+
80
+ # Sort by duration, take top 5 slowest
81
+ px traces --limit 20 --format raw --no-progress | jq 'sort_by(-.duration) | .[0:5]'
82
+
83
+ # Extract LLM model names used
84
+ px traces --limit 50 --format raw --no-progress | \
85
+ jq -r '.[].spans[] | select(.span_kind == "LLM") | .attributes["llm.model_name"]' | sort -u
89
86
  ```
90
87
 
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
- | `--include-annotations` | Include span annotations in trace export | — |
88
+ ---
100
89
 
101
90
  ### `px trace <trace-id>`
102
91
 
103
- Fetch a specific trace by ID.
92
+ Fetch a single trace by ID.
104
93
 
105
94
  ```bash
106
95
  px trace abc123def456
107
- px trace abc123def456 --file trace.json # Save to file
108
- px trace abc123def456 --format raw | jq # Pipe to jq
96
+ px trace abc123def456 --format raw | jq '.spans[] | select(.status_code != "OK")'
97
+ px trace abc123def456 --file trace.json
109
98
  ```
110
99
 
111
- | Option | Description | Default |
112
- | ----------------------- | ---------------------------------------- | -------- |
113
- | `--file <path>` | Save to file instead of stdout | stdout |
114
- | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
115
- | `--include-annotations` | Include span annotations in trace export | — |
100
+ ---
116
101
 
117
102
  ### `px datasets`
118
103
 
119
- List all available datasets.
104
+ List all datasets.
120
105
 
121
106
  ```bash
122
- px datasets
123
- px datasets --format json # JSON output
124
- px datasets --format raw --no-progress | jq # Pipe to jq
107
+ px datasets --format raw --no-progress | jq '.[].name'
125
108
  ```
126
109
 
127
- | Option | Description | Default |
128
- | ------------------- | -------------------------- | -------- |
129
- | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
130
- | `--limit <number>` | Maximum number of datasets | — |
110
+ ---
131
111
 
132
112
  ### `px dataset <dataset-identifier>`
133
113
 
134
114
  Fetch examples from a dataset.
135
115
 
136
116
  ```bash
137
- px dataset query_response # Fetch all examples
138
- px dataset query_response --split train # Filter by split
139
- px dataset query_response --split train --split test # Multiple splits
140
- px dataset query_response --version <version-id> # Specific version
141
- px dataset query_response --file dataset.json # Save to file
142
- px dataset query_response --format raw | jq '.examples[].input'
117
+ px dataset my-dataset --format raw | jq '.examples[].input'
118
+ px dataset my-dataset --split train --split test
119
+ px dataset my-dataset --version <version-id>
120
+ px dataset my-dataset --file dataset.json
143
121
  ```
144
122
 
145
- | Option | Description | Default |
146
- | ---------------- | ---------------------------------------- | -------- |
147
- | `--split <name>` | Filter by split (can be used repeatedly) | — |
148
- | `--version <id>` | Fetch from specific dataset version | latest |
149
- | `--file <path>` | Save to file instead of stdout | stdout |
150
- | `--format <fmt>` | `pretty`, `json`, or `raw` | `pretty` |
123
+ ---
151
124
 
152
125
  ### `px experiments --dataset <name-or-id>`
153
126
 
154
- List experiments for a dataset, optionally exporting full data to files.
127
+ List experiments for a dataset.
155
128
 
156
129
  ```bash
157
- px experiments --dataset my-dataset # List experiments
158
- px experiments --dataset my-dataset --format json # JSON output
159
- px experiments --dataset my-dataset ./experiments # Export to directory
130
+ px experiments --dataset my-dataset --format raw --no-progress | \
131
+ jq '.[] | {id, successful_run_count, failed_run_count}'
160
132
  ```
161
133
 
162
- | Option | Description | Default |
163
- | ------------------------ | ----------------------------------------- | -------- |
164
- | `--dataset <name-or-id>` | Dataset name or ID (required) | — |
165
- | `[directory]` | Export experiment JSON files to directory | stdout |
166
- | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
167
- | `--limit <number>` | Maximum number of experiments | — |
134
+ ---
168
135
 
169
136
  ### `px experiment <experiment-id>`
170
137
 
171
- Fetch a single experiment with all run data.
138
+ Fetch a single experiment with all run data (inputs, outputs, evaluations, trace IDs).
172
139
 
173
140
  ```bash
174
- px experiment RXhwZXJpbWVudDox
175
- px experiment RXhwZXJpbWVudDox --file exp.json # Save to file
176
- px experiment RXhwZXJpbWVudDox --format json # JSON output
141
+ # Find failed runs
142
+ px experiment RXhwZXJpbWVudDox --format raw --no-progress | \
143
+ jq '.[] | select(.error != null) | {input, error}'
144
+
145
+ # Average latency
146
+ px experiment RXhwZXJpbWVudDox --format raw --no-progress | \
147
+ jq '[.[].latency_ms] | add / length'
177
148
  ```
178
149
 
179
- | Option | Description | Default |
180
- | ------------------- | ------------------------------ | -------- |
181
- | `--file <path>` | Save to file instead of stdout | stdout |
182
- | `--format <format>` | `pretty`, `json`, or `raw` | `pretty` |
150
+ ---
183
151
 
184
- ## Output Formats
152
+ ### `px prompts`
185
153
 
186
- **`pretty`** (default) — Human-readable tree view:
154
+ List all prompts.
187
155
 
188
- ```
189
- ┌─ Trace: abc123def456
190
-
191
- │ Input: What is the weather in San Francisco?
192
- │ Output: The weather is currently sunny...
193
-
194
- │ Spans:
195
- │ └─ ✓ agent_run (CHAIN) - 1250ms
196
- │ ├─ ✓ llm_call (LLM) - 800ms
197
- │ └─ ✓ tool_execution (TOOL) - 400ms
198
- └─
156
+ ```bash
157
+ px prompts --format raw --no-progress | jq '.[].name'
199
158
  ```
200
159
 
201
- **`json`** — Formatted JSON with indentation.
160
+ ---
202
161
 
203
- **`raw`** — Compact JSON for piping to `jq` or other tools.
162
+ ### `px prompt <prompt-identifier>`
204
163
 
205
- ## JSON Structure
164
+ Fetch a prompt. The `text` format is ideal for piping to AI assistants.
206
165
 
207
- ```json
208
- {
209
- "traceId": "abc123def456",
210
- "spans": [
211
- {
212
- "name": "chat_completion",
213
- "context": {
214
- "trace_id": "abc123def456",
215
- "span_id": "span-1"
216
- },
217
- "span_kind": "LLM",
218
- "parent_id": null,
219
- "start_time": "2026-01-17T10:00:00.000Z",
220
- "end_time": "2026-01-17T10:00:01.250Z",
221
- "status_code": "OK",
222
- "attributes": {
223
- "llm.model_name": "gpt-4",
224
- "llm.token_count.prompt": 512,
225
- "llm.token_count.completion": 256,
226
- "input.value": "What is the weather?",
227
- "output.value": "The weather is sunny..."
228
- }
229
- }
230
- ],
231
- "rootSpan": { ... },
232
- "startTime": "2026-01-17T10:00:00.000Z",
233
- "endTime": "2026-01-17T10:00:01.250Z",
234
- "duration": 1250,
235
- "status": "OK"
236
- }
166
+ ```bash
167
+ px prompt my-evaluator --format text --no-progress | claude -p "Review this prompt"
168
+ px prompt my-evaluator --tag production --format json | jq '.template'
237
169
  ```
238
170
 
239
- 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.*`.
171
+ | Option | Description | Default |
172
+ | ------------------- | ---------------------------------- | -------- |
173
+ | `--tag <name>` | Get version by tag | — |
174
+ | `--version <id>` | Get specific version | latest |
175
+ | `--format <format>` | `pretty`, `json`, `raw`, or `text` | `pretty` |
240
176
 
241
- ## Examples
177
+ ---
178
+
179
+ ### `px api graphql <query>`
242
180
 
243
- ### Debug failed traces
181
+ Make authenticated GraphQL queries against the Phoenix API. Output is `{"data": {...}}` JSON — pipe with `jq '.data.<field>'` to extract values. Only queries are permitted; mutations and subscriptions are rejected.
244
182
 
245
183
  ```bash
246
- px traces --limit 20 --format raw --no-progress | jq '.[] | select(.status == "ERROR")'
184
+ px api graphql '<query>' [--endpoint <url>] [--api-key <key>]
247
185
  ```
248
186
 
249
- ### Find slowest traces
187
+ Use introspection to discover what fields are available:
250
188
 
251
189
  ```bash
252
- px traces --limit 10 --format raw --no-progress | jq 'sort_by(-.duration) | .[0:3]'
190
+ $ px api graphql '{ __schema { queryType { fields { name } } } }' | jq '.data.__schema.queryType.fields[].name'
191
+ "projects"
192
+ "datasets"
193
+ "prompts"
194
+ "evaluators"
195
+ "projectCount"
196
+ "datasetCount"
197
+ ...
198
+
199
+ $ px api graphql '{ __type(name: "Experiment") { fields { name type { name } } } }' | \
200
+ jq '.data.__type.fields[] | {name, type: .type.name}'
201
+ {"name":"id","type":"ID"}
202
+ {"name":"name","type":"String"}
203
+ {"name":"runCount","type":"Int"}
204
+ {"name":"errorRate","type":"Float"}
205
+ {"name":"averageRunLatencyMs","type":"Float"}
253
206
  ```
254
207
 
255
- ### Extract LLM models used
208
+ **Projects:**
256
209
 
257
210
  ```bash
258
- px traces --limit 50 --format raw --no-progress | \
259
- jq -r '.[].spans[] | select(.span_kind == "LLM") | .attributes["llm.model_name"]' | sort -u
211
+ $ px api graphql '{ projects { edges { node { name traceCount tokenCountTotal } } } }' | \
212
+ jq '.data.projects.edges[].node'
213
+ {"name": "default", "traceCount": 1482, "tokenCountTotal": 219083}
260
214
  ```
261
215
 
262
- ### Count errors
216
+ **Datasets:**
263
217
 
264
218
  ```bash
265
- px traces --limit 100 --format raw --no-progress | jq '[.[] | select(.status == "ERROR")] | length'
219
+ $ px api graphql '{ datasets { edges { node { name exampleCount experimentCount } } } }' | \
220
+ jq '.data.datasets.edges[].node'
221
+ {"name": "eval-golden-set", "exampleCount": 120, "experimentCount": 4}
222
+ {"name": "rag-test-cases", "exampleCount": 50, "experimentCount": 1}
266
223
  ```
267
224
 
268
- ### List datasets and experiments
225
+ **Experiments:**
269
226
 
270
227
  ```bash
271
- # List all datasets
272
- px datasets --format raw --no-progress | jq '.[].name'
273
- # Output: "query_response"
228
+ # List experiments per dataset with error rate and avg latency
229
+ $ px api graphql '{
230
+ datasets {
231
+ edges {
232
+ node {
233
+ name
234
+ experiments {
235
+ edges {
236
+ node { name runCount errorRate averageRunLatencyMs }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }' | jq '.data.datasets.edges[].node | {dataset: .name, experiments: [.experiments.edges[].node]}'
274
243
 
275
- # List experiments for a dataset
276
- px experiments --dataset query_response --format raw --no-progress | \
277
- jq '.[] | {id, successful_run_count, failed_run_count}'
278
- # Output: {"id":"RXhwZXJpbWVudDox","successful_run_count":249,"failed_run_count":1}
244
+ # Find experiments with failures
245
+ $ px api graphql '{
246
+ datasets { edges { node { name experiments { edges { node { name errorRate runCount } } } } } }
247
+ }' | jq '.. | objects | select(.errorRate? > 0) | {name, errorRate, runCount}'
248
+ ```
249
+
250
+ **Counts at a glance:**
279
251
 
280
- # Export all experiment data for a dataset to a directory
281
- px experiments --dataset query_response ./experiments/
252
+ ```bash
253
+ $ px api graphql '{ projectCount datasetCount promptCount evaluatorCount }'
254
+ {"data": {"projectCount": 1, "datasetCount": 12, "promptCount": 3, "evaluatorCount": 2}}
282
255
  ```
283
256
 
284
- ### Analyze experiment results
257
+ ---
258
+
259
+ ## JSON output shape
260
+
261
+ All commands output JSON. Use `--format raw` for compact JSON and `--no-progress` to suppress stderr when piping:
285
262
 
286
263
  ```bash
287
- # Get input queries and latency from an experiment
288
- px experiment RXhwZXJpbWVudDox --format raw --no-progress | \
289
- jq '.[] | {query: .input.query, latency_ms, trace_id}'
264
+ px traces --format raw --no-progress | jq ...
265
+ px datasets --format raw --no-progress | jq ...
266
+ ```
290
267
 
291
- # Find failed runs in an experiment
292
- px experiment RXhwZXJpbWVudDox --format raw --no-progress | \
293
- jq '.[] | select(.error != null) | {query: .input.query, error}'
294
- # Output: {"query":"looking for complex fodmap meal ideas","error":"peer closed connection..."}
268
+ Trace JSON structure:
295
269
 
296
- # Calculate average latency across runs
297
- px experiment RXhwZXJpbWVudDox --format raw --no-progress | \
298
- jq '[.[].latency_ms] | add / length'
270
+ ```json
271
+ {
272
+ "traceId": "abc123def456",
273
+ "status": "OK",
274
+ "duration": 1250,
275
+ "spans": [
276
+ {
277
+ "name": "chat_completion",
278
+ "span_kind": "LLM",
279
+ "status_code": "OK",
280
+ "attributes": {
281
+ "llm.model_name": "gpt-4",
282
+ "llm.token_count.prompt": 512,
283
+ "llm.token_count.completion": 256,
284
+ "input.value": "What is the weather?",
285
+ "output.value": "The weather is sunny..."
286
+ }
287
+ }
288
+ ]
289
+ }
299
290
  ```
300
291
 
292
+ `px api graphql` output always wraps results in `{"data": {...}}`. Pipe with `jq '.data.<field>'` to extract.
293
+
301
294
  ---
302
295
 
303
296
  ## Community
304
297
 
305
- - 🌍 [Slack community](https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg)
298
+ - 🌍 [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-3r07iavnk-ammtATWSlF0pSrd1DsMW7g)
306
299
  - 📚 [Documentation](https://arize.com/docs/phoenix)
307
300
  - 🌟 [GitHub](https://github.com/Arize-ai/phoenix)
308
301
  - 🐞 [Report bugs](https://github.com/Arize-ai/phoenix/issues)
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAkBA,wBAAgB,IAAI,SA0BnB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAqBA,wBAAgB,IAAI,SA6BnB"}
package/build/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { createAuthCommand, createDatasetCommand, createDatasetsCommand, createExperimentCommand, createExperimentsCommand, createProjectsCommand, createPromptCommand, createPromptsCommand, createTraceCommand, createTracesCommand, } from "./commands/index.js";
3
2
  import { Command } from "commander";
3
+ import { createApiCommand, createAuthCommand, createDatasetCommand, createDatasetsCommand, createExperimentCommand, createExperimentsCommand, createProjectsCommand, createPromptCommand, createPromptsCommand, createSessionCommand, createSessionsCommand, createTraceCommand, createTracesCommand, } from "./commands/index.js";
4
4
  // Phoenix CLI Main Logic
5
5
  export function main() {
6
6
  const program = new Command();
@@ -15,10 +15,13 @@ export function main() {
15
15
  program.addCommand(createTraceCommand());
16
16
  program.addCommand(createDatasetsCommand());
17
17
  program.addCommand(createDatasetCommand());
18
+ program.addCommand(createSessionsCommand());
19
+ program.addCommand(createSessionCommand());
18
20
  program.addCommand(createExperimentsCommand());
19
21
  program.addCommand(createExperimentCommand());
20
22
  program.addCommand(createPromptsCommand());
21
23
  program.addCommand(createPromptCommand());
24
+ program.addCommand(createApiCommand());
22
25
  // Show help if no command provided
23
26
  if (process.argv.length === 2) {
24
27
  program.help();
package/build/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,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,iBAAiB,EAAE,CAAC,CAAC;IACxC,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;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,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,iBAAiB,EAAE,CAAC,CAAC;IACxC,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;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEvC,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,10 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Returns true if the query string is a GraphQL mutation or subscription.
4
+ * Strips # comments first to avoid false positives.
5
+ */
6
+ export declare function isNonQuery({ query }: {
7
+ query: string;
8
+ }): boolean;
9
+ export declare function createApiCommand(): Command;
10
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAGhE;AA+GD,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C"}
@@ -0,0 +1,103 @@
1
+ import { Command } from "commander";
2
+ import { getConfigErrorMessage, resolveConfig } from "../config.js";
3
+ import { writeError, writeOutput } from "../io.js";
4
+ /**
5
+ * Returns true if the query string is a GraphQL mutation or subscription.
6
+ * Strips # comments first to avoid false positives.
7
+ */
8
+ export function isNonQuery({ query }) {
9
+ const stripped = query.replace(/#[^\n]*/g, "");
10
+ return /^\s*(mutation|subscription)[\s({]/m.test(stripped);
11
+ }
12
+ async function apiGraphqlHandler(query, options) {
13
+ try {
14
+ // 1. Reject mutations and subscriptions
15
+ if (isNonQuery({ query })) {
16
+ writeError({
17
+ message: "Error: Only queries are permitted. Mutations and subscriptions are not allowed.",
18
+ });
19
+ process.exit(1);
20
+ }
21
+ // 2. Resolve config (endpoint only — no project required)
22
+ const config = resolveConfig({
23
+ cliOptions: { endpoint: options.endpoint, apiKey: options.apiKey },
24
+ });
25
+ if (!config.endpoint) {
26
+ writeError({
27
+ message: getConfigErrorMessage({
28
+ errors: [
29
+ "Phoenix endpoint not configured. Set PHOENIX_HOST environment variable or use --endpoint flag.",
30
+ ],
31
+ }),
32
+ });
33
+ process.exit(1);
34
+ }
35
+ // 3. Build URL and auth headers
36
+ const graphqlUrl = `${config.endpoint.replace(/\/$/, "")}/graphql`;
37
+ const headers = {
38
+ "Content-Type": "application/json",
39
+ ...(config.headers ?? {}),
40
+ };
41
+ if (config.apiKey) {
42
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
43
+ }
44
+ // 4. POST using Node 22 built-in fetch
45
+ const response = await fetch(graphqlUrl, {
46
+ method: "POST",
47
+ headers,
48
+ body: JSON.stringify({ query }),
49
+ });
50
+ if (!response.ok) {
51
+ writeError({
52
+ message: `Error: HTTP ${response.status} ${response.statusText} from ${graphqlUrl}`,
53
+ });
54
+ process.exit(1);
55
+ }
56
+ // 5. Parse and output response
57
+ const json = (await response.json());
58
+ if (json.errors && json.errors.length > 0) {
59
+ const msgs = json.errors.map((e) => ` • ${e.message}`).join("\n");
60
+ writeError({ message: `GraphQL Errors:\n${msgs}` });
61
+ }
62
+ // Always write full response to stdout (2-space indent, pipeable)
63
+ writeOutput({ message: JSON.stringify(json, null, 2) });
64
+ if (json.errors && json.errors.length > 0 && json.data == null) {
65
+ process.exit(1);
66
+ }
67
+ }
68
+ catch (error) {
69
+ writeError({
70
+ message: `Error: ${error instanceof Error ? error.message : String(error)}`,
71
+ });
72
+ process.exit(1);
73
+ }
74
+ }
75
+ function createApiGraphqlCommand() {
76
+ return new Command("graphql")
77
+ .description("Execute a GraphQL query against the Phoenix API.\n" +
78
+ "\n" +
79
+ " Only queries are permitted — mutations are rejected.\n" +
80
+ "\n" +
81
+ " Examples:\n" +
82
+ "\n" +
83
+ " # List project names\n" +
84
+ " px api graphql '{ projects { edges { node { name } } } }'\n" +
85
+ "\n" +
86
+ " # Filter inline\n" +
87
+ " px api graphql '{ datasets(first: 5) { edges { node { name } } } }'\n" +
88
+ "\n" +
89
+ " # Pipe to jq to extract fields\n" +
90
+ " px api graphql '{ projects { edges { node { name } } } }' | \\\n" +
91
+ " jq '.data.projects.edges[].node.name'")
92
+ .argument("<query>", "GraphQL query string")
93
+ .option("--endpoint <url>", "Phoenix API endpoint (or set PHOENIX_HOST)")
94
+ .option("--api-key <key>", "Phoenix API key (or set PHOENIX_API_KEY)")
95
+ .action(apiGraphqlHandler);
96
+ }
97
+ export function createApiCommand() {
98
+ const command = new Command("api");
99
+ command.description("Make authenticated requests to the Phoenix API");
100
+ command.addCommand(createApiGraphqlCommand());
101
+ return command;
102
+ }
103
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAS3C"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpD;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAS3C"}
@@ -1,6 +1,6 @@
1
+ import { Command } from "commander";
1
2
  import { resolveConfig } from "../config.js";
2
3
  import { writeError, writeOutput } from "../io.js";
3
- import { Command } from "commander";
4
4
  /**
5
5
  * Obscure an API key for display using asterisks.
6
6
  * Shows a fixed number of asterisks regardless of key length for security.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,sCAAsC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IACzD,wBAAwB;IACxB,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,UAAU,EAAE;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,UAAU,CAAC;YACT,OAAO,EAAE,2DAA2D;SACrE,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5B,yBAAyB;IACzB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB;IAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAErD,kBAAkB;IAClB,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAOhD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,sCAAsC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IACzD,wBAAwB;IACxB,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,UAAU,EAAE;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;KACF,CAAC,CAAC;IAEH,kCAAkC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,UAAU,CAAC;YACT,OAAO,EAAE,2DAA2D;SACrE,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5B,yBAAyB;IACzB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB;IAC9B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO;SACJ,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAErD,kBAAkB;IAClB,OAAO,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/commands/dataset.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAyB9C"}
1
+ {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/commands/dataset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqLpC;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAyB9C"}