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.
This commit is contained in:
Levi Neely 2026-07-30 16:29:43 +02:00
parent 74f68f5045
commit 25dbc1b85c
6 changed files with 16 additions and 38 deletions

1
go.mod
View File

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

2
go.sum
View File

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

View File

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

View File

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

View File

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

View File

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