Skip to content

Commit 356d2d1

Browse files
committed
feat: wire memory into CLI runCmd + continueCmd
- Buffer restore on session resume (continueCmd) - Buffer append for user + agent after RunWithMessages - Buffer persisted to session files - OnSessionEnd extraction at session completion - Fixed buffer persist after store.Append() (re-load + re-save)
1 parent 44620e8 commit 356d2d1

1 file changed

Lines changed: 74 additions & 2 deletions

File tree

cmd/kode/main.go

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,10 +763,27 @@ func run(args []string) error {
763763
messages = append([]llm.Message{{Role: "system", Content: systemMessage}}, messages...)
764764
}
765765

766+
// Append user input to buffer
767+
if mm := agent.Memory(); mm != nil {
768+
mm.AppendBuffer("user", shorten(f.Task, 100))
769+
}
770+
766771
var result string
767772
result, allMessages, runErr = agent.RunWithMessages(ctx, messages)
768773
_ = result
769774

775+
// Append agent response to buffer
776+
if runErr == nil && len(allMessages) > 0 {
777+
if mm := agent.Memory(); mm != nil {
778+
for i := len(allMessages) - 1; i >= 0; i-- {
779+
if allMessages[i].Role == "assistant" && allMessages[i].Content != "" {
780+
mm.AppendBuffer("agent", shorten(allMessages[i].Content, 100))
781+
break
782+
}
783+
}
784+
}
785+
}
786+
770787
if runErr == nil {
771788
store, err := session.NewStore()
772789
if err != nil {
@@ -777,6 +794,10 @@ func run(args []string) error {
777794
return fmt.Errorf("save session: %w", err)
778795
}
779796
sess.Sandbox = resolved.Sandbox
797+
// Persist buffer to session
798+
if mm := agent.Memory(); mm != nil {
799+
sess.Buffer = mm.GetBuffer()
800+
}
780801
store.Save(sess)
781802
fmt.Fprintf(os.Stderr, "kode: session %s saved — continue with: kode continue \"...\"\n", sess.ID)
782803
}
@@ -800,6 +821,19 @@ func run(args []string) error {
800821
runLearnLoop(allMessages, f.Task, sm)
801822
}
802823

824+
// ── Session end — extract episode if enough turns ──
825+
if mm := agent.Memory(); mm != nil && f.Session != nil && *f.Session {
826+
// We need the session for OnSessionEnd. Re-create it from the stored data.
827+
sess, err := session.NewStore()
828+
if err == nil {
829+
latest, err := sess.Latest()
830+
if err == nil {
831+
msgStrs := makeSessionMessageStrings(latest)
832+
mm.OnSessionEnd(latest.ID, latest.Turns, msgStrs)
833+
}
834+
}
835+
}
836+
803837
return nil
804838
}
805839

@@ -1337,11 +1371,21 @@ func continueCmd(args []string) error {
13371371
}
13381372
defer agent.Close()
13391373

1374+
// Restore buffer from session
1375+
if mm := agent.Memory(); mm != nil && len(sess.Buffer) > 0 {
1376+
mm.RestoreBuffer(sess.Buffer)
1377+
}
1378+
13401379
// Build message history: session messages + new user message
13411380
// The system message is already in the session
13421381
messages := sess.GetMessages()
13431382
messages = append(messages, llm.Message{Role: "user", Content: task})
13441383

1384+
// Append user input to buffer
1385+
if mm := agent.Memory(); mm != nil {
1386+
mm.AppendBuffer("user", shorten(task, 100))
1387+
}
1388+
13451389
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
13461390
defer cancel()
13471391

@@ -1352,12 +1396,40 @@ func continueCmd(args []string) error {
13521396
}
13531397
_ = result
13541398

1355-
// Save updated session
1356-
if err := store.Append(sess.ID, allMessages[len(sess.GetMessages()):]); err != nil {
1399+
// Append agent response to buffer
1400+
if len(allMessages) > 0 {
1401+
if mm := agent.Memory(); mm != nil {
1402+
for i := len(allMessages) - 1; i >= 0; i-- {
1403+
if allMessages[i].Role == "assistant" && allMessages[i].Content != "" {
1404+
mm.AppendBuffer("agent", shorten(allMessages[i].Content, 100))
1405+
break
1406+
}
1407+
}
1408+
}
1409+
}
1410+
1411+
// Save updated session — persist messages AND buffer
1412+
newMsgs := allMessages[len(sess.GetMessages()):]
1413+
if err := store.Append(sess.ID, newMsgs); err != nil {
13571414
return fmt.Errorf("save session: %w", err)
13581415
}
1416+
// Re-load session to persist buffer (Append reads from disk)
1417+
if mm := agent.Memory(); mm != nil {
1418+
updated, err := store.Load(sess.ID)
1419+
if err == nil {
1420+
updated.Buffer = mm.GetBuffer()
1421+
store.Save(updated)
1422+
}
1423+
}
13591424

13601425
fmt.Fprintf(os.Stderr, "kode: session %s saved (%d turns)\n", sess.ID, sess.Turns+1)
1426+
1427+
// ── Session end — extract episode ──
1428+
if mm := agent.Memory(); mm != nil {
1429+
msgStrs := makeSessionMessageStrings(sess)
1430+
mm.OnSessionEnd(sess.ID, sess.Turns+1, msgStrs)
1431+
}
1432+
13611433
return nil
13621434
}
13631435

0 commit comments

Comments
 (0)