-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathanalytics.go
More file actions
97 lines (80 loc) · 2.19 KB
/
analytics.go
File metadata and controls
97 lines (80 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package analytics
import (
"os"
"github.com/launchdarkly/ldcli/cmd/cliflags"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"golang.org/x/term"
)
type envChecker interface {
Getenv(key string) string
IsTerminal(fd int) bool
StdinFd() int
StdoutFd() int
}
type osEnvChecker struct{}
func (osEnvChecker) Getenv(key string) string { return os.Getenv(key) }
func (osEnvChecker) IsTerminal(fd int) bool { return term.IsTerminal(fd) }
func (osEnvChecker) StdinFd() int { return int(os.Stdin.Fd()) }
func (osEnvChecker) StdoutFd() int { return int(os.Stdout.Fd()) }
type agentEnvVar struct {
envVar string
label string
}
// Ordered list so detection priority is deterministic.
var knownAgentEnvVars = []agentEnvVar{
{"CURSOR_SESSION_ID", "cursor"},
{"CURSOR_TRACE_ID", "cursor"},
{"CLAUDE_CODE", "claude-code"},
{"CLAUDE_CODE_SESSION", "claude-code"},
{"CODEX_SESSION", "codex"},
{"CODEX_SANDBOX_ID", "codex"},
{"DEVIN_SESSION", "devin"},
{"GITHUB_COPILOT", "copilot"},
{"WINDSURF_SESSION", "windsurf"},
{"CLINE_TASK_ID", "cline"},
{"AIDER_MODEL", "aider"},
}
// DetectAgentContext returns a label identifying the agent environment, or ""
// if the CLI appears to be running in an interactive human terminal.
func DetectAgentContext() string {
return detectAgentContext(osEnvChecker{})
}
func detectAgentContext(env envChecker) string {
if v := env.Getenv("LD_CLI_AGENT"); v != "" {
return "explicit:" + v
}
for _, a := range knownAgentEnvVars {
if env.Getenv(a.envVar) != "" {
return a.label
}
}
if !env.IsTerminal(env.StdinFd()) && !env.IsTerminal(env.StdoutFd()) {
return "no-tty"
}
return ""
}
func CmdRunEventProperties(
cmd *cobra.Command,
name string,
overrides map[string]interface{},
) map[string]interface{} {
baseURI := viper.GetString(cliflags.BaseURIFlag)
var flags []string
cmd.Flags().Visit(func(f *pflag.Flag) {
flags = append(flags, f.Name)
})
properties := map[string]interface{}{
"name": name,
"action": cmd.CalledAs(),
"flags": flags,
}
if baseURI != cliflags.BaseURIDefault {
properties["baseURI"] = baseURI
}
for k, v := range overrides {
properties[k] = v
}
return properties
}