( ctx context.Context, logger slog.Logger, tools []fantasy.AgentTool, raw pqtype.NullRawMessage, planMode database.NullChatPlanMode, chatMode database.NullChatMode, )
| 7044 | } |
| 7045 | |
| 7046 | func appendDynamicTools( |
| 7047 | ctx context.Context, |
| 7048 | logger slog.Logger, |
| 7049 | tools []fantasy.AgentTool, |
| 7050 | raw pqtype.NullRawMessage, |
| 7051 | planMode database.NullChatPlanMode, |
| 7052 | chatMode database.NullChatMode, |
| 7053 | ) ([]fantasy.AgentTool, map[string]bool, error) { |
| 7054 | if isExploreSubagentMode(chatMode) || (planMode.Valid && planMode.ChatPlanMode == database.ChatPlanModePlan) { |
| 7055 | return tools, nil, nil |
| 7056 | } |
| 7057 | |
| 7058 | dynamicToolNames, err := parseDynamicToolNames(raw) |
| 7059 | if err != nil { |
| 7060 | return nil, nil, xerrors.Errorf("parse dynamic tool names: %w", err) |
| 7061 | } |
| 7062 | if len(dynamicToolNames) == 0 { |
| 7063 | return tools, dynamicToolNames, nil |
| 7064 | } |
| 7065 | |
| 7066 | var dynamicToolDefs []codersdk.DynamicTool |
| 7067 | if raw.Valid { |
| 7068 | if err := json.Unmarshal(raw.RawMessage, &dynamicToolDefs); err != nil { |
| 7069 | return nil, nil, xerrors.Errorf("unmarshal dynamic tools: %w", err) |
| 7070 | } |
| 7071 | } |
| 7072 | |
| 7073 | activeToolNames := make(map[string]struct{}, len(tools)) |
| 7074 | for _, name := range allowedBehaviorToolNames(tools, chatMode) { |
| 7075 | activeToolNames[name] = struct{}{} |
| 7076 | } |
| 7077 | for _, t := range tools { |
| 7078 | info := t.Info() |
| 7079 | if _, active := activeToolNames[info.Name]; !active { |
| 7080 | continue |
| 7081 | } |
| 7082 | if dynamicToolNames[info.Name] { |
| 7083 | logger.Warn(ctx, "dynamic tool name collides with built-in tool, built-in takes precedence", |
| 7084 | slog.F("tool_name", info.Name)) |
| 7085 | delete(dynamicToolNames, info.Name) |
| 7086 | } |
| 7087 | } |
| 7088 | |
| 7089 | var filteredDefs []codersdk.DynamicTool |
| 7090 | for _, dt := range dynamicToolDefs { |
| 7091 | if dynamicToolNames[dt.Name] { |
| 7092 | filteredDefs = append(filteredDefs, dt) |
| 7093 | } |
| 7094 | } |
| 7095 | |
| 7096 | return append(tools, dynamicToolsFromSDK(logger, filteredDefs)...), dynamicToolNames, nil |
| 7097 | } |
| 7098 | |
| 7099 | func (p *Server) runChat( |
| 7100 | ctx context.Context, |
no test coverage detected