From 60da0bbfde5884880678eda264500e1286526a3e Mon Sep 17 00:00:00 2001 From: ollie Date: Thu, 28 May 2026 18:44:57 +0200 Subject: [PATCH] token efficiency: expose compactionModel in 9p cfg, fix test stubs - Add compactionModel= to cfg read/write - Add CompactionModel/SetCompactionModel stubs to test stubCore - Fix NewSessionTree calls with missing invalidateModels arg --- main_test.go | 19 +++++++++++-------- session/sessionfile.go | 3 +++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/main_test.go b/main_test.go index fcd17fc..becbb16 100644 --- a/main_test.go +++ b/main_test.go @@ -89,6 +89,8 @@ func (c *stubCore) WaitChange(ctx context.Context, _, _ string) (string, bool) { } func (c *stubCore) Close() { c.closed = true } func (c *stubCore) ToolCallCount() int64 { return 0 } +func (c *stubCore) CompactionModel() string { return "" } +func (c *stubCore) SetCompactionModel(string) {} func (c *stubCore) Bus() *pubsub.Bus { if c.bus_ == nil { c.bus_ = pubsub.NewBus() @@ -174,6 +176,7 @@ func newTestSessionFileStore(t *testing.T, sess *session.Session) (*fs.Tree, *st func() {}, func(id string) error { return nil }, func(data []byte) error { return nil }, + func() {}, ) return sf, core } @@ -181,7 +184,7 @@ func newTestSessionFileStore(t *testing.T, sess *session.Session) (*fs.Tree, *st func newTestSessionFileStoreWith(t *testing.T, sess *session.Session, kill func(), rename func(string) error, save func([]byte) error) *fs.Tree { t.Helper() sink := testSink() - return session.NewSessionTree(sess, sink.NewLogger("test"), kill, rename, save) + return session.NewSessionTree(sess, sink.NewLogger("test"), kill, rename, save, func() {}) } // ===== session.Session ===== @@ -399,7 +402,7 @@ func TestSessionFileStoreReadableContract(t *testing.T) { defer sess.Cancel() sink := testSink() _ = session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) } func TestSessionFileStoreList(t *testing.T) { @@ -407,7 +410,7 @@ func TestSessionFileStoreList(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) entries, err := sf.List() if err != nil { @@ -424,7 +427,7 @@ func TestSessionFileStoreStatChat(t *testing.T) { sess.AppendLog([]byte("hello")) sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) fi, err := sf.Stat("chat") if err != nil { @@ -441,7 +444,7 @@ func TestSessionFileStoreGetChat(t *testing.T) { sess.AppendLog([]byte("hello")) sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) data := testStoreRead(t, sf, "chat") if string(data) != "hello" { @@ -454,7 +457,7 @@ func TestSessionFileStoreGetContent(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) for _, name := range []string{"cfg", "offset", "usage", "ctxsz", "models", "systemprompt"} { if _, err := sf.Open(name); err != nil { @@ -468,7 +471,7 @@ func TestSessionFileStorePutCwd(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) testStoreWrite(t, sf, "cfg", []byte("cwd=/new/path")) core := sess.Core.(*stubCore) @@ -482,7 +485,7 @@ func TestSessionFileStorePutEmpty(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewSessionTree(sess, sink.NewLogger("test"), - func() {}, func(string) error { return nil }, func([]byte) error { return nil }) + func() {}, func(string) error { return nil }, func([]byte) error { return nil }, func() {}) // Empty write is a no-op e, err := sf.Open("cfg") diff --git a/session/sessionfile.go b/session/sessionfile.go index 5c65cb8..25d9d37 100644 --- a/session/sessionfile.go +++ b/session/sessionfile.go @@ -338,6 +338,7 @@ func (h *sessionHelper) cfgContent() string { } else { sb.WriteString("verbosity=\n") } + fmt.Fprintf(&sb, "compactionModel=%s\n", h.sess.Core.CompactionModel()) return sb.String() } @@ -496,6 +497,8 @@ func (h *sessionHelper) handleCfg(input string) error { case "verbosity": hasParams = true p.Verbosity = v + case "compactionModel": + h.sess.Core.SetCompactionModel(v) // state → read-only, silently ignored } }