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
This commit is contained in:
ollie 2026-05-28 18:44:57 +02:00
parent d8bd47c545
commit 60da0bbfde
2 changed files with 14 additions and 8 deletions

View File

@ -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")

View File

@ -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
}
}