@arizeai/phoenix-cli 1.14.0 → 1.15.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 +40 -12
- package/build/commands/api.d.ts.map +1 -1
- package/build/commands/api.js +5 -8
- package/build/commands/api.js.map +1 -1
- package/build/commands/auth.js +1 -1
- package/build/commands/auth.js.map +1 -1
- package/build/commands/formatSetup.d.ts +18 -2
- package/build/commands/formatSetup.d.ts.map +1 -1
- package/build/commands/formatSetup.js +27 -5
- package/build/commands/formatSetup.js.map +1 -1
- package/build/commands/options.d.ts +3 -2
- package/build/commands/options.d.ts.map +1 -1
- package/build/commands/options.js +2 -1
- package/build/commands/options.js.map +1 -1
- package/build/commands/setup.d.ts +21 -0
- package/build/commands/setup.d.ts.map +1 -1
- package/build/commands/setup.js +37 -5
- package/build/commands/setup.js.map +1 -1
- package/build/commands/setupMcp.js +1 -1
- package/build/commands/setupMcp.js.map +1 -1
- package/build/config.d.ts +5 -2
- package/build/config.d.ts.map +1 -1
- package/build/config.js +37 -13
- package/build/config.js.map +1 -1
- package/build/exitCodes.d.ts +8 -0
- package/build/exitCodes.d.ts.map +1 -1
- package/build/exitCodes.js +8 -0
- package/build/exitCodes.js.map +1 -1
- package/build/pxi/options.d.ts +1 -1
- package/build/pxi/preflight.js +2 -2
- package/build/pxi/preflight.js.map +1 -1
- package/build/setup/agents/registry.d.ts.map +1 -1
- package/build/setup/agents/registry.js +4 -0
- package/build/setup/agents/registry.js.map +1 -1
- package/build/setup/copy.d.ts +26 -0
- package/build/setup/copy.d.ts.map +1 -1
- package/build/setup/copy.js +46 -1
- package/build/setup/copy.js.map +1 -1
- package/build/setup/mcp/runSetupMcp.js +2 -2
- package/build/setup/mcp/runSetupMcp.js.map +1 -1
- package/build/setup/options.d.ts +4 -3
- package/build/setup/options.d.ts.map +1 -1
- package/build/setup/options.js +8 -7
- package/build/setup/options.js.map +1 -1
- package/build/setup/prompts/instrumentationPrompt.d.ts.map +1 -1
- package/build/setup/prompts/instrumentationPrompt.js +14 -7
- package/build/setup/prompts/instrumentationPrompt.js.map +1 -1
- package/build/setup/runSetup.d.ts +21 -2
- package/build/setup/runSetup.d.ts.map +1 -1
- package/build/setup/runSetup.js +44 -7
- package/build/setup/runSetup.js.map +1 -1
- package/build/setup/steps/verifyTraces.d.ts +25 -11
- package/build/setup/steps/verifyTraces.d.ts.map +1 -1
- package/build/setup/steps/verifyTraces.js +53 -28
- package/build/setup/steps/verifyTraces.js.map +1 -1
- package/build/setup/steps/writeEnvFile.d.ts.map +1 -1
- package/build/setup/steps/writeEnvFile.js +7 -5
- package/build/setup/steps/writeEnvFile.js.map +1 -1
- package/package.json +6 -6
package/build/setup/options.d.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Input resolution for setup.
|
|
3
3
|
*
|
|
4
4
|
* Follows px's `resolveConfig()` precedence — flags, then env, then
|
|
5
|
-
* defaults —
|
|
6
|
-
* `PHOENIX_PROJECT_NAME`
|
|
7
|
-
* setup-specific env vars. Reads env only through
|
|
5
|
+
* defaults — using phoenix-config's shared base-URL precedence for the
|
|
6
|
+
* endpoint and `PHOENIX_PROJECT`/`PHOENIX_PROJECT_NAME` for the project
|
|
7
|
+
* (#14131). There are no setup-specific env vars. Reads env only through
|
|
8
|
+
* `RunContext.env`.
|
|
8
9
|
*
|
|
9
10
|
* Note the `--no-input` flag (or a non-TTY stdin) — not the presence of env
|
|
10
11
|
* vars — is what opts into headless behavior: an ambient `PHOENIX_API_KEY`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG9D;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,mEAAmE;IACnE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,mBAAmB,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,EAC/C,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,GAAG,IAAI,CAIP;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;CACjD,GAAG,WAAW,CAoCd"}
|
package/build/setup/options.js
CHANGED
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Input resolution for setup.
|
|
3
3
|
*
|
|
4
4
|
* Follows px's `resolveConfig()` precedence — flags, then env, then
|
|
5
|
-
* defaults —
|
|
6
|
-
* `PHOENIX_PROJECT_NAME`
|
|
7
|
-
* setup-specific env vars. Reads env only through
|
|
5
|
+
* defaults — using phoenix-config's shared base-URL precedence for the
|
|
6
|
+
* endpoint and `PHOENIX_PROJECT`/`PHOENIX_PROJECT_NAME` for the project
|
|
7
|
+
* (#14131). There are no setup-specific env vars. Reads env only through
|
|
8
|
+
* `RunContext.env`.
|
|
8
9
|
*
|
|
9
10
|
* Note the `--no-input` flag (or a non-TTY stdin) — not the presence of env
|
|
10
11
|
* vars — is what opts into headless behavior: an ambient `PHOENIX_API_KEY`
|
|
11
12
|
* in a dev shell never silently short-circuits the interactive flow.
|
|
12
13
|
*/
|
|
14
|
+
import { getBaseUrlFromValues } from "@arizeai/phoenix-config";
|
|
13
15
|
import { CODING_AGENT_IDS } from "./agents/registry.js";
|
|
14
16
|
import * as COPY from "./copy.js";
|
|
15
17
|
import { HeadlessInputError } from "./errors.js";
|
|
@@ -29,10 +31,9 @@ export function assertAgentForHeadlessInstrument({ headless, agent, }) {
|
|
|
29
31
|
}
|
|
30
32
|
export function resolveSetupInputs({ options, context, }) {
|
|
31
33
|
const { env } = context;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
undefined;
|
|
34
|
+
// Same variable precedence as resolveConfig and the SDKs, applied to the
|
|
35
|
+
// injected env copy (so no `.env.phoenix` discovery here).
|
|
36
|
+
const endpoint = options.endpoint ?? getBaseUrlFromValues(env);
|
|
36
37
|
const project = options.project ??
|
|
37
38
|
env.PHOENIX_PROJECT ??
|
|
38
39
|
env.PHOENIX_PROJECT_NAME ??
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAgG9C;;;;;;;;GAQG;AACH,MAAM,UAAU,gCAAgC,CAAC,EAC/C,QAAQ,EACR,KAAK,GAIN;IACC,IAAI,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,OAAO,EACP,OAAO,GAIR;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,GAAG,CAAC,eAAe;QACnB,GAAG,CAAC,oBAAoB;QACxB,SAAS,CAAC;IACZ,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IAEjE,qEAAqE;IACrE,uDAAuD;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC;IAEnD,IAAI,UAAU,EAAE,CAAC;QACf,gCAAgC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,SAAS;QACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS;QACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS;QACnC,QAAQ;QACR,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QAClC,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,6DAA6D;QAC7D,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,QAAQ;QAC1C,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACrD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentationPrompt.d.ts","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,yBAAyB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,EAAE,yBAAyB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"instrumentationPrompt.d.ts","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,EAAE,yBAAyB,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,EAAE,yBAAyB,GAAG,MAAM,CA8DpC"}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
import { DOCS_MCP_SERVER_NAME } from "../agents/registry.js";
|
|
14
14
|
export function buildInstrumentationPrompt({ projectName, endpoint, isDefaultEndpoint, docs, tracesUrl, authEnabled, languages = [], localDocsDir, docsMcpConfigured, }) {
|
|
15
15
|
const credentialVars = authEnabled
|
|
16
|
-
? "PHOENIX_COLLECTOR_ENDPOINT and PHOENIX_API_KEY"
|
|
17
|
-
: "PHOENIX_COLLECTOR_ENDPOINT";
|
|
16
|
+
? "PHOENIX_COLLECTOR_ENDPOINT, PHOENIX_ENDPOINT, and PHOENIX_API_KEY"
|
|
17
|
+
: "PHOENIX_COLLECTOR_ENDPOINT and PHOENIX_ENDPOINT";
|
|
18
18
|
const endpointRule = isDefaultEndpoint
|
|
19
19
|
? ""
|
|
20
20
|
: `\n Also set the collector endpoint in code only if the quickstart says to; it is ${endpoint}.`;
|
|
@@ -47,17 +47,24 @@ Rules:
|
|
|
47
47
|
write the API key or any secret into source code, config files, or command arguments.
|
|
48
48
|
3. Configure the Phoenix project name in code: use the SDK's register call with the
|
|
49
49
|
project name "${projectName}".${endpointRule}
|
|
50
|
-
4.
|
|
50
|
+
4. The endpoint variables are base URLs; \`.env.phoenix\` already sets both to the same
|
|
51
|
+
value. PHOENIX_COLLECTOR_ENDPOINT is where traces are exported — register() and the
|
|
52
|
+
OTel SDKs derive the full OTLP target from it. PHOENIX_ENDPOINT serves everything
|
|
53
|
+
else. Leave both set, and do not rewrite them to carry the /v1/traces path. If you
|
|
54
|
+
must construct an exporter that posts to exactly the URL it is given, build the full
|
|
55
|
+
OTLP URL in code: ${endpoint}/v1/traces. Handed a base URL, such exporters drop
|
|
56
|
+
every span silently.
|
|
57
|
+
5. Prefer auto-instrumentation packages over hand-written span wrappers. Make the smallest
|
|
51
58
|
correct change.
|
|
52
|
-
|
|
59
|
+
6. Verify your work by emitting exactly one trace: run the app briefly, or a minimal
|
|
53
60
|
throwaway script that makes one real LLM call through the instrumented path, then
|
|
54
61
|
delete any throwaway script. Do not run the full test suite or the build.
|
|
55
|
-
|
|
62
|
+
7. Install SDK packages with the project's existing package manager, pinned to the latest
|
|
56
63
|
stable version you can verify. If this is a monorepo, note the root but only modify
|
|
57
64
|
files at or below the current working directory.
|
|
58
|
-
|
|
65
|
+
8. Keep changes concise and readable. Do not restructure, reformat, or meaningfully modify
|
|
59
66
|
existing application code.
|
|
60
|
-
|
|
67
|
+
9. Do not use the \`px\` CLI.
|
|
61
68
|
|
|
62
69
|
When finished, end your final message with a one-line summary of the changes you made and
|
|
63
70
|
this link to the project's traces: ${tracesUrl}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentationPrompt.js","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAsC1D,MAAM,UAAU,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAS,GAAG,EAAE,EACd,YAAY,EACZ,iBAAiB,GACS;IAC1B,MAAM,cAAc,GAAG,WAAW;QAChC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"instrumentationPrompt.js","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAsC1D,MAAM,UAAU,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAS,GAAG,EAAE,EACd,YAAY,EACZ,iBAAiB,GACS;IAC1B,MAAM,cAAc,GAAG,WAAW;QAChC,CAAC,CAAC,mEAAmE;QACrE,CAAC,CAAC,iDAAiD,CAAC;IACtD,MAAM,YAAY,GAAG,iBAAiB;QACpC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,sFAAsF,QAAQ,GAAG,CAAC;IACtG,MAAM,YAAY,GAChB,SAAS,CAAC,MAAM,GAAG,CAAC;QAClB,CAAC,CAAC,yBAAyB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC;QACtF,CAAC,CAAC,oIAAoI,CAAC;IAC3I,MAAM,aAAa,GAAG,YAAY;QAChC,CAAC,CAAC,2CAA2C,YAAY,4FAA4F;QACrJ,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,UAAU,oBAAoB,gLAAgL;QAChN,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;4CAKmC,IAAI,CAAC,gBAAgB;mDACd,IAAI,CAAC,oBAAoB;0BAClD,IAAI,CAAC,gBAAgB;uDACQ,IAAI,CAAC,iBAAiB,GAAG,aAAa,GAAG,WAAW;EACzG,YAAY;;;;yDAI2C,cAAc;;;;;;mBAMpD,WAAW,KAAK,YAAY;;;;;;uBAMxB,QAAQ;;;;;;;;;;;;;;;qCAeM,SAAS;;;CAG7C,CAAC;AACF,CAAC"}
|
|
@@ -17,6 +17,7 @@ import type { Connection } from "./steps/establishConnection.js";
|
|
|
17
17
|
import { type ToolingResult } from "./steps/installTooling.js";
|
|
18
18
|
import { type InstrumentationLane } from "./steps/instrumentApp.js";
|
|
19
19
|
import type { DocsMcpResult } from "./steps/offerDocsMcp.js";
|
|
20
|
+
import { type TraceVerification } from "./steps/verifyTraces.js";
|
|
20
21
|
/** Everything a run did, in the shape the summary and `--format json` print. */
|
|
21
22
|
export interface SetupReport {
|
|
22
23
|
connection: Connection;
|
|
@@ -30,11 +31,29 @@ export interface SetupReport {
|
|
|
30
31
|
/** The docs MCP offer, when it was made (configured replaces `docs`). */
|
|
31
32
|
docsMcp?: DocsMcpResult;
|
|
32
33
|
instrumentation?: InstrumentationLane;
|
|
33
|
-
/**
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* How the wait for the first trace ended. Absent on a run that never
|
|
36
|
+
* instrumented and so had nothing to verify.
|
|
37
|
+
*/
|
|
38
|
+
verification?: TraceVerification;
|
|
35
39
|
tooling?: ToolingResult;
|
|
36
40
|
tracesUrl: string;
|
|
37
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* True once the API confirmed a trace arrived after this run started — setup's
|
|
44
|
+
* definition of done.
|
|
45
|
+
*/
|
|
46
|
+
export declare function tracesConfirmed(report: SetupReport): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* True when setup tried to verify data flow and did not get it. The one
|
|
49
|
+
* outcome that makes a run a failure: a `deferred` wait was the user's call,
|
|
50
|
+
* and an absent verification means there was nothing to verify.
|
|
51
|
+
*
|
|
52
|
+
* Every surface that reports the verdict — the closing line, the headless
|
|
53
|
+
* summary, the exit code — reads it from here or {@link tracesConfirmed}, so
|
|
54
|
+
* they cannot drift into disagreeing with each other.
|
|
55
|
+
*/
|
|
56
|
+
export declare function verificationFailed(report: SetupReport): boolean;
|
|
38
57
|
/** `px setup` — the whole flow. */
|
|
39
58
|
export declare function runSetup(deps: SetupDeps, inputs: SetupInputs): Promise<SetupReport>;
|
|
40
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runSetup.d.ts","sourceRoot":"","sources":["../../src/setup/runSetup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"runSetup.d.ts","sourceRoot":"","sources":["../../src/setup/runSetup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAG9B,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sCAAsC;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE/D;AAeD,mCAAmC;AACnC,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB;AAqBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,WAAW,CAAC,CAetB;AAED,4EAA4E;AAC5E,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,CAexB"}
|
package/build/setup/runSetup.js
CHANGED
|
@@ -21,8 +21,27 @@ import { establishConnection } from "./steps/establishConnection.js";
|
|
|
21
21
|
import { offerToolingInstalls, } from "./steps/installTooling.js";
|
|
22
22
|
import { instrumentApp } from "./steps/instrumentApp.js";
|
|
23
23
|
import { offerPxProfile } from "./steps/offerPxProfile.js";
|
|
24
|
-
import {
|
|
24
|
+
import { skewWindowIsClear, waitForFirstTrace, tracesUrl, } from "./steps/verifyTraces.js";
|
|
25
25
|
import { ENV_FILE_NAME, writeEnvFile } from "./steps/writeEnvFile.js";
|
|
26
|
+
/**
|
|
27
|
+
* True once the API confirmed a trace arrived after this run started — setup's
|
|
28
|
+
* definition of done.
|
|
29
|
+
*/
|
|
30
|
+
export function tracesConfirmed(report) {
|
|
31
|
+
return report.verification === "verified";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* True when setup tried to verify data flow and did not get it. The one
|
|
35
|
+
* outcome that makes a run a failure: a `deferred` wait was the user's call,
|
|
36
|
+
* and an absent verification means there was nothing to verify.
|
|
37
|
+
*
|
|
38
|
+
* Every surface that reports the verdict — the closing line, the headless
|
|
39
|
+
* summary, the exit code — reads it from here or {@link tracesConfirmed}, so
|
|
40
|
+
* they cannot drift into disagreeing with each other.
|
|
41
|
+
*/
|
|
42
|
+
export function verificationFailed(report) {
|
|
43
|
+
return report.verification === "notVerified";
|
|
44
|
+
}
|
|
26
45
|
/**
|
|
27
46
|
* Detect the installed agents — but only when the lane is still open. `--agent`
|
|
28
47
|
* pins it, and the pinned agent probes its own binary, so the sweep's four
|
|
@@ -68,9 +87,27 @@ export async function runSetup(deps, inputs) {
|
|
|
68
87
|
: COPY.PRODUCTION.bodyAuthOff, COPY.PRODUCTION.title);
|
|
69
88
|
// Untitled: the outro below already says it, and closes the rail.
|
|
70
89
|
deps.prompter.note(COPY.OUTRO_BODY);
|
|
71
|
-
deps.prompter.outro(
|
|
90
|
+
deps.prompter.outro(outroTitle(report));
|
|
72
91
|
return { ...report, tooling };
|
|
73
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* The closing line, which is the last thing left on screen and so the run's
|
|
95
|
+
* verdict as the user reads it. It has to follow the verification outcome: the
|
|
96
|
+
* notes above it are informational either way, and closing on "You're set up."
|
|
97
|
+
* after an unverified hand-off is a success claim setup did not earn.
|
|
98
|
+
*
|
|
99
|
+
* A deferred wait gets the same honest title as a failed one — the user chose
|
|
100
|
+
* to stop watching, which does not make tracing confirmed working. Only the
|
|
101
|
+
* exit code distinguishes them, because only that has a caller to mislead.
|
|
102
|
+
*
|
|
103
|
+
* A run that never instrumented has nothing to verify and keeps the plain
|
|
104
|
+
* title — registering is all it was asked to do.
|
|
105
|
+
*/
|
|
106
|
+
function outroTitle(report) {
|
|
107
|
+
return report.verification && !tracesConfirmed(report)
|
|
108
|
+
? COPY.OUTRO_TITLE_NOT_VERIFIED
|
|
109
|
+
: COPY.OUTRO_TITLE;
|
|
110
|
+
}
|
|
74
111
|
/**
|
|
75
112
|
* `px setup instrument` — the instrumentation slice, re-runnable on a repo that
|
|
76
113
|
* is already registered. Registration still runs: it is idempotent, and it is
|
|
@@ -87,7 +124,7 @@ export async function runInstrument(deps, resolved) {
|
|
|
87
124
|
}
|
|
88
125
|
const report = await registerAndInstrument(deps, inputs, { agentDetection });
|
|
89
126
|
if (!inputs.headless) {
|
|
90
|
-
deps.prompter.outro(
|
|
127
|
+
deps.prompter.outro(outroTitle(report));
|
|
91
128
|
}
|
|
92
129
|
return report;
|
|
93
130
|
}
|
|
@@ -129,7 +166,7 @@ async function registerAndInstrument(deps, inputs, { agentDetection }) {
|
|
|
129
166
|
// Any span already visible inside the clock-skew window predates this run —
|
|
130
167
|
// verification must then require spans strictly after the start time, or a
|
|
131
168
|
// pre-existing trace would falsely verify the hand-off.
|
|
132
|
-
const
|
|
169
|
+
const allowClockSkew = await skewWindowIsClear(deps, connection, {
|
|
133
170
|
sinceMs: startedAt,
|
|
134
171
|
});
|
|
135
172
|
// The docs steps live inside instrumentApp, after its lane choice: the docs
|
|
@@ -154,9 +191,9 @@ async function registerAndInstrument(deps, inputs, { agentDetection }) {
|
|
|
154
191
|
// arriving, not the agent's own claim that it finished. It is reported, not
|
|
155
192
|
// thrown on: the connection and hand-off files are real work worth keeping
|
|
156
193
|
// even when no trace showed up.
|
|
157
|
-
const
|
|
194
|
+
const verification = await waitForFirstTrace(deps, connection, {
|
|
158
195
|
sinceMs: startedAt,
|
|
159
|
-
allowClockSkew
|
|
196
|
+
allowClockSkew,
|
|
160
197
|
headless: inputs.headless,
|
|
161
198
|
});
|
|
162
199
|
return {
|
|
@@ -168,7 +205,7 @@ async function registerAndInstrument(deps, inputs, { agentDetection }) {
|
|
|
168
205
|
files: [...base.files, ...(docsMcp?.files ?? [])],
|
|
169
206
|
gitignored: [...base.gitignored, ...(docs?.gitignoreAppended ?? [])],
|
|
170
207
|
instrumentation,
|
|
171
|
-
|
|
208
|
+
verification,
|
|
172
209
|
};
|
|
173
210
|
}
|
|
174
211
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runSetup.js","sourceRoot":"","sources":["../../src/setup/runSetup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAA4B,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"runSetup.js","sourceRoot":"","sources":["../../src/setup/runSetup.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,31 +14,45 @@ import type { Connection } from "./establishConnection.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function tracesUrl(connection: Connection): string;
|
|
16
16
|
/**
|
|
17
|
-
* True when the
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* True when the clock-skew window at `sinceMs` is known to be empty, and so
|
|
18
|
+
* safe for verification to count as part of this run.
|
|
19
|
+
*
|
|
20
|
+
* Checked before instrumentation begins: any span already visible at that
|
|
21
|
+
* point predates this run, so verification must not credit the window. An
|
|
22
|
+
* indeterminate probe answers false for the same reason — widening the window
|
|
23
|
+
* on an answer we could not get would let a span from before this run satisfy
|
|
24
|
+
* verification, which is the false success this whole step exists to prevent.
|
|
20
25
|
*/
|
|
21
|
-
export declare function
|
|
26
|
+
export declare function skewWindowIsClear(deps: Pick<SetupDeps, "createClient">, connection: Connection, { sinceMs }: {
|
|
22
27
|
sinceMs: number;
|
|
23
28
|
}): Promise<boolean>;
|
|
24
29
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
30
|
+
* How the wait for the first trace ended.
|
|
31
|
+
*
|
|
32
|
+
* `deferred` is the outcome that is not a failure: the user was asked whether
|
|
33
|
+
* to keep watching and chose to stop. Verification was withdrawn, not attempted
|
|
34
|
+
* and lost, so setup must not report it as a broken setup — the escape hatch
|
|
35
|
+
* says "everything else is already configured" and means it.
|
|
36
|
+
*/
|
|
37
|
+
export type TraceVerification = "verified" | "notVerified" | "deferred";
|
|
38
|
+
/**
|
|
39
|
+
* Watch for the first trace since `sinceMs`.
|
|
28
40
|
*
|
|
29
41
|
* The "keep watching?" prompt is the only thing that can extend the wait, so a
|
|
30
42
|
* headless run gets exactly one window: there is no terminal to ask on, and
|
|
31
|
-
* looping forever would hang an unattended caller.
|
|
43
|
+
* looping forever would hang an unattended caller. That also means only an
|
|
44
|
+
* interactive run can return `deferred` — a headless timeout is nobody's
|
|
45
|
+
* decision.
|
|
32
46
|
*
|
|
33
47
|
* @param args.sinceMs - instrumentation start; only spans after it count.
|
|
34
48
|
* @param args.allowClockSkew - widen the window by the skew tolerance. Pass
|
|
35
|
-
* false
|
|
36
|
-
*
|
|
49
|
+
* false unless the window was confirmed empty before instrumentation began
|
|
50
|
+
* (see {@link skewWindowIsClear}), so stale spans cannot satisfy verification.
|
|
37
51
|
* @param args.headless - no prompting; give up after one window.
|
|
38
52
|
*/
|
|
39
53
|
export declare function waitForFirstTrace(deps: Pick<SetupDeps, "clock" | "createClient" | "prompter">, connection: Connection, { sinceMs, allowClockSkew, headless, }: {
|
|
40
54
|
sinceMs: number;
|
|
41
55
|
allowClockSkew?: boolean;
|
|
42
56
|
headless?: boolean;
|
|
43
|
-
}): Promise<
|
|
57
|
+
}): Promise<TraceVerification>;
|
|
44
58
|
//# sourceMappingURL=verifyTraces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyTraces.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/verifyTraces.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAIxD;AAOD
|
|
1
|
+
{"version":3,"file":"verifyTraces.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/verifyTraces.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAIxD;AAOD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACrC,UAAU,EAAE,UAAU,EACtB,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,OAAO,CAAC,CAOlB;AAiFD;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC,EAC5D,UAAU,EAAE,UAAU,EACtB,EACE,OAAO,EACP,cAAqB,EACrB,QAAgB,GACjB,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE,OAAO,CAAC,iBAAiB,CAAC,CA2C5B"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* only consulted at the timeout escape hatch ("keep watching / finish
|
|
7
7
|
* anyway") — never asked to eyeball the UI as the definition of done.
|
|
8
8
|
*/
|
|
9
|
+
import { HttpError } from "@arizeai/phoenix-client";
|
|
9
10
|
import * as COPY from "../copy.js";
|
|
10
11
|
const POLL_INTERVAL_MS = 2_000;
|
|
11
12
|
const POLL_WINDOW_MS = 60_000;
|
|
@@ -24,12 +25,18 @@ function searchStartTime(sinceMs, skewMs) {
|
|
|
24
25
|
return new Date(sinceMs - skewMs).toISOString();
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
|
-
* True when the
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* True when the clock-skew window at `sinceMs` is known to be empty, and so
|
|
29
|
+
* safe for verification to count as part of this run.
|
|
30
|
+
*
|
|
31
|
+
* Checked before instrumentation begins: any span already visible at that
|
|
32
|
+
* point predates this run, so verification must not credit the window. An
|
|
33
|
+
* indeterminate probe answers false for the same reason — widening the window
|
|
34
|
+
* on an answer we could not get would let a span from before this run satisfy
|
|
35
|
+
* verification, which is the false success this whole step exists to prevent.
|
|
30
36
|
*/
|
|
31
|
-
export async function
|
|
32
|
-
|
|
37
|
+
export async function skewWindowIsClear(deps, connection, { sinceMs }) {
|
|
38
|
+
const probe = await probeForNewSpans(spanSearchClient(deps, connection), connection.projectName, searchStartTime(sinceMs, START_TIME_SKEW_MS));
|
|
39
|
+
return probe === "none";
|
|
33
40
|
}
|
|
34
41
|
function spanSearchClient(deps, connection) {
|
|
35
42
|
return deps.createClient({
|
|
@@ -37,12 +44,8 @@ function spanSearchClient(deps, connection) {
|
|
|
37
44
|
apiKey: connection.apiKey,
|
|
38
45
|
});
|
|
39
46
|
}
|
|
40
|
-
/**
|
|
41
|
-
|
|
42
|
-
* has no spans to have created it, and a network hiccup mid-poll should keep
|
|
43
|
-
* setup watching rather than abort it.
|
|
44
|
-
*/
|
|
45
|
-
async function hasNewSpans(client, projectName, startTime) {
|
|
47
|
+
/** One span-search request. */
|
|
48
|
+
async function probeForNewSpans(client, projectName, startTime) {
|
|
46
49
|
try {
|
|
47
50
|
const { data } = await client.GET("/v1/projects/{project_identifier}/spans", {
|
|
48
51
|
params: {
|
|
@@ -51,38 +54,53 @@ async function hasNewSpans(client, projectName, startTime) {
|
|
|
51
54
|
},
|
|
52
55
|
signal: AbortSignal.timeout(POLL_REQUEST_TIMEOUT_MS),
|
|
53
56
|
});
|
|
54
|
-
return (data?.data.length ?? 0) > 0;
|
|
57
|
+
return (data?.data.length ?? 0) > 0 ? "found" : "none";
|
|
55
58
|
}
|
|
56
|
-
catch {
|
|
57
|
-
|
|
59
|
+
catch (error) {
|
|
60
|
+
// The client's middleware turns every non-2xx into an HttpError, so a
|
|
61
|
+
// status is only reachable from here. A 404 is a definite "none": the
|
|
62
|
+
// project does not exist, so nothing has ever been delivered to it.
|
|
63
|
+
// Everything else — an auth rejection, a 5xx, a timeout, a dropped
|
|
64
|
+
// socket — is an answer we did not get.
|
|
65
|
+
return error instanceof HttpError && error.status === 404
|
|
66
|
+
? "none"
|
|
67
|
+
: "unknown";
|
|
58
68
|
}
|
|
59
69
|
}
|
|
60
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Poll until a span arrives or the window elapses, and report how it ended.
|
|
72
|
+
*
|
|
73
|
+
* The terminal probe is returned rather than a bare boolean so the caller can
|
|
74
|
+
* tell "Phoenix says there are no spans" from "Phoenix never answered" — the
|
|
75
|
+
* difference between the user's app not emitting and setup being unable to
|
|
76
|
+
* look, which need different remediation.
|
|
77
|
+
*/
|
|
61
78
|
async function pollWindow(deps, client, connection, startTime) {
|
|
62
79
|
const deadline = deps.clock.now() + POLL_WINDOW_MS;
|
|
63
80
|
for (;;) {
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
const probe = await probeForNewSpans(client, connection.projectName, startTime);
|
|
82
|
+
if (probe === "found") {
|
|
83
|
+
return probe;
|
|
66
84
|
}
|
|
67
85
|
if (deps.clock.now() >= deadline) {
|
|
68
|
-
return
|
|
86
|
+
return probe;
|
|
69
87
|
}
|
|
70
88
|
await deps.clock.sleep(POLL_INTERVAL_MS);
|
|
71
89
|
}
|
|
72
90
|
}
|
|
73
91
|
/**
|
|
74
|
-
* Watch for the first trace since `sinceMs`.
|
|
75
|
-
* observed via the API, false when the wait ends without one — the user gave
|
|
76
|
-
* up at the timeout prompt, or, in a headless run, the first window elapsed.
|
|
92
|
+
* Watch for the first trace since `sinceMs`.
|
|
77
93
|
*
|
|
78
94
|
* The "keep watching?" prompt is the only thing that can extend the wait, so a
|
|
79
95
|
* headless run gets exactly one window: there is no terminal to ask on, and
|
|
80
|
-
* looping forever would hang an unattended caller.
|
|
96
|
+
* looping forever would hang an unattended caller. That also means only an
|
|
97
|
+
* interactive run can return `deferred` — a headless timeout is nobody's
|
|
98
|
+
* decision.
|
|
81
99
|
*
|
|
82
100
|
* @param args.sinceMs - instrumentation start; only spans after it count.
|
|
83
101
|
* @param args.allowClockSkew - widen the window by the skew tolerance. Pass
|
|
84
|
-
* false
|
|
85
|
-
*
|
|
102
|
+
* false unless the window was confirmed empty before instrumentation began
|
|
103
|
+
* (see {@link skewWindowIsClear}), so stale spans cannot satisfy verification.
|
|
86
104
|
* @param args.headless - no prompting; give up after one window.
|
|
87
105
|
*/
|
|
88
106
|
export async function waitForFirstTrace(deps, connection, { sinceMs, allowClockSkew = true, headless = false, }) {
|
|
@@ -91,13 +109,20 @@ export async function waitForFirstTrace(deps, connection, { sinceMs, allowClockS
|
|
|
91
109
|
const client = spanSearchClient(deps, connection);
|
|
92
110
|
deps.prompter.note(COPY.VERIFY.waitingBody(url), COPY.VERIFY.title);
|
|
93
111
|
for (;;) {
|
|
94
|
-
|
|
112
|
+
const probe = await pollWindow(deps, client, connection, startTime);
|
|
113
|
+
if (probe === "found") {
|
|
95
114
|
deps.prompter.line(COPY.VERIFY.received(url));
|
|
96
|
-
return
|
|
115
|
+
return "verified";
|
|
116
|
+
}
|
|
117
|
+
// Say which problem this is. "No trace arrived" sends the user to look at
|
|
118
|
+
// their exporter; an unanswered probe means setup could not look at all,
|
|
119
|
+
// and pointing them at instrumentation would be a wild goose chase.
|
|
120
|
+
if (probe === "unknown") {
|
|
121
|
+
deps.prompter.line(COPY.VERIFY.unreachable(connection.endpoint));
|
|
97
122
|
}
|
|
98
123
|
if (headless) {
|
|
99
124
|
deps.prompter.line(COPY.VERIFY.notVerifiedHeadless(url));
|
|
100
|
-
return
|
|
125
|
+
return "notVerified";
|
|
101
126
|
}
|
|
102
127
|
const keepWatching = await deps.prompter.select({
|
|
103
128
|
message: COPY.VERIFY.timeoutMessage,
|
|
@@ -112,7 +137,7 @@ export async function waitForFirstTrace(deps, connection, { sinceMs, allowClockS
|
|
|
112
137
|
});
|
|
113
138
|
if (!keepWatching) {
|
|
114
139
|
deps.prompter.note(COPY.VERIFY.notVerifiedBody(url), COPY.VERIFY.notVerifiedTitle);
|
|
115
|
-
return
|
|
140
|
+
return "deferred";
|
|
116
141
|
}
|
|
117
142
|
}
|
|
118
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyTraces.js","sourceRoot":"","sources":["../../../src/setup/steps/verifyTraces.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"verifyTraces.js","sourceRoot":"","sources":["../../../src/setup/steps/verifyTraces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeEnvFile.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/writeEnvFile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"writeEnvFile.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/writeEnvFile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAY5C,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAa7E;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,EAC1C,UAAU,EAAE,UAAU,EACtB,EAAE,eAAe,EAAE,EAAE;IAAE,eAAe,EAAE,OAAO,CAAA;CAAE,GAChD,kBAAkB,CAmBpB"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from "node:fs";
|
|
9
9
|
import * as path from "node:path";
|
|
10
|
+
import { connectionEnv } from "../agents/registry.js";
|
|
10
11
|
import * as COPY from "../copy.js";
|
|
11
12
|
import { ensureGitignored } from "../util/gitignoreCoverage.js";
|
|
12
13
|
export const ENV_FILE_NAME = ".env.phoenix";
|
|
@@ -20,14 +21,15 @@ function quoteEnvValue(value) {
|
|
|
20
21
|
return `"${value.replace(/[\\"$`]/g, (char) => `\\${char}`)}"`;
|
|
21
22
|
}
|
|
22
23
|
export function renderEnvFile(connection, isoDate) {
|
|
24
|
+
// connectionEnv() owns the Connection → env-var mapping; this file only
|
|
25
|
+
// adds the header and shell quoting.
|
|
23
26
|
const lines = [
|
|
24
27
|
COPY.ENV_FILE.fileHeaderEnv(isoDate),
|
|
25
|
-
|
|
26
|
-
`
|
|
28
|
+
"# Both are base URLs for the same server here — keep both. Tracing reads",
|
|
29
|
+
"# only PHOENIX_COLLECTOR_ENDPOINT, while the API clients and `px` read",
|
|
30
|
+
"# PHOENIX_ENDPOINT (falling back to the collector one when it is unset).",
|
|
31
|
+
...Object.entries(connectionEnv(connection)).map(([key, value]) => `${key}=${quoteEnvValue(value)}`),
|
|
27
32
|
];
|
|
28
|
-
if (connection.apiKey) {
|
|
29
|
-
lines.push(`PHOENIX_API_KEY=${quoteEnvValue(connection.apiKey)}`);
|
|
30
|
-
}
|
|
31
33
|
return `${lines.join("\n")}\n`;
|
|
32
34
|
}
|
|
33
35
|
export function writeEnvFile(deps, connection, { isGitRepository }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeEnvFile.js","sourceRoot":"","sources":["../../../src/setup/steps/writeEnvFile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAsB,EAAE,OAAe;IACnE,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QACpC,
|
|
1
|
+
{"version":3,"file":"writeEnvFile.js","sourceRoot":"","sources":["../../../src/setup/steps/writeEnvFile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAsB,EAAE,OAAe;IACnE,wEAAwE;IACxE,qCAAqC;IACrC,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QACpC,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAC9C,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CACnD;KACF,CAAC;IACF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAOD,MAAM,UAAU,YAAY,CAC1B,IAA0C,EAC1C,UAAsB,EACtB,EAAE,eAAe,EAAgC;IAEjD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAE/D,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;QAChE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,wEAAwE;IACxE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjC,mEAAmE;IACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;QAC3B,SAAS,EAAE,CAAC,aAAa,CAAC;QAC1B,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;AACtD,CAAC"}
|