From 25dbc1b85c50d47f529c908898b692b8b3567dfe Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Thu, 30 Jul 2026 16:29:43 +0200 Subject: [PATCH] session: remove resetElevation plumbing Rate limiting is now time-based (leaky bucket in core/elevate), so per-turn reset hooks are no longer needed. Remove ResetElevation from session config, files.go, root.go, and main.go. --- go.mod | 1 + go.sum | 2 ++ main.go | 5 ----- main_test.go | 19 +++++++++---------- session/files.go | 13 ++++--------- session/root.go | 14 -------------- 6 files changed, 16 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index 5508c75..8cc338d 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( require ( golang.org/x/sys v0.47.0 // indirect + golang.org/x/time v0.15.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a628296..fb92932 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,8 @@ golang.org/x/sys v0.0.0-20210415045647-66c3f260301c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= diff --git a/main.go b/main.go index c201af4..a0a1f1e 100644 --- a/main.go +++ b/main.go @@ -192,11 +192,6 @@ func runServer(sockPath string) { Enable9P: !*no9p, EnableDBus: !*nodbus && (*no9p || *tcpAddr == ""), InvalidateModels: modelCache.Invalidate, - ResetElevation: func(sessionID string) { - if elevateBroker != nil { - elevateBroker.ResetTurn(sessionID) - } - }, OnSessionCreated: func(id string, sess *session.Session) { if dbusAdapter != nil { dbusAdapter.OnSessionCreated(id, sess) diff --git a/main_test.go b/main_test.go index b4fe979..46a04fa 100644 --- a/main_test.go +++ b/main_test.go @@ -173,7 +173,6 @@ func newTestSessionFileStore(t *testing.T, sess *session.Session) *fs.Tree { func(data []byte) error { return nil }, func() {}, nil, - nil, ) return sf } @@ -182,7 +181,7 @@ func newTestSessionFileStoreWith(t *testing.T, sess *session.Session, kill func( t.Helper() sink := testSink() // Session tree for kill/rename/save operations - return session.NewSessionTree(sess, sink.NewLogger("test"), kill, rename, save, func() {}, nil, nil) + return session.NewSessionTree(sess, sink.NewLogger("test"), kill, rename, save, func() {}, nil) } // ===== session.Session ===== @@ -400,7 +399,7 @@ func TestSessionFileStoreReadableContract(t *testing.T) { defer sess.Cancel() sink := testSink() _ = session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) } func TestSessionFileStoreList(t *testing.T) { @@ -408,7 +407,7 @@ func TestSessionFileStoreList(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) entries, err := sf.List() if err != nil { @@ -425,7 +424,7 @@ func TestSessionFileStoreStatChat(t *testing.T) { sess.AppendLog([]byte("hello")) sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) fi, err := sf.Stat("chat") if err != nil { @@ -442,7 +441,7 @@ func TestSessionFileStoreGetChat(t *testing.T) { sess.AppendLog([]byte("hello")) sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) data := testStoreRead(t, sf, "chat") if string(data) != "hello" { @@ -455,7 +454,7 @@ func TestSessionFileStoreGetContent(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) for _, name := range []string{"cfg", "offset", "usage", "ctxsz", "models", "systemprompt"} { if _, err := sf.Open(name); err != nil { @@ -469,7 +468,7 @@ func TestSessionFileStorePutCwd(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) // Create the directory first so SetCWD validates it os.MkdirAll("/tmp/newpath", 0755) @@ -485,7 +484,7 @@ func TestSessionFileStorePutEmpty(t *testing.T) { defer sess.Cancel() sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func([]byte) error { return nil }, func() {}, nil, nil) + func([]byte) error { return nil }, func() {}, nil) // Empty write is a no-op e, err := sf.Open("cfg") @@ -592,7 +591,7 @@ func TestSessionFileStoreWriteChat(t *testing.T) { var saved []byte sink := testSink() sf := session.NewAgentTree(sess, sink.NewLogger("test"), - func(data []byte) error { saved = data; return nil }, func() {}, nil, nil) + func(data []byte) error { saved = data; return nil }, func() {}, nil) testStoreWrite(t, sf, "chat", []byte("transcript data")) if string(saved) != "transcript data" { diff --git a/session/files.go b/session/files.go index efcf4b2..d1114f7 100644 --- a/session/files.go +++ b/session/files.go @@ -63,8 +63,8 @@ func sessionFilePerms() map[string]os.FileMode { return fs.Perms[fs.PathSessionFile].Files } -func NewSessionTree(sess *Session, log *olog.Logger, kill func(), rename func(newID string) error, saveTranscript func([]byte) error, invalidateModels func(), resetElevation func(), toolRegistry *toolsrv.Registry) *fs.Tree { - h := &sessionHelper{sess: sess, log: log, kill: kill, rename: rename, saveTranscript: saveTranscript, invalidateModels: invalidateModels, resetElevation: resetElevation, toolRegistry: toolRegistry} +func NewSessionTree(sess *Session, log *olog.Logger, kill func(), rename func(newID string) error, saveTranscript func([]byte) error, invalidateModels func(), toolRegistry *toolsrv.Registry) *fs.Tree { + h := &sessionHelper{sess: sess, log: log, kill: kill, rename: rename, saveTranscript: saveTranscript, invalidateModels: invalidateModels, toolRegistry: toolRegistry} perms := sessionFilePerms() specs := make([]fs.FileSpec, len(SessionFileList)) for i, f := range SessionFileList { @@ -76,8 +76,8 @@ func NewSessionTree(sess *Session, log *olog.Logger, kill func(), rename func(ne } // NewAgentTree builds the file tree for a single agent within a session. -func NewAgentTree(sess *Session, log *olog.Logger, saveTranscript func([]byte) error, invalidateModels func(), resetElevation func(), toolRegistry *toolsrv.Registry) *fs.Tree { - h := &sessionHelper{sess: sess, log: log, saveTranscript: saveTranscript, invalidateModels: invalidateModels, resetElevation: resetElevation, toolRegistry: toolRegistry} +func NewAgentTree(sess *Session, log *olog.Logger, saveTranscript func([]byte) error, invalidateModels func(), toolRegistry *toolsrv.Registry) *fs.Tree { + h := &sessionHelper{sess: sess, log: log, saveTranscript: saveTranscript, invalidateModels: invalidateModels, toolRegistry: toolRegistry} perms := sessionFilePerms() specs := make([]fs.FileSpec, len(AgentFileList)) for i, f := range AgentFileList { @@ -96,7 +96,6 @@ type sessionHelper struct { rename func(newID string) error saveTranscript func([]byte) error invalidateModels func() - resetElevation func() // called on prompt write to reset turn counter toolRegistry *toolsrv.Registry } @@ -195,10 +194,6 @@ func (h *sessionHelper) fileSpec(name string, mode os.FileMode) fs.FileSpec { h.sess.InvalidateModelsCache() return nil } - // Reset elevation rate limiter on new turn - if h.resetElevation != nil { - h.resetElevation() - } h.sess.mu.Lock() h.sess.prevPrompt = []byte(input) h.sess.mu.Unlock() diff --git a/session/root.go b/session/root.go index 8b87455..48de43e 100644 --- a/session/root.go +++ b/session/root.go @@ -53,8 +53,6 @@ type Config struct { EnableDBus bool // InvalidateModels clears the model cache, forcing a refresh. InvalidateModels func() - // ResetElevation resets the per-turn elevation rate limiter for a session. - ResetElevation func(sessionID string) // ToolRegistry is the shared tool registry for lazy tool promotion. ToolRegistry *toolsrv.Registry // SkillsRegistry is the shared skills registry for skill loading. @@ -168,11 +166,6 @@ func lookupLocked(rs *rootState, id string) *Session { } func openSessionTree(rs *rootState, sess *Session) *fs.Tree { - var resetElev func() - if rs.cfg.ResetElevation != nil { - id := sess.id - resetElev = func() { rs.cfg.ResetElevation(id) } - } return NewSessionTree( sess, rs.cfg.Log, @@ -180,23 +173,16 @@ func openSessionTree(rs *rootState, sess *Session) *fs.Tree { func(newID string) error { return Rename(rs, sess.id, newID) }, nil, rs.cfg.InvalidateModels, - resetElev, rs.cfg.ToolRegistry, ) } func openAgentTree(rs *rootState, sess *Session) *fs.Tree { - var resetElev func() - if rs.cfg.ResetElevation != nil { - id := sess.id - resetElev = func() { rs.cfg.ResetElevation(id) } - } return NewAgentTree( sess, rs.cfg.Log, nil, rs.cfg.InvalidateModels, - resetElev, rs.cfg.ToolRegistry, ) }