Skip to content

Commit aa11af2

Browse files
authored
fix: sre agent (#177)
1 parent b6a4455 commit aa11af2

3 files changed

Lines changed: 135 additions & 35 deletions

File tree

cmd/deploy.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ Examples:
124124
fmt.Fprintf(os.Stderr, format+"\n", args...)
125125
}
126126
if sreMode {
127-
logf("[deploy] --sre requested; Docker is the default SRE runtime. After deployment, run: clanker sre install --target docker --apply")
127+
logf("[deploy] --sre requested; planning a long-running Clanker SRE agent with heartbeat verification")
128128
}
129129

130130
// 3. Resolve AWS profile/region early so intelligence pipeline can scan infra
@@ -323,7 +323,7 @@ Examples:
323323
if planProvider == "" {
324324
planProvider = "aws"
325325
}
326-
deployObjectiveContext := withOneClickDeployContext(baseQuestion, planProvider, intel.Architecture.Method, enforceImageDeploy)
326+
deployObjectiveContext := withOneClickDeployContext(baseQuestion, planProvider, intel.Architecture.Method, enforceImageDeploy, sreMode)
327327
planningContext := compactPlanningContext(deployObjectiveContext, planProvider)
328328
projectSummaryForLLM := strings.TrimSpace(rp.Summary)
329329
if intel.DeepAnalysis != nil && strings.TrimSpace(intel.DeepAnalysis.AppDescription) != "" {
@@ -1773,20 +1773,27 @@ func compactOneLine(raw string, limit int) string {
17731773

17741774
var shellStylePlaceholderRe = regexp.MustCompile(`\$\{([A-Z0-9_]+)\}`)
17751775

1776-
func withOneClickDeployContext(base, provider, method string, enforceImageDeploy bool) string {
1777-
context := buildOneClickDeployObjective(provider, method, enforceImageDeploy)
1776+
func withOneClickDeployContext(base, provider, method string, enforceImageDeploy bool, sreMode bool) string {
1777+
context := buildOneClickDeployObjective(provider, method, enforceImageDeploy, sreMode)
17781778
base = strings.TrimSpace(base)
17791779
if base == "" {
17801780
return context
17811781
}
17821782
return context + "\n\n" + base
17831783
}
17841784

1785-
func buildOneClickDeployObjective(provider, method string, enforceImageDeploy bool) string {
1785+
func buildOneClickDeployObjective(provider, method string, enforceImageDeploy bool, sreMode bool) string {
17861786
prov := strings.ToLower(strings.TrimSpace(provider))
17871787
if prov == "" {
17881788
prov = "aws"
17891789
}
1790+
if sreMode {
1791+
deployID := strings.TrimSpace(os.Getenv("CLANKER_SRE_DEPLOY_ID"))
1792+
if deployID == "" {
1793+
deployID = "$CLANKER_SRE_DEPLOY_ID"
1794+
}
1795+
return fmt.Sprintf("[one-click SRE deploy objective]\nGenerate command plan steps that deploy only the long-running Clanker SRE agent, not the analyzed app. Use provider=%s and the smallest practical always-on runtime for that provider. Prefer ghcr.io/bgdnvk/clanker:latest and run: clanker sre run --sre --target cloud-vm --provider %s --deploy-id %s. The runtime MUST set CLANKER_CEREBRO_URL, CLANKER_CEREBRO_INGEST_TOKEN, CLANKER_SRE_DEPLOY_ID, and CLANKER_SRE_PROVIDER. Tag or label every created resource with clanker-sre=true and clanker-sre-deploy-id=%s. Keep commands idempotent, preserve created resource IDs, and include a final non-secret health/verification command that checks the service/container is still running. Never print token values.", prov, prov, deployID, deployID)
1796+
}
17901797
m := strings.ToLower(strings.TrimSpace(method))
17911798
if m == "" {
17921799
m = "ec2"

cmd/sre.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ var sreRunCmd = &cobra.Command{
9696
cerebroURL, _ := cmd.Flags().GetString("cerebro-url")
9797
ingestToken, _ := cmd.Flags().GetString("ingest-token")
9898
provider, _ := cmd.Flags().GetString("provider")
99+
deployID, _ := cmd.Flags().GetString("deploy-id")
99100
interval, err := durationFlag(cmd, "interval", sre.DefaultInterval)
100101
if err != nil {
101102
return err
@@ -114,6 +115,7 @@ var sreRunCmd = &cobra.Command{
114115
Once: once,
115116
Writer: os.Stdout,
116117
Provider: provider,
118+
DeployID: deployID,
117119
})
118120
if errors.Is(err, context.Canceled) {
119121
return nil
@@ -184,6 +186,8 @@ func addSREPlanFlags(cmd *cobra.Command) {
184186
cmd.Flags().String("name", sre.DefaultAgentName, "SRE bot name/container/service name")
185187
cmd.Flags().String("cerebro-url", "", "Cerebro API base URL, e.g. http://127.0.0.1:8080/api")
186188
cmd.Flags().String("ingest-token-env", sre.DefaultIngestTokenEnv, "Environment variable name that holds the Cerebro ingest token")
189+
cmd.Flags().String("provider", "", "Cloud provider name for heartbeat identification (aws, gcp, azure, etc.)")
190+
cmd.Flags().String("deploy-id", "", "Stable SRE deployment ID for heartbeat verification")
187191
cmd.Flags().String("interval", sre.DefaultInterval.String(), "Heartbeat/discovery interval")
188192
cmd.Flags().String("format", "text", "Output format: text or json")
189193
}
@@ -195,6 +199,7 @@ func addSRERunFlags(cmd *cobra.Command) {
195199
cmd.Flags().String("cerebro-url", "", "Cerebro API base URL, e.g. http://127.0.0.1:8080/api")
196200
cmd.Flags().String("ingest-token", "", "Cerebro ingest token (or set CLANKER_CEREBRO_INGEST_TOKEN)")
197201
cmd.Flags().String("provider", "", "Cloud provider name for heartbeat identification (aws, gcp, azure, etc.)")
202+
cmd.Flags().String("deploy-id", "", "Stable SRE deployment ID for heartbeat verification")
198203
cmd.Flags().String("interval", sre.DefaultInterval.String(), "Heartbeat/discovery interval")
199204
cmd.Flags().Bool("once", false, "Send one heartbeat and exit")
200205
}
@@ -209,8 +214,10 @@ func buildSREPlan(cmd *cobra.Command) (sre.InstallPlan, error) {
209214
name, _ := cmd.Flags().GetString("name")
210215
cerebroURL, _ := cmd.Flags().GetString("cerebro-url")
211216
ingestTokenEnv, _ := cmd.Flags().GetString("ingest-token-env")
217+
provider, _ := cmd.Flags().GetString("provider")
218+
deployID, _ := cmd.Flags().GetString("deploy-id")
212219
discovery := sre.Discover(cmd.Context())
213-
return sre.BuildPlan(discovery, sre.PlanOptions{Target: target, Image: image, Name: name, BackendURL: cerebroURL, IngestTokenEnv: ingestTokenEnv, Interval: interval}), nil
220+
return sre.BuildPlan(discovery, sre.PlanOptions{Target: target, Image: image, Name: name, BackendURL: cerebroURL, IngestTokenEnv: ingestTokenEnv, Provider: provider, DeployID: deployID, Interval: interval}), nil
214221
}
215222

216223
func durationFlag(cmd *cobra.Command, name string, fallback time.Duration) (time.Duration, error) {

0 commit comments

Comments
 (0)