@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
package/README.md
CHANGED
|
@@ -1,44 +1,207 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
33
|
+
Or run directly with npx:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
14
36
|
npx @arizeai/phoenix-cli
|
|
15
37
|
```
|
|
16
38
|
|
|
17
|
-
##
|
|
39
|
+
## Quick Start
|
|
18
40
|
|
|
19
41
|
```bash
|
|
20
|
-
#
|
|
21
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
172
|
+
## Examples
|
|
33
173
|
|
|
34
|
-
###
|
|
174
|
+
### Debug failed traces
|
|
35
175
|
|
|
36
176
|
```bash
|
|
37
|
-
|
|
177
|
+
px traces --limit 20 --format raw --no-progress | jq '.[] | select(.status == "ERROR")'
|
|
38
178
|
```
|
|
39
179
|
|
|
40
|
-
###
|
|
180
|
+
### Find slowest traces
|
|
41
181
|
|
|
42
182
|
```bash
|
|
43
|
-
|
|
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
|
package/build/cli.js.map
ADDED
|
@@ -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"}
|
package/build/client.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|