(t *testing.T)
| 3955 | } |
| 3956 | |
| 3957 | func TestPostToolHookEmitsLifecycleEvents(t *testing.T) { |
| 3958 | t.Parallel() |
| 3959 | |
| 3960 | registry := hooks.NewRegistry() |
| 3961 | require.NoError(t, registry.RegisterBuiltin("noop_post_tool", func(_ context.Context, _ *hooks.Input, _ []string) (*hooks.Output, error) { |
| 3962 | return nil, nil |
| 3963 | })) |
| 3964 | |
| 3965 | agentTools := []tools.Tool{{ |
| 3966 | Name: "echo_tool", |
| 3967 | Parameters: map[string]any{}, |
| 3968 | Handler: func(_ context.Context, _ tools.ToolCall) (*tools.ToolCallResult, error) { |
| 3969 | return tools.ResultSuccess("ok"), nil |
| 3970 | }, |
| 3971 | }} |
| 3972 | |
| 3973 | root := agent.New("root", "You are a test agent", |
| 3974 | agent.WithModel(&mockProvider{id: "test/mock-model", stream: &mockStream{}}), |
| 3975 | agent.WithToolSets(newStubToolSet(nil, agentTools, nil)), |
| 3976 | agent.WithHooks(&latest.HooksConfig{ |
| 3977 | PostToolUse: []latest.HookMatcherConfig{{ |
| 3978 | Matcher: "echo_tool", |
| 3979 | Hooks: []latest.HookDefinition{{ |
| 3980 | Type: "builtin", |
| 3981 | Command: "noop_post_tool", |
| 3982 | }}, |
| 3983 | }}, |
| 3984 | }), |
| 3985 | ) |
| 3986 | tm := team.New(team.WithAgents(root)) |
| 3987 | rt, err := NewLocalRuntime(t.Context(), tm, WithSessionCompaction(false), WithModelStore(mockModelStore{})) |
| 3988 | require.NoError(t, err) |
| 3989 | rt.hooksRegistry = registry |
| 3990 | rt.buildHooksExecutors() |
| 3991 | |
| 3992 | sess := session.New(session.WithUserMessage("Test"), session.WithToolsApproved(true)) |
| 3993 | calls := []tools.ToolCall{{ |
| 3994 | ID: "call_1", |
| 3995 | Type: "function", |
| 3996 | Function: tools.FunctionCall{Name: "echo_tool", Arguments: `{}`}, |
| 3997 | }} |
| 3998 | |
| 3999 | events := make(chan Event, 10) |
| 4000 | rt.processToolCalls(t.Context(), sess, calls, agentTools, NewChannelSink(events)) |
| 4001 | |
| 4002 | var started *HookStartedEvent |
| 4003 | var finished *HookFinishedEvent |
| 4004 | for len(events) > 0 { |
| 4005 | switch ev := (<-events).(type) { |
| 4006 | case *HookStartedEvent: |
| 4007 | started = ev |
| 4008 | case *HookFinishedEvent: |
| 4009 | finished = ev |
| 4010 | } |
| 4011 | } |
| 4012 | |
| 4013 | require.NotNil(t, started) |
| 4014 | assert.Equal(t, hooks.EventPostToolUse, started.HookEvent) |
nothing calls this directly
no test coverage detected