dbus: add GetPlan, SetPlan, GetSystemPrompt, GetContextSize, GetPreviousPrompt, Compact, ClearContext

Closes remaining feature gaps vs 9p interface.
This commit is contained in:
Levi Neely 2026-07-18 18:16:55 +02:00
parent d907aa53f4
commit e1ce5df53c
1 changed files with 119 additions and 8 deletions

127
main.go
View File

@ -33,14 +33,16 @@ const (
// managedSession wraps a Core with its context and metadata.
type managedSession struct {
core agent.Core
ctx context.Context
cancel context.CancelFunc
id string
agent string
log []byte
logMu sync.Mutex
peers map[string]bool
core agent.Core
ctx context.Context
cancel context.CancelFunc
id string
agent string
log []byte
logMu sync.Mutex
peers map[string]bool
plan string
prevPrompt string
}
// chatEmitter batches ChatUpdated D-Bus signals to avoid flooding the bus.
@ -369,6 +371,7 @@ func (m *SessionManager) Submit(sessionID, prompt string) (bool, *dbus.Error) {
return false, nil
}
sess.prevPrompt = prompt
go sess.core.Submit(sess.ctx, prompt)
return true, nil
}
@ -519,6 +522,85 @@ func (m *SessionManager) GetContext(sessionID string) (string, *dbus.Error) {
return result, nil
}
// --- Plan/scratchpad ---
func (m *SessionManager) GetPlan(sessionID string) (string, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return "", nil
}
return sess.plan, nil
}
func (m *SessionManager) SetPlan(sessionID, plan string) (bool, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return false, nil
}
sess.plan = plan
return true, nil
}
// --- System prompt / context size / previous prompt ---
func (m *SessionManager) GetSystemPrompt(sessionID string) (string, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return "", nil
}
return sess.core.SystemPrompt(), nil
}
func (m *SessionManager) GetContextSize(sessionID string) (string, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return "", nil
}
return sess.core.CtxSz(), nil
}
func (m *SessionManager) GetPreviousPrompt(sessionID string) (string, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return "", nil
}
return sess.prevPrompt, nil
}
// --- Compact / Clear ---
func (m *SessionManager) Compact(sessionID string) (bool, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return false, nil
}
sess.core.Submit(sess.ctx, "/compact")
return true, nil
}
func (m *SessionManager) ClearContext(sessionID string) (bool, *dbus.Error) {
m.mu.RLock()
sess, ok := m.sessions[sessionID]
m.mu.RUnlock()
if !ok {
return false, nil
}
sess.core.Submit(sess.ctx, "/clear")
return true, nil
}
// --- Backends/models/agents ---
func (m *SessionManager) ListBackends() ([]string, *dbus.Error) {
@ -1356,6 +1438,35 @@ const introspectXML = `<node>
<arg name="prompt" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="GetPlan">
<arg name="session_id" type="s" direction="in"/>
<arg name="plan" type="s" direction="out"/>
</method>
<method name="SetPlan">
<arg name="session_id" type="s" direction="in"/>
<arg name="plan" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="GetSystemPrompt">
<arg name="session_id" type="s" direction="in"/>
<arg name="result" type="s" direction="out"/>
</method>
<method name="GetContextSize">
<arg name="session_id" type="s" direction="in"/>
<arg name="result" type="s" direction="out"/>
</method>
<method name="GetPreviousPrompt">
<arg name="session_id" type="s" direction="in"/>
<arg name="result" type="s" direction="out"/>
</method>
<method name="Compact">
<arg name="session_id" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="ClearContext">
<arg name="session_id" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="Generate">
<arg name="prompt" type="s" direction="in"/>
<arg name="system" type="s" direction="in"/>