summaryrefslogtreecommitdiff
path: root/internal/executor/claude.go
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-05-24 08:47:07 +0000
committerClaude <noreply@anthropic.com>2026-05-24 08:47:07 +0000
commitc7d95f3992d24f86ff71e5f3e18260a8ef8a09f0 (patch)
treeca62aca2287952907cdde0263672a0911b37d30e /internal/executor/claude.go
parent48a8e49cdda833f8af22e839ca3c102c40c97e17 (diff)
feat(executor): introduce AgentChannel seam for runner signals
Defines AgentChannel — the normalized interface by which a runner reports agent-originated signals (AskUser, ReportSummary, SpawnSubtask, RecordProgress) — plus a default storeChannel implementation backed by storage. Runner.Run now takes an AgentChannel; the pool constructs one per execution. The file transport routes its post-exit summary detection through ch.ReportSummary (buffered onto the execution so the pool still applies its extract/synthesize fallbacks, no double-write). AskUser returns ErrAgentBlocked since write-and-exit cannot answer in-session; question persistence stays with the pool's BlockedError handling. SpawnSubtask and RecordProgress are implemented and tested, ready for the MCP transport in Phase 2 where the channel becomes fully load-bearing. Store gains CreateEvent so the channel can emit agent_message events. https://claude.ai/code/session_01SESwn7kQ7oP62trWw6pc39
Diffstat (limited to 'internal/executor/claude.go')
-rw-r--r--internal/executor/claude.go6
1 files changed, 3 insertions, 3 deletions
diff --git a/internal/executor/claude.go b/internal/executor/claude.go
index 3c87f26..0123754 100644
--- a/internal/executor/claude.go
+++ b/internal/executor/claude.go
@@ -51,7 +51,7 @@ func (r *ClaudeRunner) binaryPath() string {
// project into a temp sandbox, runs the agent there, then merges committed
// changes back to project_dir. On failure the sandbox is preserved and its
// path is included in the error.
-func (r *ClaudeRunner) Run(ctx context.Context, t *task.Task, e *storage.Execution) error {
+func (r *ClaudeRunner) Run(ctx context.Context, t *task.Task, e *storage.Execution, ch AgentChannel) error {
projectDir := t.Agent.ProjectDir
// Validate project_dir exists when set.
@@ -164,7 +164,7 @@ func (r *ClaudeRunner) Run(ctx context.Context, t *task.Task, e *storage.Executi
// extract the text as the summary and fall through to normal completion.
if isCompletionReport(questionJSON) {
r.Logger.Info("treating question file as completion report", "taskID", e.TaskID)
- e.Summary = extractQuestionText(questionJSON)
+ _ = ch.ReportSummary(ctx, extractQuestionText(questionJSON))
} else {
// Preserve sandbox on BLOCKED — agent may have partial work and its
// Claude session files are stored under the sandbox's project slug.
@@ -177,7 +177,7 @@ func (r *ClaudeRunner) Run(ctx context.Context, t *task.Task, e *storage.Executi
summaryFile := filepath.Join(logDir, "summary.txt")
if summaryData, readErr := os.ReadFile(summaryFile); readErr == nil {
os.Remove(summaryFile) // consumed
- e.Summary = strings.TrimSpace(string(summaryData))
+ _ = ch.ReportSummary(ctx, strings.TrimSpace(string(summaryData)))
}
// Merge sandbox back to project_dir and clean up.