1package core
2
3import (
4 "context"
5 "strings"
6 "testing"
7
8 "github.com/bnema/zut/packages/provider"
9)
10
11func TestDynamicContextComposesHostAndExtensionContext(t *testing.T) {
12 agent := NewAgent(&compactLifecycleClient{}, "test-model", "system", Registry{})
13 agent.HostContext = func(context.Context) string { return "host inventory" }
14 agent.BeforeTurnContext = func(context.Context, int) (bool, string, string) {
15 return true, "", "extension data"
16 }
17 if err := agent.Prompt(context.Background(), "user message", nil, nil); err != nil {
18 t.Fatal(err)
19 }
20 messages := agent.Messages()
21 if len(messages) < 2 {
22 t.Fatalf("messages = %#v", messages)
23 }
24 text, ok := messages[0].Content[0].(provider.TextBlock)
25 if !ok {
26 t.Fatalf("context content = %T", messages[0].Content[0])
27 }
28 for _, want := range []string{"host inventory", "[Extension context]", "extension data"} {
29 if !strings.Contains(text.Text, want) {
30 t.Fatalf("dynamic context missing %q: %q", want, text.Text)
31 }
32 }
33}
34
35func TestFirstDynamicContextPersistsAsTranscriptReplacement(t *testing.T) {
36 client := &compactLifecycleClient{}
37 agent := NewAgent(client, "test-model", "system", Registry{})
38 session, err := NewSession(t.TempDir(), "/workspace", "test", "test-model", "test")
39 if err != nil {
40 t.Fatal(err)
41 }
42 agent.OnMessageAppended = func(message provider.Message) {
43 if err := session.AppendMessage(message); err != nil {
44 t.Fatal(err)
45 }
46 }
47 agent.OnTranscriptCompacted = func(messages []provider.Message) {
48 if err := session.AppendCompaction(messages); err != nil {
49 t.Fatal(err)
50 }
51 }
52 agent.BeforeTurnContext = func(context.Context, int) (bool, string, string) {
53 return true, "", "accepted extension context"
54 }
55 if err := agent.Prompt(context.Background(), "accepted user message", nil, nil); err != nil {
56 t.Fatal(err)
57 }
58 path := session.Path
59 if err := session.Close(); err != nil {
60 t.Fatal(err)
61 }
62
63 opened, messages, err := OpenSession(path)
64 if err != nil {
65 t.Fatal(err)
66 }
67 defer opened.Close()
68 if len(messages) < 2 || messages[0].Role != provider.RoleDeveloper || messages[1].Role != provider.RoleUser {
69 t.Fatalf("restored messages = %#v, want developer context followed by accepted user message", messages)
70 }
71}