package tools import ( "context" "github.com/modelcontextprotocol/go-sdk/mcp" "git.warky.dev/wdevs/amcs/internal/session" "git.warky.dev/wdevs/amcs/internal/store" ext "git.warky.dev/wdevs/amcs/internal/types" ) type ProjectPersonasTool struct { store *store.DB sessions *session.ActiveProjects } func NewProjectPersonasTool(db *store.DB, sessions *session.ActiveProjects) *ProjectPersonasTool { return &ProjectPersonasTool{store: db, sessions: sessions} } type ProjectPersonaInput struct { Project string `json:"project,omitempty" jsonschema:"project name or id (uses active project if omitted)"` PersonaID int64 `json:"persona_id" jsonschema:"persona id"` IsDefault bool `json:"is_default,omitempty" jsonschema:"make this the default persona for the project"` } type ProjectPersonaOutput struct { ProjectID int64 `json:"project_id"` PersonaID int64 `json:"persona_id"` } type ListProjectPersonasInput struct { Project string `json:"project,omitempty" jsonschema:"project name or id (uses active project if omitted)"` } type ListProjectPersonasOutput struct { ProjectID int64 `json:"project_id"` Personas []ext.ProjectPersona `json:"personas"` } func (t *ProjectPersonasTool) Add(ctx context.Context, req *mcp.CallToolRequest, in ProjectPersonaInput) (*mcp.CallToolResult, ProjectPersonaOutput, error) { project, err := resolveProject(ctx, t.store, t.sessions, req, in.Project, true) if err != nil { return nil, ProjectPersonaOutput{}, err } if err := t.store.AddProjectPersona(ctx, project.NumericID, in.PersonaID, in.IsDefault); err != nil { return nil, ProjectPersonaOutput{}, err } return nil, ProjectPersonaOutput{ProjectID: project.NumericID, PersonaID: in.PersonaID}, nil } func (t *ProjectPersonasTool) Remove(ctx context.Context, req *mcp.CallToolRequest, in ProjectPersonaInput) (*mcp.CallToolResult, ProjectPersonaOutput, error) { project, err := resolveProject(ctx, t.store, t.sessions, req, in.Project, true) if err != nil { return nil, ProjectPersonaOutput{}, err } if err := t.store.RemoveProjectPersona(ctx, project.NumericID, in.PersonaID); err != nil { return nil, ProjectPersonaOutput{}, err } return nil, ProjectPersonaOutput{ProjectID: project.NumericID, PersonaID: in.PersonaID}, nil } func (t *ProjectPersonasTool) SetDefault(ctx context.Context, req *mcp.CallToolRequest, in ProjectPersonaInput) (*mcp.CallToolResult, ProjectPersonaOutput, error) { in.IsDefault = true return t.Add(ctx, req, in) } func (t *ProjectPersonasTool) List(ctx context.Context, req *mcp.CallToolRequest, in ListProjectPersonasInput) (*mcp.CallToolResult, ListProjectPersonasOutput, error) { project, err := resolveProject(ctx, t.store, t.sessions, req, in.Project, true) if err != nil { return nil, ListProjectPersonasOutput{}, err } personas, err := t.store.ListProjectPersonas(ctx, project.NumericID) if err != nil { return nil, ListProjectPersonasOutput{}, err } if personas == nil { personas = []ext.ProjectPersona{} } return nil, ListProjectPersonasOutput{ProjectID: project.NumericID, Personas: personas}, nil }