@arizeai/phoenix-cli 1.8.1 → 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 (242) hide show
  1. package/README.md +34 -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/curl.d.ts +17 -0
  93. package/build/curl.d.ts.map +1 -1
  94. package/build/curl.js.map +1 -1
  95. package/build/optionParsers.d.ts +12 -0
  96. package/build/optionParsers.d.ts.map +1 -1
  97. package/build/optionParsers.js +15 -0
  98. package/build/optionParsers.js.map +1 -1
  99. package/build/pxi/App.d.ts.map +1 -1
  100. package/build/pxi/App.js +4 -0
  101. package/build/pxi/App.js.map +1 -1
  102. package/build/pxi/options.d.ts +98 -0
  103. package/build/pxi/options.d.ts.map +1 -1
  104. package/build/pxi/options.js.map +1 -1
  105. package/build/settings.d.ts.map +1 -1
  106. package/build/settings.js +4 -0
  107. package/build/settings.js.map +1 -1
  108. package/build/setup/agents/registry.d.ts +78 -0
  109. package/build/setup/agents/registry.d.ts.map +1 -0
  110. package/build/setup/agents/registry.js +129 -0
  111. package/build/setup/agents/registry.js.map +1 -0
  112. package/build/setup/copy.d.ts +167 -0
  113. package/build/setup/copy.d.ts.map +1 -0
  114. package/build/setup/copy.js +290 -0
  115. package/build/setup/copy.js.map +1 -0
  116. package/build/setup/deps/buildDefaultDeps.d.ts +13 -0
  117. package/build/setup/deps/buildDefaultDeps.d.ts.map +1 -0
  118. package/build/setup/deps/buildDefaultDeps.js +29 -0
  119. package/build/setup/deps/buildDefaultDeps.js.map +1 -0
  120. package/build/setup/deps/clipboard.d.ts +12 -0
  121. package/build/setup/deps/clipboard.d.ts.map +1 -0
  122. package/build/setup/deps/clipboard.js +30 -0
  123. package/build/setup/deps/clipboard.js.map +1 -0
  124. package/build/setup/deps/clock.d.ts +10 -0
  125. package/build/setup/deps/clock.d.ts.map +1 -0
  126. package/build/setup/deps/clock.js +11 -0
  127. package/build/setup/deps/clock.js.map +1 -0
  128. package/build/setup/deps/context.d.ts +28 -0
  129. package/build/setup/deps/context.d.ts.map +1 -0
  130. package/build/setup/deps/context.js +24 -0
  131. package/build/setup/deps/context.js.map +1 -0
  132. package/build/setup/deps/docs.d.ts +41 -0
  133. package/build/setup/deps/docs.d.ts.map +1 -0
  134. package/build/setup/deps/docs.js +33 -0
  135. package/build/setup/deps/docs.js.map +1 -0
  136. package/build/setup/deps/index.d.ts +42 -0
  137. package/build/setup/deps/index.d.ts.map +1 -0
  138. package/build/setup/deps/index.js +16 -0
  139. package/build/setup/deps/index.js.map +1 -0
  140. package/build/setup/deps/phoenixClient.d.ts +22 -0
  141. package/build/setup/deps/phoenixClient.d.ts.map +1 -0
  142. package/build/setup/deps/phoenixClient.js +17 -0
  143. package/build/setup/deps/phoenixClient.js.map +1 -0
  144. package/build/setup/deps/processes.d.ts +28 -0
  145. package/build/setup/deps/processes.d.ts.map +1 -0
  146. package/build/setup/deps/processes.js +58 -0
  147. package/build/setup/deps/processes.js.map +1 -0
  148. package/build/setup/deps/prompter.d.ts +42 -0
  149. package/build/setup/deps/prompter.d.ts.map +1 -0
  150. package/build/setup/deps/prompter.js +10 -0
  151. package/build/setup/deps/prompter.js.map +1 -0
  152. package/build/setup/errors.d.ts +27 -0
  153. package/build/setup/errors.d.ts.map +1 -0
  154. package/build/setup/errors.js +36 -0
  155. package/build/setup/errors.js.map +1 -0
  156. package/build/setup/options.d.ts +113 -0
  157. package/build/setup/options.d.ts.map +1 -0
  158. package/build/setup/options.js +63 -0
  159. package/build/setup/options.js.map +1 -0
  160. package/build/setup/prompts/instrumentationPrompt.d.ts +42 -0
  161. package/build/setup/prompts/instrumentationPrompt.d.ts.map +1 -0
  162. package/build/setup/prompts/instrumentationPrompt.js +64 -0
  163. package/build/setup/prompts/instrumentationPrompt.js.map +1 -0
  164. package/build/setup/runSetup.d.ts +45 -0
  165. package/build/setup/runSetup.d.ts.map +1 -0
  166. package/build/setup/runSetup.js +212 -0
  167. package/build/setup/runSetup.js.map +1 -0
  168. package/build/setup/steps/chooseEndpoint.d.ts +36 -0
  169. package/build/setup/steps/chooseEndpoint.d.ts.map +1 -0
  170. package/build/setup/steps/chooseEndpoint.js +125 -0
  171. package/build/setup/steps/chooseEndpoint.js.map +1 -0
  172. package/build/setup/steps/confirmGitSafety.d.ts +17 -0
  173. package/build/setup/steps/confirmGitSafety.d.ts.map +1 -0
  174. package/build/setup/steps/confirmGitSafety.js +73 -0
  175. package/build/setup/steps/confirmGitSafety.js.map +1 -0
  176. package/build/setup/steps/establishConnection.d.ts +29 -0
  177. package/build/setup/steps/establishConnection.d.ts.map +1 -0
  178. package/build/setup/steps/establishConnection.js +143 -0
  179. package/build/setup/steps/establishConnection.js.map +1 -0
  180. package/build/setup/steps/installTooling.d.ts +28 -0
  181. package/build/setup/steps/installTooling.d.ts.map +1 -0
  182. package/build/setup/steps/installTooling.js +79 -0
  183. package/build/setup/steps/installTooling.js.map +1 -0
  184. package/build/setup/steps/instrumentApp.d.ts +41 -0
  185. package/build/setup/steps/instrumentApp.d.ts.map +1 -0
  186. package/build/setup/steps/instrumentApp.js +131 -0
  187. package/build/setup/steps/instrumentApp.js.map +1 -0
  188. package/build/setup/steps/offerPxProfile.d.ts +20 -0
  189. package/build/setup/steps/offerPxProfile.d.ts.map +1 -0
  190. package/build/setup/steps/offerPxProfile.js +95 -0
  191. package/build/setup/steps/offerPxProfile.js.map +1 -0
  192. package/build/setup/steps/prefetchDocs.d.ts +24 -0
  193. package/build/setup/steps/prefetchDocs.d.ts.map +1 -0
  194. package/build/setup/steps/prefetchDocs.js +49 -0
  195. package/build/setup/steps/prefetchDocs.js.map +1 -0
  196. package/build/setup/steps/verifyTraces.d.ts +44 -0
  197. package/build/setup/steps/verifyTraces.d.ts.map +1 -0
  198. package/build/setup/steps/verifyTraces.js +119 -0
  199. package/build/setup/steps/verifyTraces.js.map +1 -0
  200. package/build/setup/steps/writeEnvFile.d.ts +19 -0
  201. package/build/setup/steps/writeEnvFile.d.ts.map +1 -0
  202. package/build/setup/steps/writeEnvFile.js +50 -0
  203. package/build/setup/steps/writeEnvFile.js.map +1 -0
  204. package/build/setup/ui/clackPrompter.d.ts +11 -0
  205. package/build/setup/ui/clackPrompter.d.ts.map +1 -0
  206. package/build/setup/ui/clackPrompter.js +107 -0
  207. package/build/setup/ui/clackPrompter.js.map +1 -0
  208. package/build/setup/ui/selectBoolean.d.ts +18 -0
  209. package/build/setup/ui/selectBoolean.d.ts.map +1 -0
  210. package/build/setup/ui/selectBoolean.js +14 -0
  211. package/build/setup/ui/selectBoolean.js.map +1 -0
  212. package/build/setup/util/gitignoreCoverage.d.ts +24 -0
  213. package/build/setup/util/gitignoreCoverage.d.ts.map +1 -0
  214. package/build/setup/util/gitignoreCoverage.js +43 -0
  215. package/build/setup/util/gitignoreCoverage.js.map +1 -0
  216. package/build/setup/util/paths.d.ts +6 -0
  217. package/build/setup/util/paths.d.ts.map +1 -0
  218. package/build/setup/util/paths.js +23 -0
  219. package/build/setup/util/paths.js.map +1 -0
  220. package/build/setup/util/redact.d.ts +12 -0
  221. package/build/setup/util/redact.d.ts.map +1 -0
  222. package/build/setup/util/redact.js +31 -0
  223. package/build/setup/util/redact.js.map +1 -0
  224. package/build/validation/endpoint.d.ts +19 -0
  225. package/build/validation/endpoint.d.ts.map +1 -0
  226. package/build/validation/endpoint.js +39 -0
  227. package/build/validation/endpoint.js.map +1 -0
  228. package/package.json +15 -12
  229. package/build/commands/annotationMutationUtils.d.ts.map +0 -1
  230. package/build/commands/annotationMutationUtils.js.map +0 -1
  231. package/build/commands/noteMutationUtils.d.ts.map +0 -1
  232. package/build/commands/noteMutationUtils.js.map +0 -1
  233. package/build/commands/sessionAnnotationsCommand.d.ts.map +0 -1
  234. package/build/commands/sessionAnnotationsCommand.js.map +0 -1
  235. package/build/commands/spanAnnotationsCommand.d.ts +0 -7
  236. package/build/commands/spanAnnotationsCommand.d.ts.map +0 -1
  237. package/build/commands/spanAnnotationsCommand.js +0 -164
  238. package/build/commands/spanAnnotationsCommand.js.map +0 -1
  239. package/build/commands/traceAnnotationsCommand.d.ts +0 -7
  240. package/build/commands/traceAnnotationsCommand.d.ts.map +0 -1
  241. package/build/commands/traceAnnotationsCommand.js +0 -167
  242. package/build/commands/traceAnnotationsCommand.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Input resolution for setup.
3
+ *
4
+ * Follows px's `resolveConfig()` precedence — flags, then env, then
5
+ * defaults — additionally accepting `PHOENIX_COLLECTOR_ENDPOINT` and
6
+ * `PHOENIX_PROJECT_NAME` as endpoint/project aliases (#14131). There are no
7
+ * setup-specific env vars. Reads env only through `RunContext.env`.
8
+ *
9
+ * Note the `--no-input` flag (or a non-TTY stdin) — not the presence of env
10
+ * vars — is what opts into headless behavior: an ambient `PHOENIX_API_KEY`
11
+ * in a dev shell never silently short-circuits the interactive flow.
12
+ */
13
+ import { type CodingAgentId } from "./agents/registry.js";
14
+ import type { DocsPrefetchOptions, RunContext } from "./deps/index.js";
15
+ /**
16
+ * The parsed `px setup` flags, as the command layer hands them over. Every
17
+ * choice setup would prompt for has a field here, which is what lets an
18
+ * unattended caller — CI, or a coding agent — run the same flow a human
19
+ * clicks through. Raw material for {@link resolveSetupInputs}; steps only
20
+ * ever see the resolved {@link SetupInputs}.
21
+ */
22
+ export interface SetupOptions {
23
+ /** --endpoint: pre-answer the endpoint question */
24
+ endpoint?: string;
25
+ /** --project: name or Relay Global ID */
26
+ project?: string;
27
+ /** --no-input: headless mode (also auto-on when !stdin.isTTY, per px convention) */
28
+ noInput?: boolean;
29
+ /**
30
+ * Hidden --api-url: base URL for setup's own API calls (dev).
31
+ * User-facing values — hand-off files, px profile, traces URLs — keep the
32
+ * endpoint the user chose.
33
+ */
34
+ apiUrl?: string;
35
+ /**
36
+ * --agent: pre-answer the instrumentation lane with a coding agent id.
37
+ * Validated against the registry at the command layer. Headless
38
+ * instrumentation requires it — there is no prompt to fall back to.
39
+ */
40
+ agent?: CodingAgentId;
41
+ /**
42
+ * --language: languages to instrument. Passed to the agent so it skips its
43
+ * own detection; empty means "detect it yourself".
44
+ */
45
+ languages?: string[];
46
+ /**
47
+ * --instrument / --no-instrument: run the instrumentation hand-off.
48
+ * Undefined means "decide by lane" — interactive asks, headless skips
49
+ * (registration-only stays the default for an unattended run, so `px setup
50
+ * --no-input` in CI never edits source that nobody asked it to touch).
51
+ */
52
+ instrument?: boolean;
53
+ /** --skills / --no-skills: offer the coding-agent skills install. */
54
+ skills?: boolean;
55
+ /**
56
+ * --yolo: let the agent run without its own permission prompts. Required in
57
+ * practice for a background run, which has no terminal to approve on.
58
+ */
59
+ bypassPermissions?: boolean;
60
+ /**
61
+ * --background: run the agent to completion without its TUI. Implied when
62
+ * setup itself is headless — there is no terminal to hand over.
63
+ */
64
+ background?: boolean;
65
+ /** Docs prefetch, so the agent instruments against local docs. */
66
+ docs?: DocsPrefetchOptions;
67
+ }
68
+ export interface SetupInputs {
69
+ /** Pre-answered endpoint (flag, else env), if any. */
70
+ endpoint?: string;
71
+ /** Pre-answered project name or Relay Global ID (flag, else env), if any. */
72
+ project?: string;
73
+ /** API key from env — used by the headless auth-on lane only. */
74
+ apiKey?: string;
75
+ /** True when --no-input was passed or stdin is not a TTY. */
76
+ headless: boolean;
77
+ /** Pre-answered instrumentation lane, if `--agent` named one. */
78
+ agent?: CodingAgentId;
79
+ /** Languages to instrument; empty means the agent detects them itself. */
80
+ languages: string[];
81
+ /**
82
+ * Whether to run the instrumentation hand-off. Interactive defaults to
83
+ * true (it is the point of setup); headless defaults to false, so an
84
+ * unattended run registers without ever editing source unless asked.
85
+ */
86
+ instrument: boolean;
87
+ /** Whether to offer/install the coding-agent skills; undefined means ask. */
88
+ skills?: boolean;
89
+ /** Run the agent without its TUI. Always true when setup is headless. */
90
+ background: boolean;
91
+ /** Run the agent without its own permission prompts (`--yolo`). */
92
+ bypassPermissions: boolean;
93
+ /** Docs prefetch; only consulted when `instrument` is true. */
94
+ docs: DocsPrefetchOptions;
95
+ }
96
+ /**
97
+ * A headless run that instruments must name its agent: there is no prompt to
98
+ * pick a lane from, and silently falling back to one would be a coin flip over
99
+ * which agent edits the caller's source.
100
+ *
101
+ * `px setup instrument` calls this directly — its lane is instrumentation by
102
+ * definition, so it never passes `--instrument` for `resolveSetupInputs` to
103
+ * catch.
104
+ */
105
+ export declare function assertAgentForHeadlessInstrument({ headless, agent, }: {
106
+ headless: boolean;
107
+ agent?: CodingAgentId;
108
+ }): void;
109
+ export declare function resolveSetupInputs({ options, context, }: {
110
+ options: SetupOptions;
111
+ context: Pick<RunContext, "env" | "stdinIsTTY">;
112
+ }): SetupInputs;
113
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,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;CAC5B;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;CAC3B;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,CAqCd"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Input resolution for setup.
3
+ *
4
+ * Follows px's `resolveConfig()` precedence — flags, then env, then
5
+ * defaults — additionally accepting `PHOENIX_COLLECTOR_ENDPOINT` and
6
+ * `PHOENIX_PROJECT_NAME` as endpoint/project aliases (#14131). There are no
7
+ * setup-specific env vars. Reads env only through `RunContext.env`.
8
+ *
9
+ * Note the `--no-input` flag (or a non-TTY stdin) — not the presence of env
10
+ * vars — is what opts into headless behavior: an ambient `PHOENIX_API_KEY`
11
+ * in a dev shell never silently short-circuits the interactive flow.
12
+ */
13
+ import { CODING_AGENT_IDS } from "./agents/registry.js";
14
+ import * as COPY from "./copy.js";
15
+ import { HeadlessInputError } from "./errors.js";
16
+ /**
17
+ * A headless run that instruments must name its agent: there is no prompt to
18
+ * pick a lane from, and silently falling back to one would be a coin flip over
19
+ * which agent edits the caller's source.
20
+ *
21
+ * `px setup instrument` calls this directly — its lane is instrumentation by
22
+ * definition, so it never passes `--instrument` for `resolveSetupInputs` to
23
+ * catch.
24
+ */
25
+ export function assertAgentForHeadlessInstrument({ headless, agent, }) {
26
+ if (headless && agent === undefined) {
27
+ throw new HeadlessInputError(COPY.HEADLESS.agentRequired(CODING_AGENT_IDS));
28
+ }
29
+ }
30
+ export function resolveSetupInputs({ options, context, }) {
31
+ const { env } = context;
32
+ const endpoint = options.endpoint ??
33
+ env.PHOENIX_HOST ??
34
+ env.PHOENIX_COLLECTOR_ENDPOINT ??
35
+ undefined;
36
+ const project = options.project ??
37
+ env.PHOENIX_PROJECT ??
38
+ env.PHOENIX_PROJECT_NAME ??
39
+ undefined;
40
+ const apiKey = env.PHOENIX_API_KEY ?? undefined;
41
+ const headless = Boolean(options.noInput) || !context.stdinIsTTY;
42
+ // Interactive setup exists to instrument; an unattended run does not
43
+ // touch source unless the caller asked for it by name.
44
+ const instrument = options.instrument ?? !headless;
45
+ if (instrument) {
46
+ assertAgentForHeadlessInstrument({ headless, agent: options.agent });
47
+ }
48
+ return {
49
+ endpoint: endpoint?.trim() || undefined,
50
+ project: project?.trim() || undefined,
51
+ apiKey: apiKey?.trim() || undefined,
52
+ headless,
53
+ agent: options.agent,
54
+ languages: options.languages ?? [],
55
+ instrument,
56
+ skills: options.skills,
57
+ // A headless run has no terminal to hand to the agent's TUI.
58
+ background: options.background ?? headless,
59
+ bypassPermissions: Boolean(options.bypassPermissions),
60
+ docs: options.docs ?? { enabled: true },
61
+ };
62
+ }
63
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/setup/options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAqF9C;;;;;;;;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,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ;QAChB,GAAG,CAAC,YAAY;QAChB,GAAG,CAAC,0BAA0B;QAC9B,SAAS,CAAC;IACZ,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;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The instrumentation prompt handed to a coding agent.
3
+ *
4
+ * One shared template serves the launched-agent and copy-to-clipboard lanes.
5
+ * Every rule is load-bearing — do not trim a rule without replacing the
6
+ * protection it provides. The prompt leans
7
+ * on the docs for package names and APIs (language-scoped quickstarts plus
8
+ * the integrations index) rather than inlining instructions that go stale.
9
+ * Setup independently verifies traces against the Phoenix API after the
10
+ * agent finishes, so the agent's job ends with an emitted trace, not a
11
+ * self-report.
12
+ */
13
+ export interface InstrumentationPromptDocs {
14
+ /** Python quickstart (arize-phoenix-otel). */
15
+ quickstartPython: string;
16
+ /** TypeScript quickstart (@arizeai/phoenix-otel). */
17
+ quickstartTypeScript: string;
18
+ /** phoenix.otel register() reference. */
19
+ phoenixOtelSetup: string;
20
+ /** Per-framework/provider auto-instrumentation guides. */
21
+ integrationsIndex: string;
22
+ }
23
+ export interface InstrumentationPromptArgs {
24
+ projectName: string;
25
+ endpoint: string;
26
+ isDefaultEndpoint: boolean;
27
+ docs: InstrumentationPromptDocs;
28
+ tracesUrl: string;
29
+ authEnabled: boolean;
30
+ /**
31
+ * `--language` values. Non-empty replaces the agent's own language
32
+ * detection, which is the slowest and least reliable thing it does.
33
+ */
34
+ languages?: string[];
35
+ /**
36
+ * Directory the docs prefetch wrote, when it ran. The agent reads those
37
+ * pages from disk instead of fetching the URLs mid-run.
38
+ */
39
+ localDocsDir?: string;
40
+ }
41
+ export declare function buildInstrumentationPrompt({ projectName, endpoint, isDefaultEndpoint, docs, tracesUrl, authEnabled, languages, localDocsDir, }: InstrumentationPromptArgs): string;
42
+ //# sourceMappingURL=instrumentationPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentationPrompt.d.ts","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,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;CACvB;AAED,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAc,EACd,YAAY,GACb,EAAE,yBAAyB,GAAG,MAAM,CAoDpC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The instrumentation prompt handed to a coding agent.
3
+ *
4
+ * One shared template serves the launched-agent and copy-to-clipboard lanes.
5
+ * Every rule is load-bearing — do not trim a rule without replacing the
6
+ * protection it provides. The prompt leans
7
+ * on the docs for package names and APIs (language-scoped quickstarts plus
8
+ * the integrations index) rather than inlining instructions that go stale.
9
+ * Setup independently verifies traces against the Phoenix API after the
10
+ * agent finishes, so the agent's job ends with an emitted trace, not a
11
+ * self-report.
12
+ */
13
+ export function buildInstrumentationPrompt({ projectName, endpoint, isDefaultEndpoint, docs, tracesUrl, authEnabled, languages = [], localDocsDir, }) {
14
+ const credentialVars = authEnabled
15
+ ? "PHOENIX_COLLECTOR_ENDPOINT and PHOENIX_API_KEY"
16
+ : "PHOENIX_COLLECTOR_ENDPOINT";
17
+ const endpointRule = isDefaultEndpoint
18
+ ? ""
19
+ : `\n Also set the collector endpoint in code only if the quickstart says to; it is ${endpoint}.`;
20
+ const languageRule = languages.length > 0
21
+ ? `The app's language is ${languages.join(" and ")} — do not spend time detecting it.`
22
+ : "Detect the app's language, follow the matching quickstart, and use the integration guide\nfor the app's LLM framework or provider.";
23
+ const localDocsRule = localDocsDir
24
+ ? `\nThese pages are already downloaded to ${localDocsDir} — read them from disk first, and only\nfetch a URL if the page you need is missing there.`
25
+ : "";
26
+ return `You are running as part of the Phoenix setup script. Your ONLY task is to add Phoenix
27
+ tracing to the application in the current working directory and emit one verification
28
+ trace. Do not run setup tools, onboarding scripts, or "px setup" again.
29
+
30
+ Work from the official docs — do not guess package names or APIs from memory:
31
+ - Python quickstart (arize-phoenix-otel): ${docs.quickstartPython}
32
+ - TypeScript quickstart (@arizeai/phoenix-otel): ${docs.quickstartTypeScript}
33
+ - register() reference: ${docs.phoenixOtelSetup}
34
+ - Auto-instrumentation guides by framework/provider: ${docs.integrationsIndex}${localDocsRule}
35
+ ${languageRule}
36
+
37
+ Rules:
38
+ 1. Tracing only. Do not add evals, datasets, prompts, dashboards, or any other feature.
39
+ 2. Credentials are provided via environment variables (${credentialVars}), which Phoenix SDKs read
40
+ automatically. If they are not set in your shell, apply them with
41
+ \`set -a; source .env.phoenix; set +a\` before the verification run. NEVER print the
42
+ contents of \`.env.phoenix\`, never print the API key, and never
43
+ write the API key or any secret into source code, config files, or command arguments.
44
+ 3. Configure the Phoenix project name in code: use the SDK's register call with the
45
+ project name "${projectName}".${endpointRule}
46
+ 4. Prefer auto-instrumentation packages over hand-written span wrappers. Make the smallest
47
+ correct change.
48
+ 5. Verify your work by emitting exactly one trace: run the app briefly, or a minimal
49
+ throwaway script that makes one real LLM call through the instrumented path, then
50
+ delete any throwaway script. Do not run the full test suite or the build.
51
+ 6. Install SDK packages with the project's existing package manager, pinned to the latest
52
+ stable version you can verify. If this is a monorepo, note the root but only modify
53
+ files at or below the current working directory.
54
+ 7. Keep changes concise and readable. Do not restructure, reformat, or meaningfully modify
55
+ existing application code.
56
+ 8. Do not use the \`px\` CLI.
57
+
58
+ When finished, end your final message with a one-line summary of the changes you made and
59
+ this link to the project's traces: ${tracesUrl}
60
+ If you could not complete the task or could not emit a verification trace, say so plainly
61
+ with a one-paragraph reason instead.
62
+ `;
63
+ }
64
+ //# sourceMappingURL=instrumentationPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentationPrompt.js","sourceRoot":"","sources":["../../../src/setup/prompts/instrumentationPrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgCH,MAAM,UAAU,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAS,GAAG,EAAE,EACd,YAAY,GACc;IAC1B,MAAM,cAAc,GAAG,WAAW;QAChC,CAAC,CAAC,gDAAgD;QAClD,CAAC,CAAC,4BAA4B,CAAC;IACjC,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;IAEP,OAAO;;;;;4CAKmC,IAAI,CAAC,gBAAgB;mDACd,IAAI,CAAC,oBAAoB;0BAClD,IAAI,CAAC,gBAAgB;uDACQ,IAAI,CAAC,iBAAiB,GAAG,aAAa;EAC3F,YAAY;;;;yDAI2C,cAAc;;;;;;mBAMpD,WAAW,KAAK,YAAY;;;;;;;;;;;;;;qCAcV,SAAS;;;CAG7C,CAAC;AACF,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The setup step sequence, and nothing else.
3
+ *
4
+ * All effects flow through `SetupDeps`; all strings live in `copy.ts`;
5
+ * cancellation unwinds via `SetupCancelledError` to the command handler.
6
+ *
7
+ * Three entry points, composed from the same steps:
8
+ * - `runSetup` — the whole flow (`px setup`)
9
+ * - `runInstrument` — register, then instrument and verify (`px setup instrument`)
10
+ * - `runSkills` — the tooling installs alone (`px setup skills`)
11
+ * Each returns a {@link SetupReport}, which the command layer renders in the
12
+ * requested `--format`.
13
+ */
14
+ import type { DocsPrefetchResult, SetupDeps } from "./deps/index.js";
15
+ import type { SetupInputs } from "./options.js";
16
+ import type { Connection } from "./steps/establishConnection.js";
17
+ import { type ToolingResult } from "./steps/installTooling.js";
18
+ import { type InstrumentationLane } from "./steps/instrumentApp.js";
19
+ /** Everything a run did, in the shape the summary and `--format json` print. */
20
+ export interface SetupReport {
21
+ connection: Connection;
22
+ authEnabled: boolean;
23
+ headless: boolean;
24
+ /** Files setup wrote into the repo. */
25
+ files: string[];
26
+ /** Paths appended to a .gitignore. */
27
+ gitignored: string[];
28
+ docs?: DocsPrefetchResult;
29
+ instrumentation?: InstrumentationLane;
30
+ /** True once the API confirmed a trace arrived after this run started. */
31
+ tracesVerified?: boolean;
32
+ tooling?: ToolingResult;
33
+ tracesUrl: string;
34
+ }
35
+ /** `px setup` — the whole flow. */
36
+ export declare function runSetup(deps: SetupDeps, inputs: SetupInputs): Promise<SetupReport>;
37
+ /**
38
+ * `px setup instrument` — the instrumentation slice, re-runnable on a repo that
39
+ * is already registered. Registration still runs: it is idempotent, and it is
40
+ * what produces the connection the agent and the verification step need.
41
+ */
42
+ export declare function runInstrument(deps: SetupDeps, resolved: SetupInputs): Promise<SetupReport>;
43
+ /** `px setup skills` — the tooling installs alone; no connection needed. */
44
+ export declare function runSkills(deps: SetupDeps, inputs: SetupInputs): Promise<ToolingResult>;
45
+ //# sourceMappingURL=runSetup.d.ts.map
@@ -0,0 +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;AAUhF,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,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD,mCAAmC;AACnC,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB;AAED;;;;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"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * The setup step sequence, and nothing else.
3
+ *
4
+ * All effects flow through `SetupDeps`; all strings live in `copy.ts`;
5
+ * cancellation unwinds via `SetupCancelledError` to the command handler.
6
+ *
7
+ * Three entry points, composed from the same steps:
8
+ * - `runSetup` — the whole flow (`px setup`)
9
+ * - `runInstrument` — register, then instrument and verify (`px setup instrument`)
10
+ * - `runSkills` — the tooling installs alone (`px setup skills`)
11
+ * Each returns a {@link SetupReport}, which the command layer renders in the
12
+ * requested `--format`.
13
+ */
14
+ import { detectCodingAgents, probeGlobalBinary, } from "./agents/registry.js";
15
+ import * as COPY from "./copy.js";
16
+ import { SetupCancelledError } from "./errors.js";
17
+ import { assertAgentForHeadlessInstrument } from "./options.js";
18
+ import { chooseEndpoint } from "./steps/chooseEndpoint.js";
19
+ import { confirmGitSafety } from "./steps/confirmGitSafety.js";
20
+ import { establishConnection } from "./steps/establishConnection.js";
21
+ import { offerToolingInstalls, } from "./steps/installTooling.js";
22
+ import { instrumentApp } from "./steps/instrumentApp.js";
23
+ import { offerPxProfile } from "./steps/offerPxProfile.js";
24
+ import { prefetchDocs } from "./steps/prefetchDocs.js";
25
+ import { hasSpansInSkewWindow, waitForFirstTrace, tracesUrl, } from "./steps/verifyTraces.js";
26
+ import { ENV_FILE_NAME, writeEnvFile } from "./steps/writeEnvFile.js";
27
+ /**
28
+ * Detect the installed agents — but only when the lane is still open. `--agent`
29
+ * pins it, and the pinned agent probes its own binary, so the sweep's four
30
+ * subprocess spawns would be thrown away. Every headless instrumentation run
31
+ * names an agent, so that is exactly where the waste would land.
32
+ */
33
+ function detectAgentsUnlessPinned(deps, inputs) {
34
+ return inputs.agent ? Promise.resolve([]) : detectCodingAgents(deps);
35
+ }
36
+ /** `px setup` — the whole flow. */
37
+ export async function runSetup(deps, inputs) {
38
+ // Started before the first prompt so the probes finish behind it; awaited
39
+ // by the instrumentation and tooling steps.
40
+ const agentDetection = detectAgentsUnlessPinned(deps, inputs);
41
+ // Probed with package-runner bin dirs stripped from PATH — under
42
+ // `npx @arizeai/phoenix-cli setup`, the package's own `px` shim must not
43
+ // masquerade as a global install and suppress the CLI-install offer.
44
+ const pxOnPath = probeGlobalBinary(deps, "px");
45
+ if (!inputs.headless) {
46
+ deps.prompter.intro(COPY.INTRO);
47
+ }
48
+ const report = await registerAndInstrument(deps, inputs, { agentDetection });
49
+ // A headless run stops here: the tooling offers are prompts, and its stdout
50
+ // belongs to the summary.
51
+ if (inputs.headless) {
52
+ return report;
53
+ }
54
+ // Tooling opt-ins come after the verified-trace moment so nothing stands
55
+ // between launch and first trace: point px at this project, then install the
56
+ // CLI and skills so the user (and their coding agent) can look at the traces
57
+ // now flowing.
58
+ await offerPxProfile(deps, {
59
+ connection: report.connection,
60
+ settingsPath: deps.context.settingsPath,
61
+ });
62
+ const tooling = await offerToolingInstalls(deps, {
63
+ pxOnPath,
64
+ skills: inputs.skills,
65
+ canPrompt: true,
66
+ });
67
+ deps.prompter.note(report.authEnabled
68
+ ? COPY.PRODUCTION.bodyAuthOn
69
+ : COPY.PRODUCTION.bodyAuthOff, COPY.PRODUCTION.title);
70
+ // Untitled: the outro below already says it, and closes the rail.
71
+ deps.prompter.note(COPY.OUTRO_BODY);
72
+ deps.prompter.outro(COPY.OUTRO_TITLE);
73
+ return { ...report, tooling };
74
+ }
75
+ /**
76
+ * `px setup instrument` — the instrumentation slice, re-runnable on a repo that
77
+ * is already registered. Registration still runs: it is idempotent, and it is
78
+ * what produces the connection the agent and the verification step need.
79
+ */
80
+ export async function runInstrument(deps, resolved) {
81
+ // This lane instruments by definition, so it never passes `--instrument` for
82
+ // `resolveSetupInputs` to have guarded — check the headless rule here.
83
+ assertAgentForHeadlessInstrument(resolved);
84
+ const inputs = { ...resolved, instrument: true };
85
+ const agentDetection = detectAgentsUnlessPinned(deps, inputs);
86
+ if (!inputs.headless) {
87
+ deps.prompter.intro(COPY.INTRO_INSTRUMENT);
88
+ }
89
+ const report = await registerAndInstrument(deps, inputs, { agentDetection });
90
+ if (!inputs.headless) {
91
+ deps.prompter.outro(COPY.OUTRO_TITLE);
92
+ }
93
+ return report;
94
+ }
95
+ /** `px setup skills` — the tooling installs alone; no connection needed. */
96
+ export async function runSkills(deps, inputs) {
97
+ const pxOnPath = probeGlobalBinary(deps, "px");
98
+ if (!inputs.headless) {
99
+ deps.prompter.intro(COPY.INTRO_SKILLS);
100
+ }
101
+ const tooling = await offerToolingInstalls(deps, {
102
+ pxOnPath,
103
+ skills: inputs.skills,
104
+ canPrompt: !inputs.headless,
105
+ });
106
+ if (!inputs.headless) {
107
+ deps.prompter.outro(COPY.OUTRO_TITLE);
108
+ }
109
+ return tooling;
110
+ }
111
+ /**
112
+ * Register, then — when asked — prefetch docs, hand off to the agent, and
113
+ * verify traces. The shared spine of `px setup` and `px setup instrument`.
114
+ */
115
+ async function registerAndInstrument(deps, inputs, { agentDetection }) {
116
+ const registration = await register(deps, inputs);
117
+ const { connection, authEnabled, gitignoreAppended } = registration;
118
+ const base = {
119
+ connection,
120
+ authEnabled,
121
+ headless: inputs.headless,
122
+ files: [ENV_FILE_NAME],
123
+ gitignored: gitignoreAppended,
124
+ tracesUrl: tracesUrl(connection),
125
+ };
126
+ if (!inputs.instrument) {
127
+ return base;
128
+ }
129
+ // Only after registration's git-safety gate: the docs fetch writes into
130
+ // `.px/`, which an earlier download can make look like a pre-existing dirty
131
+ // tree in a fast or cached headless run.
132
+ const docs = await prefetchDocs(deps, {
133
+ docs: inputs.docs,
134
+ isGitRepository: registration.isGitRepository,
135
+ });
136
+ const startedAt = deps.clock.now();
137
+ // Any span already visible inside the clock-skew window predates this run —
138
+ // verification must then require spans strictly after the start time, or a
139
+ // pre-existing trace would falsely verify the hand-off.
140
+ const hadRecentSpans = await hasSpansInSkewWindow(deps, connection, {
141
+ sinceMs: startedAt,
142
+ });
143
+ const instrumentation = await instrumentApp(deps, connection, {
144
+ authEnabled,
145
+ agentDetection,
146
+ agent: inputs.agent,
147
+ languages: inputs.languages,
148
+ mode: {
149
+ background: inputs.background,
150
+ bypassPermissions: inputs.bypassPermissions,
151
+ },
152
+ ...(docs ? { docs } : {}),
153
+ });
154
+ // The return value is setup's definition of done — a trace the API confirmed
155
+ // arriving, not the agent's own claim that it finished. It is reported, not
156
+ // thrown on: the connection and hand-off files are real work worth keeping
157
+ // even when no trace showed up.
158
+ const tracesVerified = await waitForFirstTrace(deps, connection, {
159
+ sinceMs: startedAt,
160
+ allowClockSkew: !hadRecentSpans,
161
+ headless: inputs.headless,
162
+ });
163
+ return {
164
+ ...base,
165
+ ...(docs ? { docs } : {}),
166
+ // The docs step gitignores its own output dir, so the report has to fold
167
+ // those appends in or it under-states what setup touched.
168
+ gitignored: [...base.gitignored, ...(docs?.gitignoreAppended ?? [])],
169
+ instrumentation,
170
+ tracesVerified,
171
+ };
172
+ }
173
+ /**
174
+ * Git safety, endpoint, connection, env file — the part every lane shares, and
175
+ * all a registration-only run performs.
176
+ */
177
+ async function register(deps, inputs) {
178
+ const { headless } = inputs;
179
+ const git = await confirmGitSafety(deps, { headless });
180
+ if (!git.proceed) {
181
+ throw new SetupCancelledError();
182
+ }
183
+ // The hidden --api-url dev flag never reaches this endpoint — it is applied
184
+ // as the client's base URL in buildDefaultDeps, so API traffic is rerouted
185
+ // while hand-off files, the px profile, and traces URLs keep the endpoint
186
+ // resolved here.
187
+ const endpointChoice = await chooseEndpoint(deps, {
188
+ presetEndpoint: inputs.endpoint,
189
+ headless,
190
+ });
191
+ const connection = await establishConnection(deps, {
192
+ endpoint: endpointChoice.endpoint,
193
+ authEnabled: endpointChoice.authEnabled,
194
+ inputs,
195
+ });
196
+ const envFile = writeEnvFile(deps, connection, {
197
+ isGitRepository: git.isGitRepository,
198
+ });
199
+ if (!headless) {
200
+ deps.prompter.line(COPY.ENV_FILE.wrote([ENV_FILE_NAME]));
201
+ if (envFile.gitignoreAppended.length > 0) {
202
+ deps.prompter.line(COPY.ENV_FILE.gitignored(envFile.gitignoreAppended));
203
+ }
204
+ }
205
+ return {
206
+ connection,
207
+ authEnabled: endpointChoice.authEnabled,
208
+ gitignoreAppended: envFile.gitignoreAppended,
209
+ isGitRepository: git.isGitRepository,
210
+ };
211
+ }
212
+ //# sourceMappingURL=runSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runSetup.js","sourceRoot":"","sources":["../../src/setup/runSetup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Choose the endpoint: where Phoenix is, and whether it wants an API key.
3
+ *
4
+ * Two options — Local or Remote ("paste your instance URL"). The probe is
5
+ * an unauthenticated
6
+ * `GET /v1/projects?limit=1`: 200 → auth off, 401/403 → auth on, anything
7
+ * else → troubleshoot copy and re-ask (max 3 attempts).
8
+ */
9
+ import type { SetupDeps } from "../deps/index.js";
10
+ export interface EndpointChoice {
11
+ /** Normalized origin, no trailing slash. */
12
+ endpoint: string;
13
+ authEnabled: boolean;
14
+ }
15
+ export type ProbeOutcome = {
16
+ kind: "authOff";
17
+ } | {
18
+ kind: "authOn";
19
+ } | {
20
+ kind: "unreachable";
21
+ detail: string;
22
+ } | {
23
+ kind: "notPhoenix";
24
+ detail: string;
25
+ };
26
+ /**
27
+ * Probe an endpoint to determine reachability and whether auth is enabled.
28
+ */
29
+ export declare function probeEndpoint(deps: Pick<SetupDeps, "createClient">, endpoint: string): Promise<ProbeOutcome>;
30
+ export interface ChooseEndpointArgs {
31
+ /** Pre-answered endpoint from --endpoint / env (skips the select). */
32
+ presetEndpoint?: string;
33
+ headless: boolean;
34
+ }
35
+ export declare function chooseEndpoint(deps: Pick<SetupDeps, "createClient" | "prompter">, { presetEndpoint, headless }: ChooseEndpointArgs): Promise<EndpointChoice>;
36
+ //# sourceMappingURL=chooseEndpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chooseEndpoint.d.ts","sourceRoot":"","sources":["../../../src/setup/steps/chooseEndpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAQzC,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAMD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAsBvB;AA+BD,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,GAAG,UAAU,CAAC,EAClD,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAC/C,OAAO,CAAC,cAAc,CAAC,CA+DzB"}