c179e014ad
CI / build-and-test (push) Failing after 1m52s
* 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
83 lines
3.0 KiB
Go
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
|
|
}
|