refactor(cron): simplify main-summary prefix config

main
Peter Steinberger 2025-12-13 11:43:18 +00:00
parent 0152e053e1
commit 32cd1175fb
3 changed files with 29 additions and 40 deletions

View File

@ -498,7 +498,6 @@ private struct CronJobEditor: View {
@State private var thinking: String = "" @State private var thinking: String = ""
@State private var timeoutSeconds: String = "" @State private var timeoutSeconds: String = ""
@State private var bestEffortDeliver: Bool = false @State private var bestEffortDeliver: Bool = false
@State private var postToMain: Bool = false
@State private var postPrefix: String = "Cron" @State private var postPrefix: String = "Cron"
var body: some View { var body: some View {
@ -568,12 +567,12 @@ private struct CronJobEditor: View {
} }
} }
if self.payloadKind == .agentTurn { if self.payloadKind == .agentTurn || self.sessionTarget == .isolated {
Section("Post summary to main (optional)") { Section("Main session summary") {
Toggle("Post to main", isOn: self.$postToMain) Text("Isolated jobs always post a summary back into the main session when they finish.")
if self.postToMain { .font(.caption)
TextField("Prefix", text: self.$postPrefix) .foregroundStyle(.secondary)
} TextField("Prefix", text: self.$postPrefix)
} }
} }
} }
@ -666,7 +665,6 @@ private struct CronJobEditor: View {
self.bestEffortDeliver = bestEffortDeliver ?? false self.bestEffortDeliver = bestEffortDeliver ?? false
} }
self.postToMain = job.isolation?.postToMain ?? false
self.postPrefix = job.isolation?.postToMainPrefix ?? "Cron" self.postPrefix = job.isolation?.postToMainPrefix ?? "Cron"
} }
@ -746,17 +744,11 @@ private struct CronJobEditor: View {
] ]
if !name.isEmpty { root["name"] = name } if !name.isEmpty { root["name"] = name }
if self.payloadKind == .agentTurn || self.sessionTarget == .isolated { if payload["kind"] as? String == "agentTurn" || self.sessionTarget == .isolated {
if self.postToMain { let trimmed = self.postPrefix.trimmingCharacters(in: .whitespacesAndNewlines)
root["isolation"] = [ root["isolation"] = [
"postToMain": true, "postToMainPrefix": trimmed.isEmpty ? "Cron" : trimmed,
"postToMainPrefix": self.postPrefix.trimmingCharacters(in: .whitespacesAndNewlines) ]
.isEmpty ? "Cron" : self.postPrefix,
]
} else if self.job != nil {
// Allow clearing isolation on edit.
root["isolation"] = ["postToMain": false]
}
} }
return root return root
@ -839,7 +831,7 @@ struct CronSettings_Previews: PreviewProvider {
channel: "last", channel: "last",
to: nil, to: nil,
bestEffortDeliver: true), bestEffortDeliver: true),
isolation: CronIsolation(postToMain: true, postToMainPrefix: "Cron"), isolation: CronIsolation(postToMain: nil, postToMainPrefix: "Cron"),
state: CronJobState( state: CronJobState(
nextRunAtMs: Int(Date().addingTimeInterval(3600).timeIntervalSince1970 * 1000), nextRunAtMs: Int(Date().addingTimeInterval(3600).timeIntervalSince1970 * 1000),
runningAtMs: nil, runningAtMs: nil,

View File

@ -77,6 +77,7 @@ Each job is a JSON object with stable keys (unknown keys ignored for forward com
- `{"kind":"agentTurn","message":string,"deliver"?:boolean,"channel"?: "last"|"whatsapp"|"telegram","to"?:string,"timeoutSeconds"?:number}` - `{"kind":"agentTurn","message":string,"deliver"?:boolean,"channel"?: "last"|"whatsapp"|"telegram","to"?:string,"timeoutSeconds"?:number}`
- `isolation` (optional; only meaningful for isolated jobs) - `isolation` (optional; only meaningful for isolated jobs)
- `{"postToMain"?: boolean, "postToMainPrefix"?: string}` - `{"postToMain"?: boolean, "postToMainPrefix"?: string}`
- Note: `postToMain` is deprecated (no-op). Isolated jobs always post a summary; only the prefix is configurable.
- `runtime` (optional) - `runtime` (optional)
- `{"maxAttempts"?:number,"retryBackoffMs"?:number}` (best-effort retries; defaults off) - `{"maxAttempts"?:number,"retryBackoffMs"?:number}` (best-effort retries; defaults off)
- `state` (runtime-maintained) - `state` (runtime-maintained)

View File

@ -163,11 +163,7 @@ export function registerCronCli(program: Command) {
"Do not fail the job if delivery fails", "Do not fail the job if delivery fails",
false, false,
) )
.option( .option("--post-to-main", "Deprecated (no-op)", false)
"--post-to-main",
"Deprecated: isolated jobs always post a summary to main; use --post-prefix to customize",
false,
)
.option( .option(
"--post-prefix <prefix>", "--post-prefix <prefix>",
"Prefix for summary system event", "Prefix for summary system event",
@ -271,12 +267,16 @@ export function registerCronCli(program: Command) {
); );
} }
const isolation = opts.postToMain const isolation =
? { payload.kind === "agentTurn"
postToMain: true, ? {
postToMainPrefix: String(opts.postPrefix ?? "Cron"), postToMainPrefix:
} typeof opts.postPrefix === "string" &&
: undefined; opts.postPrefix.trim()
? opts.postPrefix.trim()
: "Cron",
}
: undefined;
const params = { const params = {
name: name:
@ -347,11 +347,7 @@ export function registerCronCli(program: Command) {
"Do not fail job if delivery fails", "Do not fail job if delivery fails",
false, false,
) )
.option( .option("--post-to-main", "Deprecated (no-op)", false)
"--post-to-main",
"Deprecated: isolated jobs always post a summary to main; use --post-prefix to customize",
false,
)
.option("--post-prefix <prefix>", "Prefix for summary system event") .option("--post-prefix <prefix>", "Prefix for summary system event")
.action(async (id, opts) => { .action(async (id, opts) => {
try { try {
@ -420,11 +416,11 @@ export function registerCronCli(program: Command) {
}; };
} }
if (opts.postToMain) { if (typeof opts.postPrefix === "string") {
patch.isolation = { patch.isolation = {
postToMain: true, postToMainPrefix: opts.postPrefix.trim()
postToMainPrefix: ? opts.postPrefix
typeof opts.postPrefix === "string" ? opts.postPrefix : "Cron", : "Cron",
}; };
} }