@arizeai/phoenix-cli 1.8.0 → 1.9.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 (249) hide show
  1. package/README.md +42 -0
  2. package/build/cli.d.ts.map +1 -1
  3. package/build/cli.js +2 -1
  4. package/build/cli.js.map +1 -1
  5. package/build/client.d.ts +5 -1
  6. package/build/client.d.ts.map +1 -1
  7. package/build/client.js +2 -1
  8. package/build/client.js.map +1 -1
  9. package/build/commands/annotationConfig.d.ts.map +1 -1
  10. package/build/commands/annotationConfig.js.map +1 -1
  11. package/build/commands/{annotationMutationUtils.d.ts → annotationMutations.d.ts} +1 -1
  12. package/build/commands/annotationMutations.d.ts.map +1 -0
  13. package/build/commands/{annotationMutationUtils.js → annotationMutations.js} +1 -1
  14. package/build/commands/annotationMutations.js.map +1 -0
  15. package/build/commands/api.d.ts.map +1 -1
  16. package/build/commands/api.js.map +1 -1
  17. package/build/commands/auth.d.ts +1 -1
  18. package/build/commands/auth.d.ts.map +1 -1
  19. package/build/commands/auth.js +6 -12
  20. package/build/commands/auth.js.map +1 -1
  21. package/build/commands/dataset.d.ts.map +1 -1
  22. package/build/commands/dataset.js.map +1 -1
  23. package/build/commands/docs.d.ts +51 -0
  24. package/build/commands/docs.d.ts.map +1 -1
  25. package/build/commands/docs.js +86 -37
  26. package/build/commands/docs.js.map +1 -1
  27. package/build/commands/experiment.d.ts.map +1 -1
  28. package/build/commands/experiment.js.map +1 -1
  29. package/build/commands/fetchSpanAnnotations.d.ts +14 -0
  30. package/build/commands/fetchSpanAnnotations.d.ts.map +1 -0
  31. package/build/commands/fetchSpanAnnotations.js +57 -0
  32. package/build/commands/fetchSpanAnnotations.js.map +1 -0
  33. package/build/commands/fetchTraceAnnotations.d.ts +14 -0
  34. package/build/commands/fetchTraceAnnotations.d.ts.map +1 -0
  35. package/build/commands/fetchTraceAnnotations.js +57 -0
  36. package/build/commands/fetchTraceAnnotations.js.map +1 -0
  37. package/build/commands/formatAnnotationMutation.d.ts +1 -1
  38. package/build/commands/formatAnnotationMutation.d.ts.map +1 -1
  39. package/build/commands/formatNoteMutation.d.ts +1 -1
  40. package/build/commands/formatNoteMutation.d.ts.map +1 -1
  41. package/build/commands/formatSetup.d.ts +50 -0
  42. package/build/commands/formatSetup.d.ts.map +1 -0
  43. package/build/commands/formatSetup.js +64 -0
  44. package/build/commands/formatSetup.js.map +1 -0
  45. package/build/commands/index.d.ts +4 -3
  46. package/build/commands/index.d.ts.map +1 -1
  47. package/build/commands/index.js +4 -3
  48. package/build/commands/index.js.map +1 -1
  49. package/build/commands/{noteMutationUtils.d.ts → noteMutations.d.ts} +1 -1
  50. package/build/commands/noteMutations.d.ts.map +1 -0
  51. package/build/commands/{noteMutationUtils.js → noteMutations.js} +1 -1
  52. package/build/commands/noteMutations.js.map +1 -0
  53. package/build/commands/options.d.ts +248 -0
  54. package/build/commands/options.d.ts.map +1 -0
  55. package/build/commands/options.js +16 -0
  56. package/build/commands/options.js.map +1 -0
  57. package/build/commands/profile.d.ts.map +1 -1
  58. package/build/commands/profile.js +3 -11
  59. package/build/commands/profile.js.map +1 -1
  60. package/build/commands/project.d.ts.map +1 -1
  61. package/build/commands/project.js +0 -1
  62. package/build/commands/project.js.map +1 -1
  63. package/build/commands/prompt.d.ts.map +1 -1
  64. package/build/commands/prompt.js.map +1 -1
  65. package/build/commands/self.d.ts.map +1 -1
  66. package/build/commands/self.js.map +1 -1
  67. package/build/commands/session.d.ts.map +1 -1
  68. package/build/commands/session.js +4 -4
  69. package/build/commands/session.js.map +1 -1
  70. package/build/commands/{sessionAnnotationsCommand.d.ts → sessionAnnotations.d.ts} +1 -1
  71. package/build/commands/sessionAnnotations.d.ts.map +1 -0
  72. package/build/commands/{sessionAnnotationsCommand.js → sessionAnnotations.js} +1 -1
  73. package/build/commands/sessionAnnotations.js.map +1 -0
  74. package/build/commands/setup.d.ts +19 -0
  75. package/build/commands/setup.d.ts.map +1 -0
  76. package/build/commands/setup.js +245 -0
  77. package/build/commands/setup.js.map +1 -0
  78. package/build/commands/span.d.ts.map +1 -1
  79. package/build/commands/span.js +5 -5
  80. package/build/commands/span.js.map +1 -1
  81. package/build/commands/spanAnnotations.d.ts +6 -13
  82. package/build/commands/spanAnnotations.d.ts.map +1 -1
  83. package/build/commands/spanAnnotations.js +154 -47
  84. package/build/commands/spanAnnotations.js.map +1 -1
  85. package/build/commands/trace.d.ts.map +1 -1
  86. package/build/commands/trace.js +6 -6
  87. package/build/commands/trace.js.map +1 -1
  88. package/build/commands/traceAnnotations.d.ts +6 -13
  89. package/build/commands/traceAnnotations.d.ts.map +1 -1
  90. package/build/commands/traceAnnotations.js +157 -47
  91. package/build/commands/traceAnnotations.js.map +1 -1
  92. package/build/config.d.ts +4 -1
  93. package/build/config.d.ts.map +1 -1
  94. package/build/config.js +67 -11
  95. package/build/config.js.map +1 -1
  96. package/build/curl.d.ts +17 -0
  97. package/build/curl.d.ts.map +1 -1
  98. package/build/curl.js.map +1 -1
  99. package/build/exitCodes.d.ts.map +1 -1
  100. package/build/optionParsers.d.ts +12 -0
  101. package/build/optionParsers.d.ts.map +1 -1
  102. package/build/optionParsers.js +15 -0
  103. package/build/optionParsers.js.map +1 -1
  104. package/build/pxi/App.d.ts.map +1 -1
  105. package/build/pxi/App.js +4 -0
  106. package/build/pxi/App.js.map +1 -1
  107. package/build/pxi/index.js.map +1 -1
  108. package/build/pxi/options.d.ts +98 -0
  109. package/build/pxi/options.d.ts.map +1 -1
  110. package/build/pxi/options.js.map +1 -1
  111. package/build/settings.d.ts.map +1 -1
  112. package/build/settings.js +4 -0
  113. package/build/settings.js.map +1 -1
  114. package/build/setup/agents/registry.d.ts +78 -0
  115. package/build/setup/agents/registry.d.ts.map +1 -0
  116. package/build/setup/agents/registry.js +129 -0
  117. package/build/setup/agents/registry.js.map +1 -0
  118. package/build/setup/copy.d.ts +167 -0
  119. package/build/setup/copy.d.ts.map +1 -0
  120. package/build/setup/copy.js +290 -0
  121. package/build/setup/copy.js.map +1 -0
  122. package/build/setup/deps/buildDefaultDeps.d.ts +13 -0
  123. package/build/setup/deps/buildDefaultDeps.d.ts.map +1 -0
  124. package/build/setup/deps/buildDefaultDeps.js +29 -0
  125. package/build/setup/deps/buildDefaultDeps.js.map +1 -0
  126. package/build/setup/deps/clipboard.d.ts +12 -0
  127. package/build/setup/deps/clipboard.d.ts.map +1 -0
  128. package/build/setup/deps/clipboard.js +30 -0
  129. package/build/setup/deps/clipboard.js.map +1 -0
  130. package/build/setup/deps/clock.d.ts +10 -0
  131. package/build/setup/deps/clock.d.ts.map +1 -0
  132. package/build/setup/deps/clock.js +11 -0
  133. package/build/setup/deps/clock.js.map +1 -0
  134. package/build/setup/deps/context.d.ts +28 -0
  135. package/build/setup/deps/context.d.ts.map +1 -0
  136. package/build/setup/deps/context.js +24 -0
  137. package/build/setup/deps/context.js.map +1 -0
  138. package/build/setup/deps/docs.d.ts +41 -0
  139. package/build/setup/deps/docs.d.ts.map +1 -0
  140. package/build/setup/deps/docs.js +33 -0
  141. package/build/setup/deps/docs.js.map +1 -0
  142. package/build/setup/deps/index.d.ts +42 -0
  143. package/build/setup/deps/index.d.ts.map +1 -0
  144. package/build/setup/deps/index.js +16 -0
  145. package/build/setup/deps/index.js.map +1 -0
  146. package/build/setup/deps/phoenixClient.d.ts +22 -0
  147. package/build/setup/deps/phoenixClient.d.ts.map +1 -0
  148. package/build/setup/deps/phoenixClient.js +17 -0
  149. package/build/setup/deps/phoenixClient.js.map +1 -0
  150. package/build/setup/deps/processes.d.ts +28 -0
  151. package/build/setup/deps/processes.d.ts.map +1 -0
  152. package/build/setup/deps/processes.js +58 -0
  153. package/build/setup/deps/processes.js.map +1 -0
  154. package/build/setup/deps/prompter.d.ts +42 -0
  155. package/build/setup/deps/prompter.d.ts.map +1 -0
  156. package/build/setup/deps/prompter.js +10 -0
  157. package/build/setup/deps/prompter.js.map +1 -0
  158. package/build/setup/errors.d.ts +27 -0
  159. package/build/setup/errors.d.ts.map +1 -0
  160. package/build/setup/errors.js +36 -0
  161. package/build/setup/errors.js.map +1 -0
  162. package/build/setup/options.d.ts +113 -0
  163. package/build/setup/options.d.ts.map +1 -0
  164. package/build/setup/options.js +63 -0
  165. package/build/setup/options.js.map +1 -0
  166. package/build/setup/prompts/instrumentationPrompt.d.ts +42 -0
  167. package/build/setup/prompts/instrumentationPrompt.d.ts.map +1 -0
  168. package/build/setup/prompts/instrumentationPrompt.js +64 -0
  169. package/build/setup/prompts/instrumentationPrompt.js.map +1 -0
  170. package/build/setup/runSetup.d.ts +45 -0
  171. package/build/setup/runSetup.d.ts.map +1 -0
  172. package/build/setup/runSetup.js +212 -0
  173. package/build/setup/runSetup.js.map +1 -0
  174. package/build/setup/steps/chooseEndpoint.d.ts +36 -0
  175. package/build/setup/steps/chooseEndpoint.d.ts.map +1 -0
  176. package/build/setup/steps/chooseEndpoint.js +125 -0
  177. package/build/setup/steps/chooseEndpoint.js.map +1 -0
  178. package/build/setup/steps/confirmGitSafety.d.ts +17 -0
  179. package/build/setup/steps/confirmGitSafety.d.ts.map +1 -0
  180. package/build/setup/steps/confirmGitSafety.js +73 -0
  181. package/build/setup/steps/confirmGitSafety.js.map +1 -0
  182. package/build/setup/steps/establishConnection.d.ts +29 -0
  183. package/build/setup/steps/establishConnection.d.ts.map +1 -0
  184. package/build/setup/steps/establishConnection.js +143 -0
  185. package/build/setup/steps/establishConnection.js.map +1 -0
  186. package/build/setup/steps/installTooling.d.ts +28 -0
  187. package/build/setup/steps/installTooling.d.ts.map +1 -0
  188. package/build/setup/steps/installTooling.js +79 -0
  189. package/build/setup/steps/installTooling.js.map +1 -0
  190. package/build/setup/steps/instrumentApp.d.ts +41 -0
  191. package/build/setup/steps/instrumentApp.d.ts.map +1 -0
  192. package/build/setup/steps/instrumentApp.js +131 -0
  193. package/build/setup/steps/instrumentApp.js.map +1 -0
  194. package/build/setup/steps/offerPxProfile.d.ts +20 -0
  195. package/build/setup/steps/offerPxProfile.d.ts.map +1 -0
  196. package/build/setup/steps/offerPxProfile.js +95 -0
  197. package/build/setup/steps/offerPxProfile.js.map +1 -0
  198. package/build/setup/steps/prefetchDocs.d.ts +24 -0
  199. package/build/setup/steps/prefetchDocs.d.ts.map +1 -0
  200. package/build/setup/steps/prefetchDocs.js +49 -0
  201. package/build/setup/steps/prefetchDocs.js.map +1 -0
  202. package/build/setup/steps/verifyTraces.d.ts +44 -0
  203. package/build/setup/steps/verifyTraces.d.ts.map +1 -0
  204. package/build/setup/steps/verifyTraces.js +119 -0
  205. package/build/setup/steps/verifyTraces.js.map +1 -0
  206. package/build/setup/steps/writeEnvFile.d.ts +19 -0
  207. package/build/setup/steps/writeEnvFile.d.ts.map +1 -0
  208. package/build/setup/steps/writeEnvFile.js +50 -0
  209. package/build/setup/steps/writeEnvFile.js.map +1 -0
  210. package/build/setup/ui/clackPrompter.d.ts +11 -0
  211. package/build/setup/ui/clackPrompter.d.ts.map +1 -0
  212. package/build/setup/ui/clackPrompter.js +107 -0
  213. package/build/setup/ui/clackPrompter.js.map +1 -0
  214. package/build/setup/ui/selectBoolean.d.ts +18 -0
  215. package/build/setup/ui/selectBoolean.d.ts.map +1 -0
  216. package/build/setup/ui/selectBoolean.js +14 -0
  217. package/build/setup/ui/selectBoolean.js.map +1 -0
  218. package/build/setup/util/gitignoreCoverage.d.ts +24 -0
  219. package/build/setup/util/gitignoreCoverage.d.ts.map +1 -0
  220. package/build/setup/util/gitignoreCoverage.js +43 -0
  221. package/build/setup/util/gitignoreCoverage.js.map +1 -0
  222. package/build/setup/util/paths.d.ts +6 -0
  223. package/build/setup/util/paths.d.ts.map +1 -0
  224. package/build/setup/util/paths.js +23 -0
  225. package/build/setup/util/paths.js.map +1 -0
  226. package/build/setup/util/redact.d.ts +12 -0
  227. package/build/setup/util/redact.d.ts.map +1 -0
  228. package/build/setup/util/redact.js +31 -0
  229. package/build/setup/util/redact.js.map +1 -0
  230. package/build/validation/endpoint.d.ts +19 -0
  231. package/build/validation/endpoint.d.ts.map +1 -0
  232. package/build/validation/endpoint.js +39 -0
  233. package/build/validation/endpoint.js.map +1 -0
  234. package/build/version.js.map +1 -1
  235. package/package.json +15 -12
  236. package/build/commands/annotationMutationUtils.d.ts.map +0 -1
  237. package/build/commands/annotationMutationUtils.js.map +0 -1
  238. package/build/commands/noteMutationUtils.d.ts.map +0 -1
  239. package/build/commands/noteMutationUtils.js.map +0 -1
  240. package/build/commands/sessionAnnotationsCommand.d.ts.map +0 -1
  241. package/build/commands/sessionAnnotationsCommand.js.map +0 -1
  242. package/build/commands/spanAnnotationsCommand.d.ts +0 -7
  243. package/build/commands/spanAnnotationsCommand.d.ts.map +0 -1
  244. package/build/commands/spanAnnotationsCommand.js +0 -164
  245. package/build/commands/spanAnnotationsCommand.js.map +0 -1
  246. package/build/commands/traceAnnotationsCommand.d.ts +0 -7
  247. package/build/commands/traceAnnotationsCommand.d.ts.map +0 -1
  248. package/build/commands/traceAnnotationsCommand.js +0 -167
  249. package/build/commands/traceAnnotationsCommand.js.map +0 -1
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Establish the connection.
3
+ *
4
+ * The project itself is never created here — Phoenix creates a project on
5
+ * first ingestion, so setup only needs to settle on a *name* and hand it
6
+ * to the app via `PHOENIX_PROJECT_NAME`. What remains is credential
7
+ * acquisition: the auth-on lanes verify the key with a read-only probe so a
8
+ * bad paste is caught here rather than at first trace. Future OAuth
9
+ * acquisition plugs into the auth-on interactive lane unchanged.
10
+ */
11
+ import * as path from "node:path";
12
+ import { HttpError } from "@arizeai/phoenix-client";
13
+ import * as COPY from "../copy.js";
14
+ import { HeadlessInputError, SetupFatalError } from "../errors.js";
15
+ import { redactForDisplay } from "../util/redact.js";
16
+ const REST_TIMEOUT_MS = 10_000;
17
+ // ---------------------------------------------------------------------------
18
+ // Project name
19
+ // ---------------------------------------------------------------------------
20
+ /** Names are used as URL path identifiers; '/', '?', '#' are invalid. */
21
+ export function validateProjectName(value) {
22
+ const trimmed = value.trim();
23
+ if (!trimmed || /[/?#]/.test(trimmed)) {
24
+ return COPY.CONNECT.projectNameInvalid;
25
+ }
26
+ return undefined;
27
+ }
28
+ export function defaultProjectName(cwd) {
29
+ const base = path.basename(cwd).replace(/[/?#]/g, "-").trim();
30
+ return base || "default";
31
+ }
32
+ async function promptForProjectName(deps, inputs) {
33
+ const name = inputs.project ??
34
+ (await deps.prompter.textInput({
35
+ message: COPY.CONNECT.projectNameMessage,
36
+ defaultValue: defaultProjectName(deps.context.cwd),
37
+ validate: validateProjectName,
38
+ }));
39
+ return name.trim();
40
+ }
41
+ /**
42
+ * Read-only probe: list one project. Only the credential matters here — an
43
+ * instance with no projects yet still answers 200.
44
+ */
45
+ async function checkApiKey(deps, endpoint, apiKey) {
46
+ const client = deps.createClient({ endpoint, apiKey });
47
+ try {
48
+ await client.GET("/v1/projects", {
49
+ params: { query: { limit: 1 } },
50
+ signal: AbortSignal.timeout(REST_TIMEOUT_MS),
51
+ });
52
+ return { kind: "ok" };
53
+ }
54
+ catch (error) {
55
+ if (error instanceof HttpError) {
56
+ if (error.status === 401 || error.status === 403) {
57
+ return { kind: "rejected", status: error.status };
58
+ }
59
+ return { kind: "error", detail: `HTTP ${error.status}` };
60
+ }
61
+ return { kind: "error", detail: redactForDisplay(String(error)) };
62
+ }
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Interactive lanes
66
+ // ---------------------------------------------------------------------------
67
+ async function connectAuthOff(deps, endpoint, inputs) {
68
+ const projectName = await promptForProjectName(deps, inputs);
69
+ deps.prompter.line(COPY.CONNECT.usingProject(projectName));
70
+ return { endpoint, projectName };
71
+ }
72
+ /** Prompt for an API key without echoing it to the terminal. */
73
+ async function promptForApiKey(deps) {
74
+ const apiKey = await deps.prompter.passwordInput({
75
+ message: COPY.API_KEY.pasteKeyMessage,
76
+ validate: (value) => value.trim() ? undefined : COPY.API_KEY.pasteKeyInvalid,
77
+ });
78
+ return apiKey.trim();
79
+ }
80
+ /**
81
+ * A rejected key returns to the masked credential prompt without asking for
82
+ * the project name again.
83
+ */
84
+ async function connectAuthOnInteractive(deps, endpoint, inputs) {
85
+ deps.prompter.note(COPY.API_KEY.instructions, COPY.API_KEY.instructionsTitle);
86
+ let apiKey = await promptForApiKey(deps);
87
+ const projectName = await promptForProjectName(deps, inputs);
88
+ for (;;) {
89
+ const result = await checkApiKey(deps, endpoint, apiKey);
90
+ if (result.kind === "ok") {
91
+ deps.prompter.line(COPY.CONNECT.usingProject(projectName));
92
+ return { endpoint, projectName, apiKey };
93
+ }
94
+ if (result.kind === "rejected") {
95
+ deps.prompter.line(COPY.API_KEY.pasteKeyRejected);
96
+ apiKey = await promptForApiKey(deps);
97
+ continue;
98
+ }
99
+ throw new SetupFatalError(COPY.CONNECT.connectFailed(result.detail));
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Headless lane
104
+ // ---------------------------------------------------------------------------
105
+ async function connectHeadless(deps, endpoint, authEnabled, inputs) {
106
+ if (!inputs.project) {
107
+ throw new HeadlessInputError(COPY.CONNECT.headlessNeedsProject);
108
+ }
109
+ const projectName = inputs.project.trim();
110
+ if (!authEnabled) {
111
+ return { endpoint, projectName };
112
+ }
113
+ const apiKey = inputs.apiKey;
114
+ if (!apiKey) {
115
+ throw new HeadlessInputError(COPY.CONNECT.headlessNeedsApiKey);
116
+ }
117
+ const result = await checkApiKey(deps, endpoint, apiKey);
118
+ if (result.kind === "rejected") {
119
+ throw new SetupFatalError(COPY.CONNECT.headlessAuthRejected);
120
+ }
121
+ if (result.kind === "error") {
122
+ throw new SetupFatalError(COPY.CONNECT.connectFailed(result.detail));
123
+ }
124
+ return { endpoint, projectName, apiKey };
125
+ }
126
+ export async function establishConnection(deps, { endpoint, authEnabled, inputs }) {
127
+ // A --project / env-provided name bypasses the prompt in every lane, so
128
+ // enforce here the same rule the prompt validates interactively.
129
+ if (inputs.project !== undefined) {
130
+ const nameError = validateProjectName(inputs.project);
131
+ if (nameError) {
132
+ throw new HeadlessInputError(nameError);
133
+ }
134
+ }
135
+ if (inputs.headless) {
136
+ return connectHeadless(deps, endpoint, authEnabled, inputs);
137
+ }
138
+ if (!authEnabled) {
139
+ return connectAuthOff(deps, endpoint, inputs);
140
+ }
141
+ return connectAuthOnInteractive(deps, endpoint, inputs);
142
+ }
143
+ //# sourceMappingURL=establishConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"establishConnection.js","sourceRoot":"","sources":["../../../src/setup/steps/establishConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Install the tooling: the global `px` CLI, and the Phoenix skills.
3
+ *
4
+ * Runs after traces are verified — the peak-motivation moment — and offers
5
+ * the tooling that turns "traces are flowing" into "I can look at them":
6
+ * a global `px` install when setup is running without `px` on PATH
7
+ * (the `npx @arizeai/phoenix-cli setup` case), and the Phoenix skills for
8
+ * the user's coding agent via `npx skills add` (no `--skill` pins — the
9
+ * skills CLI's own picker lists the repo's skills and target agents). Both
10
+ * installs are spawned on the terminal so their own output and prompts show
11
+ * through; failures are non-fatal warnings with the command to retry by hand.
12
+ */
13
+ import type { SetupDeps } from "../deps/index.js";
14
+ /** What an install offer did — reported in the setup summary. */
15
+ export type ToolingOutcome = "installed" | "failed" | "declined" | "skipped";
16
+ export interface ToolingResult {
17
+ cli: ToolingOutcome;
18
+ skills: ToolingOutcome;
19
+ }
20
+ export declare function offerToolingInstalls(deps: Pick<SetupDeps, "context" | "processes" | "prompter">, { pxOnPath, skills, canPrompt, }: {
21
+ /** Started at setup launch so the probe never blocks this prompt. */
22
+ pxOnPath: Promise<boolean>;
23
+ /** `--skills` / `--no-skills`; undefined means ask (when we can). */
24
+ skills?: boolean;
25
+ /** False in a headless run: there is no terminal to ask on. */
26
+ canPrompt: boolean;
27
+ }): Promise<ToolingResult>;
28
+ //# sourceMappingURL=installTooling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installTooling.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/installTooling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,SAAS,CAAC;AAiCtD,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAiCD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC,EAC3D,EACE,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB,GACA,OAAO,CAAC,aAAa,CAAC,CAoBxB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Install the tooling: the global `px` CLI, and the Phoenix skills.
3
+ *
4
+ * Runs after traces are verified — the peak-motivation moment — and offers
5
+ * the tooling that turns "traces are flowing" into "I can look at them":
6
+ * a global `px` install when setup is running without `px` on PATH
7
+ * (the `npx @arizeai/phoenix-cli setup` case), and the Phoenix skills for
8
+ * the user's coding agent via `npx skills add` (no `--skill` pins — the
9
+ * skills CLI's own picker lists the repo's skills and target agents). Both
10
+ * installs are spawned on the terminal so their own output and prompts show
11
+ * through; failures are non-fatal warnings with the command to retry by hand.
12
+ */
13
+ import * as COPY from "../copy.js";
14
+ import { selectBoolean } from "../ui/selectBoolean.js";
15
+ const CLI_INSTALL_SPEC = {
16
+ command: "npm",
17
+ args: ["install", "-g", "@arizeai/phoenix-cli"],
18
+ };
19
+ /**
20
+ * `npx skills add`, as spawned. The leading `-y` is npx's own — install the
21
+ * `skills` package without asking.
22
+ *
23
+ * Unattended, the skills CLI needs its `--yes` too: it is interactive by
24
+ * default (a skill picker, an agent picker, a final confirm) and a missing TTY
25
+ * does not suppress those prompts, so without the flag a headless run hangs on
26
+ * stdin. With it, the installer takes every skill in the repo for the agents it
27
+ * detects. Interactively we leave it off, so the user drives those pickers.
28
+ */
29
+ function skillsAddSpec(unattended) {
30
+ return {
31
+ command: "npx",
32
+ args: [
33
+ "-y",
34
+ "skills",
35
+ "add",
36
+ COPY.SKILLS_SOURCE,
37
+ ...(unattended ? ["--yes"] : []),
38
+ ],
39
+ };
40
+ }
41
+ /**
42
+ * Install, honoring a decision the caller already made. `decided` short-circuits
43
+ * the prompt: `true` installs (`--skills`), `false` skips (`--no-skills`), and
44
+ * `undefined` asks — so a headless run, which has no terminal to ask on, must
45
+ * arrive here already decided.
46
+ */
47
+ async function offerInstall(deps, copy, spec, decided) {
48
+ const optedIn = decided ??
49
+ (await selectBoolean({
50
+ prompter: deps.prompter,
51
+ message: copy.message,
52
+ yesLabel: copy.yes,
53
+ noLabel: copy.no,
54
+ }));
55
+ if (!optedIn) {
56
+ return "declined";
57
+ }
58
+ const { exitCode } = await deps.processes.spawnInteractive({
59
+ ...spec,
60
+ cwd: deps.context.cwd,
61
+ });
62
+ deps.prompter.line(exitCode === 0 ? copy.installed : copy.failed);
63
+ return exitCode === 0 ? "installed" : "failed";
64
+ }
65
+ export async function offerToolingInstalls(deps, { pxOnPath, skills, canPrompt, }) {
66
+ // The global CLI install is prompt-only — it is offered when `px` is missing
67
+ // (an `npx` run), and skipped outright when we cannot ask, because installing
68
+ // a global npm package is not something to do to an unattended caller.
69
+ const cli = !canPrompt || (await pxOnPath)
70
+ ? "skipped"
71
+ : await offerInstall(deps, COPY.TOOLING.cli, CLI_INSTALL_SPEC);
72
+ // With no prompt to fall back on, an unflagged skills install defaults to
73
+ // going ahead: the only reason to invoke this lane unattended is to install.
74
+ // `--no-skills` still declines. This default lives here, next to `canPrompt`,
75
+ // rather than in each caller.
76
+ const skillsOutcome = await offerInstall(deps, COPY.TOOLING.skills, skillsAddSpec(!canPrompt), canPrompt ? skills : (skills ?? true));
77
+ return { cli, skills: skillsOutcome };
78
+ }
79
+ //# sourceMappingURL=installTooling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installTooling.js","sourceRoot":"","sources":["../../../src/setup/steps/installTooling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,gBAAgB,GAA6B;IACjD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,sBAAsB,CAAC;CAChD,CAAC;AAEF;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,UAAmB;IACxC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,IAAI;YACJ,QAAQ;YACR,KAAK;YACL,IAAI,CAAC,aAAa;YAClB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACjC;KACF,CAAC;AACJ,CAAC;AAYD;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CACzB,IAA2D,EAC3D,IAAsB,EACtB,IAA8B,EAC9B,OAAiB;IAEjB,MAAM,OAAO,GACX,OAAO;QACP,CAAC,MAAM,aAAa,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,GAAG;YAClB,OAAO,EAAE,IAAI,CAAC,EAAE;SACjB,CAAC,CAAC,CAAC;IACN,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;QACzD,GAAG,IAAI;QACP,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;KACtB,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA2D,EAC3D,EACE,QAAQ,EACR,MAAM,EACN,SAAS,GAQV;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,uEAAuE;IACvE,MAAM,GAAG,GACP,CAAC,SAAS,IAAI,CAAC,MAAM,QAAQ,CAAC;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAEnE,0EAA0E;IAC1E,6EAA6E;IAC7E,8EAA8E;IAC9E,8BAA8B;IAC9B,MAAM,aAAa,GAAG,MAAM,YAAY,CACtC,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,aAAa,CAAC,CAAC,SAAS,CAAC,EACzB,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CACtC,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Instrumentation hand-off.
3
+ *
4
+ * Lanes, in order of preference: launch a detected coding agent directly
5
+ * (prompt pre-loaded, credentials injected via env), copy the prompt for an
6
+ * agent the user runs themselves, or manual via the quickstart docs. All
7
+ * lanes converge on the trace-verification step — setup's definition of
8
+ * done is API-verified data flow, not agent self-report.
9
+ *
10
+ * `--agent` pre-answers the lane, which is what makes an unattended run
11
+ * possible: with no TTY there is no prompt to pick a lane from, and the agent
12
+ * runs in background mode (no TUI to hand the terminal to).
13
+ */
14
+ import { type AgentRunMode, type CodingAgent, type CodingAgentId } from "../agents/registry.js";
15
+ import type { DocsPrefetchResult, SetupDeps } from "../deps/index.js";
16
+ import type { Connection } from "./establishConnection.js";
17
+ export interface InstrumentAppArgs {
18
+ authEnabled: boolean;
19
+ /** Started at setup launch so the probes never block this prompt. */
20
+ agentDetection: Promise<CodingAgent[]>;
21
+ /** `--agent`: skip the lane prompt and launch this agent. */
22
+ agent?: CodingAgentId;
23
+ /** `--language`: passed through so the agent skips its own detection. */
24
+ languages: string[];
25
+ /** How to run the agent — see {@link AgentRunMode}. */
26
+ mode: AgentRunMode;
27
+ /** Where the prefetched docs landed, when the docs step ran. */
28
+ docs?: DocsPrefetchResult;
29
+ }
30
+ /** Which lane instrumentation actually took — reported in the summary. */
31
+ export type InstrumentationLane = {
32
+ kind: "agent";
33
+ agent: CodingAgentId;
34
+ exitCode: number;
35
+ } | {
36
+ kind: "clipboard";
37
+ } | {
38
+ kind: "manual";
39
+ };
40
+ export declare function instrumentApp(deps: Pick<SetupDeps, "context" | "processes" | "prompter" | "writeClipboard">, connection: Connection, args: InstrumentAppArgs): Promise<InstrumentationLane>;
41
+ //# sourceMappingURL=instrumentApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentApp.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/instrumentApp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,kBAAkB,EAAgB,SAAS,EAAE,MAAM,SAAS,CAAC;AAG3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,yEAAyE;IACzE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uDAAuD;IACvD,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,CACR,SAAS,EACT,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,CACxD,EACD,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAgG9B"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Instrumentation hand-off.
3
+ *
4
+ * Lanes, in order of preference: launch a detected coding agent directly
5
+ * (prompt pre-loaded, credentials injected via env), copy the prompt for an
6
+ * agent the user runs themselves, or manual via the quickstart docs. All
7
+ * lanes converge on the trace-verification step — setup's definition of
8
+ * done is API-verified data flow, not agent self-report.
9
+ *
10
+ * `--agent` pre-answers the lane, which is what makes an unattended run
11
+ * possible: with no TTY there is no prompt to pick a lane from, and the agent
12
+ * runs in background mode (no TUI to hand the terminal to).
13
+ */
14
+ import { buildLaunchSpec, getCodingAgent, probeBinary, } from "../agents/registry.js";
15
+ import * as COPY from "../copy.js";
16
+ import { SetupFatalError } from "../errors.js";
17
+ import { buildInstrumentationPrompt } from "../prompts/instrumentationPrompt.js";
18
+ import { tracesUrl } from "./verifyTraces.js";
19
+ const DEFAULT_LOCAL_ENDPOINT = "http://localhost:6006";
20
+ export async function instrumentApp(deps, connection, args) {
21
+ const { authEnabled, agentDetection, languages, mode } = args;
22
+ const prompt = buildInstrumentationPrompt({
23
+ projectName: connection.projectName,
24
+ endpoint: connection.endpoint,
25
+ isDefaultEndpoint: connection.endpoint === DEFAULT_LOCAL_ENDPOINT,
26
+ docs: {
27
+ quickstartPython: COPY.DOCS.quickstartPython,
28
+ quickstartTypeScript: COPY.DOCS.quickstartTypeScript,
29
+ phoenixOtelSetup: COPY.DOCS.phoenixOtelSetup,
30
+ integrationsIndex: COPY.DOCS.integrationsIndex,
31
+ },
32
+ tracesUrl: tracesUrl(connection),
33
+ authEnabled,
34
+ languages,
35
+ // Only advertise the local docs dir when it holds pages — an empty one
36
+ // (docs site down, over-narrow workflow filter) would send the agent to
37
+ // read a directory with nothing in it instead of the web.
38
+ ...(args.docs?.hasPagesOnDisk ? { localDocsDir: args.docs.outputDir } : {}),
39
+ });
40
+ // `--agent` short-circuits the lane prompt. The binary is probed rather
41
+ // than taken from the detection sweep so a named-but-missing agent fails
42
+ // with "not on your PATH" instead of silently dropping to another lane.
43
+ if (args.agent) {
44
+ const agent = getCodingAgent(args.agent);
45
+ if (!agent) {
46
+ throw new SetupFatalError(COPY.INSTRUMENTATION.unknownAgent(args.agent));
47
+ }
48
+ if (!(await probeBinary(deps, agent.binary))) {
49
+ throw new SetupFatalError(COPY.INSTRUMENTATION.agentNotFound(agent.label, agent.binary));
50
+ }
51
+ return launchAgent(deps, connection, { agent, prompt, mode });
52
+ }
53
+ const detectedAgents = await agentDetection;
54
+ const options = [
55
+ ...detectedAgents.map((agent) => ({
56
+ value: `agent:${agent.id}`,
57
+ label: COPY.INSTRUMENTATION.launchLabel(agent.label),
58
+ hint: COPY.INSTRUMENTATION.launchHint,
59
+ })),
60
+ {
61
+ value: "clipboard",
62
+ label: COPY.INSTRUMENTATION.clipboardLabel,
63
+ hint: COPY.INSTRUMENTATION.clipboardHint,
64
+ },
65
+ {
66
+ value: "manual",
67
+ label: COPY.INSTRUMENTATION.manualLabel,
68
+ hint: COPY.INSTRUMENTATION.manualHint,
69
+ },
70
+ ];
71
+ const choice = await deps.prompter.select({
72
+ message: COPY.INSTRUMENTATION.modeMessage,
73
+ options,
74
+ });
75
+ const chosenAgent = detectedAgents.find((agent) => choice === `agent:${agent.id}`);
76
+ if (chosenAgent) {
77
+ return launchAgent(deps, connection, { agent: chosenAgent, prompt, mode });
78
+ }
79
+ if (choice === "clipboard") {
80
+ const copied = await deps.writeClipboard(prompt);
81
+ if (copied) {
82
+ deps.prompter.line(COPY.INSTRUMENTATION.promptCopied);
83
+ }
84
+ else {
85
+ deps.prompter.line(COPY.INSTRUMENTATION.promptCopyFailed);
86
+ deps.prompter.note(prompt);
87
+ }
88
+ await deps.prompter.select({
89
+ message: COPY.INSTRUMENTATION.clipboardDoneMessage,
90
+ options: [
91
+ { value: true, label: COPY.INSTRUMENTATION.clipboardDoneLabel },
92
+ ],
93
+ });
94
+ return { kind: "clipboard" };
95
+ }
96
+ deps.prompter.line(COPY.INSTRUMENTATION.manualDocs(COPY.DOCS.instrumentationIndex));
97
+ await deps.prompter.select({
98
+ message: COPY.INSTRUMENTATION.manualDoneMessage,
99
+ options: [{ value: true, label: COPY.INSTRUMENTATION.manualDoneLabel }],
100
+ });
101
+ return { kind: "manual" };
102
+ }
103
+ /**
104
+ * Run the agent with the prompt pre-loaded. A non-zero exit is a warning, not
105
+ * a failure: the agent may have instrumented the app and then exited badly,
106
+ * and trace verification — not the agent's exit code — decides whether setup
107
+ * succeeded.
108
+ */
109
+ async function launchAgent(deps, connection, { agent, prompt, mode, }) {
110
+ // Without its TUI *and* without permission bypass, an agent stalls on the
111
+ // first approval it wants, with no terminal to approve it on — the run then
112
+ // dies at the verification timeout with nothing to show. Say so up front.
113
+ if (mode.background && !mode.bypassPermissions) {
114
+ deps.prompter.line(COPY.INSTRUMENTATION.backgroundNeedsYolo(agent.label));
115
+ }
116
+ deps.prompter.line(mode.background
117
+ ? COPY.INSTRUMENTATION.launchingBackground(agent.label)
118
+ : COPY.INSTRUMENTATION.launching(agent.label));
119
+ const spec = buildLaunchSpec(agent, {
120
+ prompt,
121
+ cwd: deps.context.cwd,
122
+ connection,
123
+ mode,
124
+ });
125
+ const { exitCode } = await deps.processes.spawnInteractive(spec);
126
+ if (exitCode !== 0) {
127
+ deps.prompter.line(COPY.INSTRUMENTATION.agentExitWarning(agent.label));
128
+ }
129
+ return { kind: "agent", agent: agent.id, exitCode };
130
+ }
131
+ //# sourceMappingURL=instrumentApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentApp.js","sourceRoot":"","sources":["../../../src/setup/steps/instrumentApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Offer to point `px` at the project setup just connected.
3
+ *
4
+ * Because setup *is* px, everything here is in-process — the profile
5
+ * (including the API key, when auth is on) is written through px's own
6
+ * settings module (`~/.px/settings.json`, dir 0700, file 0600). No argv or
7
+ * subprocess ever carries the secret. Any failure is a non-fatal warning;
8
+ * setup proceeds regardless.
9
+ */
10
+ import type { SetupDeps } from "../deps/index.js";
11
+ import type { Connection } from "./establishConnection.js";
12
+ /** `local` for localhost, else the host with dots and colons → dashes. */
13
+ export declare function profileNameForEndpoint(endpoint: string): string;
14
+ export interface PxProfileArgs {
15
+ connection: Connection;
16
+ /** Override the settings file path (tests). */
17
+ settingsPath?: string;
18
+ }
19
+ export declare function offerPxProfile(deps: Pick<SetupDeps, "prompter">, { connection, settingsPath }: PxProfileArgs): Promise<void>;
20
+ //# sourceMappingURL=offerPxProfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerPxProfile.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/offerPxProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EACjC,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,aAAa,GAC1C,OAAO,CAAC,IAAI,CAAC,CAoFf"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Offer to point `px` at the project setup just connected.
3
+ *
4
+ * Because setup *is* px, everything here is in-process — the profile
5
+ * (including the API key, when auth is on) is written through px's own
6
+ * settings module (`~/.px/settings.json`, dir 0700, file 0600). No argv or
7
+ * subprocess ever carries the secret. Any failure is a non-fatal warning;
8
+ * setup proceeds regardless.
9
+ */
10
+ import { getSettingsPath, getStoredActiveProfile, loadSettings, saveSettings, SettingsFileError, } from "../../settings.js";
11
+ import * as COPY from "../copy.js";
12
+ import { SetupCancelledError } from "../errors.js";
13
+ import { redactForDisplay } from "../util/redact.js";
14
+ /** `local` for localhost, else the host with dots and colons → dashes. */
15
+ export function profileNameForEndpoint(endpoint) {
16
+ // URL.hostname keeps the brackets on IPv6 literals (e.g. "[::1]").
17
+ const host = new URL(endpoint).hostname;
18
+ if (host === "localhost" || host === "127.0.0.1" || host === "[::1]") {
19
+ return "local";
20
+ }
21
+ return host.replace(/^\[|\]$/g, "").replace(/[.:]/g, "-");
22
+ }
23
+ export async function offerPxProfile(deps, { connection, settingsPath }) {
24
+ // Strict, and on its own: a settings file whose contents don't parse must not
25
+ // degrade to the empty profiles record a lenient load returns, which the save
26
+ // below would then write over whatever the user had. A file that is simply
27
+ // absent is not an error — the load returns fresh settings for it.
28
+ let settings;
29
+ try {
30
+ settings = loadSettings({ settingsPath, strict: true });
31
+ }
32
+ catch (error) {
33
+ // Only a file we can't parse gets sent here. `px profile create`, the
34
+ // remedy the generic failure suggests, loads the same file the same strict
35
+ // way — so for this one failure it is no remedy at all, and the file itself
36
+ // is what has to be dealt with.
37
+ if (error instanceof SettingsFileError) {
38
+ deps.prompter.line(COPY.PX_PROFILE.unreadableSettings(settingsPath ?? getSettingsPath(), redactForDisplay(error.message)));
39
+ return;
40
+ }
41
+ deps.prompter.line(COPY.PX_PROFILE.failed(redactForDisplay(String(error))));
42
+ return;
43
+ }
44
+ try {
45
+ const active = getStoredActiveProfile(settings);
46
+ // A fully-configured active profile pointing elsewhere is a conflict —
47
+ // ask before switching, never clobber silently. A partially configured
48
+ // profile (missing endpoint or project) is non-conflicting.
49
+ const conflicting = active !== undefined &&
50
+ Boolean(active.entry.endpoint) &&
51
+ Boolean(active.entry.project) &&
52
+ (active.entry.endpoint !== connection.endpoint ||
53
+ active.entry.project !== connection.projectName);
54
+ const optedIn = await deps.prompter.select(conflicting && active
55
+ ? {
56
+ message: COPY.PX_PROFILE.conflictMessage(active.name, active.entry.endpoint ?? ""),
57
+ options: [
58
+ { value: false, label: COPY.PX_PROFILE.conflictNo },
59
+ { value: true, label: COPY.PX_PROFILE.conflictYes },
60
+ ],
61
+ }
62
+ : {
63
+ message: COPY.PX_PROFILE.optInMessage,
64
+ options: [
65
+ { value: true, label: COPY.PX_PROFILE.optInYes },
66
+ { value: false, label: COPY.PX_PROFILE.optInNo },
67
+ ],
68
+ });
69
+ if (!optedIn) {
70
+ return;
71
+ }
72
+ const profileName = profileNameForEndpoint(connection.endpoint);
73
+ const entry = {
74
+ endpoint: connection.endpoint,
75
+ project: connection.projectName,
76
+ };
77
+ if (connection.apiKey) {
78
+ entry.apiKey = connection.apiKey;
79
+ }
80
+ settings.profiles[profileName] = {
81
+ ...settings.profiles[profileName],
82
+ ...entry,
83
+ };
84
+ settings.activeProfile = profileName;
85
+ saveSettings(settings, { settingsPath });
86
+ deps.prompter.line(COPY.PX_PROFILE.created(profileName));
87
+ }
88
+ catch (error) {
89
+ if (error instanceof SetupCancelledError) {
90
+ throw error;
91
+ }
92
+ deps.prompter.line(COPY.PX_PROFILE.failed(redactForDisplay(String(error))));
93
+ }
94
+ }
95
+ //# sourceMappingURL=offerPxProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offerPxProfile.js","sourceRoot":"","sources":["../../../src/setup/steps/offerPxProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Prefetch the Phoenix docs into the repo, so the instrumentation agent reads
3
+ * package names and APIs from disk instead of fetching URLs mid-run.
4
+ *
5
+ * Runs only when instrumentation runs — the docs exist to serve the agent, so
6
+ * a registration-only run has no reason to write them. Never fatal: a docs
7
+ * site that is slow or down degrades to the agent fetching pages itself, which
8
+ * is what it did before this step existed.
9
+ *
10
+ * Must run after the git-safety gate: the download writes untracked files
11
+ * under `.px/`, which a fast headless run could otherwise mistake for
12
+ * pre-existing user changes.
13
+ */
14
+ import { type DocsPrefetchOptions, type DocsPrefetchResult, type SetupDeps } from "../deps/index.js";
15
+ /**
16
+ * Download the docs and gitignore what they wrote. A failure is reported and
17
+ * dropped: the connection and hand-off files are real work worth keeping, and
18
+ * the agent can still read the docs from the web.
19
+ */
20
+ export declare function prefetchDocs(deps: Pick<SetupDeps, "fetchDocs" | "prompter" | "context">, { docs, isGitRepository, }: {
21
+ docs: DocsPrefetchOptions;
22
+ isGitRepository: boolean;
23
+ }): Promise<DocsPrefetchResult | undefined>;
24
+ //# sourceMappingURL=prefetchDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetchDocs.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/prefetchDocs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AAMjB;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC,EAC3D,EACE,IAAI,EACJ,eAAe,GAChB,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GACzD,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA6BzC"}