Files
amcs/internal/tools/project_personas.go
T
warkanum c179e014ad
CI / build-and-test (push) Failing after 1m52s
feat(db): add project personas and skills tables
* Introduce project_personas table with foreign keys to projects and agent_personas
* Add project_skills table with foreign key to projects and agent_skills
* Include override boolean field in agent_persona_skills and project_skills
* Update schema and migration files to reflect new tables and fields
* Enhance CORS handling to reflect request origin
2026-07-04 23:45:51 +02:00

83 lines
3.0 KiB
Go

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
}