summaryrefslogtreecommitdiff
path: root/internal/executor/helpers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/executor/helpers.go')
-rw-r--r--internal/executor/helpers.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/internal/executor/helpers.go b/internal/executor/helpers.go
index 5ffde8e..36cd050 100644
--- a/internal/executor/helpers.go
+++ b/internal/executor/helpers.go
@@ -24,12 +24,13 @@ func (e *BlockedError) Error() string { return fmt.Sprintf("task blocked: %s", e
// (costUSD, error). error is non-nil if the stream signals task failure:
// - result message has is_error:true
// - a tool_result was denied due to missing permissions
-func parseStream(r io.Reader, w io.Writer, logger *slog.Logger) (float64, error) {
+func parseStream(r io.Reader, w io.Writer, logger *slog.Logger) (float64, string, error) {
tee := io.TeeReader(r, w)
scanner := bufio.NewScanner(tee)
scanner.Buffer(make([]byte, 1024*1024), 1024*1024) // 1MB buffer for large lines
var totalCost float64
+ var sessionID string
var streamErr error
for scanner.Scan() {
@@ -41,6 +42,12 @@ func parseStream(r io.Reader, w io.Writer, logger *slog.Logger) (float64, error)
msgType, _ := msg["type"].(string)
switch msgType {
+ case "system":
+ if subtype, ok := msg["subtype"].(string); ok && subtype == "init" {
+ if sid, ok := msg["session_id"].(string); ok {
+ sessionID = sid
+ }
+ }
case "rate_limit_event":
if info, ok := msg["rate_limit_info"].(map[string]interface{}); ok {
status, _ := info["status"].(string)
@@ -81,7 +88,7 @@ func parseStream(r io.Reader, w io.Writer, logger *slog.Logger) (float64, error)
}
}
- return totalCost, streamErr
+ return totalCost, sessionID, streamErr
}
// permissionDenialError inspects a "user" stream message for tool_result entries