@@ -77,10 +77,11 @@
77 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ChannelStateFile string
78 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SessionID string
79 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Nick string
80 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HooksEnabled bool
81 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
InterruptOnMessage bool
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MirrorReasoning bool
82 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PollInterval time.Duration
83 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HeartbeatInterval time.Duration
84 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TargetCWD string
85 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Args []string
86 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -152,10 +153,11 @@
152 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
_ = sessionrelay.RemoveChannelStateFile(cfg.ChannelStateFile)
153 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defer func() { _ = sessionrelay.RemoveChannelStateFile(cfg.ChannelStateFile) }()
154 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
155 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var relay sessionrelay.Connector
156 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
relayActive := false
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var onlineAt time.Time
157 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if relayRequested {
158 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
conn, err := sessionrelay.New(sessionrelay.Config{
159 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Transport: cfg.Transport,
160 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
URL: cfg.URL,
161 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Token: cfg.Token,
@@ -180,10 +182,11 @@
180 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
relay = conn
181 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
relayActive = true
182 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if err := sessionrelay.WriteChannelStateFile(cfg.ChannelStateFile, relay.ControlChannel(), relay.Channels()); err != nil {
183 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fmt.Fprintf(os.Stderr, "codex-relay: channel state disabled: %v\n", err)
184 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onlineAt = time.Now()
185 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
_ = relay.Post(context.Background(), fmt.Sprintf(
186 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"online in %s; mention %s to interrupt before the next action",
187 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filepath.Base(cfg.TargetCWD), cfg.Nick,
188 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
))
189 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -266,11 +269,11 @@
266 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}()
267 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
go func() {
268 271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
copyPTYOutput(ptmx, os.Stdout, state)
269 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}()
270 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if relayActive {
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- go relayInputLoop(ctx, relay, cfg, state, ptmx)
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ go relayInputLoop(ctx, relay, cfg, state, ptmx, onlineAt)
272 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
273 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
274 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
err = cmd.Wait()
275 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cancel()
276 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -279,12 +282,12 @@
279 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
_ = relay.Post(context.Background(), fmt.Sprintf("offline (exit %d)", exitCode))
280 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
281 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return err
282 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
283 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- func relayInputLoop(ctx context.Context, relay sessionrelay.Connector, cfg config, state *relayState, ptyFile *os.File) {
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lastSeen := time.Now()
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func relayInputLoop(ctx context.Context, relay sessionrelay.Connector, cfg config, state *relayState, ptyFile *os.File, since time.Time) {
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lastSeen := since
286 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ticker := time.NewTicker(cfg.PollInterval)
287 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defer ticker.Stop()
288 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
289 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for {
290 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
select {
@@ -517,10 +520,11 @@
517 520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IRCPass: getenvOr(fileConfig, "SCUTTLEBOT_IRC_PASS", ""),
518 521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IRCAgentType: getenvOr(fileConfig, "SCUTTLEBOT_IRC_AGENT_TYPE", "worker"),
519 522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IRCDeleteOnClose: getenvBoolOr(fileConfig, "SCUTTLEBOT_IRC_DELETE_ON_CLOSE", true),
520 523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HooksEnabled: getenvBoolOr(fileConfig, "SCUTTLEBOT_HOOKS_ENABLED", true),
521 524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
InterruptOnMessage: getenvBoolOr(fileConfig, "SCUTTLEBOT_INTERRUPT_ON_MESSAGE", true),
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MirrorReasoning: getenvBoolOr(fileConfig, "SCUTTLEBOT_MIRROR_REASONING", false),
522 526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PollInterval: getenvDurationOr(fileConfig, "SCUTTLEBOT_POLL_INTERVAL", defaultPollInterval),
523 527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HeartbeatInterval: getenvDurationAllowZeroOr(fileConfig, "SCUTTLEBOT_PRESENCE_HEARTBEAT", defaultHeartbeat),
524 528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Args: append([]string(nil), args...),
525 529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
526 530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -720,11 +724,11 @@
720 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ctx.Err() == nil {
721 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
_ = relay.Post(context.Background(), fmt.Sprintf("mirror failed: %v — session activity not visible in IRC", err))
722 726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
723 727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
724 728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if err := tailSessionFile(ctx, sessionPath, func(text string) {
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if err := tailSessionFile(ctx, sessionPath, cfg.MirrorReasoning, func(text string) {
726 730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, line := range splitMirrorText(text) {
727 731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if line == "" {
728 732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue
729 733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
730 734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
_ = relay.Post(ctx, line)
@@ -770,11 +774,11 @@
770 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case <-ticker.C:
771 775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
772 776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
773 777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
774 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- func tailSessionFile(ctx context.Context, path string, emit func(string)) error {
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func tailSessionFile(ctx context.Context, path string, mirrorReasoning bool, emit func(string)) error {
776 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file, err := os.Open(path)
777 781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if err != nil {
778 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return err
779 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
780 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defer file.Close()
@@ -785,11 +789,11 @@
785 789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
786 790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reader := bufio.NewReader(file)
787 791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for {
788 792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
line, err := reader.ReadBytes('\n')
789 793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if len(line) > 0 {
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for _, text := range sessionMessages(line) {
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, text := range sessionMessages(line, mirrorReasoning) {
791 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if text != "" {
792 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
emit(text)
793 797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
794 798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
795 799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -806,11 +810,11 @@
806 810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
807 811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return err
808 812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
809 813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
810 814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- func sessionMessages(line []byte) []string {
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func sessionMessages(line []byte, mirrorReasoning bool) []string {
812 816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var env sessionEnvelope
813 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if err := json.Unmarshal(line, &env); err != nil {
814 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nil
815 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
816 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if env.Type != "response_item" {
@@ -833,11 +837,11 @@
833 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
834 838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case "message":
835 839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if payload.Role != "assistant" {
836 840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nil
837 841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return flattenAssistantContent(payload.Content)
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return flattenAssistantContent(payload.Content, mirrorReasoning)
839 843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
840 844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nil
841 845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
842 846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
843 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func summarizeFunctionCall(name, argsJSON string) string {
@@ -883,19 +887,27 @@
883 887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
884 888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return name
885 889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
886 890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
887 891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- func flattenAssistantContent(content []sessionContent) []string {
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ func flattenAssistantContent(content []sessionContent, mirrorReasoning bool) []string {
889 893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var lines []string
890 894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, item := range content {
891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if item.Type != "output_text" {
892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue
893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for _, line := range splitMirrorText(item.Text) {
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if line != "" {
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lines = append(lines, line)
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch item.Type {
896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "output_text":
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, line := range splitMirrorText(item.Text) {
898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if line != "" {
899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lines = append(lines, line)
900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case "reasoning":
903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if mirrorReasoning {
904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for _, line := range splitMirrorText(item.Text) {
905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if line != "" {
906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lines = append(lines, "💭 "+line)
907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
897 909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
898 910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
899 911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
900 912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return lines
901 913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
902 914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!