Some checks failed
CI / build-and-test (push) Failing after -31m24s
* Implement ContentEditorField for inline editing of content * Create ContentEditorModal for editing content in a modal * Introduce FormerShell for managing forms related to skills and thoughts * Enhance SkillsPage and ThoughtsPage with new components for better content management
152 lines
5.1 KiB
Go
152 lines
5.1 KiB
Go
package tools
|
|
|
|
// import (
|
|
// "context"
|
|
// "strings"
|
|
|
|
// "github.com/google/uuid"
|
|
// "github.com/modelcontextprotocol/go-sdk/mcp"
|
|
|
|
// "git.warky.dev/wdevs/amcs/internal/store"
|
|
// ext "git.warky.dev/wdevs/amcs/internal/types"
|
|
// )
|
|
|
|
// type HouseholdTool struct {
|
|
// store *store.DB
|
|
// }
|
|
|
|
// func NewHouseholdTool(db *store.DB) *HouseholdTool {
|
|
// return &HouseholdTool{store: db}
|
|
// }
|
|
|
|
// // add_household_item
|
|
|
|
// type AddHouseholdItemInput struct {
|
|
// Name string `json:"name" jsonschema:"name of the item"`
|
|
// Category string `json:"category,omitempty" jsonschema:"category (e.g. paint, appliance, measurement, document)"`
|
|
// Location string `json:"location,omitempty" jsonschema:"where in the home this item is"`
|
|
// Details map[string]any `json:"details,omitempty" jsonschema:"flexible metadata (model numbers, colors, specs, etc.)"`
|
|
// Notes string `json:"notes,omitempty"`
|
|
// }
|
|
|
|
// type AddHouseholdItemOutput struct {
|
|
// Item ext.HouseholdItem `json:"item"`
|
|
// }
|
|
|
|
// func (t *HouseholdTool) AddItem(ctx context.Context, _ *mcp.CallToolRequest, in AddHouseholdItemInput) (*mcp.CallToolResult, AddHouseholdItemOutput, error) {
|
|
// if strings.TrimSpace(in.Name) == "" {
|
|
// return nil, AddHouseholdItemOutput{}, errRequiredField("name")
|
|
// }
|
|
// if in.Details == nil {
|
|
// in.Details = map[string]any{}
|
|
// }
|
|
// item, err := t.store.AddHouseholdItem(ctx, ext.HouseholdItem{
|
|
// Name: strings.TrimSpace(in.Name),
|
|
// Category: strings.TrimSpace(in.Category),
|
|
// Location: strings.TrimSpace(in.Location),
|
|
// Details: in.Details,
|
|
// Notes: strings.TrimSpace(in.Notes),
|
|
// })
|
|
// if err != nil {
|
|
// return nil, AddHouseholdItemOutput{}, err
|
|
// }
|
|
// return nil, AddHouseholdItemOutput{Item: item}, nil
|
|
// }
|
|
|
|
// // search_household_items
|
|
|
|
// type SearchHouseholdItemsInput struct {
|
|
// Query string `json:"query,omitempty" jsonschema:"search text matching name or notes"`
|
|
// Category string `json:"category,omitempty" jsonschema:"filter by category"`
|
|
// Location string `json:"location,omitempty" jsonschema:"filter by location"`
|
|
// }
|
|
|
|
// type SearchHouseholdItemsOutput struct {
|
|
// Items []ext.HouseholdItem `json:"items"`
|
|
// }
|
|
|
|
// func (t *HouseholdTool) SearchItems(ctx context.Context, _ *mcp.CallToolRequest, in SearchHouseholdItemsInput) (*mcp.CallToolResult, SearchHouseholdItemsOutput, error) {
|
|
// items, err := t.store.SearchHouseholdItems(ctx, in.Query, in.Category, in.Location)
|
|
// if err != nil {
|
|
// return nil, SearchHouseholdItemsOutput{}, err
|
|
// }
|
|
// if items == nil {
|
|
// items = []ext.HouseholdItem{}
|
|
// }
|
|
// return nil, SearchHouseholdItemsOutput{Items: items}, nil
|
|
// }
|
|
|
|
// // get_household_item
|
|
|
|
// type GetHouseholdItemInput struct {
|
|
// ID uuid.UUID `json:"id" jsonschema:"item id"`
|
|
// }
|
|
|
|
// type GetHouseholdItemOutput struct {
|
|
// Item ext.HouseholdItem `json:"item"`
|
|
// }
|
|
|
|
// func (t *HouseholdTool) GetItem(ctx context.Context, _ *mcp.CallToolRequest, in GetHouseholdItemInput) (*mcp.CallToolResult, GetHouseholdItemOutput, error) {
|
|
// item, err := t.store.GetHouseholdItem(ctx, in.ID)
|
|
// if err != nil {
|
|
// return nil, GetHouseholdItemOutput{}, err
|
|
// }
|
|
// return nil, GetHouseholdItemOutput{Item: item}, nil
|
|
// }
|
|
|
|
// // add_vendor
|
|
|
|
// type AddVendorInput struct {
|
|
// Name string `json:"name" jsonschema:"vendor name"`
|
|
// ServiceType string `json:"service_type,omitempty" jsonschema:"type of service (e.g. plumber, electrician, landscaper)"`
|
|
// Phone string `json:"phone,omitempty"`
|
|
// Email string `json:"email,omitempty"`
|
|
// Website string `json:"website,omitempty"`
|
|
// Notes string `json:"notes,omitempty"`
|
|
// Rating *int `json:"rating,omitempty" jsonschema:"1-5 rating"`
|
|
// }
|
|
|
|
// type AddVendorOutput struct {
|
|
// Vendor ext.HouseholdVendor `json:"vendor"`
|
|
// }
|
|
|
|
// func (t *HouseholdTool) AddVendor(ctx context.Context, _ *mcp.CallToolRequest, in AddVendorInput) (*mcp.CallToolResult, AddVendorOutput, error) {
|
|
// if strings.TrimSpace(in.Name) == "" {
|
|
// return nil, AddVendorOutput{}, errRequiredField("name")
|
|
// }
|
|
// vendor, err := t.store.AddVendor(ctx, ext.HouseholdVendor{
|
|
// Name: strings.TrimSpace(in.Name),
|
|
// ServiceType: strings.TrimSpace(in.ServiceType),
|
|
// Phone: strings.TrimSpace(in.Phone),
|
|
// Email: strings.TrimSpace(in.Email),
|
|
// Website: strings.TrimSpace(in.Website),
|
|
// Notes: strings.TrimSpace(in.Notes),
|
|
// Rating: in.Rating,
|
|
// })
|
|
// if err != nil {
|
|
// return nil, AddVendorOutput{}, err
|
|
// }
|
|
// return nil, AddVendorOutput{Vendor: vendor}, nil
|
|
// }
|
|
|
|
// // list_vendors
|
|
|
|
// type ListVendorsInput struct {
|
|
// ServiceType string `json:"service_type,omitempty" jsonschema:"filter by service type"`
|
|
// }
|
|
|
|
// type ListVendorsOutput struct {
|
|
// Vendors []ext.HouseholdVendor `json:"vendors"`
|
|
// }
|
|
|
|
// func (t *HouseholdTool) ListVendors(ctx context.Context, _ *mcp.CallToolRequest, in ListVendorsInput) (*mcp.CallToolResult, ListVendorsOutput, error) {
|
|
// vendors, err := t.store.ListVendors(ctx, in.ServiceType)
|
|
// if err != nil {
|
|
// return nil, ListVendorsOutput{}, err
|
|
// }
|
|
// if vendors == nil {
|
|
// vendors = []ext.HouseholdVendor{}
|
|
// }
|
|
// return nil, ListVendorsOutput{Vendors: vendors}, nil
|
|
// }
|